Pipeline Hub

Format core (doctrine, limits, gates, launch)

source: /Users/ayden/.openclaw/workspace/knowledge/ad-formats/_FORMAT-CORE.md

Format core — what every ad format inherits

Every format-* skill = this core + the format's own beat sheet, pack spec, visual grammar and test plan. Read this once per session before running any format.

0. Plan from the combo map (Step 0, every format; workflow-combo-loop)

1. Dawn doctrine (non-negotiable, all formats)

1b. Fish rulings 10-06 (binding)

2. Production lanes (pick the one the format names)

Models are ROLES: look up today's model for each role in knowledge/ad-formats/_MODEL-REGISTRY.md; swap models there, not in skills.

Lane Entry Use for
cartoon-h3 narrator scripts/cartoon_h3/run.py (ElevenLabs VO is the clock) animated VO stories, explainers
cartoon-h3 dialogue same; pack voices: + [SPEAKER] "line" VO lines animated multi-voice scenes (see §3 lip-sync limit)
cartoon-h3 song song.py (Suno V5 on kie) → run.py --song sung stories (song-ad-playbook.md)
re-skin scripts/cartoon_h3/reskin.py same audio + beats, new style (one variable)
ugc-omni scripts/ugc_omni/omni.py (skill ugc-omni) THE photoreal engine: talking head + b-roll (mode: cuts) and single-take yapper (mode: oneshot); gates G0-G4
statics scripts/statics/gen_statics.py (skill dawn-statics) non-native image ads
natives native-image-gen + dawn-native-write long copy + one image
yapper (H3 native voice) scripts/yapper/yapper.py SIDE ARM only (Fish 10-06): one variable against a locked ugc-omni baseline. Photoreal talking heads and single takes run on ugc-omni (mode: oneshot); the keyframe chain stays closed (10-05)
vo-broll scripts/vo_broll_runner.py (+ seedance_broll_runner.py, clip_library.py) VO over real/AI b-roll (format-warehouse, ugc batches)
hooks / readout scripts.cartoon_h3.hooksplice, scripts.cartoon_h3.readout, scripts.cartoon_h3.matrix hook splices on a shared body; per-concept read

2a. Editing = code, never CapCut (Fish 10-06: "we have remotion and stuff to cut for us instead of going into capcut")

Any source step that says CapCut/Premiere maps to our own stack, so edits are repeatable and batchable: - Captions, title header, music bed, final render: scripts/remotion_stitch.py (Remotion project apps/orange-doc, compositions VideoAd 24 fps / VideoAd30; captionMode tiktok / dragon / tiktokbox; captions always from the script) — called by scripts/cartoon_h3/assemble.py; header via scripts/cartoon_h3/title.py; end card via scripts/cartoon_h3/endcard.py (OPT-IN --end-card since Fish 10-06: "we don't need that"). - Trims, speed fits, concat, mux, crop 16:9→9:16, intercut A/B speaker clips, split screen (vstack/hstack), cue-sheet SFX: ffmpeg (patterns in assemble.py fit_clip, master_mix in scripts/vo_audio_chain.py). - Built 10-06: Remotion PodcastTwoShot, DuetStack, ScoreCard, ChapterCard (python3 scripts/remotion_stitch.py comp <Comp> <props.json> <out>); SFX cue sheets (scripts/cartoon_h3/sfx.py, H3_SFX_PLAN= or <run>/sfx-plan.json; real SFX files only — AI foley rejected 10-06); scripts/cartoon_h3/concat.py (chapters / hook prepend). Captions sit at 59-64% of height (Reels-safe, Fish 10-06); titles in the top 14% are pushed to 15%.

(Fish 10-06: "only expensive models for the harder scenes like the product reveal"; "minimax h3 could replace seedance") Every batch/shot gets a tier in the storyboard; the tier picks the ROLE quality, the registry picks the model. | Tier | Shots | Model quality | |---|---|---| | A, hard | product reveal / band on wrist, hands touching anything, CTA, 3+ characters interacting, the hook's first 3 s | best proven pick for the role (cartoon: H3-max; photoreal: ugc-omni Omni A-roll, product via omni's product gate ≥7/10 or real footage; Seedance 2.5 product shots rejected 10-06); candidates/regens allowed | | B, standard | one or two characters acting, dialogue staging, room action | H3-max (or H3 / H3-max-turbo once proven equal on a side-by-side) | | C, easy | establishing shots, empty rooms, clocks, b-roll inserts, reaction holds, paper/2D pans and zooms | cheapest proven simple-motion i2v; a still with a push-in is fine if under ~1.5 s | - H3 covers A-B for every cartoon format; photoreal A-roll is all ugc-omni (tiers only pick b-roll there). - Per-batch model choice: BUILT 10-06. scripts/cartoon_h3/tiers.py tags every batch A/B/C in plan.json + <run>/tiers.md (with cost per batch); run.py --tier-models "A=h3-max,B=h3-max,C=h3" routes each batch (default = --model for all, i.e. unchanged); receipts record tier/model/resolution. Proving a cheaper B/C model is still a one-unit side-by-side first.

