CtrlK
BlogDocsLog inGet started
Tessl Logo

andrebrov/reel-script

Research and write the script for a talking-head reel — sharpen a topic into one arguable claim, search the web for facts and articles that back it (every claim sourced or cut), then write both a full teleprompter script and a beat sheet in the user's own voice. Hands its sourced articles to the broll-sourcing skill so they become the on-screen screenshots. Use when the user says they want to talk about a topic, asks for a reel script, wants facts or articles found for a take, or names a subject for "today's reel". Writing and research only — no video touched here.

75

Quality

94%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Low

Low-risk findings worth noting

Overview
Quality
Evals
Security
Files

SKILL.md

name:
reel-script
description:
Research and write the script for a talking-head reel — sharpen a topic into one arguable claim, search the web for facts and articles that back it (every claim sourced or cut), then write both a full teleprompter script and a beat sheet in the user's own voice. Hands its sourced articles to the broll-sourcing skill so they become the on-screen screenshots. Use when the user says they want to talk about a topic, asks for a reel script, wants facts or articles found for a take, or names a subject for "today's reel". Writing and research only — no video touched here.

Reel Script

Turns a topic into a defensible, recordable script. Ends where broll-sourcing begins, and hands it the research so nothing is searched twice.

topic ─▶ 1.ANGLE ─▶ 2.RESEARCH ─▶ ⏸ GATE A ─▶ 3.SCRIPT ─▶ ⏸ GATE B ─▶ broll-sourcing
                    (sourced)     fact sheet    (2 forms)   read aloud

Read voice.md before writing a single line. It is next to this file. The script is in his voice or it is worthless — including the non-native grammar, which is deliberate and must not be corrected.

Where things go

One dated folder per day, one slug per reel inside it:

20260831/bfcm-claude-code/
  brief.md        the angle, once settled
  research.json   sourced facts — feeds broll-sourcing Step 4 directly
  script.md       teleprompter + beat sheet
  raw/ work/ plan/ preview/ exports/     (reel-builder scaffolds these later)

YYYYMMDD is today's date, no dashes. The slug level stays even for a single reel — batch days put several here and the layout must not change shape.

Step 1 — Find the angle

A reel needs a position, not a topic. "BFCM and Claude Code" is a topic; it produces a Wikipedia article read aloud. Sharpen until it is one sentence someone could argue with:

BFCM 2026 is the first peak season where the checkout path was written by something that has never seen the traffic — and nobody is load-testing it.

Ask the user two things, and ask them before searching anything:

  1. What is your actual take? Not what is happening — what you think about what is happening, and what you would bet on.
  2. Who is wrong? Every post in voice.md has an opponent: the committee, the credulous adopter, Google's product org, the founder who won't delegate. Name it. A take with no opponent has no reason to be watched.

Write both into brief.md with the claim as a single sentence at the top. Nothing gets researched until that sentence exists.

Step 2 — Research

Search for facts that back the specific claim — not background on the topic. WebSearch and WebFetch. For each fact, capture all five:

fieldwhy
claimthe sentence it supports, in plain words
valuethe number or the verbatim quote — never paraphrased
urlwhere it came from
publication + daterecency is a fact about the fact; BFCM figures from 2024 are not this year's

A fact you cannot source gets cut, not softened. No "reportedly", no "studies suggest", no "around 70% of teams". Inventing a plausible statistic is the one failure that costs the audience — this account is followed because every number traces to something. If the claim needs a number that does not exist publicly, the honest moves are: say the number is not published, run the experiment yourself, or drop the beat.

