ktg-plugin-marketplace/plugins/linkedin-studio/commands/video.md
Kjell Tore Guttormsen 29229c0b01 feat(linkedin-studio): video quality gate (captions + aspect guidance, drop 9:16 mandate)
Resolve the video-advice contradiction on the two surfaces this step owns
(research/03 D1-D3):

- commands/video.md: rename the "3-Second Test" to a "Muted-Autoplay Test"
  (front-load value for ~85% muted viewing; the "three-second hook" is
  cross-platform folklore, not a LinkedIn signal); make captions the
  enforceable spec (SRT or native auto-captions, indexed for search);
  aspect ratio as guidance (4:5/1:1 preferred for broad distribution,
  9:16 opt-in for the vertical video tab, crops to 1:1 on desktop); add
  MP4-default + warn-only MOV/AVI + official upload limits to the
  pre-recording reminder.
- references/linkedin-formats.md: reframe the 9:16 "distribution boost"
  as uncorroborated heuristic; 4:5 "deprioritized" -> 4:5/1:1 preferred;
  drop the "3-second hook"; MP4 safe-default + warn-only MOV/AVI; replace
  "good video rewarded more than ever" with the honest "per-video reach
  declining; documents/carousels out-engage video."

algorithm-signals-reference.md (the canonical magnitude source) was
already reconciled in Phase 0 (line 56 reads "declining ... 4:5/1:1
preferred, captions are the enforceable spec") and carries no boost copy,
so it is intentionally untouched here — and it is not in this step's
manifest.

Verify: grep 'must be 9:16|9:16 (1080|3-second hook' video.md
linkedin-formats.md -> none; 'captions' video.md -> 5; 'deprioritized'
linkedin-formats.md -> none; structure lint 61/61.

KNOWN RESIDUAL (flagged for follow-up, NOT in this step's scope):
- references/linkedin-growth-playbook-2025-2026.md:216 still carries a
  "9:16 ... distribution boost" line. That file is owned by Step 17, but
  Step 17's changes are newsletter-distribution — the video line would
  fall through. Fold this into Step 17 or the review gate.
- references/video-strategy-guide.md:300 still says "the 3-second test
  determines 70% of retention." That file is owned by NO plan step
  (orphaned) — needs a home. Surface at session end for an operator
  decision.

Plan Step 15 (Wave 4 S2). Counts unchanged.
[skip-docs]: tre-doc + version bump deferred to Step 21 per remediation plan.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 02:37:51 +02:00

9.9 KiB
Raw Permalink Blame History

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".
Read
Glob
Grep
Write
Bash
AskUserQuestion
Task

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.md for posting state (streak, weekly progress, recent topics)
  • Read skills/linkedin-studio/SKILL.md for 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_topic is 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 references/video-strategy-guide.md for script templates, pacing, and production guidance
  • Read references/linkedin-formats.md (Video Content Deep Dive section) for algorithm data and technical specs

Check for existing assets:

  • assets/voice-samples/ — Match the user's natural voice (REQUIRED before scripting)
  • assets/examples/high-engagement-posts.md — Study successful patterns

Step 1: Choose Video Type

Use AskUserQuestion:

What type of video do you want to create?

  1. Talking head — You on camera sharing an insight, story, or opinion
  2. Screen recording — Walkthrough of a tool, demo, or process
  3. Slideshow — Visual slides with voiceover narration
  4. 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?

  1. 30 seconds (75 words) — Single punchy insight or quick tip
  2. 60 seconds (150 words) — Framework intro or single lesson
  3. 90 seconds (225 words) — Extended format for complex frameworks (use sparingly)
  4. 2 minutes (300 words) — Detailed story or multi-step process (retention drops significantly)

Default recommendation: 60 seconds is the 2026 sweet spot — LinkedIn requires 30% minimum completion rate or your video gets zero distribution. Shorter videos achieve higher completion rates and the algorithm rewards that heavily.

Step 3: Topic and Angle Selection

Follow the same flow as /linkedin:post:

  1. Ask what they want the video to be about (if not already clear)
  2. Read references/thought-leadership-angles.md for the 8 universal angles
  3. Present 2-3 angle options via AskUserQuestion
  4. Verify topic doesn't duplicate recent posts (check state file)
  5. 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:

  1. Calculate word budget based on selected length (duration × 2.5 wps)
  2. Select the appropriate script template from references/video-strategy-guide.md
  3. 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:])
  4. Match voice against assets/voice-samples/
  5. 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 (~8085% 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.)

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 thought leadership 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:

printf '%s' '<POST_CAPTION_TEXT>' | node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/clipboard-helper.mjs

Then confirm: "Post caption copied to clipboard."

Step 7: Refinement Cycle

Use AskUserQuestion:

How does this script look?

  1. Ready to record — Script is good to go
  2. Adjust the hook — Try a different opening
  3. Change the pacing — Too fast or too slow
  4. Simplify the language — Make it more conversational
  5. Try a different angle — Same topic, new perspective
  6. Change the length — Make it shorter or longer

Iterate until satisfied.

Step 8: Save and Update State

Save the final script to assets/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

  • references/video-strategy-guide.md — Script templates, pacing, production
  • references/linkedin-formats.md — Video specs, algorithm, technical requirements
  • references/engagement-frameworks.md — Hook types, CTAs
  • references/thought-leadership-angles.md — 8 universal angles
  • references/algorithm-signals-reference.md — Algorithm mechanics
  • assets/checklists/quality-scorecard.md — Pre-publish check