Pipeline Hub

workflow-ugc-automation

Claude-orchestrated batch pipeline for DawnBands AI UGC/video ads: product URL -> brand-dna.json (scripts/brand_dna.py), reference ad -> per-second dissect -> <=15 s scene prompts, one base -> N variants swapping ONE variable (hook / actor / setting / product angle / delivery) with a variants manifest, generation fan-out bound to registry ROLES behind Fish's per-batch spend go, then QA + review sheet + ad-batch-hub staging.

Lane: ugc-omni (every photoreal-people unit, gates G0-G4) / cartoon-h3 / statics / seedance b-roll, picked per format; H3 native voice (yapper) is a side arm only · not built yet: 8 (see below) · source: /Users/ayden/.openclaw/workspace/skills/workflow-ugc-automation

SKILL.mdprocedure.mdsources.mdEvals (7)Learnings (14)
1. Read first2. When to use / when not3. Inputs4. Outputs5. Process6. Tools & models7. Gates & QA checklist8. Failure modes9. Sources

workflow-ugc-automation — URL in, a reviewed batch of one-variable variants out

The transferable part of davidaistar's pipeline is the orchestration, not StarPop: brand DNA from a URL, a vision model breaking a reference into per-second beats, an LLM chunking those into ≤15 s prompts, one base fanned into variants, parallel generation, a review step. We rebuild it on our own scripts, API-first (no browser driving a SaaS UI), with our gates. Free steps can run unattended. Nothing paid runs without Fish's go for that batch, and nothing in this workflow writes to Meta.

1. Read first

2. When to use / when not

3. Inputs

Input Required Where it comes from
Product URL yes live PDP (Dawn default per workspace CLAUDE.md; it redirects, so take the canonical URL brand_dna.py records)
Reference ad for dissect-led batches our winner, a non-competitor organic/scaling ad, or a competitor (gap map only); file or URL
Approved base script before any variant format skill beat sheet → direct-response-copywriter doctrine → humanizer → red-team (core §1 copy routing)
Parent + its CPA yes the paying ad this batch iterates (core §5 parent:)
Actor reference photoreal only ugc-omni G1: a real creator frame → avatar; G2 locks the character's prompt
Fish's batch go before step 6 in chat, against the cost quote; recorded in manifest.json

4. Outputs

All under output/ugc-auto/<YYYY-MM-DD>-<slug>/ (new slug per batch, session freshness): - brand-dna.json copy (source of truth stays output/brand-dna/<handle>/, with images/ + raw/ receipts) - dissect/ pointer to output/ad-dissect/<slug>/ (dissect.json, pacing.json, dissect.md) - scenes.json: the base ad as ≤15 s generation units, each with role, tier, Action/Audio/Quality prompt blocks - variants.json: the variant list, ONE axis + value per variant, the parent and what stays constant - manifest.json: per variant per unit: lane, registry role, model id, job dir, cost quote, actual cost, takes to approved, QA result, file (review.md rolls these up into cost per approved variant, failed takes included: starpop seedance-2-5-ads, top-5-ai-video-generators-realistic-ugc) - review.md + ads.json: Fish's review sheet and the hub payload; final/<variant-id>.mp4 (≤24 MB copies for the hub)

5. Process

# Step Tool Cost
0 Balances + registry check; monthly fal catalog refresh + per-role diff higgsfield account status, kie credit GET, fal catalog curl (procedure §0) free
1 Brand-DNA intake python3 scripts/brand_dna.py <product-url> free
2 Dissect the reference python3 scripts/ad_dissector.py <src> --brand-context "<one line>" [--competitor] 1 Gemini call (cents)
3 Chunk into ≤15 s scene prompts + tier each unit python3 scripts/ugc_tools/scene_chunker.py --script <approved> --lane <lane> --subject "the mom" --dissect <dissect.json> --out $B/scenes.json, then Claude fills the <FILL> slots (procedure §3) free
4 Variants manifest (one swap each) + quote python3 scripts/ugc_tools/batch_variation.py plan --base $B/scenes.json --axis <axis> --values <values.json> --price <lane>=<$>/s; cartoon lane uses python3 -m scripts.cartoon_h3.matrix free
5 Stage the PLAN as a hub draft; quote the cost; get Fish's go ~/ad-batch-hub/stage-session.py <plan-dir> --brand "Dawn Band" --type ugc --draft --push free
6 Smoke one unit, then fan out per lane lane entry points (§6), --spend / no --dry-run only after the go PAID
7 QA every output scripts/gemini_qa.py, omni.py verify, clipqa.py, eyes cents
8 Review sheet + finalize the hub session python3 scripts/ugc_tools/review_sheet.py --manifest $B/manifest.json (review.html + review.md), stage-session.py <batch-dir> --finalize <session-id> --push free
9 Hand to launch (not this workflow) media-buyer; meta_preflight.py sanitize + check_links; meta_link_audit.py human-gated

