format-timeline — one family, one month, the mornings change
1. Read first
knowledge/ad-formats/_FORMAT-CORE.md(doctrine, lane limits, gates, launch). Binding; this skill only adds the timeline structure.references/beat-sheet.md: both beat sheets, the milestone truth table (what is actually true at each stage, cited), the reconciled static copy.references/sources.md: IM8 reference ad beat by beat, davidaistar statics notes, our receipts.references/template-C07-timeline-stack.json: the proposed static template, templates.json schema.- Video:
skills/cartoon-h3/SKILL.md(VO clarity gate, batches, credit discipline),output/dawn-combo-map-2026-10-05/MAP.md§2A, stake bankoutput/creative-strategy-cooper-2026-10-05/dawn-stakes.md. - Static:
skills/dawn-statics/SKILL.md(all 8 locks, the copy method, Fish 9-30 rulings), reference batchoutput/dawn-iterate-2026-10-04/statics/(template-driven render path). - Facts:
knowledge/brands/dawnbands/product-truth.md; outcome evidence:research/customer-evidence-2026-09-15.md,research/voc-competitor-reviews-2026-10-02.jsonl.
2. When to use / when not
- Use to answer the #1 purchase hesitation, "will it actually wake him, and how soon" (wake doubt 82/156 = 52.6%, wear doubt 18.6%, owned survey 9-15). A timeline answers objections in the order she has them: will he wear it → will it wake him → will it last → what changes for me.
- Evidence status: untested on Dawn (both executions). Signals: IM8's 1:51 AI timeline (Foreplay #7); davidaistar ranks the timeline static as the #1 missing static (
analysis/diff_statics.mdtop-5 #1); our oneweek song already tells its story day by day (Monday...Saturday) and paid $1,106 / 26 purchases / $42.55 CPA / ROAS 1.81. His AOV-lift claim is unverified and doesn't map: a band isn't a refill. - Video must follow ONE family with mom narrating. IM8's format is an explainer over a body; character-less explainer VO got 0 purchases on Dawn (MAP.md "Don't build"). Anatomy-style inserts are allowed only inside her story, one shot at most.
- Don't use for a stake the mornings didn't cause, college/kid-money stakes, dated promises ("by day 14 he..."), or any milestone the truth table can't back. Don't use the static as a testimonial vessel (testimonial statics lose, MAP.md §2B).
3. The format
- (a) Video, 9:16, 60-120 s, cartoon-h3 narrator (one ElevenLabs mom voice). Shape: her morning and the stake → why (one explainer line) → the band arrives → night one → the first mornings → week two → a month on → payoff on HER → CTA. The calendar moves; the family stays the same. One style per ad (clay sheets already exist for Mom/Dad/Caleb + kitchen/teen room/hallway/bedroom, §9).
- (b) Static, 1:1 (4:5 via
--aspects), template C07 timeline-stack: headline (her verbatim callout) → root-cause sub → three stacked stages on a gold spine (Tonight / Tomorrow morning / Every morning after) with objects-only photos moving night → dawn → full morning → product cutout → 60-night pill. - Reference: Foreplay
07_timeline(IM8 Daily Ultimate Essentials, 1:51): "if a man who drinks regularly took one sachet every morning for 3 weeks, this is what happens", calendar flips to Week 1/2/3, 3D anatomy per stage, real UGC grid at the end.
4. Why it sells
- The timeline converts "does it work" into "what happens next", which she can picture. Each stage retires one objection and the last stage pays off on her.
- Video = recipe A (story): mom first-person narrator, an accuser close to her in the opening (husband / school / her own kid, stake bank), a credible explainer INSIDE the story (nurse / pediatrician, quoted by mom), payoff = vindication + her morning back. Problem-aware: line 1 names her situation in action.
- Static = recipe B (callout): brand voice to her, her daily burden, exhaustion → relief, authority = guarantee/science, payoff = kid independence / calm morning. No person, no quote dressed as a buyer.
5. Beat sheet (full rules + truth table in references/beat-sheet.md)
(a) Video
| Beat | % runtime | Job | Must contain |
|---|---|---|---|
| 1 Hook | 0-8 | Stop the scroll on her | Her situation in action + the stake on her (VOC/stake bank) + the timeline promise ("this is what the next month looked like") |
| 2 Before | 8-22 | Prove she's the alarm | The knocks, the yelling, what she tried (generic, no brands, never bed shakers); the accuser's line quoted by mom |
| 3 Why + arrival | 22-32 | Root cause, product in | Explainer inside the story, Fish's root-cause line verbatim; the band arrives; product named once |
| 4 Night one | 32-45 | Kill wear doubt | He puts it on himself; set on the band, no app; she lies awake anyway |
| 5 The first mornings | 45-62 | Kill wake doubt, honestly | Buzz on the wrist, keeps going until he turns it off; nobody else wakes; morning one he's awake but not up yet (Q06); by the third she hasn't knocked |
| 6 Week two | 62-76 | Prove it lasts | Routine: he charges it himself (battery ~two weeks), little sibling / husband sleeps through, she stops setting her own early alarm |
| 7 A month on | 76-92 | Payoff on HER | The accuser sees it (vindication) + one concrete thing she has back |
| 8 CTA | 92-100 | Offer | Product name + 60-night wake-up guarantee, spoken; end card (optional, --end-card; off by default per Fish 10-06) |
(b) Static (reading order, top to bottom)
| Slot | Job | Rule |
|---|---|---|
| Headline | Recognition: her burden | Her verbatim line that reads as a callout TO her ("you"/"your", like the §Static spec example), voc_check ≥1 + hit file read; or declared card_item; ≤8 words unless verbatim. A first-person "I…" quote is mom-first POV (1.53 vs brand voice 1.87, MAP §2B): declared variant only |
| Root-cause sub | Why | "An ADHD brain tunes out a sound it hears every morning." (ADAPTED from Fish 9-30 "Their brain tunes out…" to put ADHD on the image; Fish approves the adaptation at the sheet, else keep his line verbatim and name ADHD in the headline) |
| Stage 1 Tonight | Wear/setup doubt | True product fact: set on the band, he puts it on |
| Stage 2 Tomorrow morning | Mechanism | Fish 9-30 line verbatim: "Dawn vibrates on the wrist and keeps getting stronger until they press the button." |
| Stage 3 Every morning after | Payoff | Independence + calm (claim-unlocked outcome, no date); may close on a "without …" clause naming her burden ("…without you at his door"), the objection-in-one-line move from starpop ai-static-ads-that-convert |
| Product + pill | Proof/risk reversal | Real cutout, display dark; "60-night wake-up guarantee" |
6. Pack spec (video) and static spec
- Step 0 — combo plan (feedback loop,
workflow-combo-loop):python3 scripts/combo_loop/plan.py --format format-timeline --brand dawn→ pick one combo (a paying parent + ONE changed dimension) and paste its block into the pack front matter / job or spec JSON ("combo": {...}; no file →tags.py register --prefix):combo_avatarcombo_anglecombo_povcombo_authoritycombo_stakecombo_stake_oncombo_emotioncombo_root_causecombo_mechanismcombo_payoffcombo_devicecombo_formatcombo_parentcombo_variablecombo_ad_prefix(= the launched Meta ad-name prefix).python3 scripts/combo_loop/tags.py check <pack>must PASS before concept approval; the weekly refresh reads results back by that prefix.
Video pack (output/concept-packs/dawnbands-timeline-<slug>-<date>.md, new slug every run):
- Front matter: format: cartoon-h3, brand: dawnbands, format_skill: format-timeline, parent: oneweek song (sa-ontime-04-relatab-animation-song-oneweek-a-v2copy, $42.55 CPA, ROAS 1.81), iteration: the ONE variable (e.g. "experiment week before the product → timeline of the product in use; same family, same accuser"), elevenlabs_voice_id: the mom narrator (DruqipkeFENaGA2DCMeV = the wife narrator of the 10-03 guestroom packs; confirm with Fish), vo_tempo, body_start (3 hooks), title: (lines split by |, shown while line 1 plays), end_card:, style, cast, envs, product_truth. style_key/style_block/style_anchor/product_truth become --style/--style-block/--style-ref/--product-truth via python3 -m scripts.cartoon_h3.packargs (refs in <pack>.args, §9); visual_negative is a record.
- product_truth: from product-truth.md: matte black ribbed silicone band, small flush LED time display DARK when idle, three alarms, set on the band, no app. Never "no display" (the 10-03 packs said that; product-truth.md overrides).
- ## VO Script: N. "line", one sentence per line, 5-12 words, no speaker tags (single narrator). Milestone lines carry the label AND the event in one line ≥5 words ("Night one, he put it on without a word."): a bare "Night one." is under 1.2 s and gets merged into a neighbour.
- ## Scene visual intents: N. **role** — <env>: <who is on screen, doing what, framing>; roles narrator (hook), narrator, reveal (band arrives), cta. pack.py marks a panel as a product panel whenever the intent says "the band", "wristband", "dawn band", "black band", "ribbed band" or "silicone band" (PRODUCT_IN_FRAME_RE); product panels cap their batch at 3. Name the band only in intents that show it.
- Cast: Mom (narrator, 35-54), the kid (one, fixed age), the accuser (husband/dad by default), optional little sibling. Two similar-age characters never share a batch.
- Envs: teen room, kitchen, hallway, master bedroom (+ school office only if the stake is the school).
Static spec: copy json per static (headline, root_cause_sub, steps, rows, pill; slots and caps in the C07 file) + one spec.json entry per static in the gen_statics shape (slug, layout: ../static-templates/refs/C01.jpg (the gate's existence check; the same C01 image is render input 2, Fish 10-03), template: C07, lines = headline / sub / bullets [3 stage lines + pill], voc or card_item, why, alts ≥2) + top-level waivers ([{"slug": "*", "rule": "rule9", "reason": "..."}], read by gen_statics.py itself since 10-06; a rule substring like "MISSING WRIST-VIBRATION MECHANISM" also works), or a top-level chain naming the timeline's own steps instead of waiving.
7. Visual grammar
- Video, per milestone: a recurring establishing shot carries time: the same teen-room door at night → grey dawn → warm morning → bright morning; a paper wall calendar with X marks and NO numerals; the kitchen clock with hands only. No readable text anywhere (milestone words live in VO + captions).
- Show the result, not the band. Night one: the band on his wrist resting flat on the duvet, side-on, he's not looking at it, lamp off, display dark. First mornings: his eyes opening + small cartoon motion lines at the resting wrist (never a raised wrist, never a lit face). Week two: band lying flat beside a charging cable on the nightstand in daylight. A month on: no band at all, her face and the kitchen.
- Visuals never run ahead of the VO. A before-stage or night-one shot shows no after-state: no calm mom, no kid up on his own, no empty hallway until the line that earns it plays (starpop
create-and-clone-competitor-ads-with-ai: don't let the image hand the character the result before the script does). Check every intent against its VO line's stage before the storyboard goes to Fish. - Before vs after framing: before = tight on MOM at his door, mid-knock; after = wide, MOM alone in the kitchen with coffee, the hallway empty behind her. The accuser's line is staged on MOM's face (narrator quotes it; no lip-sync anyway).
- The explainer insert (optional, ≤1 shot): a cartoon brain asleep under a blanket, sound waves bouncing off, a soft pulse at the wrist getting through. Never a standalone anatomy segment.
- Static: objects-only row photos (people render readable faces 2 runs of 2, dawn-statics); the band appears ONLY as the real cutout bottom-left; morning light in rows 2-3; brand lock palette; no clocks.
8. Audio
- One EL mom voice, warm, tired then lighter; narration ≥3.4 wps overall (vo_check FAIL below), dead air ≤0.4 s. 60-120 s ≈ 210-400 words.
- Numbers spelled with spaces in VO ("night one", "week two", "six thirty"): video is outside the statics qualifier ban, but every count must be true to the family's story and the truth table.
- One ducked warm-tactile bed (assemble default), no hits or risers. No buzz SFX yet: the library has no buzz file. The per-beat SFX layer is BUILT (10-06:
## Sound cue sheet+H3_SFX_PLAN=<pack.md>on the assemble stage,scripts/cartoon_h3/sfx.py); a buzz cue needs a sourced file and Fish's go (registry foley model = still NOT BUILT). - End card (optional,
--end-card; off by default per Fish 10-06) 3 s (end_card:text = product name + 60-night wake-up guarantee;end_card_clip:the product-spin-on-navy clip if Fish wants motion).
9. Production
(a) Video (free until refs/canvas; reuse the clay sheets in output/cartoon-h3/_refs/dawn-songs-2026-10-04/clay/: char-mom, char-dad, char-caleb, env-teen-room/kitchen/hallway/master-bedroom, product-band = $0 sheets)
# zsh. <pack>.args (core §5: ALWAYS packargs). Full paths in the file (packargs does not expand $vars); C below = output/cartoon-h3/_refs/dawn-songs-2026-10-04/clay:
# --char-ref mom=$C/char-mom.png --char-ref caleb=$C/char-caleb.png --char-ref dad=$C/char-dad.png --env teen-room=$C/env-teen-room.png
# --env kitchen=$C/env-kitchen.png --env hallway=$C/env-hallway.png --product-ref $C/product-band.png --characters "Mom, Dad and Caleb"
# (front matter style_key: claymation + product_truth + style_anchor become flags)
P=output/concept-packs/dawnbands-timeline-<slug>-<date>.md; S=<slug>
A=(${(z)"$(python3 -m scripts.cartoon_h3.packargs $P)"}); A=(${(Q)A})
python3 -m scripts.cartoon_h3.run $A --dry-run # free: cost estimate (h3.py table)
python3 -m scripts.cartoon_h3.run $A --stage vo # EL VO + vo_check gate; Fish listens
python3 -m scripts.cartoon_h3.run $A --stage storyboard # free; storyboard.md (tier per batch) → Fish
touch output/cartoon-h3/$S/storyboard.approved # Fish only
python3 -m scripts.cartoon_h3.run $A --stage canvas # Image gen role (registry), paid
python3 -m scripts.cartoon_h3.run $A --stage gen --prompts-only # Fish reviews motion prompts
python3 -m scripts.cartoon_h3.run $A --stage gen --spend --backend fal --model h3-max --candidates 1
python3 -m scripts.cartoon_h3.run $A --stage assemble --hub # captions from script + (optional end card) + gemini_qa
- New sheets (other style/cast) =
python3 -m scripts.cartoon_h3.sheet <out.png> <prompt.txt> [anchor.png](paid, ~$0.15-0.30), dry-run listing first (pattern:output/dawn-iterate-2026-10-04/video/render_sheets.sh). - Cost: 90 s ≈ 7-10 H3 batches (≤15 s, ≤4 panels, product batches ≤3). h3.py
FAL_PRICE(fixed 10-06 from the fal page): h3-max 768P $0.08/s ($1.20 per 15 s) + ~$0.10-0.16 reference surcharge per batch;run.py --dry-runwrites the per-batch quote totiers.md. Budget ~$8-14 video + ~$2 canvases + EL quota. Check fal / Higgsfield / kie balances first. - Shot tiers (core §2b): tag every batch in
storyboard.md. A = hook first 3 s, band arrives/on his wrist, the first-morning buzz, CTA, 3-person shots (Mom + Dad + Caleb); B = Mom at the door, kitchen dialogue staging; C = the recurring door/calendar/clock time-jump shots, empty hallway. run.py auto-tags tiers into<run>/tiers.md+plan.json(tiers.py; re-tag if the word match is wrong); per-tier models via--tier-models(fal), default all H3-max. - Draft → final (core gate 6b): free drafts = storyboard, canvases,
--prompts-only. A paid H3 draft isrun.py --draft(480P at $0.05/s vs $0.08/s, own<slug>-draftdir, prints the native re-render command); finals re-render natively (a 480P→--hdupscale lost to native on Fish's 10-04 eye test), so draft only when staging needs iteration; otherwise one candidate at final quality,--regen Nper failed batch. - ≤5 refs per batch with a style anchor (core §3): Mom + Dad + Caleb + product + one room = 5, so 3-person batches stay in one room.
- Hooks: 3 hooks × 1 shared body (
body_start); h1 runs to completion before h2/h3.
(b) Static (template route = the 10-04 batch pattern; copy that folder's scripts into the new batch dir)
B=output/dawn-timeline-statics-<date>; S=$B/spec.json # spec carries `waivers` (rule 9 SA2 chain, reason written)
sed 's/60-night wake-up guarantee//g' $B/copy/*.json | grep -nEi '\b(day|night|morning|week|month)s?[ :]*([0-9]+|one|two|three|four|five|six|seven|ten|fourteen|twenty|thirty|sixty|a few)\b|\b([0-9]+|one|two|three|four|five|six|seven|ten|fourteen|twenty|thirty|sixty|a few)[ -]*(day|night|morning|week|month)s?\b|\bwithin an? (day|night|week|month)' # time-label gate: must print nothing
python3 scripts/statics/voc_check.py "<her card item>" "<alt 1>" "<alt 2>" # ≥1 hit each
grep -rli "<her card item>" knowledge/brands/dawnbands/research # which file hit: voc-competitor-reviews*.jsonl = another brand's buyer, not her
python3 scripts/statics/gen_statics.py $S --check # real gate; waived findings print as WAIVED with their reason (10-06)
python3 scripts/statics/gen_statics.py $S --list # sheet (incl. waivers + chain) → Fish
python3 - --go <<'EOF' # PROPOSED C07 prompt + inputs (product, C01 layout ref, board); drop --go to print only
import json,sys; from pathlib import Path; sys.path.insert(0,"knowledge/brands/dawnbands/static-templates"); import make_prompts as mp
from scripts.cartoon_h3.canvas import gen_canvas_fal
t=json.load(open("skills/format-timeline/references/template-C07-timeline-stack.json")); c=json.load(open("<copy.json>"))
w=mp.lint(t,c); r=mp.render(t,c); print(w, r["inputs"], r["prompt"], sep="\n")
if not w and "--go" in sys.argv: gen_canvas_fal(r["prompt"], Path("<B>/renders/<slug>.png"), [p for _,p in r["inputs"]], size={"width":2048,"height":2048}) # PAID, Fish's go
EOF
python3 scripts/statics/static_review.py $B/renders --spec $S # two-vote FAIL; eyeball full size
python3 ~/ad-batch-hub/stage-session.py $B/renders --brand "Dawn Band" --type static # the renders dir (iterdir is not recursive); refuses without passing sidecars
- gen_statics reads
waiverssince 10-06, so a waived C07 can also gogen_statics.py $S --out $B/renders --new-layout --improvise --candidates 2 --dry-run(layout= C01.jpg, the C07 skeleton aslayout_note), then the same without--dry-runon Fish's go; refresh approved statics with--recycle <pick.png> --only <slug> --out <dir>(writes<slug>.r2.pngif the dir holds the base). The make_prompts route above stays the default for C07. - Cost: ~$0.15-0.30 per render; 3 statics + one retry each ≈ $2. Product redrawn → hard path: render "NO PRODUCT" and PIL-paste
product-cutout-unlit.png(dawn-statics "Product fidelity, hard path").
10. Gates & QA checklist
- [ ] Parent named with CPA (video: oneweek $42.55; static: slop body family ~$33); ONE variable stated.
- [ ] Every milestone traced to a row of the truth table (beat-sheet.md); no dated promise, no invented rate ("most kids by day 3").
- [ ] Video: one family, mom narrates every line; accuser + stake from the stake bank (cite #); explainer inside the story, Fish's root-cause line verbatim; payoff on HER.
- [ ] Video: honest first-morning beat (awake ≠ up, Q06); product only from beat 3; band words only in intents that show it.
- [ ] Wrist rule in every product intent; no readable text; clocks hands-only; calendar without numerals.
- [ ] No intent shows a later stage's result than its VO line has reached (before/night-one shots carry no calm, no self-wake, no empty hallway).
- [ ] Red-team pass (timeline math across the month, battery/charge timing, who knows what, product facts).
- [ ] vo_check PASS; Fish listened; storyboard approved with a tier (A/B/C) per batch; motion prompts reviewed; balances checked before
--spend. - [ ] Static: time-label grep prints nothing; headline voc_check ≥1 and the hit file is a parent thread/survey (not competitor reviews); ADHD on the image;
why+alts;gen_statics.py --checkPASS with documented waivers only; Fish approved the approval sheet; render inputs include the C01 layout ref. - [ ] Static: band only as the real cutout; objects-only rows; static_review PASS/WARN listed; eyeballed full size.
- [ ] Final video: freezes 0, dark 0, captions from script, end card (optional,
--end-card; off by default per Fish 10-06), gemini_qa, Fish watched it.
11. Variants & test plan
- Video test 1: timeline vs its parent story (oneweek), own ad set in Testing CBO with a video floor (Fish's go, Meta write). Read at 7 days: CPA vs $42.55 and breakeven (~$42), hook rate + hold via
python3 -m scripts.cartoon_h3.readout --concept <concept>(ad names<concept>-h<i>-l1). Caveat: song → spoken is a second variable until format-spoken-drama's song-vs-spoken read lands; call it a format test, not an iteration read. - 3 hooks per body: (a) the accuser's line quoted by mom, (b) the timeline promise ("This is what one month did to my mornings."), (c) night one ("The first night he wore it, I still set my alarm."). Hook (b) vs (a) is the format's own question.
- Then one variable at a time: accuser (MAP §3 order), payoff (vindication vs her time back), style (re-skin).
- Static test: own ad set in Testing, parent slop body + title locked, image = C07 (the one variable), 3 statics = 3 headline callouts on the same template, floor per dawn-statics "next format lane". Read CPA at 7 days vs the slop family's paying grids (D05 $30.69, D14 $31.39). Units per order is a free side read for the AOV claim; don't expect it.
- Later static variant (needs real proof): stage labels taken from verified post-purchase quotes that contain their own timing, credited honestly. Blocked until the post-use survey exists (§12).
12. Failure modes
- Time labels slip onto a static ("Day 14", "Night 1", "week two"):
gen_staticsonly catches "N days/nights" and make_prompts lint has no time rule; the grep in §9 is the gate. C01 already bans time labels. - Milestones invented: Dawn has no post-use outcome data (no day-14 survey; Okendo's 2,142 reviews are imported, 95% predate the first order; bottleneck diagnosis 10-03). Use only the truth table; never quote Okendo as proof.
- Survey quotes and voc_check: since 10-06 the corpus holds the buyer survey CSVs (workspace
dawn-survey-responses_1.csv+ the 09-15 184-row export), so owned-survey lines hit, labelledsurveywith the file. Okendo hits print as NOT COUNTED (94.6 % predate the first order). Lines from the newer 9-23 export not on disk still score 0: declare them ascard_itemwith the survey ref. - gen_statics rule 9 (default = SA2 Apology Mom chain) fails timeline statics on "MISSING WRIST-VIBRATION MECHANISM" ('dawn band' + 'startle' required) even with Fish's mechanism line: declare a timeline
chainin the spec, or waiverule9inwaiverswith the reason written (gen_statics reads both since 10-06). - Pill conflict: 10-04 batch shipped "Wake up guaranteed · 60 days" (gate regex fails "60 days"); product-truth's storefront promise is the 60-night wake-up guarantee. Use "60-night wake-up guarantee".
- Generator doctrine conflict: dawn-statics 9-30 says GPT Image 2 on Higgsfield; templates say gpt_image_2 fal first; the registry's Image gen role and the 10-04 shipped batch say GPT Image 2.5 on fal (
openai/gpt-image-2.5/flare/edit, canvas.py default). Follow the registry role unless Fish rules. - Character-less drift: the video turns into an anatomy explainer (IM8 style) → 0-purchase pattern. Cut to one insert; every beat shows the family.
- Lit band in night shots (night one, charging) → wrist down/flat, lamp off, regen that batch only.
- Overpromise on morning one breaks belief for the 52.6% who doubt it wakes him; keep the honest beat.
- Not built yet (needs Fish's go): C07 merged into
templates.json; chapter title cards over the video (assemble only overlaystitle:and captions); a day-14 post-use survey for real timeline quotes. (Built 10-06: gen_staticswaivers/chain; voc_check survey + Okendo paths, Okendo reported not counted.)
13. Sources
~/research/davidaistar/foreplay/07_timeline.gemini.md, REPORT.md (format table row 7, statics §11), analysis/diff_statics.md, analysis/gemini_HEa4AVv-ths.md, analysis/guide_copy_images_shorts.md (H2); skills/dawn-statics/SKILL.md, scripts/statics/gen_statics.py, voc_check.py, static_review.py, knowledge/brands/dawnbands/static-templates/ (templates.json, make_prompts.py, README); output/dawn-iterate-2026-10-04/statics/; skills/cartoon-h3/SKILL.md, scripts/cartoon_h3/run.py, pack.py; MAP.md + songs_all.json/songs_scripts.json; product-truth.md, claims-register.md, research/customer-evidence-2026-09-15.md, voc-competitor-reviews-2026-10-02.jsonl, bottleneck-diagnosis-2026-10-03.md; dawn-stakes.md.
Not built yet (needs Fish's go)
- One ducked warm-tactile bed (assemble default), no hits or risers. No buzz SFX yet: the library has no buzz file. The per-beat SFX layer is BUILT (10-06: Sound cue sheet + H3_SFX_PLAN=<pack.md on the assemble stage, scripts/cartoon_h3/sfx.p
- Not built yet (needs Fish's go): C07 merged into templates.json; chapter title cards over the video (assemble only overlays title: and captions); a day-14 post-use survey for real timeline quotes. (Built 10-06: gen_statics waivers/chain; vo