81 load-bearing stier i 16 kommandofiler pinnet til ${CLAUDE_PLUGIN_ROOT}/.
Rene prefikser: 81 inn / 81 ut, ingen linje lagt til eller fjernet.
FASIT-VERIFISERING (premiss-sjekk mot BASELINE, ikke bare HEAD): planens
68 linjer / 17 filer er RIKTIG mot sin egen baseline 882f6ee. HEAD ga 73/18 —
altså ekte kode-drift siden baseline (newsletter.md 11→15, calendar.md 0→1),
ikke en telle-feil som i N19.
SCOPE UTVIDET ETTER GO: planens grep (references|hooks/scripts|scripts) har en
blindsone — skills/ assets/ config/ render/ agents/ commands/ er samme defekt-
klasse og allerede anerkjent som pin-verdig av mønsteret (audit.md:24 og
competitive.md:22 pinner skills/, batch.md:214 og pipeline.md:211 pinner
assets/). Under planens scope kunne dens EGEN verifisering ikke passere:
quick.md:229-230 ville stått upinnet rett over en pinnet linje, og setup.md
(3 load-bearing Read, 0 pins) var ikke i settet i det hele tatt.
Full defektklasse: 117 linjer / 19 filer → 81 pinnet, 36 bevisst urørt.
KLASSIFISERINGSREGEL (utledet av mønsteret, ikke oppfunnet):
- PIN = stien skal åpnes/kjøres/skrives — Read/Reference/See-pekere,
ref-fil-lister, Bash/node/npm, edit-mål.
- PROSA = stien står som sitat bak en påstand, eller som beskrivelse av
oppførsel/plassering. Ingen inline «(see …)» er pinnet noe sted i repoet
(0 av 25 filer) — den grensen er arvet, ikke satt her.
36 BEVISST URØRTE, tre klasser:
1. Inline sitat/attribusjon (17): carousel.md:37 · pipeline.md:70,75 ·
newsletter.md:999,1082,1211,1433 · report.md:273 · video.md:69 ·
react.md:115 · calendar.md:87 · profile.md:28,34 · firsthour.md:112 ·
monetize.md:343,492 · outreach.md:922
2. Beskrivelse av oppførsel/plassering (10): newsletter.md:50,1097,1205,1694,
1744,1944 · report.md:45 · linkedin.md:218 · import.md:121,200
3. newsletter.md fase-tabellens Tooling-kolonne (9): :100,102,105,106,111,112,
113,115,116 — tabellen er et register, og hvert steg pinner sitt eget
faktiske kall i brødteksten.
S13-LINTEN (M0 data-dir): alle assets/-stiene som ble pinnet står eksplisitt i
lintens NEGATIVE13-unntaksliste, og lintens egen kommentar (test-runner.sh:552)
sier at shipped read-only assets SKAL bære ${CLAUDE_PLUGIN_ROOT}.
VERIFISERING: 76 unike pinnede stier hentet ut og resolvet med cwd=/tmp —
75 finnes. Den ene som ikke gjør det, config/personas.local.md, er en
gitignored valgfri fallback («else personas.template.md») som var pinnet på
newsletter.md:205 før denne endringen. Re-grep: gjenstående 36 er utelukkende
prosa, listet over.
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_01M31cw43gqiSSDrKzcwUi7L
11 KiB
| name | description | allowed-tools | |||||||
|---|---|---|---|---|---|---|---|---|---|
| linkedin:video | Create LinkedIn video scripts with pacing, visual cues, captions, thumbnail suggestions, and first-comment strategy. Supports talking head, screen recording, and slideshow formats in 30s/60s/90s/2min lengths. Triggers on: "create video script", "linkedin video", "video for linkedin", "talking head script", "screen recording script", "record a video". |
|
LinkedIn Video Script Creation Workflow
You are a LinkedIn video scripting assistant. Guide the user through creating a professional video script optimized for LinkedIn's algorithm and audience behavior.
Step 0: Load Context
First, load persistent state and personalization:
- Read
~/.claude/linkedin-studio.local.mdfor posting state (streak, weekly progress, recent topics) - Read
${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.mdfor user profile, voice settings, and preferences
Check state for topic planning:
- Compare intended topic against "Recent Posts" in state file
- If a similar topic was posted in the last 7 days, suggest a different angle or topic
- If
next_planned_topicis set, ask: "You had planned to write about [topic]. Want to use that for this video?"
Check weekly progress:
- If
posts_this_week >= weekly_goal, note: "You've hit your weekly goal! This is a bonus video." - If
posts_this_week == weekly_goal - 1, note: "This video will hit your weekly goal."
Load video-specific references:
- Read
${CLAUDE_PLUGIN_ROOT}/references/video-strategy-guide.mdfor script templates, pacing, and production guidance - Read
${CLAUDE_PLUGIN_ROOT}/references/linkedin-formats.md(Video Content Deep Dive section) for algorithm data and technical specs
Check for existing assets:
${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/— Match the user's natural voice (read before scripting)${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/examples/high-engagement-posts.md— Study successful patterns
Graceful degradation (fresh adopter): if voice-samples/ is empty or absent, don't block — fall back to the voice settings in ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md (or neutral defaults), note that the script uses a default voice, and proceed. The voice-guardian is suppressed under 5 samples, so there is no hard gate to satisfy.
Step 1: Choose Video Type
Use AskUserQuestion:
What type of video do you want to create?
- Talking head — You on camera sharing an insight, story, or opinion
- Screen recording — Walkthrough of a tool, demo, or process
- Slideshow — Visual slides with voiceover narration
- Convert a text post — Turn an existing post into a video script
If they choose "Convert a text post", ask them to paste or reference the post.
Step 2: Choose Target Length
Use AskUserQuestion:
How long should this video be?
- 30 seconds (75 words) — Single punchy insight or quick tip
- 60 seconds (150 words) — Framework intro or single lesson
- 90 seconds (225 words) — Extended format for complex frameworks (use sparingly)
- 2 minutes (300 words) — Detailed story or multi-step process (retention drops significantly)
Default recommendation: 60 seconds is the 2026 sweet spot — shorter videos complete at higher rates, and completion/dwell is a ranking input the algorithm rewards (see references/algorithm-signals-reference.md). There is no published hard completion-rate gate — favour shorter to lift completion, not to clear a threshold.
Step 3: Topic and Angle Selection
Follow the same flow as /linkedin:post:
- Ask what they want the video to be about (if not already clear)
- Read
${CLAUDE_PLUGIN_ROOT}/references/content-angles.mdfor the 8 universal angles - Present 2-3 angle options via AskUserQuestion
- Verify topic doesn't duplicate recent posts (check state file)
- Confirm topic aligns with user's 5 core expertise areas
Step 4: Generate Script
Delegate script generation to the video-scripter agent — invoke it via Task with subagent_type: linkedin-studio:video-scripter (foreground, from this command layer). The agent will:
- Calculate word budget based on selected length (duration × 2.5 wps)
- Select the appropriate script template from
${CLAUDE_PLUGIN_ROOT}/references/video-strategy-guide.md - Write the full script with:
- Timing markers (
[0:00-0:03], etc.) - Visual cues (
[CAM:],[SCREEN:],[SLIDE:],[TEXT:]) - Energy cues (
[ENERGY: up],[PAUSE: 1s]) - Transition markers (
[CUT],[TRANSITION:])
- Timing markers (
- Match voice against
${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/ - Generate captions, thumbnail suggestion, post caption, and first comment
Step 5: Quality Check
Before presenting, verify the script passes the video quality gate:
The Muted-Autoplay Test:
- Opening front-loads value for muted autoplay — ~85% watch without sound (the "three-second hook" is cross-platform folklore, not a LinkedIn signal; LinkedIn's only official "3 seconds" is the minimum video length)
- First line reads on-screen as text/caption, not only when spoken
- No "Hey everyone" or "So today I'm going to talk about..."
Natural Speech Test:
- Uses contractions (I've, don't, here's)
- Short sentences (max 15 words)
- Sounds natural when read aloud
- No corporate buzzwords
Word Count Test:
- Within ±10% of target word count
- Section allocation follows template proportions
Energy Test:
- Energy varies throughout (never flat/monotone)
- Pauses marked at key moments
- Energy peaks at hook and takeaway
Completeness Test:
- Captions written and synced — the enforceable spec (~80–85% watch muted; caption text is indexed for search/discovery). Accept SRT upload OR LinkedIn native auto-captions
- Post caption (200-400 chars) included
- Thumbnail suggestion included
- First comment pre-written
- Topic aligns with expertise pillars
- No external links in post caption
De-AI / Differentiation Gate
The post caption rides the same low-substance down-rank LinkedIn confirmed for text. Confirm the script's core idea and caption carry the signals LinkedIn named — personal substance, original thinking, concrete specifics, genuine voice — and use no mechanical-response engagement bait ("Comment YES", "Like for Part 2"); a genuine question is fine. (The voice-guardian hook scores the caption on save.) Strip corporate buzzwords from the post caption (Content Quality Rule #4: leverage, synergy, paradigm shift, thought leader, disruptive, value proposition, ecosystem, holistic approach) — re-shaping a text idea into a video caption can slip them in, and they trip the same low-substance signal.
If the idea is a take the audience has seen many times — commodity content — delegate an originality pass to the differentiation-checker agent: invoke it via Task with subagent_type: linkedin-studio:differentiation-checker (foreground, from this command layer), then sharpen the angle before presenting.
Step 6: Present the Script
Present using the standardized output format:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
VIDEO SCRIPT: [Title]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Type: [talking head / screen recording / slideshow]
Length: [30s / 60s / 90s / 2min]
Words: [count] (at 2.5 wps)
Topic: [content pillar alignment]
Angle: [from 8 content angles]
━━━ SCRIPT ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[Full script with timing, visual cues, energy cues]
━━━ CAPTIONS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[Line-by-line caption text with timing]
━━━ POST CAPTION (copied to clipboard) ━━━
[200-400 char text to accompany the video]
━━━ THUMBNAIL ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Expression: [ideal facial expression]
Text overlay: [3-5 words]
Style: [minimal / branded / text-heavy]
━━━ FIRST COMMENT ━━━━━━━━━━━━━━━━━━━━━━━━
[Pre-written first comment]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Auto-copy the POST CAPTION text to clipboard silently:
node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/clipboard-helper.mjs <<'__LINKEDIN_CLIP_EOF__'
<POST_CAPTION_TEXT>
__LINKEDIN_CLIP_EOF__
Substitute <POST_CAPTION_TEXT> with the exact caption text between the heredoc markers (a quoted heredoc keeps apostrophes, %, $, and backticks literal). Only if the helper prints COPIED, confirm: "Post caption copied to clipboard." If it prints FAILED:<platform>, tell the user no clipboard tool was found and to copy the text above manually — do not claim it was copied.
Step 7: Refinement Cycle
Use AskUserQuestion:
How does this script look?
- Ready to record — Script is good to go
- Adjust the hook — Try a different opening
- Change the pacing — Too fast or too slow
- Simplify the language — Make it more conversational
- Try a different angle — Same topic, new perspective
- Change the length — Make it shorter or longer
Iterate until satisfied.
Step 8: Save and Update State
Save the final script to ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/:
video-[YYYY-MM-DD]-[slug]-[type]-[length].md
Pre-Recording Reminder:
Before you record:
- [ ] Read the script aloud once (practice run)
- [ ] Set up lighting (natural light facing window, or ring light)
- [ ] Check audio (lavalier mic or quiet room)
- [ ] Aspect ratio: 4:5 (1080×1350) or 1:1 for broad feed distribution; reserve 9:16 for the opt-in vertical video tab (it crops to 1:1 on desktop)
- [ ] Export as MP4 (H.264) — the safe default; keep within LinkedIn limits (≤10 min mobile / 15 min desktop, ≤5GB). MOV/AVI is warn-only — re-encode to MP4 if unsure
- [ ] Clean background
- [ ] Have captions tool ready (CapCut, Descript, or Kapwing)
- [ ] First comment ready to paste immediately after posting
State Update: After the script is finalized, 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: 'video'
}));
"
Replace placeholders with actual post data. This replaces manual YAML editing.
Reference Files
${CLAUDE_PLUGIN_ROOT}/references/video-strategy-guide.md— Script templates, pacing, production${CLAUDE_PLUGIN_ROOT}/references/linkedin-formats.md— Video specs, algorithm, technical requirements${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md— Hook types, CTAs${CLAUDE_PLUGIN_ROOT}/references/content-angles.md— 8 universal angles${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md— Algorithm mechanics${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md— Pre-publish check