linkedin-studio/commands/batch.md
Kjell Tore Guttormsen 885526738c fix(linkedin-studio): N21 — scaffold-bånd-redesign + ferskhet-rester (newsletter-guide, first-comment) [skip-docs]
Del 1 — scaffold-bånd (KTG-beslutning: behold målbåndet, utvid komponentene).
Komponentsummen var 960–1 640 mot målbåndet 1 200–1 800: en skjelett-konform
draft kunne lande under gulvet og nådde aldri taket. Nye bånd — Context
250–350, Insight 550–850, Implication 250–350 (Hook 110–140 og CTA 50–100
uendret) — summerer til 1 210–1 790, altså INNI 1 200–1 800. Skjelett-konform
er nå gate-konform per konstruksjon.

Målbåndet 1 200–1 800 er uendret overalt; hooks/prompts/content-quality-gate.md
(den kanoniske gaten) er ikke rørt. Alternativet — å heve taket per AuthoredUp
D-4 — ville krevd 25 filer / 40 linjer inkl. gate-prompten, begge skills,
quality-scorecard, config-malen og brain-fiksturen.

Skjelettet fantes i seks kopier, alle rettet på KTG-go: commands/post.md,
commands/batch.md, commands/pipeline.md, references/engagement-frameworks.md,
agents/content-optimizer.md, skills/linkedin-content-creation/SKILL.md. De tre
siste lå utenfor planens scope, men to av dem var internt selvmotsigende på én
linje (overskrift 1 200–1 800 over komponenter som summerte til 960–1 640), og
engagement-frameworks.md er nettopp fila post.md/pipeline.md instruerer
modellen om å LESE for strukturen.

Nabofunn tatt med på KTG-go: post.md:95 ga «Personal stories → 1 000–1 400»,
som motsa post.md:136s egen gate. Kald-review R2a MAJOR — nå 1 200–1 800.

D-4 inn i kanonfila: ny «Post length»-seksjon i
references/algorithm-signals-reference.md med AuthoredUp-optimumet 1 301–2 500
(372 126 poster, sep 2025–feb 2026), merket single-vendor/ett vindu, med
eksplisitt note om at datapunktet gjør det shippede taket konservativt — ikke
feil — og at de to AuthoredUp-N-ene i fila (621K vs 372K) er ulike studier.
Kilde verifisert mot primærkilden, ikke overført fra planen.

Del 2 — ferskhet-rester (begge påstander verifisert mot LinkedIn Help):
- D-6 newsletter-strategy-guide.md: «5 000+ følgere» framstilt som terskel er
  feil — «All LinkedIn members have access to create a newsletter on LinkedIn»
  (a517914). Omskrevet til redaksjonell modenhetsvurdering (også i
  Mistakes-tabellen og Bottom Line). E-post er ikke garantert: LinkedIn
  de-dupliserer på tvers av kanaler — «if you receive an in-app or push
  notification, you should not expect to also receive an email for the same
  notification» (a517914). Bringer referansefila i tråd med newsletter.md:2384.
  Fjernet samtidig den ukildede «Algorithm favors newsletters from established
  creators» i den omskrevne blokka.
- D-7 first-comment-strategy.md: «pinned by default» er uverifisert og feil —
  pinning er en eksplisitt forfatterhandling (a524166), og standard
  kommentarsortering er algoritmisk. Lagt til «What this file does not claim»-
  avsnitt som speiler kanonfilas «contested»/low-confidence-epistemikk.

Scope 3 (KTG-go, amend): references/engagement-frameworks.md har FIRE
skjeletter, ikke ett. To til brot gulvet i malbandet — Data-Driven Post
(1 050-1 400) og Contrarian Post (1 060-1 410) — og er lagt om til samme
komponentprofil som Standard, sum 1 210-1 790. Narrative Arc (1 350-1 500) la
allerede inni og star urort; alle tre har na en eksplisitt sum-linje. Fila er
den post.md:104 sender modellen til for «story structures», sa a sertifisere
den som fikset med to odelagte skjeletter igjen ville vaert usant.

SUPERSEDED og ikke gjeninnført: gammel B §S6 Del 2 pkt 1 (first-comment
−5/−10 %-tall, pods-eskalering, 360Brew-fotnote).

