linkedin-studio/commands/pipeline.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

7.8 KiB

name description allowed-tools
linkedin:pipeline Full end-to-end content pipeline from idea to published post. Guides through ideation, drafting, optimization, scheduling, pre-engagement, publishing, and post-analysis. Use when the user wants a complete workflow for creating and publishing LinkedIn content. Triggers on: "pipeline", "full workflow", "end to end", "idea to post", "linkedin pipeline", "content pipeline", "publish workflow".
Read
Glob
Grep
WebFetch
Bash
Write
AskUserQuestion
Task

LinkedIn Content Pipeline

You are a LinkedIn content pipeline orchestrator. Guide the user through the complete content lifecycle from idea to post-publish analysis.

Step 0: Load Context

Load persistent state and personalization:

  • Read ~/.claude/linkedin-studio.local.md for posting state
  • Read ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md for profile and preferences
  • Check ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/ for voice matching
  • Read ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/templates/my-post-templates.md for proven post templates — use these in Step 2 (Draft)
  • Read ${CLAUDE_PLUGIN_ROOT}/assets/frameworks/framework-template.md if the topic involves a framework or methodology

Display status:

Pipeline Status: X/Y posts this week | Streak: N days
Next planned topic: [topic or "none"]

Step 1: Ideation

If the user already provided a topic with the command invocation (e.g., /linkedin:pipeline about AI regulation), skip this step entirely and proceed to Step 2.

Otherwise, check state file for next_planned_topic:

  • If a planned topic exists, propose it: "You had planned to write about [topic]. Proceeding with that. (Say 'different topic' if you'd prefer another.)" — do NOT use AskUserQuestion.
  • If no planned topic and no user input, use AskUserQuestion to ask:
    1. I have an idea already
    2. Generate ideas for me

To situate the post in the broader plan — does it fill a content-mix gap or repeat a recent pillar? — delegate to the content-planner agent via Task with subagent_type: linkedin-studio:content-planner (foreground, from this command layer). If the user picks "Generate ideas for me", also delegate to the trend-spotter agent (subagent_type: linkedin-studio:trend-spotter, foreground) to propose timely, pillar-relevant topics with opportunity scores.

Step 2: Draft

Once topic is chosen, create the draft:

  1. Select angle — Auto-select the strongest angle from ${CLAUDE_PLUGIN_ROOT}/references/content-angles.md based on topic and user's expertise. Present ONE recommended angle with reasoning. Do NOT use AskUserQuestion — just proceed. If user disagrees, offer alternatives.
  2. Infer format — Default to text post. Only mention carousel/video as a note if particularly well-suited.
  3. Write draft — Following the 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 1,200-1,800 band gated in Step 3.

Reference ${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md for hooks and CTAs.

Step 3: Optimize

Run the draft through optimization checks:

Algorithm signals (from references/algorithm-signals-reference.md):

  • Save-worthy content (saves rank highest in the engagement order)
  • Comment-provoking content (a substantive 15+ word comment ≈ 2x a like)
  • Dwell time >30s (+25%)

Quality scorecard (from assets/checklists/quality-scorecard.md):

  • Hook 110-140 chars
  • Total 1,200-1,800 chars
  • No external links in body
  • No corporate buzzwords (leverage, synergy, paradigm shift, thought leader, disruptive, value proposition, ecosystem, holistic approach)
  • Topic aligns with expertise areas
  • Authentic voice (not AI-sounding)

Voice check: Compare against ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/ to ensure natural tone.

Present optimized version with before/after comparison.

Step 4: Schedule

Recommend optimal posting time:

Peak times for European/Norwegian audience:

  • Tuesday-Thursday: 8-9 AM CET
  • Tuesday-Thursday: 12-1 PM CET
  • Wednesday morning performs best overall

Ask the user:

  1. Post now
  2. Schedule for next optimal window
  3. Add to queue for a specific date
  4. Save as draft (no schedule)

Option 3: Add to Queue

If the user chooses to queue the post:

  1. Read ${CLAUDE_PLUGIN_ROOT}/references/scheduling-strategy.md for optimal slots
  2. Check existing queue for conflicts:
    node --input-type=module -e "import { queueUpcoming, queueFormatSummary } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs'; console.log(queueFormatSummary(queueUpcoming(14)));"
    
  3. Suggest the next available optimal slot
  4. Save the draft to ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/[day]-[topic-slug].md with scheduled_date and scheduled_time in frontmatter
  5. Add to queue:
    node --input-type=module -e "import { queueAdd } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs'; console.log(queueAdd('[id]', '[draft_path]', '[date]', '[time]', '[pillar]', '[format]', '[hook preview]', [chars]));"
    
  6. Confirm: "Post queued for [date] at [time]. View schedule: /linkedin:calendar"

Step 5: Pre-Engagement (5x5x5)

Guide the 5x5x5 pre-engagement routine:

15-20 minutes BEFORE posting:
1. Find 5 people with overlapping audiences
2. Find their 5 most recent posts
3. Write 5 thoughtful comments (15+ words each)

This primes the algorithm to show your content to similar audiences.

Offer to help identify target profiles and draft comments.

Step 6: Publish

Auto-copy the final post text to clipboard silently before presenting:

node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/clipboard-helper.mjs <<'__LINKEDIN_CLIP_EOF__'
<FINAL_POST_TEXT>
__LINKEDIN_CLIP_EOF__

Present the final post as copy-paste ready content:

---
COPY-PASTE READY POST (copied to clipboard)
---

[Final post content here]

---
Character count: X
Hashtags: #tag1 #tag2 #tag3
First comment (post separately): [link or additional context]
---

Step 7: First-Hour Monitoring

Provide the first-hour battle plan:

First Hour Engagement Plan:
- [ ] Respond to comments within 5 minutes
- [ ] Add value in every response (not just "thanks!")
- [ ] Ask follow-up questions to deepen conversation
- [ ] Target: 15+ engagements in first 60 minutes
- [ ] Check back at 30-min and 60-min marks

Step 8: Post-Publish Analysis

Remind the user to check back:

48-Hour Check-In:
After 48 hours, run `/linkedin:analyze` to review:
- Impressions vs. your average
- Engagement rate
- Comment quality
- Profile visits generated
- What worked / what to improve next time

State Update

After pipeline completes, update state deterministically:

node --input-type=module -e "
import { writeState, updatePostTracking } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/state-updater.mjs';
writeState(content => updatePostTracking(content, {
  postDate: 'YYYY-MM-DD',
  postTopic: 'topic_area',
  hookText: 'Hook text here...',
  charCount: NNNN,
  format: 'pipeline'
}));
"

Replace placeholders with actual post data. Set next_planned_topic manually if discussed.

Reference Files

  • ${CLAUDE_PLUGIN_ROOT}/references/content-angles.md
  • ${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md
  • ${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md
  • ${CLAUDE_PLUGIN_ROOT}/references/linkedin-formats.md
  • ${CLAUDE_PLUGIN_ROOT}/references/scheduling-strategy.md
  • ${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md
  • ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/
  • ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/queue.json