format-rated-solutions: rate the failed solutions, then the band
1. Read first
knowledge/ad-formats/_FORMAT-CORE.md(doctrine, lane limits, gates, launch). It is binding.references/beat-sheet.md(skeleton, rung inventory, score rules, line rules) andreferences/sources.md(Skincu, Smooche, our 10-01 run).- The 10-01 attempt: pack
output/concept-packs/dawnbands-s3-rate-them-mirror-2026-10-01.md, run diroutput/cartoon-h3/dawnbands-s3-rate-them-mirror-2026-10-01/(storyboard.md, assemble-receipt.json, gemini-qa-final.txt, vo-check.md). Section 12 lists what it taught us. - Brand:
knowledge/brands/dawnbands/product-truth.md,claims-register.md,survey-intel-post-purchase-2026-09-04.md("What they'd already tried", n=134). The rung list comes from that survey. The old graveyard/objection/mechanism/root-cause files are pointers now, so follow them to the current sources. ~/.claude/projects/-Users-ayden/memory/feedback_dr_copy_anchoring.md: failed solutions stay generic, no brand names, never bed shakers or anything tactile.output/dawn-combo-map-2026-10-05/MAP.md§2 (recipe A vs B: who presents, which authority).skills/cartoon-h3/SKILL.md(lane mechanics).skills/dawn-statics/SKILL.md(static variant).
2. When to use / when not
- Use for a problem-aware callout that teaches the mechanism through what she already tried. The ladder does the root-cause work before the product shows up: the sound-based rungs fail, the one that works is touch (her hand), and the band is touch without her.
- Evidence status: untested on Dawn. The 10-01 S3 mirror (ad
bf1001-S3 rate them, 120249989102510232) got $0.18-0.40 and about 10 impressions in a shared SCALE ad set. Meta starved it, so it was never read. It moved to Testing on 10-03 (ad set 120250033290300232, ad 120250033291530232), and no read exists as of the 10-05 hub pull. Outside Dawn the structure scales: Smooche "let's rate them" ran 99 days with 17 duplicates, and Skincu's whiteboard (Foreplay #8) runs 2:37 at 2/10 → 4/10 → 6/10 → 100/10. davidaistar REPORT §2 #8 lists "rate these" as an organic format to hijack. - Don't use for recipe A stories (accuser/vindication: use format-spoken-drama or songs). Don't build it with an expert presenter in a static (borrowed person 1.50 in statics). Don't build it around any tactile rung.
3. The format
- Video: 9:16, 1:30-2:30 (S3 ran 86 s with no stake beat, which is too thin). One animated mom in the kitchen at a whiteboard stuck to the fridge, marker in hand. She names each method she tried, gives it a score out of ten, credits what it honestly does and says why it fails. Every rung cuts to that method failing in the kid's room. Then her own rung, then the band at ten out of ten, then the mechanism, then her morning back.
- Style: one per ad. Default is disney3d, anchored on our paying Exhibit A frame (
output/dawn-iterate-2026-10-04/video/style-refs/disney3d/OURS-exhibita-90.png). The other options are pixar (the S3 look), claymation and paper. Changing style is a re-skin variant. - Static: a 1:1 single-image ladder card in brand voice ("Every ADHD wake-up you've tried, rated"), with rungs as bullets, the band at the bottom and the guarantee pill (§11). Carousel is not built (§12).
- References: Skincu (Foreplay #8) for the whiteboard plus the escalating ladder. Smooche for the honest-credit sentence skeleton. We keep the device and change the persona, stake and mechanism (sources.md).
4. Why it sells
- Proof by elimination. She has already lived every rung (survey: waking them myself 90%, phone alarms on full volume 79%, loud alarm clock 58%, routines/bedtimes/sleep apps 48%). Each score agrees with her own experience, so by the time the band gets its ten she already trusts the scale.
- Honest scoring is the credibility device. Each failed method gets a real credit before the fail line ("it goes off every time"). A hit job reads as an ad. A fair judge reads as a friend.
- The ladder carries the mechanism. Sound-based rungs fail for one reason (Fish's ruled root cause), and her own rung works because it is touch. The reveal then says "touch, without you".
- Recipe and awareness: a hybrid, and it is problem-aware. The video borrows recipe A's POV (mom first person: all three song winners. The brand-voice song did 0.72, and character-less explainer VO got 0 purchases). The stake lands on her through her own rung. The static is pure recipe B: brand voice (1.87 vs mom-first 1.53), authority is the guarantee or science and never a person, and the payoff is her calm mornings or his independence.
5. Beat sheet (full rules, rung inventory and the illustrative example: references/beat-sheet.md)
| Beat | % runtime | Job | Must contain |
|---|---|---|---|
| 1 Hook | 0-6 | Stop her with her own situation | Line 1 names her by an observable symptom, in action, at the board; "let's rate them" premise by line 2 |
| 2 Stake | 6-15 | What the mornings cost HER | 2-4 lines from VOC (trips to his door, yelling, late for her own work); no product |
| 3 Rungs 1-3 | 15-55 | Eliminate sound, light and app | Per rung: name + score / honest credit / fail line linked to the mechanism; scores strictly rising; ≤4 lines per rung |
| 4 Her rung | 55-66 | The one that works, and its price | "Me." Highest failed score (5-6). Works because she touches him. It costs her: the beat 2 stake returns |
| 5 Root cause | 66-70 | Name the pattern | One ruled line: "His brain tunes out a sound it hears every morning." or "It was never about volume." |
| 6 Reveal + score | 70-76 | The ten | Product named once, "ten out of ten", "it does what my hand did, without me" |
| 7 Mechanism | 76-88 | How | Vibrates on his wrist; keeps getting stronger until he turns it off; silent to everyone else; three alarms, no app |
| 8 Payoff + CTA | 88-100 | Her morning back + offer | Payoff on her (she stops being the alarm) or his independence; 60-night guarantee spoken; end card (optional, --end-card; off by default per Fish 10-06) |
6. Pack spec
-
Step 0 — combo plan (feedback loop,
workflow-combo-loop):python3 scripts/combo_loop/plan.py --format format-rated-solutions --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 (record + code keys):
format: cartoon-h3,brand: dawnbands,format_skill: format-rated-solutions,created,status,parent:(for v2 that is the S3 mirror, stated as "unread, $0.40 lifetime". Core §5 wants a CPA, so write "none (unread)" rather than invent one),iteration:(the one variable),title:(two lines with|, rendered by run.py while line 1 plays),end_card:(+ optionalend_card_secs,end_card_product),elevenlabs_voice_id,vo_tempo,max_gap,gap_same, optionalmin_wps/dead_air(vo_check reads them),body_start(hooks × body), plus the core record fields (overlay,style,style_anchor,visual_negative,cast,envs,product_truth). run.py does not readoverlayorproduct_truthfrom the pack;python3 -m scripts.cartoon_h3.packargsturnsstyle/style_key,style_block,product_truthandstyle_anchorinto run.py flags and appends the refs from<pack>.args(§9). - Starting pace: S3's narrator values passed vo_check at 3.40 wps: voice
mtV3PLomLvma8XKmZIju,vo_tempo: 1.13,max_gap: 0.22,gap_same: 0.22,dead_air: 0.5. Keepmin_wpsat the 3.4 core floor and don't lower it to mirror a source. ## VO Script: one sentence per line, 4-12 words, untagged (single narrator). Score lines stand alone ("The phone alarm. Two out of ten." is one line, read as one take).## Scene visual intents:N. **role** — <env>: <who is on screen, doing what, framing>. Roles:narrator (hook),narrator (rung N),narrator (her rung),narrator (product reveal),narrator (product),narrator (cta).- Cast: Mom plus ONE kid. That's two characters. An optional dog appears only in a wide shot. Never a combined multi-person ref sheet. S3's single "Dad, the little sister and the dog" sheet is the source of its character-drift QA fail.
- Envs:
kitchen(fridge whiteboard: a new env sheet, §9),teen-room,hallway(wides only). Three sets.
7. Visual grammar
- Presenter staging (no lip-sync, core §3). On her own lines she is at the board writing, crossing out or pointing, seen three-quarter or from behind. She never faces the lens in a close-up while her line plays: S3 beat 10 did that and Gemini flagged "poor lip-sync". Facing the camera is for a reaction held on a closed-mouth expression only.
- Every rung is an insert. Show the method failing literally, per the fever-dream literal rule: the phone ringing beside a sleeping kid, the clock shaking on the shelf while he sleeps, the puzzle app he taps through with his eyes shut. No visual metaphors: S3's "lease and welcome mat under the phone" was a simile turned into a picture.
- Scores never appear as numerals on screen. The canvas prompt bans numerals and Gemini fails a canvas with readable text. Show a score as marker marks: a big red X through a doodle of the method, a short red bar on a long empty track, then a long green bar plus a circle for the band. The exact number lives in the VO and the captions, which always come from the script.
- Her rung: her hand on his shoulder (touch works), then her tired face in the doorway (the cost). This shot is the visual bridge to the band.
- Product only from beat 6. Wrist down or resting, band side-on, display dark. The kid's eyes opening and small motion lines carry the buzz. The band is never held up to the camera on a raised wrist, never pressed on screen, never lit. S3 asked for "a small soft white LED glow" and "three LED dots" in intents 24 and 26, and the band audit flagged S3 batches 7 and 9 for screen/glow. Never write a glow into an intent.
- "Without me" shot: at the wake moment Mom is out of the kid's room (in the kitchen with coffee). The hallway shot is a wide with nobody lying on the floor (S3's weakest scene, Gemini scene 7).
- No readable text anywhere: the board carries doodles, X's and bars only, and clocks show hands only.
8. Audio
- Single ElevenLabs narrator, the mom-avatar voice (S3's
mtV3PLomLvma8XKmZIjupassed). Narration floor 3.4 wps (vo_check FAIL below), dead air ≤0.4 s unless the pack setsdead_air. - Score lines are short and spelled out: "two out of ten", never "2/10" (vo_check rule 3). Keep any line of 6+ words above 3.0 wps. S3's line 28 joke ("recommended by parents, not influencers. Except for me.") dragged at 2.31 wps because it only works for an influencer persona, so cut lines like it.
- Register: literal and said-out-loud. No similes ("camping on his nightstand like it pays rent" fails the 10-02 register rule) and no sass tics borrowed from the source ("The audacity.").
- Music: assemble's single ducked bed, with no swap, hit or riser. Assemble has no per-beat SFX layer, so a marker squeak or stamp sound is not available (§12). The
end_card:motion card (endcard.py) brings its own swoosh.
9. Production (free until the sheets; paid steps need Fish's go)
# zsh. Front matter: style_key: disney3d, style_anchor: output/dawn-iterate-2026-10-04/video/style-refs/disney3d/OURS-exhibita-90.png,
# product_truth: "Plain matte black ribbed silicone wristband with a small flush time display that is OFF: dark, no glow, no digits; never a smartwatch, never a touchscreen, never a lit face."
# <pack>.args (full paths; core §5: ALWAYS packargs): --char-ref Mom=output/cartoon-h3/_refs/dawn-wave1-2026-10-01/char-mom-hd.jpg
# --char-ref <Kid>=.../char-ryan-hd.jpg --product-ref output/cartoon-h3/_refs/dawn-songs-2026-10-04/disney3d/product-band.png
# --env kitchen=<kitchen-fridge-board sheet> --env teen-room=.../env-teen-room-hd.jpg --env hallway=.../env-hallway-hd.jpg --characters "Mom and <Kid>"
P=output/concept-packs/<slug>.md; S=<slug>
A=(${(z)"$(python3 -m scripts.cartoon_h3.packargs $P --storyboard)"}); A=(${(Q)A}) # missing kitchen sheet passed name-only
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 (EL quota only)
python3 -m scripts.cartoon_h3.run $A --stage storyboard # free; Fish reviews storyboard.md (tier per batch)
python3 -m scripts.cartoon_h3.sheet <out.png> <prompt.txt> <anchor.png> # NEW env sheet: kitchen + blank fridge whiteboard (paid ~$0.15-0.30, Fish's go)
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 # Image gen role sheets (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 # + end card (optional, `--end-card`; off by default per Fish 10-06) (pack end_card:) + gemini_qa final
- Shot tiers (core §2b): tag every batch in
storyboard.md. A = hook first 3 s, her hand on his shoulder (hands), reveal + mechanism (band on wrist), CTA; B = Mom at the board, rung inserts with the kid; C = phone/clock/app inserts with no person, empty hallway, kitchen establishing. 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. - Cost: a 1:45 cut runs about 9-12 H3 batches. h3-max 768P = $0.08/s ($1.20 per 15 s; h3.py
FAL_PRICEfixed 10-06 from the fal page) + ~$0.10-0.16 reference surcharge per batch, so roughly $10-17 of video plus about $2-4 of canvases;run.py --dry-runwrites the per-batch quote totiers.md. Budget a second pass on product batches: all four of S3's product batches (6-9) were regenerated at least once. - Before
--spend, check the fal, Higgsfield and kie balances. - Hooks: 3 hooks × 1 shared body (
body_start= first stake line). Run h1 to completion before h2/h3 (cartoon-h3 SHARED BODY). For a hooks × leads read, usescripts.cartoon_h3.matrixand name ads<concept>-h<i>-l<j>. - Static: follow dawn-statics:
scripts/statics/gen_statics.py spec.json --check→--list(Fish approves) → render →~/ad-batch-hub/stage-session.py <dir> --type static. The ladder card is a NEW layout (not a D0x template), so render per the dawn-statics 10-06 upgrades:--new-layout --improvise --candidates 2 --out <dir> --dry-runfirst, then the same without--dry-run(paid, Fish's go), finish the pick with--recycle <pick.png> --only <slug>; later card refreshes =--recycle.layout= a long-running list/ranking static ref Fish approves (none sourced yet). Write the pill as "Wake up guaranteed · 60 nights" or leave it out: gen_statics adds its own pill when the lines lack the exact "60 nights", so "60-night …" renders two guarantees.
10. Gates & QA checklist (format-specific, on top of core §4)
- [ ] Parent named (S3 mirror: unread, no CPA) and ONE variable stated. v2 is a format read, not a one-variable test (§11).
- [ ] Rungs come from the survey list only: sound, light, app/routine, her. No smartwatch, bed shaker, pillow or medication rung. No brand names.
- [ ] Scores rise strictly. No failed rung below 2 or above 6. The band is ten. Every failed rung has a credit line and a fail line.
- [ ] Every fail line ties to the mechanism (sound tuned out / louder is still sound / he has to be awake first / works only because it's touch). Fish's ruled root-cause line appears verbatim once.
- [ ] Stake lands on her and the mornings cause it (VOC-sourced: cite the line). No college or kid-money stake.
- [ ] No invented dollar total for failed alarms (product-truth / objection map). Prices appear only if a VOC line carries them.
- [ ] Product facts match product-truth.md: three alarms, no app, display dark when idle, 60-night guarantee (not "sixty day"), price from the live PDP.
- [ ] No numerals or words on the board in any intent. Every presenter line is staged at the board, not to the lens.
- [ ] Wrist rule in every product intent, with no glow requested anywhere. Mom is out of the room at the wake moment.
- [ ] vo_check PASS with no line under 3.0 wps (6+ words). Fish listened.
- [ ] Storyboard approved with a tier (A/B/C) per batch, motion prompts reviewed, balances checked, then
--spend. - [ ] Final: freezes 0, dark 0, captions from the script, end card only if
--end-cardwas asked (off by default, Fish 10-06), gemini_qa final read for character drift and product design (S3 scored 4/10 on both). Fish watches the cut. - [ ] Static:
--checkPASS, static_review PASS on the current rubric, Fish approved the sheet.
11. Variants & test plan
- T0 (free, before any build): check spend on the 10-01 S3 Testing copy (ad 120250033291530232) with
python3 scripts/meta_changes.py 7d --id 120250033290300232plus the hub stats. Under $15 lifetime means starved, not judged. The verdict of the original launch (10-08) is void at $0.40. - T1 (format read): build v2 (this skill's ladder: stake beat, her rung, mechanism-linked fails, rising scores, fixed visuals) in its own Testing ad set with a video floor (10-03 precedent: $30-40/day; this is a Meta write and needs Fish's go). Give the S3 mirror copy its own floor beside it. Read at 7 days on CPA vs breakeven ROAS 1.32 and v2 vs S3. Script and visuals both change, so this answers "does the rebuilt format sell", not which piece did it.
- Then one variable per ad set, from v2:
1. Hooks (3 on the shared body): (a) symptom + premise at the board, (b) the stake first ("I've been his alarm clock for years."), (c) a score cold-open whose line 2 names her. Read hook rate and hold rate via
scripts.cartoon_h3.readout. 2. Her rung in vs out (the core hypothesis: the touch-works bridge). 3. Presenter: mom alone vs mom plus a nurse at the board delivering the root-cause line (recipe A's credible person inside the story). Mom stays the one who rates. 4. Band score: ten vs "nine out of ten, he has to wear it, and he does" (answers the 21% "doubt they'd wear it" hesitation). 5. Style re-skin (scripts.cartoon_h3.reskin --from-pack, same audio). - Presenter by lane (from data): video uses mom rating her own attempts (narrator formats win with mom first; only she can honestly score what she tried). Brand voice in video only with mom on screen living each rung, never a no-character graphic (0 purchases), and only after T1 reads. Statics use brand voice, no person, and guarantee/science as authority. An expert presenter never rates.
- Static test: a single-image ladder card in its own static ad set against the proven static body. Statics in crowded sets underperformed on 10-04 (CTR 0.35-0.92% vs winners 1.50%), so it gets a floor like every new static format (dawn-statics "next format lane"; ui-mockup's m1c starved at $0.49 without one). Fish sets the floor (Meta write); read at 7 days. Expect a LOWER link CTR than the image-led statics: a reasons/ladder card pre-sells in the feed, so fewer but better clicks (davidaistar's claim for his "3 reasons" template, starpop
ai-static-ads-that-convert, unverified on Dawn). Read CPA and click→purchase rate; never reduce it on CTR alone. - Static headline frame (second static variable, after the card reads): "rated" ("Every ADHD wake-up you've tried, rated") vs a reasons frame in brand voice ("3 reasons your ADHD kid's alarm doesn't wake him"), his problem-aware "reasons I ditched [alternative]" adapted. His first-person "I ditched" wording is mom-first POV (1.53 vs brand voice 1.87 in statics, MAP §2B): declared variant only, never the default.
- Rules: never judge under 7 days, never pause (reduce spend instead), 3x CPA kill outside learning. Record the launch in
project_launch_<date>_<slug>.md.
12. Failure modes
| Failure | Fix |
|---|---|
| Mirror scores (6/5/7/6/10): the "smartest" rung scored 7 so the viewer thinks the app almost works | Rising scores, failed rungs capped at 6, her rung highest |
| No root-cause line (S3 had none): the ten is a claim, not a conclusion | Each fail line carries the mechanism; one ruled root-cause line before the reveal |
| Presenter faces the lens on her own line → "poor lip-sync" | Stage her at the board (3/4, back, pointing); lens only on closed-mouth reactions |
| Combined family ref sheet → character drift (S3 Gemini 4/10) | Two characters, one sheet each; extras only in wides |
| Obsolete product truth ("never a screen") + glow written into intents → lit/varying band | product-truth.md sentence (display dark); never request a glow; regen product batches with wrists down |
| Numerals on the board → canvas fails or H3 garbles them | Marks, X's and bars only; numbers in VO and captions |
| Source sass and similes kept ("pays rent", "The audacity", "Except for me") | Literal register; cut persona jokes that don't belong to a mom |
Static gate rejects the ladder card: phone trips the transport/phone qualifier; every static must also carry ADHD, a guilt/yell wound, "dawn band" + vibrat + wrist + startle, and a calm payoff |
Write the rung as "the alarm on full volume"; the her-rung bullet carries "yell"; the calm payoff goes in the sub. Fish's 9-30 mechanism line stays verbatim; add "Dawn Band" and "no startle" as their own short bullet, never by rewriting his line. If the card can't carry them naturally, declare the ladder's own chain in the spec or waive rule9 in waivers with a reason; gen_statics reads both since 10-06, so --list/--out/10-06 flags still run |
| Shared ad set starves the ad (S3: $0.40) | Own ad set with a floor (Fish's go) |
- Built 10-06 (Builder C), not wired into run.py: (1) the per-line score overlay = Remotion ScoreCard composition: items {name, score, max, start, end, win} timed to the score lines (lines.json starts), mark = short red bar on a long track / red X (markStyle), the band = full green bar + circle, showNumerals default false (no numerals on screen; numerals only if Fish rules otherwise), card at 16 % of the height (under the Reels top band). python3 scripts/remotion_stitch.py comp ScoreCard <props.json> <out.mov> --prores = transparent overlay for ffmpeg overlay on the final; or set bgSrc = the final to burn it in one render. (2) The per-beat SFX layer: ## Sound cue sheet + H3_SFX_PLAN=<pack.md> on assemble (scripts/cartoon_h3/sfx.py, format-asmr); marker squeak/stamp files aren't in the library yet. Not built yet (needs Fish's go): (3) A carousel. gen_statics.py gates every slide as a full static (ADHD on each; the chain can be per-slide chain or a rule9 waiver since 10-06), so slides pass the gate but nothing assembles them. There is no Meta carousel creative builder (meta_preflight.py only audits child_attachments links). stage-session.py --type carousel exists but its review gate runs only for --type static, so you'd have to run static_review.py on each slide by hand. |
13. Sources
~/research/davidaistar/REPORT.md (§2 #8, §3 row 8), foreplay/08_authority.gemini.md (Skincu), analysis/diff_copy.md, analysis/diff_animation_styles.md; output/dawn-beauty-format-2026-10-01/SCRIPTS-v4-mirror.md + SCRIPTS-v3-1to1-audit.md (Smooche lines and pace); the 10-01 pack + run dir; project_launch_2026-10-01_beauty_format_cartoons, project_testing_restructure_2026-10-03; output/kalda-ads-2026-10-05-v2/hub-publish/site/launches/data/active_ads.json (S3 spend); MAP.md; survey-intel 09-04; product-truth.md; claims-register.md; feedback_dr_copy_anchoring; skills/cartoon-h3, skills/dawn-statics; scripts/statics/gen_statics.py, scripts/cartoon_h3/{run,canvas,h3,vo_check,title,endcard}.py.
Not built yet (needs Fish's go)
- Static: a 1:1 single-image ladder card in brand voice ("Every ADHD wake-up you've tried, rated"), with rungs as bullets, the band at the bottom and the guarantee pill (§11). Carousel is not built (§12)
- Built 10-06 (Builder C), not wired into run.py: (1) the per-line score overlay = Remotion ScoreCard composition: items {name, score, max, start, end, win} timed to the score lines (lines.json starts), mark = short red bar on a long track /