format-mascot-explainer — the band explains itself to her
1. Read first
knowledge/ad-formats/_FORMAT-CORE.md(doctrine, lane limits, gates, launch). Binding; this file only adds the mascot layer.references/beat-sheet.md(skeleton + line rules),references/sources.md(reference ads paraphrased, receipts).output/dawn-combo-map-2026-10-05/MAP.md§2B (recipe B: callout, her burden, guarantee/science authority, independence payoff) and §3 "Don't build".knowledge/brands/dawnbands/product-truth.md+claims-register.md(mechanism line, unlocked claims).mechanism.md/root-cause.mdare pointers only.skills/cartoon-h3/SKILL.md(lane, VO clarity gate, credit rules) andknowledge/ad-formats/song-ad-playbook.md§5-6 (storyboard rules, H3 lit-band trap).- Talking-mouth variant only:
skills/cartoon-pipeline/SKILL.md(talking_ingredients, Bergamot character rules, R11 / cp-014 2.8 wps).
2. When to use / when not
- Use to test a video version of recipe B: brand voice talking straight to her, with a face. The mascot is the brand voice; it carries the science (root cause + mechanism) and the guarantee. That matches recipe B's authority rule (science/guarantee, not a borrowed person), and the mascot is not a person, so it doesn't read as a testimonial.
- Evidence status: untested on Dawn. Signal only: davidaistar claims the format scales for IM8 / PetLab / Hollo Socks (claim, not verified). Verified analog in our own files: Pilloway's talking-anatomy + happy-pillow ads (100 ads, 629 duplicates, longest 119 days;
output/dawn-iterate-2026-10-04/video/style-refs/skeleton/STYLE.md), same sleep niche. - Honest risks from our data: the brand-voice SONG did ROAS 0.72 (MAP §2A), and character-less explainer VO got 0 purchases (MAP §3). The mascot fixes "character-less" only if HER world is on screen too. A mascot praising itself is the weakest proof there is: proof comes from the demo, the mechanism and the guarantee, never from the mascot saying it's great.
- Don't use for recipe-A stories (accuser → vindication: use format-spoken-drama or the song lane), for a mascot that personifies the PROBLEM (that's cartoon-pipeline
villain_parade), or for a hero-vs-villain mix (two variables). - Opposite mechanic to villain_parade: the villain makes the viewer root against the problem; the mascot makes her like the fix. Different psychology, so it gets its own ad set and its own read.
3. The format
- 9:16, 45-120 s (default 75-95 s ≈ 260-340 words at 3.4-3.6 wps). One 3D style per ad:
pixar(10-01 wave-1 Mom/Ryan/room sheets already exist in it) ordisney3d(anchored on our paying Exhibit A frame,output/dawn-iterate-2026-10-04/video/style-refs/disney3d/anchor.png). - Cast: Dawn (the mascot), Mom (on screen, mostly silent), the kid (asleep / up on his own). Optional: the failed-solution alarm clock as a PROP (no face; the 10-01
char-clocksheet is face-free). - Voice: the mascot's voice speaks to HER ("you") from line 1, even before the mascot appears; it is the brand voice. Mom speaks at most one line.
- Captions from the script, hook overlay on frame 0 (pack
title:), motion end card (optional,--end-card; off by default per Fish 10-06) (packend_card:). - Reference: davidaistar TozlaC3-rCA (Hollo Socks vein mascot, Pixar, ~85 s), structure in
references/sources.md.
4. Why it sells
- Recipe B in motion: callout to her by an observable symptom → her daily burden (exhaustion, late for her own job) → the fix explains itself in plain words → his independence + her calm → guarantee. Problem-aware: lines 1-2 name her; no mystery opener, no "Hi, I'm Dawn" opener.
- The davidaistar mechanics that transfer: an explicit curiosity gap before the mechanism ("I work differently in two ways"), one technical line immediately said again in plain words, a tried-and-failed objection before the product, a visual tone shift (cool and desaturated in the problem, warm and bright from the mascot's entrance).
- One idea = one job = one picture: the mascot's mechanism lines read like a sung ingredient verse (who, the one job, what she gets) and the payoff undoes the problem in the same words (beat sheet beats 3-5).
- A friendly object explaining is easier to watch than a lecture: the same mechanism lines that were "character-less explainer VO" get a character and a demo.
5. Beat sheet (full rules in references/beat-sheet.md)
| Beat | % runtime | Job | Must contain |
|---|---|---|---|
| 1 Callout hook | 0-8 | Stop HER | Her observable symptom in line 1 (knock count, the door, the time), stake on her; exaggerated-but-literal visual; mascot not on screen yet |
| 2 Problem shown | 8-25 | Prove she's the alarm | Her morning ritual in counts/times; her cost (late to work); generic failed solutions (louder alarm, phone across the room, lights on) |
| 3 Mascot enters | 25-35 | Introduce the fix | "I'm Dawn, the [what I do]" intro line; curiosity gap ("two ways"); colour turns warm |
| 4 Mechanism demo | 35-65 | Root cause + how | Fish's lines: sound doesn't reach a deep-sleeping brain; touch gets through; stronger until he turns it off; silent to everyone else. One objection: not a smartwatch, no app, three alarms on the band |
| 5 Before/after morning | 65-90 | Payoff on HER | Same room, same camera, two mornings, SEQUENTIAL (never split screen); after = he's up on his own, she has her coffee |
| 6 Offer | 90-100 | Close | Product named, 60-night guarantee (the authority), optional 10,000+ parents; spoken CTA then end card |
6. Pack spec
-
Step 0 — combo plan (feedback loop,
workflow-combo-loop):python3 scripts/combo_loop/plan.py --format format-mascot-explainer --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. -
Front matter (core §5 keys plus):
format: cartoon-h3,brand: dawnbands,format_skill: format-mascot-explainer,variant: N(narrator, mouthless) orK(Kling talking mouth),parent:(the recipe-B static/native whose callout + mechanism this turns into video, with CPA),iteration: "static callout -> mascot explainer video, same callout + mechanism lines",cast: Mom, Ryan, Dawn (band mascot),envs: teen-room, hallway, kitchen,product_truth:one sentence from product-truth.md,end_card:,title:,body_start:for 3 hooks. - Voice keys: variant N with mascot-only VO = narrator pack:
elevenlabs_voice_id: <mascot voice>, untagged lines (narration floor 3.4 wps). If Mom gets her one line:voices: DAWN=<id>, MOM=<id>, every line tagged[DAWN]/[MOM], pace keys from the 10-01 dialogue packs (vo_tempo: 1.08,gap_same: 0.15,gap_turn: 0.3,max_gap: 0.22,seam_gap: 0.25). Voice IDs are picked by ear with Fish; never invented. style,style_key,style_block,style_anchor,visual_negativeare RECORDS (reskin.py and clipqa read some); run.py takes the look from--style,--style-block,--product-truthand--style-refon the command line, whichpython3 -m scripts.cartoon_h3.packargs <pack>builds from these keys +<slug>.args(§9).## VO Script:N. "line"(orN. [SPK] "line"), one sentence, 5-12 words.## Scene visual intents:N. **role** — <env>: <who is on screen, doing what, framing, light>. Roles:hook,problem,mascot entry,mechanism,product reveal(contains "reveal" → batch ≤3 panels),before,after,cta.- Naming rules the code enforces: the mascot is "Dawn the mascot" in intents (char-ref label
Dawn=<sheet>attaches only when "Dawn" is in the shot text). The real product is "the wristband" (pack.py product regex → product ref attached, band rules on). Never write "Dawn band", "the band", "ribbed band" or "wristband" in a mascot-only intent: it attaches the product reference ("nothing added") to a shot where the band has eyes and arms.
7. Visual grammar
Mascot design (one locked sheet, decided): - Body = the band itself as an upright buckled loop, seen from the side so the wide outer surface faces camera: plain matte black ribbed silicone, fine diagonal ribbing, buckle and pin holes at the bottom like a belt. About the size of a coffee mug. Black only (the canonical colour). - Face = two large moulded eyes set INTO the silicone on the front of the loop: matte white with dark irises and one soft highlight, like a rubber toy's eyes; ribbed-silicone eyelids that blink and squint. No glow, no emission, nothing behind them. - The display is NOT the face. The small flush display sits on the back of the loop, dark, flush, same black as the strap, and stays out of the face. Why: a face on the display reads as a lit screen = the smartwatch the band must never look like (product-truth: never a lit face in a scene), H3 lights displays on its own whenever one is the focus, and it teaches the viewer "screen device", the objection beat 4 kills. - No mouth in variant N (cartoon-h3 can't lip-sync, core §3; a mouth that stays shut while the voice plays reads broken). Expression = eyes, eyelids, body squash and lean, two short stubby ribbed arms. No legs: it hops or scoots on the buckle. Variant K uses a separate sheet with a small soft mouth slit under the eyes (it has to talk on camera). - Every sheet prompt carries the Bergamot appeal language: friendly, cute and appealing, warm expressive eyes, never a dead stare.
Shots: - Hook/problem: cool desaturated early-morning light; Mom in the hallway at his door (never at his bedside), the kid asleep ON TOP of the covers in a hoodie (no teen under covers, no adult at a child's bedside: song-playbook storyboard rules). Exaggerated but literal (the fifth knock, three phones ringing on the pillow). - Mascot shots: eye-level, ~50/50 composition with the human (mascot on the right half, person on the left; davidaistar's sizing fix), mascot on a nightstand, counter or shelf. Warm light from its entrance on. - Mechanism: ONE picture per idea, literal: sound rings from a phone bouncing off the sleeping kid; then the wristband on his resting wrist, a few small curved motion lines, his eyes opening. The mascot points from the nightstand; it never wears itself and never morphs into the product. - Product shots: wrist rule — wrist down or resting flat, band side-on, display dark, nobody looking at the wrist; "held up" = arm forward at chest height. Product only from beat 4. Mixed mascot + wristband shots: intent says the mascot is a separate character from the wristband. - Before/after: same room, same camera, two consecutive shots. No split screens (H3 canvas failure + playbook rule). No readable text, clock hands only.
8. Audio
- Mascot voice (variant N): ElevenLabs, warm, brisk, adult, mid-pitch, a smile in it; plain-spoken "friend who knows how this works". Never a squeaky or baby voice (60-120 s of it grates on a tired mom). Locked with Fish at gate 1 together with name, register and style (davidaistar's persona Q&A, answered once, not a menu).
- Pace: narrator ≥3.4 wps (vo_check FAIL below);
hook_tempofor the hook if needed; never fix pace by speeding, split the line. - Variant K: Kling native voice, prompted inline per scene (≤4 adjectives, identical every scene), 2.8 wps budget (cp-014), one speaker per scene. Kling is the legacy cartoon-pipeline route; the registry roles for a talking mouth are "Native-speech video" (H3-max i2v, proven only via
yapper.py chain-render --native) and "Lip-sync" (candidate sync-3,fal-ai/sync-lipsync/v3/image-to-video, which the registry says to prove first): one-unit proof ≤$2 before variant K is built on any of them. - One ducked music bed (assemble default). No buzz SFX yet: the library has no buzz file. The per-beat SFX layer is BUILT (10-06: a
## Sound cue sheetin the pack +H3_SFX_PLAN=<pack.md>on the assemble stage,scripts/cartoon_h3/sfx.py, format-asmr beat-sheet); 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 e.g. the existing card line "Dawn Band. It wakes him, not you. 60 nights to try it."). - Never speak the price: product-truth says $39.99, the live price test changed it on 10-04. If a price line is wanted, read the live PDP that day.
9. Production (free until the sheet gate)
# zsh. Refs live in <slug>.args beside the pack (core §5: ALWAYS packargs), e.g.
# --char-ref Mom=output/cartoon-h3/_refs/dawn-wave1-2026-10-01/char-mom.png --char-ref Ryan=.../char-ryan.png
# --char-ref Dawn=output/cartoon-h3/_refs/<slug>/char-dawn-mascot.png --env teen-room=.../env-teen-room.png
# --env hallway=.../env-hallway.png --env kitchen=.../env-kitchen.png --product-ref output/cartoon-h3/_refs/<slug>/product-band.png
# --characters "Mom, Ryan and Dawn the mascot" (style / style_block / product_truth / style_anchor come from front matter)
P=output/concept-packs/<slug>.md; S=<slug>
A=(${(z)"$(python3 -m scripts.cartoon_h3.packargs $P --storyboard)"}); A=(${(Q)A})
python3 -m scripts.cartoon_h3.run $A --dry-run # free: cost estimate from the pack word count (h3.py table)
python3 -m scripts.cartoon_h3.run $A --stage vo # EL VO + vo_check gate (EL quota only)
# mascot sheet (PAID ~$0.15-0.30, Fish's go): image 1 style anchor, image 2 real product cutout (+ a real buyer wrist photo)
python3 -m scripts.cartoon_h3.sheet output/cartoon-h3/_refs/<slug>/char-dawn-mascot.png <prompt.txt> \
<style anchor png> knowledge/brands/dawnbands/product-cutout-unlit.png
python3 -m scripts.cartoon_h3.run $A --stage storyboard # free; Fish reads storyboard.md (tier A/B/C per batch, below)
touch output/cartoon-h3/$S/storyboard.approved # Fish only
A=(${(z)"$(python3 -m scripts.cartoon_h3.packargs $P)"}); A=(${(Q)A}) # every ref must exist now
python3 -m scripts.cartoon_h3.run $A --stage canvas # paid, ~$0.20/batch
python3 -m scripts.cartoon_h3.run $A --stage gen --prompts-only # Fish reads motion prompts
python3 -m scripts.cartoon_h3.run $A --stage gen --spend --backend fal --model h3-max --candidates 1 # --auto-regen stays 0 (§12)
python3 -m scripts.cartoon_h3.clipqa output/cartoon-h3/$S # then eyes on every mascot batch
python3 -m scripts.cartoon_h3.run $A --stage assemble # end card (optional, `--end-card`; off by default per Fish 10-06) + gemini_qa
- Shot tiers (core §2b): tag every batch in
storyboard.md. A = hook first 3 s, mascot + wristband together, the buzz/reveal, CTA; B = mascot or Mom acting, before/after; C = empty hallway, kitchen establishing, clock inserts. 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 until anh3side-by-side on a B/C batch passes Fish's eye. - 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 when
style_anchoris set (disney3d; core §3refs[:5]): Mom + Ryan + Dawn + product + one env is already 5, so mixed mascot/wristband batches use one room. - The wave-1 Mom/Ryan/room sheets (
output/cartoon-h3/_refs/dawn-wave1-2026-10-01/) are pixar (Turning Red block), so pixar is the cheap default. disney3d has only product + side-cast sheets (output/cartoon-h3/_refs/dawn-songs-2026-10-04/disney3d/); Mom/kid/rooms would be new paid renders with--style-refon the Exhibit A anchor. Never reuse the wave-1product-band*.png: that 10-01 sheet is screenless and includes a lit-glow view (stale truth). Render a new in-style product sheet from the 10-04 prompt pattern (output/dawn-iterate-2026-10-04/video/sheet-prompts/disney3d/product-band.prompt.txt: display OFF, dark, flush) in the same paid step as the mascot sheet;output/cartoon-h3/_refs/dawn-songs-2026-10-04/disney3d/product-band.pngis already current for disney3d. Never the raw cutout in scene gen. - Cost (90 s; h3.py
FAL_PRICEre-read from the fal page 10-06: h3-max 768P $0.08/s = $1.20 per 15 s batch + ~$0.10-0.16 reference surcharge per batch;run.py --dry-run→tiers.mdper batch): ~7-9 batches ≈ $8-11 H3 at 768P + ~$2 canvases + ~$0.6 mascot sheet (2 rounds) + EL quota ≈ $11-14 per finished hook, each extra hook ≈ 1 batch. - Variant K:
python3 scripts/cartoon_lint.py <pack>→python3 scripts/cartoon_runner.py --profile profiles/dawnbands.toml --concept-pack <pack> --dry-run, then--executeonly on Fish's go (paid, Higgsfield Kling 3.0; check the balance first).
10. Gates & QA checklist (on top of core §4)
- [ ] Parent named with CPA; ONE variable stated; variant (N/K) stated.
- [ ] Persona lock answered once by Fish: mascot name, voice, register, style, length.
- [ ] Lines 1-2 name HER by a symptom; mascot not in the hook; stake on her and caused by the mornings.
- [ ] Mechanism lines are Fish's, verbatim; product facts only from product-truth.md; no price spoken.
- [ ] Mascot sheet: eyes in the silicone, display on the back and dark, no mouth (N), matte black, buckle visible. Fish approves the sheet before any canvas.
- [ ] Intents: mascot = "Dawn the mascot", product = "the wristband"; no product before beat 4; wrist rule in every product intent; no split screen; nobody at a bedside.
- [ ] vo_check PASS; Fish listened. Storyboard approved with a tier per batch; prompts reviewed; fal balance checked before
--spend. - [ ] Clip QA + eyes on every mascot frame at 1 fps (lit display, glowing eyes, mouth appearing, mascot merging into the wristband); waivers written only for reviewed false FAILs.
- [ ] Decision-moment pass on the last ~15 s (the offer + reveal batches) frame by frame, because AI flaws cluster where the ad asks for the click (starpop
ai-zack-d-films-style-ad-examples: garbled pack text, an identity swap on the money line, a proof graphic that miscounts its own claim, a stray photoreal hand): same Mom/kid faces as beat 1, the wristband matches its sheet, no counted/tallied graphics (models can't count: show proof as one literal picture), no disembodied or photoreal hands, captions over the shot they name (not one idea behind). - [ ] Final: freezes 0, dark 0, captions from script, end card (optional,
--end-card; off by default per Fish 10-06), Fish watched it.
11. Variants & test plan
- Test 1: mascot explainer (variant N, pixar), 3 hooks × 1 body, own ad set in Testing with a video floor (10-03 videos ran $30-40/day). Parent = the recipe-B callout static/native it voices. Day 3: starved (<$15) → raise. Day 7: CPA vs parent and vs the song benchmark ($32-47 CPA); hook rate + hold via
scripts.cartoon_h3.readout(ad names<concept>-h<i>-l1). - Hooks: (a) symptom ("If you knock on his door five times before seven…"), (b) her cost ("You've been late to your own job for him three times this month."), (c) visual interrupt + callout (three phones ringing on his pillow, line names her).
- Test 2 (isolates the mascot): same VO, mascot shots replaced by literal Mom/kid/product shots. Own pack WITHOUT
body_start(the shared-body cache fails on same words + different intents). - Then one at a time: style re-skin (
reskin.py --from-pack <pack> --style disney3d), length (60 vs 110 s), voice route N vs K. Graduation perfeedback_graduation_rule; never pause, reduce.
12. Failure modes
- Clip QA false FAILs: fixed 10-06:
clipqa.use_rubricreads the cast fromcast:/characters:and, when a cast entry says "mascot" (e.g.Dawn (band mascot)), tells the reviewer the band-with-eyes is planned (not an extra, not a product error; fails only on watch/screen, lit display, mouth). Check withpython3 -m scripts.cartoon_h3.clipqa output/cartoon-h3/$S --print-rubric. Remaining false FAILs: review by eye, writeoutput/cartoon-h3/<slug>/gen/qa-waivers.json({"<batch>-<cand>": {"reason": ..., "identity": <qa identity>}}), and keep--auto-regen 0so false FAILs don't buy regens. - Display lights up / eyes glow → regen with the display named "on the back, dark"; leftover glints:
output/dawn-iterate-2026-10-04/video/tools/deglint.py(on the real-band shots). - Mouth appears on the mascot (pixar block says "wide expressive mouths") → "Dawn has no mouth" in every mascot intent and on the sheet; regen.
- Mascot drifts into a smartwatch, a ring or a bracelet with a face-screen → sheet attached by name every shot ("Dawn" in the text); ≤3 panels on mixed shots.
- Mascot dominates and Mom disappears → the ad turns into character-less brand VO; keep her on screen in beats 1, 2 and 5.
- Mascot brags ("I'm the best alarm ever") → proof = demo + guarantee; cut the line.
- Captions or visuals run one idea behind the VO in the mechanism beat (he found a whole ingredient stack mislabelled this way) → shot intents written against the VO line they sit under; check at the decision-moment pass (§10).
- Closing beat drifts (Mom's face changes, the band turns glossy or text appears on the pack) → regen that batch; this is where the model is weakest and the viewer looks hardest.
cartoon-pipelinedocs still say the Dawn band has "no digital display" (stale): product-truth.md wins.
13. Sources
~/research/davidaistar/REPORT.md, analysis/gemini_TozlaC3-rCA.md, analysis/animation.md (TozlaC3-rCA), analysis/diff_animation_styles.md (finding #1), foreplay/08_authority.gemini.md; MAP.md; product-truth.md, claims-register.md; cartoon-h3 SKILL.md + scripts/cartoon_h3/{run,pack,h3,canvas,clipqa,sheet}.py; cartoon-pipeline SKILL.md + cp-014; knowledge/blueprints/cartoon-villain-pipeline.md; knowledge/ad-formats/cartoon-vsl.md; song-ad-playbook.md §5-6; output/dawn-iterate-2026-10-04/video/style-refs/{skeleton,disney3d}/; project_dawn_yapper_2026-10-04 (native speech route).
Built 10-06: mascot clause in clipqa.use_rubric (cast entry containing "mascot"). Not built yet (needs Fish's go): (2) cartoon-h3 "native speech" batch mode (core §3), which would give variant N an on-camera talking mascot without leaving H3; (3) a mascot archetype in cartoon_intake.py (variant K borrows talking_ingredients).
Not built yet (needs Fish's go)
- One ducked music bed (assemble default). No buzz SFX yet: the library has no buzz file. The per-beat SFX layer is BUILT (10-06: a Sound cue sheet in the pack + H3_SFX_PLAN=<pack.md on the assemble stage, scripts/cartoon_h3/sfx.py, format-as
- Built 10-06: mascot clause in clipqa.use_rubric (cast entry containing "mascot"). Not built yet (needs Fish's go): (2) cartoon-h3 "native speech" batch mode (core §3), which would give variant N an on-camera talking mascot without leaving H