Write talking-head scripts and produce Instagram reels and YouTube shorts
94
97%
Does it follow best practices?
Impact
85%
2.36xAverage score across 3 eval scenarios
Low
Low-risk findings worth noting
Process steps in order. Do not skip ahead.
Scripts for piece-to-camera video. The problem this solves is not writing — it is that a script with no shape opens on "hey guys, welcome back", wanders, and ends without telling anyone what to do. The Triangle gives it a shape.
T ── open ON the thought. No greeting, no throat-clearing.
│
MAES ── metaphor, analogy, example, or story. This is what makes it land.
│
A/N ── application, or next steps. What do they DO now?Full framework, with what each beat is for and how it fails:
references/triangle.mdAsk what the video is about, and refuse a topic. "Sales" is a topic. "Most people lose the sale in the first ten seconds" is a thought.
A topic has no edge, so the script wanders looking for one. Push until you have a single sentence someone could disagree with. If the user offers a topic, hand back two or three candidate thoughts drawn from it and let them pick.
Do not proceed on a topic. This step is the whole difference.
Ask what makes it real: a metaphor, an analogy, an example, or a story. One, not four.
Prefer whatever the user has actually lived — a number from their own data, a client, a time it went wrong. Invented examples read as invented. If they have nothing, an analogy from an unrelated domain is the next best thing, and a generic "for example, imagine you're a business owner" is the worst.
Never invent a statistic, a client, or an outcome on their behalf. Ask, or leave the slot empty and say so.
Application is "here is how you use this". Next steps is "here is what to do now". Pick one; doing both dilutes it.
"Comment below" is not next steps unless the comment is genuinely the action. Telling someone to go execute on something is stronger than farming a metric.
Write the script with the beats marked, so the shape is auditable and
check_yap.py can verify it:
[T] Most people lose the sale in the first ten seconds.
[MAES] I watched a rep last week open with four minutes of company history...
[A] Next call you take, say the outcome first and time yourself...Length: 150–200 spoken words per minute. A 60s video is 150–200 words; 90s is 225–300. Write to the target, not past it.
Write for the mouth, not the page. Short lines. One idea per sentence. Contractions. Read it aloud — anything you stumble on gets cut.
What makes a script sound recited rather than spoken — the tricolon, perfect antithesis, written-only vocabulary, em-dashes standing in for pauses:
references/spoken-tells.mdThat file is self-contained. To check it against the current, community- maintained list of LLM tells before a draft that matters:
skills/yap-writer/scripts/fetch_ai_tells.sh /tmp/tells.txtA failed fetch is a freshness check failing, not a blocker.
python3 scripts/check_yap.py draft.md --target 60It verifies the three beats are present and in order, estimates runtime against
the target, and flags greeting openers and written-not-spoken vocabulary. It
checks SHAPE, never quality — a present [MAES] beat says nothing about
whether the analogy lands, and clean vocabulary says nothing about rhythm.
Then read it aloud, standing, at pace. Every stumble is a sentence built for the eye. That test outranks the checker.
Fix what it flags, then re-run. Proceed when it is clean.
Emit two files beside each other:
<slug>.md — the beat-marked script, plus caption and hashtags if the user
wants them<slug>-teleprompter.txt — the same words, no markers, short lines with a
blank line at each beat, for reading on cameraThe teleprompter file is what gets recorded. From there, reel-builder's
talking-head mode takes the take:
Skill(skill: "reel-builder")Its plan_broll.py reads the recorded take's transcript and finds where b-roll
fits, so do not plan b-roll here — the timings do not exist until it is spoken.
Finish here.
.tessl-plugin
evals
skills
reel-builder
assets
references
scripts
yap-writer