Prefer, in order: primary sources (a platform's own report, a filing, an official changelog) → reporting that cites one → a named practitioner's first-hand account. A blog post summarizing a blog post is not a source.

Aim for 5–8 usable facts. Three survive to the script; the rest are ammunition for the comments.

Write research.json:

{"topic": "BFCM 2026 on AI-written code",
 "claim": "The first peak season running on code nobody on the team wrote",
 "facts": [
   {"id": "f1",
    "claim": "BFCM traffic is nothing like a normal day",
    "value": "$11.5B in sales over the BFCM weekend, peak 12,000 orders/minute",
    "url": "https://...", "publication": "Shopify", "date": "2025-12-02",
    "shoot": "article", "note": "screenshot the peak-orders stat block"}
 ]}

shoot and note are what broll-sourcing reads: article (screenshot it), image, video, or none (spoken only, no visual).

⏸ Gate A — the fact sheet

Present a table before writing anything:

| # | fact | source | date | shoot |

The user keeps or kills each one. Flag anything shaky yourself — a stat from a vendor about its own category, a number older than the claim needs, a single outlet with no primary source behind it. Do not wait to be caught; the cost of one bad number here lands on him in his own comments.

Save the survivors back to research.json.

Step 3 — Write both forms

Anything under 3 minutes is fine. Do not write to a tighter budget than that — the first draft of this script came in at 2:18 by cutting his voice out of it, and reading like a wire report was the price. Asides, self-deprecation and a rhetorical question cost words and are the reason it sounds like him.

Spoken pace is ~2.4 words/sec — measured across his real takes, not the 2.6 usually quoted:

words ≈ seconds × 2.4      2:00 ≈ 290 words      2:45 ≈ 400 words

Structure, taken from how the posts already work:

beattimewhat happens
Hook0:00–0:02The claim, cold. No greeting. A number if one fits.
Stakes0:12–0:28Why this is not a normal year — the strongest fact goes here
Mechanism0:15–0:45How it actually breaks. Two facts. This is the substance.
Turn0:45–1:05What to do instead. Specific enough to act on tomorrow.
Close1:05–1:15The undercut or the joke. Never "follow for more".

Keep the evidence beats clear of the first 15% and last 10% of runtime. plan_broll.py reserves those for the face and drops any sentence not wholly inside the middle — on a 90s reel the guard runs to 13.5s. A fact placed at 0:05 is structurally unillustratable, so the beat most likely to want a screenshot would be the one that can never get one.

Write script.md with both forms of the same script:

  • Teleprompter — every word, timestamped per beat, at the word budget above.
  • Beat sheet — the hook verbatim (it decides scroll-past, so it is never improvised), everything else as bullets with the fact id and word budget.

Tag each beat with the fact backing it ([f1]), so a cut fact visibly takes its beat with it. A beat with no tag is opinion — fine, but never more than one.

Step 3b — Anti-pattern check (before Gate B)

Run jbaruch's AI-writing detector over script.md. It is a defined procedure, not a vibe check.

Source of truth: ~/.claude/skills/blog-writer/references/ai-anti-patterns.md (39 patterns) and references/process.md (the three-pass procedure). Re-read both before every run — use their definitions, not your general sense of what "sounds like AI". If the skill is not installed, say so and skip; do not improvise a substitute, because invented patterns damage a voice more than the patterns they claim to fix.

Re-reading is not a formality. Run from memory and you get the contextual patterns and miss every mechanical sweep — which is where the real defect was found on this script.

Pass 1 includes five literal searches, not just a read

process.md specifies mechanical sweeps for the patterns a contextual read cannot see. Run them as searches over the spoken text:

#sweepflag
1case-insensitive "rather than"every hit joining two candidates for the same slot is contrastive negation wearing a comparative
3/4every sentence under 6 words3+ consecutive is a run — then check the definition, since fragments that each carry a full thought are not #4
7every paired em-dash — X —each occurrence is a hit, regardless of count
8em-dashes per sectionmore than two
12AI vocabulary watchlisttwo or more (delve, leverage, pivotal, crucial, seamless, robust, landscape, …)

Pass 2 is where a rewritten script usually fails

Strip adjacent sentences to their grammatical skeleton and compare shapes. This catches what Pass 1 cannot, because the vocabulary differs while the grammar is identical. Also count repeated openings across the whole script — five sentences starting "That is…" is a tell even when no two are adjacent.

The instructive failure, from this pipeline:

written: "That is not a scandal. That is just the arrangement." his own: "Not a vent out, just a statement of fact."

Two parallel sentences against one sentence with an appositive. Taking an author's real shape and making it symmetrical is the AI version of their voice — it passes every named pattern and fails the skeleton scan.

Then Pass 3 (soul check), the voice check against voice.md, and the proportionality check. In that order, no merging, no skipping.

The voice exemption — this is the part that matters here

The detector and voice.md will disagree, and voice.md wins on a tie.

"Not a vent out. Just a statement of fact."

That is pattern #1 Rhetorical Contrastive Negation, flagged with zero tolerance — and it is also a verbatim sign-off from his own published post, documented in voice.md. Rewriting it would remove the thing that makes the script sound like him.

The rule: a pattern that appears in the author's own published writing is voice, not slop. Before "fixing" any flagged line, grep voice.md and the quoted posts. If the shape is his, leave it and note why. Only rewrite what you introduced.

This is the same failure mode as correcting his non-native grammar: a clean result that no longer sounds like the author. The detector's own guidance says it outright — false positives damage the voice more than the pattern does.

What to expect

Spoken scripts trip fewer patterns than prose, but four recur:

  • #9 Preamble Announcements — the most persistent by far. "Now here is the part I actually want you to hear", "and this is why I am making this video". Cut from the same script twice, in two consecutive drafts. Announcing the move instead of making it is a reflex worth searching for by hand.
  • #4 Choppy Fragment Chains — three or more short sentences in a row.
  • #28 Labeling the Device — "that is the whole lesson", "read that again".
  • #38 Fake-Profound Kicker — a closing thesis earns its position; a mid-script one does not.

The failure that survives every pattern check

A script can pass all 39 and still read as AI, and it will do it the same way every time: written about the subject instead of from the author. Signs, all measurable:

symptomon the failing draftafter
first-person I2, both in the last line7, from the first sentence
sentence-length stdev5.0 — nothing over 20 words6.3, four long sentences
sentences opening "And"53
rhetorical question answerednoneone

The fix is not editing. It is reopening on his reaction and letting the facts follow — which is how every post in voice.md is built. Reportage that happens to be well written is the default failure of this step.

Report as a table — line, pattern, verdict (his voice / mine, rewrite) — and fix only the second kind.

⏸ Gate B — read it aloud

Ask the user to read it against a stopwatch before recording. Two things only a read-aloud catches: sentences that scan on the page and die in the mouth, and a script 20 seconds over. If it runs long, cut the weakest evidence beat whole — never trim every beat evenly, which flattens the thing into a list.

Step 4 — Hand off

Record the take, then invoke broll-sourcing, which picks up at the same folder. Its Step 4 reads research.json and screenshots the articles already found here instead of searching again — that is the entire reason the two skills exist as a pair.

Tell it the folder: 20260831/bfcm-claude-code/.

Principles

  • The claim comes before the research. Research first and you will find facts about the topic instead of evidence for the take.
  • Unsourceable means cut. Not softened, not hedged — cut.
  • Write in voice.md's voice, seams included. Clean grammar is the tell.
  • One opinion beat, maximum. The rest carries receipts.
  • Both script forms stay in sync; edit one, edit the other.
  • Run the anti-pattern check, but never let it sand off the author's own voice.

SKILL.md

tile.json

voice.md