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
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
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 aloudRead 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.
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.
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:
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.
Search for facts that back the specific claim — not background on the topic.
WebSearch and WebFetch. For each fact, capture all five:
| field | why |
|---|---|
claim | the sentence it supports, in plain words |
value | the number or the verbatim quote — never paraphrased |
url | where it came from |
publication + date | recency 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).
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.
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 wordsStructure, taken from how the posts already work:
| beat | time | what happens |
|---|---|---|
| Hook | 0:00–0:02 | The claim, cold. No greeting. A number if one fits. |
| Stakes | 0:12–0:28 | Why this is not a normal year — the strongest fact goes here |
| Mechanism | 0:15–0:45 | How it actually breaks. Two facts. This is the substance. |
| Turn | 0:45–1:05 | What to do instead. Specific enough to act on tomorrow. |
| Close | 1:05–1:15 | The 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:
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.
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.
process.md specifies mechanical sweeps for the patterns a contextual read
cannot see. Run them as searches over the spoken text:
| # | sweep | flag |
|---|---|---|
| 1 | case-insensitive "rather than" | every hit joining two candidates for the same slot is contrastive negation wearing a comparative |
| 3/4 | every sentence under 6 words | 3+ consecutive is a run — then check the definition, since fragments that each carry a full thought are not #4 |
| 7 | every paired em-dash — X — | each occurrence is a hit, regardless of count |
| 8 | em-dashes per section | more than two |
| 12 | AI vocabulary watchlist | two or more (delve, leverage, pivotal, crucial, seamless, robust, landscape, …) |
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 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.
Spoken scripts trip fewer patterns than prose, but four recur:
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:
| symptom | on the failing draft | after |
|---|---|---|
first-person I | 2, both in the last line | 7, from the first sentence |
| sentence-length stdev | 5.0 — nothing over 20 words | 6.3, four long sentences |
sentences opening "And" | 5 | 3 |
| rhetorical question answered | none | one |
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.
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.
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/.
voice.md's voice, seams included. Clean grammar is the tell.