workflow-animation-styles — one style per ad, anchored, routed, re-skinnable
The format skill decides WHAT the ad says (beat sheet). This skill decides what it LOOKS like and which model role draws it. A style is never a vibe: it is an anchor frame from a proven ad + a style block + a sheet set + a route. Change it as ONE variable against a paying parent, never mid-ad.
1. Read first
knowledge/ad-formats/_FORMAT-CORE.md(doctrine, §2b shot tiers, §3 lane limits, §4 gates). Binding.knowledge/ad-formats/_MODEL-REGISTRY.md: every model below is named by ROLE; look the model up there on the day.references/procedure.md: per-style catalog (anchor, block, sheet prompts, route, rulings), the Zach-D grammar, the last-frame chaining and simple-motion specs, the re-skin runbook, an ILLUSTRATIVE worked run.references/sources.md: the six davidaistar videos, the 10-06 diff, our receipts.knowledge/ad-formats/song-ad-playbook.md§4 (one style per song, anchored on a winner; how to find an anchor).skills/cartoon-h3/SKILL.md(lane, credit discipline, binding rules 9-12) and the format skill you are styling (e.g.skills/format-song/SKILL.md).- Anchors on disk:
output/dawn-iterate-2026-10-04/video/style-refs/README.md+ eachSTYLE.md. knowledge/brands/dawnbands/product-truth.md(the band in every style: matte black ribbed silicone, flush display DARK when idle).
2. When to use / when not
- Use when a cartoon pack needs its style keys and sheets; when Fish wants a proven ad re-skinned (same audio + beats, new look: the cheap fatigue lever); when a run drifts off-style; when a new style is proposed (paper, Zach-D) and needs an anchor + route before anyone spends.
- Evidence status (Dawn): disney3d is the only style with paying evidence (exhibit A, the best song: $33.7 CPA, ROAS 2.48 on $292; one ad, under $300: signal, not proof). Claymation: two 8-14 retells LIVE and QA-passed, no clean read (destination bug polluted the matrix ROAS). Skeleton: Pilloway outside winner (100 ads / 629 duplicates); our 10-04 S2 skeleton song unread. Paper, Zach-D, pixar-as-anchored: untested on Dawn. Style has never been isolated as the variable on Dawn: the staged exhibit A → clay re-skin is the first test.
- Don't use to rescue a weak script (style is the cheap lever, the story is the expensive one), to mix two styles in one ad, to run Zak-D overhead/observational framing on a recipe A or B ad (§5 step 2), for photoreal people (core §3 avatar gates:
ugc-omni), or to clone a competitor's frames as references (anchor = rendering style only).
3. Inputs
- An approved concept pack from a format skill (
output/concept-packs/<slug>.md) withcast,envs,characters,product_truth,parent+ CPA, anditerationnaming the ONE variable. - The cast checked against the avatar (ordinary American mom 35-54, the kid, the accuser): reused sheets carry their old look (PB §4).
- An anchor PNG for the style (table in §5). No anchor = stop and find one first (procedure §2), never "describe the look in words".
- For a re-skin: the parent's lane run dir (
--from-pack) or its final MP4 + lyric lines (--from-video). - Balances checked on fal, Higgsfield and kie before any paid step (core §4).
4. Outputs
- Pack front matter filled:
style,style_key(a run.py--stylechoice),style_block(the Fish-ruled block per style, procedure §1),visual_negative,style_anchor. - Sheets in
output/cartoon-h3/_refs/<slug>/<style-dir>/:char-<name>.png,env-<room>.png,product-band.png, each with its.prompt.txtbeside it (sheet.py writes it).<style-dir>=clayfor claymation, else the style key (reskin.pySTYLE_DIRS). <slug>.argsbeside the pack pointing at those sheets (read by packargs.py).- Scene intents with a named transition on every in-batch seam when the grammar is "flow" (§5 step 6).
- A route line in
storyboard.mdreview notes: tier per batch (A/B/C, auto-tagged in<run>/tiers.md) and the video role it would use; per-tier H3 models route withrun.py --tier-models(core §2b). A non-H3 cheap route per tier is still NOT BUILT (§6). - Re-skins: new pack
<src>-reskin-<style>-<date>.md, seeded run dir,reskin-receipt.jsonwithaudio_identical: true.
5. Process
- Step 0 — combo plan (feedback loop,
workflow-combo-loop):python3 scripts/combo_loop/plan.py --format workflow-animation-styles --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.
- Pick the style (free). One per ad. Default order for Dawn: the parent's own style for iterations; disney3d (paying anchor) for new stories; claymation or skeleton as the one-variable re-skin of a paying song; paper only as a cost test; bluey and bergamot not without Fish's go (rejected 9-19 and 8-16).
| Style key | Anchor on disk | Dawn status | Image role | Video role (tier A-B / tier C) |
|---|---|---|---|---|
disney3d |
style-refs/disney3d/anchor.png = exhibit A frame (OURS, paying) | paying signal (exhibit A, n=1) | Image gen (GPT Image 2.5); Seedream A/B NOT BUILT | Stylized video (H3-max); --tier-models can put B/C on h3 after a side-by-side |
claymation |
style-refs/clay/anchor.png = our 8-14 clay final | live, unread | Image gen | Stylized video; ask for stop-motion cadence in the block |
skeleton |
style-refs/skeleton/anchor.png = Pilloway | outside winner, ours unread | Image gen | Stylized video |
pixar |
none (9-17 Turning Red audit block only) | sheet scored 6/10 (college sniper) | Image gen; Seedream candidate | Stylized video |
paper |
none | untested | Image gen | tier A reveal/CTA on Stylized video; everything else = Cheap simple-motion i2v (NOT BUILT, §6) |
bluey |
none; rejected 9-19 (outlines) | rejected | Image gen (GPT Image 2.5 may fix outlines: one-sheet proof first) | Stylized video |
bergamot |
none; rejected 8-16 as fake clay | legacy | Image gen | Stylized video |
| Zach-D grammar | a stage eye-level plate (procedure §3.4) + disney3d/pixar anchor |
untested | Image gen | Stylized video + run.py --chain-frames (built 10-06, unproven) |
- Zak-D rule check (free).
skills/cartoon-pipelinerule cp-003 holds for Dawn: overhead dollhouse framing + a narrator talking ABOUT a character = observational; it kills "that's me". Every Dawn winner is identification (mom first person, recipe A; natives with a recognition line 1 ran $31.8 CPA vs $36.2 for first-person openers), and core §1 needs lines 1-2 to name HER. So: the Zach-D CAMERA grammar (continuous flow, planned transitions, 3-5 s beats, one stage) may be used at eye level on any style; Zak-D FRAMING (overhead diorama, third-person observer) is never used on a Dawn recipe A/B ad. Nothing in the davidaistar video overturns this: his Zach-D demo claims no results. - Lock the anchor (free).
lsthe anchor; open it; confirm it is the look Fish wants. Missing → procedure §2 (search the category that sells the style, download, Gemini-classify 3 frames, Fish picks). Writestyle_anchor:with the workspace-relative path. - Write the style keys (free).
style_key= run.py choice;style_block= the per-style block in procedure §1 (claymation MUST use the Fish 8-16 stop-motion block, not canvas.py's generic one);visual_negativenames the rejected neighbours (clay: smooth/glossy 3D, Pixar; disney3d: flat 2D, outlines; paper: 3D render, plastic). - Sheets (PAID ~$0.15-0.30 each, gate 4). Write one prompt file per sheet from the templates in procedure §3 (character model sheet; "Isometric 3D floor-plan cutaway view" env; product sheet with
knowledge/brands/dawnbands/product-cutout-unlit.pngas Image 2, display OFF). List them and the refs (dry run), get Fish's go, then one call per sheet:python3 -m scripts.cartoon_h3.sheet <out.png> <prompt.txt> <anchor.png> [product-cutout-unlit.png]The 10-04 wrapperoutput/dawn-iterate-2026-10-04/video/render_sheets.sh <disney3d|skeleton|clay> [--spend]only renders the 10-04 song cast. Eye-check every sheet against the anchor; fix one wrong thing with an edit pass (sheet.py with the sheet itself as a ref + a one-fix prompt), never a blind re-roll (cartoon-h3 rule 10). - Grammar into the intents (free). "cut" (default): hard cuts between scenes. "flow" (Zach-D): every in-batch seam gets a picturable transition in the scene intent (push-through, whip pan, match cut on an object, camera rises through the ceiling); storyboard.py's splitter writes it to
transition_in, h3.py turns it into aTransition:line. Batch seams cut hard unlessrun.py --chain-framesis passed (opt-in, built 10-06; seam-pair proof on Fish's eye still pending, §6). Zach-D: the stage is an eye-level empty plate attached to every canvas (procedure §3.4), and the hard-cut count is the format test (his measured originals: 0-2 cuts in 42-56 s; best AI copies ~1 per 8 s; 1 per ~3 s reads as an imitation). Every style, every intent: write emotion as face mechanics, not mood words ("inner brows pushed up, mouth pulled flat", "cheek squashed against her palm, eyelids half-lowered", never "worried" / "exhausted", which render a neutral face), and give every background person in a witness room, meeting or family dinner a distinct described face ("an audience" renders as mush) (starpopai-claymation-prompts,ai-claymation-ad-examples). - Storyboard (free) → Fish. zsh:
P=output/concept-packs/<slug>.md; A=(${(z)"$(python3 -m scripts.cartoon_h3.packargs $P --storyboard)"}); A=(${(Q)A}); python3 -m scripts.cartoon_h3.run $A --stage storyboard. Review style words in every panel, the wrist rule, no readable text, and mark each batch's tier (A/B/C) in your review note. Fish:touch output/cartoon-h3/<slug>/storyboard.approved. - Canvases (PAID ~$0.20/batch). Full args (
packargswithout--storyboard) add--style-ref <anchor>automatically; packargs warns on stderr when the anchor is missing: treat that warning as a stop.--stage canvas. Compare 2-3 canvases to the anchor before going on. - Motion (PAID).
--stage gen --prompts-only→ Fish reviews → core §4 gate 6b (draft → final): on a NEW style, draft one tier-A batch at--resolution 480P --batches <n>and iterate the prompt there; finals at native 768P (480→--hdupscale is unproven vs native, core 6b) →--stage gen --spend --backend fal --model h3-max. Cost: h3.pyFAL_PRICElists h3-max 768P $0.05/s but 480P $0.08/s, contradicting its own "$1.20 per 15 s" note, so budget ~$0.08/s until the fal page is re-read (60 s ad ≈ $5 of video; a 4:30 song ≈ $22) plus canvases ~$0.20/batch and sheets. - Assemble + style QA.
--stage assemble; gemini_qa final, then eyes: the last batch must look like the first (style drift shows late), seams per grammar. - Re-skin path (procedure §5). Lane song:
python3 -m scripts.cartoon_h3.reskin --from-pack <pack.md> --style <key>. Outside-lane winner:--from-video <final.mp4> --script <lines.txt> --style <key> --slug <new-slug>. Then steps 4-10;storyboard.approvedis never copied. - Log. Append a line to
memory/learnings.jsonlper run (style, anchor, sheet scores, regens, Fish's verdict).
6. Tools & models
| Need | Role (registry) | Built today | NOT BUILT (needs Fish's go) |
|---|---|---|---|
| Sheets, canvases | Image gen | sheet.py, canvas.py (--canvas-backend fal default; gpt / kie; nb = Nano Banana Pro, retired 10-01: never route to it) |
Seedream (v5) canvas backend for pixar/disney3d: A/B two sheets first, then a --canvas-backend choice |
| Fix one thing on a sheet | Image edit | sheet.py with the sheet as a ref | — |
| Cartoon motion, audio clock | Stylized video, ref + audio clock | run.py --backend fal --model h3-max |
style-LoRA and other candidates in the registry row: one-unit proof |
| Paper pans/zooms, tier C | Cheap simple-motion i2v | scripts/seedance_img2vid.py exists standalone, not wired into cartoon-h3 |
per-tier route in run.py (core §2b) + a free ffmpeg push/pan tier; spec in procedure §4 |
| Seamless batch seams (Zach-D) | Stylized video (+ Video extend as option B) | in-batch Transition: lines; run.py --chain-frames (procedure §4.4, built 10-06) |
the seam-pair proof (Fish's eye); pack chain: key + first-panel "continues the previous shot" intent |
| Re-skin | — (v2v restyle = Motion transfer / recast role) | reskin.py (song runs; --from-video drafts song intents) |
v2v restyle of a finished parent (procedure §4.5); VO-narrator re-skin untested: needs vo.mp3, words.json, lines.json, vo-receipt.json in the run dir |
| Clip QA, final QA | Video understanding | clipqa.py, scripts/gemini_qa.py |
~1 fps: cannot judge stop-motion cadence or seams; eyes decide |
Exact NOT BUILT lines: (1) the chaining PROOF and pack-level seam picks (the --chain-frames code is built 10-06, auto-picks same-scene/env seams); (2) cheap simple-motion route for paper (per-tier backend map + per-beat 9:16 stills + ffmpeg or i2v motion); (3) Seedream canvas backend; (4) a zakd style key (do not add: Zach-D is grammar on an existing key). Each needs Fish's go and a one-unit proof (registry "How to adopt").
7. Gates & QA checklist
- [ ] ONE style for the whole ad; the style is the ONE variable vs the parent (or the parent's style is kept).
- [ ] Anchor file exists and Fish has seen it; packargs printed no anchor warning.
- [ ] No Zak-D overhead/observer framing on a recipe A/B ad; camera at eye level, in the room with her.
- [ ] Style block = the Fish-ruled block (clay: handmade stop-motion, dot eyes, fingerprints, diorama, never glossy).
- [ ] Cast checked against the avatar BEFORE sheets; similar-age characters visually distinct.
- [ ] Sheet list dry-run shown; balances checked; Fish's go before
sheet.py. - [ ] Every sheet eye-checked against the anchor; product sheet display dark, no watch face, ribbing visible.
- [ ] Env sheets = isometric floor-plan cutaway, no characters, no readable text, clocks hands only.
- [ ] Flow grammar: every in-batch seam has a named transition; nobody claims seamless batch seams. Zach-D: stage plate attached to every on-stage canvas, hard cuts counted on the final (≤~1 per 8 s).
- [ ] Intents write emotion as face mechanics and describe every background face; clay shots keep a warm practical in frame (procedure §1).
- [ ] Batch tiers marked in the storyboard review (A reveal/CTA/hook/hands; C establishing, pans).
- [ ] storyboard.approved by Fish;
--prompts-onlyreviewed; new style = one tier-A draft batch first (gate 6b); cost line written with the h3.py price caveat;--spendonly after Fish's go. - [ ] Final: first and last batch match the anchor by eye; freezes 0, dark 0, captions from the script.
- [ ] Re-skin:
audio_identical: truein the receipt; beats untouched; storyboard re-approved.
8. Failure modes
| Symptom | Cause | Fix |
|---|---|---|
| Clay reads as smooth 3D toy | canvas.py claymation block is the generic "cinematic" one (run.py falls back to it when a pack has no style_block) |
pack style_block = the Fish-ruled stop-motion block (procedure §1; reskin.py copies it from the nottardy pack since 10-06) |
| Canvases ignore the look | no --style-ref (anchor missing → packargs only warns) |
find/lock the anchor; re-run packargs; never run canvases without it |
| Style drifts across the ad | sheets rendered without the anchor, or mixed sheet sets reused | re-render with anchor as Image 1; one sheet set per style dir |
| Reused Mom looks like another person | old sheets carry their old look | re-sheet the cast from the avatar (PB §4) |
| Lit band / smartwatch in clay or 3D | product sheet or pose | product sheet display OFF; wrist rule in intents (core §3) |
| Flat-2D with outlines | old image model on bluey | one-sheet proof on GPT Image 2.5 before any bluey run |
| Hard jump at every batch seam on a "flow" ad | run.py concatenates unless --chain-frames |
pass --chain-frames (after the seam-pair proof), or stage a deliberate cut at batch ends (end each batch on a whip or a black wipe object) |
| Skeleton reads as Halloween | horror cues | skeleton block bans gore/glow; faces decided up front (PB §4) |
| Paper costs as much as 3D | paper rides H3 today | accept until the tier route ships, or keep paper ads short |
| Re-skin "drift" in the story | intents edited during the re-skin | re-skin changes style words only; any intent change = a new concept, new gate |
| Gemini passes a seam/cadence problem | ~1 fps sampling | Fish watches the cut |
9. Sources
~/research/davidaistar/analysis/gemini_IolBFaQIrl4.md (Zach-D), gemini_N9Cl7PKrlxQ.md (claymation), gemini_867Fbi-lyCw.md (paper $1), gemini_TozlaC3-rCA.md (Pixar mascot), gemini_AEkzwbp6RRU.md (H3 workflow, floor-plan env), analysis/animation.md, analysis/diff_animation_styles.md; scripts/cartoon_h3/canvas.py (STYLE_BLOCKS), run.py, sheet.py, reskin.py, packargs.py; skills/cartoon-h3/SKILL.md; skills/cartoon-pipeline/SKILL.md (Identification vs Observation); song-ad-playbook §4; style-refs STYLE.md files; memory project_claymation_batch_2026-08-14.md, project_song_lane_2026-09-19.md, corrections-hot.md. Detail in references/sources.md.
Not built yet (needs Fish's go)
- A route line in storyboard.md review notes: tier per batch (A/B/C, auto-tagged in <run/tiers.md) and the video role it would use; per-tier H3 models route with run.py --tier-models (core §2b). A non-H3 cheap route per tier is still NOT BUIL
- disney3d style-refs/disney3d/anchor.png = exhibit A frame (OURS, paying) paying signal (exhibit A, n=1) Image gen (GPT Image 2.5); Seedream A/B NOT BUILT Stylized video (H3-max); --tier-models can put B/C on h3 after a side-by-side
- paper none untested Image gen tier A reveal/CTA on Stylized video; everything else = Cheap simple-motion i2v (NOT BUILT, §6)
- Need Role (registry) Built today NOT BUILT (needs Fish's go)
- Exact NOT BUILT lines: (1) the chaining PROOF and pack-level seam picks (the --chain-frames code is built 10-06, auto-picks same-scene/env seams); (2) cheap simple-motion route for paper (per-tier backend map + per-beat 9:16 stills + ffmpeg
- 867Fbi-lyCw — paper animation "$1" (gemini_867Fbi-lyCw.md). Layered papercraft stills, cuts every 2-3 s, a very cheap fast i2v for zooms/parallax only, one continuous VO. Image model preference differs by style (he picks a different model f
- Diff analysis/diff_animation_styles.md: P1 per-style model routing (paper cheap video; Seedream vs GPT Image A/B), P1 cross-batch last-frame chaining in run.py refs_for_batch, P1 mascot explainer; don't-adopt list (no per-clip QA, manual de
- Not adopted: (1) never writing "smooth/polished/glossy" anywhere in a clay prompt: our Fish-ruled block ends with "never smooth or glossy 3D". His rule says the words themselves trigger CGI; we keep the ruled block verbatim and propose a on
- Image role note: davidaistar (TozlaC3-rCA, IolBFaQIrl4) ranks Seedream far above his other image models for Pixar/CGI composition. Our canvases run on Image gen (GPT Image 2.5); a Seedream canvas backend is NOT BUILT (§4.3)
- Motion need: pans, push-ins, slight parallax, stepped movement. This is tier C motion (core §2b); only the reveal/CTA/hook batches need the Stylized video role. Route: §4.2 (NOT BUILT). Today it runs on H3 like every style (works, overpays)
- 4.2 NOT BUILT — cheap simple-motion route (paper first)
- 4.3 NOT BUILT — Seedream canvas backend (pixar / disney3d)