Verifisering: bånd-summen ligger inni målbåndet i alle seks kopier av
standard-skjelettet og i alle fire skjelettene i engagement-frameworks.md
(grep-bevis, 0 gjenværende 200-300/400-800) · D-6/D-7 omformulert (0 treff på
«5,000+ followers» / «pinned by default» / «inbox + email») · alle ti suiter
grønne, alle floors uendret: test-runner 270/0 (269 assertions >= floor 251) ·
trends 300/0 · analytics 202/0 · hooks 191/0 · brain 134/0 · editions 72/0 ·
render 63/0 · specifics-bank 45/0 · tests 35/0 · contract-gate 33/0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LhF1H7ctT5Fk8KkoCQpe5n
2026-07-31 18:08:53 +02:00

218 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: linkedin:batch
description: |
Create a full week of LinkedIn content in one session. Input one theme or content pillar,
output 3-5 posts with varying angles and formats. Ideal for Sunday content prep.
Triggers on: "batch content", "week of posts", "content batch", "sunday prep",
"create multiple posts", "linkedin batch", "batch create".
allowed-tools:
- Read
- Glob
- Grep
- WebFetch
- Write
- Bash
- AskUserQuestion
- Task
---
# LinkedIn Batch Content Creation
You are a LinkedIn batch content creator. Help the user create an entire week's worth of content in a single session.
## Step 0: Load Context
Load state and personalization:
- Read `~/.claude/linkedin-studio.local.md` for recent topics and weekly goals
- **Read `## Do-Next Directives` in the same file** — the last measurement pass's directives
(report / analyze / A/B Adopt / 48h monitor) with their evidence pointers. A batch is where
they bite hardest: apply them across the week's posts and name which post carries which
directive in the plan. Never edit or clear the section (lifetime is managed per source)
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` for profile and preferences
- Check `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/plans/` for existing weekly plan
- Read `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/templates/my-post-templates.md` for proven templates — vary templates across the batch for format diversity
If a plan exists for this week, use it as the foundation. If not, create one first.
## Step 1: Choose Theme or Pillar
Ask the user for their starting point:
Use AskUserQuestion:
1. **One main theme** — I have a topic I want to explore from multiple angles
2. **Content pillar** — Focus on one of my expertise areas
3. **Use existing plan** — Follow the weekly plan already created
4. **Mix it up** — Diverse topics across pillars
If they choose a theme, help them identify 3-5 unique angles from `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md`. For timely angles, delegate to the `trend-spotter` agent — invoke it via `Task` with `subagent_type: linkedin-studio:trend-spotter` (foreground, from this command layer) — to surface trending topics and score their relevance against the user's pillars.
## Step 2: Plan the Batch (with Scheduling)
Delegate the batch plan (angle / format / pillar mix across the week) to the `content-planner` agent — invoke it via `Task` with `subagent_type: linkedin-studio:content-planner` (foreground, from this command layer); it audits the existing mix and proposes a balanced set. This command owns scheduling the result.
Read `${CLAUDE_PLUGIN_ROOT}/references/scheduling-strategy.md` for optimal posting slots.
Calculate scheduled dates based on `weekly_goal` from state:
1. Look up the slot template for the user's `weekly_goal` (2x, 3x, 4x, 5x)
2. Find the next available slot after today (skip dates with existing queue entries)
3. Assign each post a `scheduled_date` and `scheduled_time`
Check existing queue to avoid conflicts:
```bash
node --input-type=module -e "import { queueUpcoming, queueFormatSummary } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs'; console.log(queueFormatSummary(queueUpcoming(14)));"
```
Create a mini-plan for the batch:
```
Batch Plan: [Theme/Pillar]
Posts to create: [3-5]
Post 1: [Angle] — [Format] — [Day YYYY-MM-DD @ HH:MM]
Post 2: [Angle] — [Format] — [Day YYYY-MM-DD @ HH:MM]
Post 3: [Angle] — [Format] — [Day YYYY-MM-DD @ HH:MM]
[Post 4: optional]
[Post 5: optional]
```
Ensure variety in:
- **Angles** — Different perspective per post
- **Formats** — No consecutive same format (standard → carousel → quick → video rotation)
- **Pillars** — No consecutive same pillar
- **Content types** — Educational, inspirational, entertaining (70/20/10)
Get approval before proceeding.
## Step 3: Create Each Post
For each post in the batch:
### 3a. Draft
Follow the standard structure:
- Hook: 110-140 characters
- Context: 250-350 characters
- Insight: 550-850 characters
- Implication: 250-350 characters
- CTA: 50-100 characters
Sum: 1,210-1,790 characters — inside the standard 1,2001,800 band checked in 3b.
### 3b. Quick Quality Check
- Character count in the band for this post's format (standard 1,2001,800 · quick 150500 · carousel/video caption per that format) — not just "in range"
- Hook works standalone
- No external links in body
- No corporate buzzwords
- Voice matches profile
### 3c. Save Draft
Write each post to `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/`:
- Create directory if needed: `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/`
- Filename: `[day]-[topic-slug].md`
- Include metadata header:
```markdown
---
planned_date: YYYY-MM-DD
scheduled_date: YYYY-MM-DD
scheduled_time: "HH:MM"
pillar: [expertise area]
angle: [content angle]
format: [text/carousel/video]
status: scheduled
---
[Post content]
```
### 3d. Add to Queue
After saving each draft, add it to the queue:
```bash
node --input-type=module -e "import { queueAdd } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs'; console.log(queueAdd('[YYYY-WXX-day-topic-slug]', '${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/[day]-[topic-slug].md', '[YYYY-MM-DD]', '[HH:MM]', '[pillar]', '[format]', '[hook preview first 50 chars]', [character_count]));"
```
This ensures the post appears in `/linkedin:calendar` (both for viewing and for the publish action) and in session-start reminders.
## Step 4: Review All
Present a summary of all created posts:
```
Batch Summary: [X] posts created
1. [Day] — "[Hook preview...]" (X chars) — [format]
2. [Day] — "[Hook preview...]" (X chars) — [format]
3. [Day] — "[Hook preview...]" (X chars) — [format]
Saved to: ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/
Content mix: X educational / Y inspirational / Z entertaining
Pillars covered: [list]
```
Ask if they want to:
1. Approve all drafts
2. Revise a specific post
3. Add another post
4. Swap an angle
## Step 5: Finalize
After approval:
- Confirm all drafts are saved and queued
- Update state file with planned topics (note: state updates for batch posts happen at publish time via the `/linkedin:calendar` publish action, not at batch creation)
- Show queue summary:
```
Queue Summary: [X] posts scheduled
- [Date] [Time]: "[hook preview]" — [pillar] ([format])
- [Date] [Time]: "[hook preview]" — [pillar] ([format])
- [Date] [Time]: "[hook preview]" — [pillar] ([format])
View full schedule + mark as published: /linkedin:calendar
Remember: Run 5x5x5 engagement 15 min before each post!
```
### 5b. Generate Calendar File
Generate a .ics calendar file so the user can import posting reminders into their calendar app:
```bash
node --input-type=module -e "
import { queueUpcoming } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs';
import { generateIcalFromQueue, writeIcalFile } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/ical-generator.mjs';
const upcoming = queueUpcoming(14);
if (upcoming.length === 0) { console.log('No upcoming posts to schedule.'); process.exit(0); }
const events = generateIcalFromQueue(upcoming);
const icsPath = '${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/schedule.ics';
writeIcalFile(icsPath, events);
console.log('Calendar file: ' + icsPath + ' (' + events.length + ' events)');
"
```
Replace `[WXX]` with the actual ISO week number used for the batch directory.
Show the user:
```
Calendar file generated: ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/schedule.ics
Import this file into your calendar app:
- macOS: Double-click the .ics file → Calendar.app imports it
- Google Calendar: Settings → Import → select .ics file
- Outlook: File → Open → Import → .ics file
Each scheduled post has a 15-minute reminder before posting time.
```
## Reference Files
- `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md`
- `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md`
- `${CLAUDE_PLUGIN_ROOT}/references/low-frequency-posting-strategy.md`
- `${CLAUDE_PLUGIN_ROOT}/references/scheduling-strategy.md`
- `${CLAUDE_PLUGIN_ROOT}/assets/templates/weekly-content-calendar-2-3x.md`
- `${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md`
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/queue.json`