3. Known lane limits (design around them, don't discover them mid-run)

4. Gates (in order; every one is Fish's unless marked)

  1. Concept + script approval (Fish): beat sheet filled, every stake/quote sourced, red-team done.
  2. Hooks: 3 hook variants per concept where the format allows (shared body via pack body_start; hooks × leads matrix in cartoon-h3 SKILL.md).
  3. VO/dialogue clarity gate (automatic, vo_check.py), then Fish listens.
  4. Refs/sheets (paid, ~$0.15-0.30 each): one sheet = python3 -m scripts.cartoon_h3.sheet <out.png> <prompt.txt> [refs...]; the batch wrapper output/dawn-iterate-2026-10-04/video/render_sheets.sh <style> [--spend] only knows the 10-04 song cast (dry run first). Render only after Fish's go. Cast checked against the avatar BEFORE rendering.
  5. Storyboard (storyboard.md) → Fish → touch storyboard.approved.
  6. Motion prompts for review: run.py --stage gen --prompts-only (feedback_motion_prompt_approval) before paid video. 6b. Draft → final (Jack Vs. AI 10-06, Seedance 2.5 credits video): prototype tier-A/B shots on a cheap DRAFT (low res / draft endpoint), iterate the prompt on drafts, then render only the approved draft at final quality with a motion-preserving step. Routes: Seedance 2.5 Draft → "Generate in 1080p" on Higgsfield (30 vs 120 credits per 10 s); fal Flux 3 */draft → blackforestlabs/flux-3/draft-enhance (same seed, same motion); H3 has no motion-preserving re-render → run.py --draft (BUILT 10-06: 480P into <slug>-draft, copies VO/plan/approval/canvases, no upscale/end card, never touches the shared-body cache, prints the 768P re-render command). Real fal prices read 10-06 (h3.py FAL_PRICE): h3-max 480P $0.05/s, 768P $0.08/s, 1080P $0.16/s + ~$0.10-0.16/batch reference surcharge; e.g. nottardy (24 batches) $24.73 at 768P vs $15.96 as a 480P draft. Proof 10-06 (output/model-proofs-2026-10-06/6-h3-480p-draft): a 480P draft keeps the shots and cuts but is a DIFFERENT take (SSIM 0.34 vs the 768P clip) — use it to check prompt, staging and cut timing only, never to preview the final look. Final = native 768P/1080P re-render of approved batches (a 480→--hd upscale lost to native on Fish's 10-04 eye test). Not adopted from the same video: "stealth prompting" past moderation filters.
  7. Generation: --spend (Fish's green light), --candidates 1, ≤4 panels/job, --regen N in its own call, never the Higgsfield UI Rerun (feedback_higgsfield_credit_discipline).
  8. Assemble + QA: freezes 0, dark frames 0, captions from the script, end card only if asked (run.py --end-card; Fish 10-06: not necessary by default), gemini_qa final, Fish watches the cut. - Placement preview (starpop facebook-instagram-ad-sizes-and-safe-zones, how-to-preview-a-facebook-ad-before-publishing): scrub to the hook frame, reveal frame and end card on a 9:16 overlay. Header, captions, product, price/offer inside Meta Reels' safe box: top 14 %, bottom 35 %, sides 6 % are UI (1080×1920: 269 px / 672 px / 65 px; 720×1280: 179 / 448 / 43 px) → content in y 14-65 %. Feed shows 9:16 at a 4:5 centre crop (~15 % lost top and bottom). The article names the UI regions but no numbers; 14/35/6 is Meta's published Reels spec (cross-checked 10-06). - Caption height verdict (VideoAd.tsx, read 10-06): default mode centres at 50 % + 80 px (≈56 % of 1280) = SAFE. tiktok = +236 px (≈68 % of 1280; ≈62 % if the comp is 1920 high because the offset is fixed px), tiktokbox top 68 %, dragon top 74 % → all inside the Reels bottom band on Meta (primary text + CTA overlay). Dragon's title header at y 0.08 sits in the top 14 % band AND is cut by the Feed 4:5 crop. reaction-duet composite captions land ~74 % = in the band. Fish's call: a Meta-placement caption height ≤ ~62 % centre (two-line block must end ≤65 %), or accept for TikTok-only cuts. Code change (offset as % of height, per-placement) needs Fish's go. - Primary text: read only what shows before "See more" (symptom must be in it); the headline adds proof, never repeats the hook. Export the preview at the exact frame under review. - Decision-moment check (Starpop teardowns: AI flaws cluster where the ad asks for the click): frame-by-frame review of the last ~15 s (reveal, product, CTA, end card) on every format before Fish's watch. - Before promising any render: check fal, Higgsfield and kie balances (all three went dry 10-03).

5. Pack front matter every format pack carries

format, brand, created, status, parent (the paying ad this iterates, with CPA), iteration (the ONE variable), format_skill (e.g. format-spoken-drama), title, overlay, end_card, style, style_key, style_block, visual_negative, style_anchor, cast, envs, product_truth; run.py reads style/product truth/anchor/refs from the CLI only, so ALWAYS build the args with python3 -m scripts.cartoon_h3.packargs <pack.md> [--storyboard] (refs live in <pack>.args). Only style_<SPEAKER>/tempo_<SPEAKER> keys for speakers in voices: are voice settings (run.py fixed 10-06; before that style_key crashed dialogue VO). Dialogue packs add voices: and pace keys (vo_tempo, gap_same, gap_turn, max_gap, seam_gap, style_<SPK>, tempo_<SPK>); song packs add the suno_* keys. New slug per run (session freshness rule). Plus the combo_* keys from §0 (combo_avatar … combo_ad_prefix), validated by python3 scripts/combo_loop/tags.py check <pack>.

6. Launch + read (media-buyer rules apply)

7. Every format skill has these sections (template: _FORMAT-SKILL-TEMPLATE.md)

Read first · When to use / not · The format · Why it sells (evidence status) · Beat sheet · Pack spec · Visual grammar · Audio · Production commands + cost · Gates & QA checklist · Variants & test plan · Failure modes · Sources (13; scripts/check_format_skills.py enforces the order). Workflow skills: _WORKFLOW-SKILL-TEMPLATE.md (9 sections).