Step rules: 1. Brand DNA reads only the public storefront (<pdp> HTML, <pdp>.json, first-party theme CSS) with curl. It writes images, colours, fonts, PDP copy, price, review snippets and warnings. Act on every warning: a handle redirect means ad links use the canonical URL; lit-display images are never product-in-scene or i2v refs (use knowledge/brands/dawnbands/product-cutout-unlit.png); a price mismatch with product-truth means the live PDP wins for offer lines and Fish hears about it. Hardware facts still come from product-truth only; PDP review snippets are store-curated, not VOC. 2. Dissect gives structure and measured pacing. It does NOT give our script. Source-type decision per format-ad-clone: our winner / non-competitor = mirror the structure with one innovation; competitor = gap map, must fail the competitor-swap test. 3. Scene chunking: group beats into generation units that respect the lane cap (H3 ≤15 s/≤4 panels; omni buckets 4/6/8/10 s, one script line per take; Seedance b-roll per registry). Each unit carries the dissect's role, a tier (A/B/C, core §2b), and three blocks: Action (who, doing what, framing), Audio (voice, room tone, delivery, exact line), Quality (capture device, light, aspect). Give the model the scene + the line and let it improvise camera work; lock only what the gate checks (product, wrist, words). Every ref gets one stated job in a reference map, every shot one action and one camera instruction, every seam between shots is chosen (cut or stated transition), and footage comes back clean of captions/text (procedure §3; starpop Seedance/Kling guides). 4. Variants: one axis per variant vs the base: hook (first 3 s line + action), actor (one locked character swapped for another), setting (environment only), product_angle (which benefit/mechanism beat leads), delivery (same words, a different read: calm / tired / skeptical / deadpan; starpop how-to-use-seedance-2-0-to-make-ads, how-to-use-kling-3-0-to-make-ads). Everything else is byte-identical (same body units reused, not regenerated). Two axes changed = two variants. 3 hooks on a shared body is the default first fan-out (core §4 gate 2). 5. Draft first (hub rule): the plan (scenes, hooks, start frames if any) goes up as a Draft session; Fish reviews there. A missing verdict is NOT approval. Fish's go is a chat message naming this batch and its quote; write it into manifest.json go. 6. Draft → final + fan-out (core gate 6b): where the lane has a draft route (Seedance 2.5 Draft → "Generate in 1080p" on Higgsfield; fal Flux 3 */draft → draft-enhance; H3 480P → upscale only after a side-by-side vs native 1080), iterate tier-A/B units on drafts and render only approved drafts at final quality. ugc-omni has no draft step: its G2 lock (same line good 3×) is the smoke and the proof, and every A-roll take is Omni (tiers only pick b-roll). H3 cartoon batches draft with run.py --draft (480P, own <slug>-draft dir); no other lane has a batch draft stage (NOT BUILT). Then smoke ONE unit of the base on its lane, Fish's eye on it, then the rest. Shared body first, then hooks (shared-batch race, cartoon-h3). Regens are their own calls and count against a batch cap of 8. 7. QA: review in a fixed order and pick correct over pretty: product → face/wardrobe → hands/action → dialogue → continuity → camera → audio/ending. Before any regen, name the cause (reference, prompt, scope, settings) and change only that. Freezes 0, dark frames 0, transcript = script (omni verify), captions from the script, band dark and wrist down in every product shot, no smartwatch. A generated band appears only through ugc-omni's product gate (variant/pick --product ≥7/10 + display state, prodcheck), display-off wording, worn or resting across a palm (never pinched upright), product_action locked; real footage is the fallback. Gemini samples ~1 fps: eyes are the final gate. 8. Review sheet: one row per variant (procedure §8). Stage finals into the SAME hub session (--finalize), never a second session.

6. Tools & models

Roles come from _MODEL-REGISTRY.md; re-read it each batch. Lane per format: | Format (his five) | Our lane + entry | Registry role(s) | Status | |---|---|---|---| | Handheld selfie talking head | ugc-omni scripts/ugc_omni/omni.py (cost, lock, gen, verify, broll, assemble; dry run until --spend) | Photoreal / multi-ref video with locked character; Image gen (avatar/frames) | Built (another session owns ugc-omni: reference, don't edit) | | One-shot UGC with b-roll | ugc-omni A-roll + broll; or Seedance b-roll scripts/seedance_broll_runner.py | + Cheap simple-motion i2v (tier C) | Built. Runner models are Higgsfield seedance1_5/seedance_2_0 only | | Single-take native speech (yapper) | ugc-omni mode: oneshot (one location, no b-roll, chained segments on exact frames, anchor_every: 3, reveal via end_frame) | Photoreal talking take (Omni) | Built. H3 native voice via yapper.py = side arm only (one variable vs a locked omni baseline); its keyframe chain stays closed (Fish 10-05) | | Pixar / cartoon object | python3 -m scripts.cartoon_h3.run (+ matrix for hooks × leads) | Stylized video, ref + audio clock; TTS | Built, full gates in cartoon-h3; no lip-sync (core §3): his talking-object shot is staged off-mouth | | Podcast two-shot | format-podcast | per that skill | per that skill | | Statics from the same DNA | scripts/statics/gen_statics.py (dawn-statics) | Image gen; Exact text on image | Built | | Cinematic short (no VO) | not run | — | Skipped: he rates it weak for DR (f83UH) | Provider conflicts, flag once per batch (not resolved here): (1) the registry says fal is the default gateway, but seedance_broll_runner.py is Higgsfield-only (seedance1_5/seedance_2_0, no 2.5) and skills/vo-broll/SKILL.md (9-15) routes generated clips to Higgsfield; (2) ugc-omni runs on kie, not fal; (3) image arms: pass --arms gpt2,sd5 (Fish 10-06: Nano Banana retired, Seedream 5 Pro is arm 2; omni.py's own default still lists nbp, its owner changes that). Ask Fish at the batch go which applies.

Shared: dissect + QA = Video understanding (scripts/ad_dissector.py, scripts/gemini_qa.py, scripts/cartoon_h3/clipqa.py); scripts = LLM writing (scripts/claude_cli.py); staging = ~/ad-batch-hub/stage-session.py, stats = ~/ad-batch-hub/scripts/refresh.sh (read-only Meta GET); cartoon audit site = python3 -m scripts.cartoon_h3.hub.

NOT BUILT (needs Fish's go): - Built 10-06 (free, scripts/ugc_tools/): scene_chunker.py, batch_variation.py (plan / approve / check / log; check exits 2 without Fish's go), review_sheet.py. Not built: per-lane job dirs from a variant (each lane's own entry point still runs the units: matrix.py, omni hook lines, gen_statics --only), and no lane runner calls batch_variation.py check yet. - Seedance 2.5 (fal) in seedance_broll_runner.py; Video extend, Video edit by instruction, Motion transfer/recast roles (all NOT BUILT in the registry). - Static swipe-file library (his 136 ripped templates) under knowledge/. - A fal catalog refresh/diff script (procedure §0 is a curl loop + a python one-liner). - Browser-driving a generation SaaS (his Claude-in-Chrome step): deliberately not built; API entry points replace it.

7. Gates & QA checklist

8. Failure modes

9. Sources

~/research/davidaistar/REPORT.md; analysis/gemini_f83UH-qmNUs.md, analysis/gemini_aqo2L5wYGEg.md, analysis/ugc_seedance.md (f83UH, aqo2 sections, cross-video #6-7), analysis/guide_copy_images_shorts.md (shorts wGVBPiaFYiw, cPQ9e0RfiQE, J7k_eNpLO3o, 2zOlhDAOwb4; variation mode), analysis/diff_ai_ugc.md, analysis/diff_cloning.md. Ours: project_ad_batch_hub.md, feedback_higgsfield_credit_discipline.md, feedback_meta_upload_preflight.md, feedback_meta_link_match.md, reference_shopify_stores.md (public storefront only). Detail: references/sources.md.

Not built yet (needs Fish's go)

Every line in this skill that mentions something not built, roughly de-duplicated. Some items repeat in different words.