render-multiworld
Assemble a silent, music-led 3-world product-tour ad — trim and hard-cut-concat the per-world WIDE-arrival + top-down-macro clips, composite the HTML/Playwright brand end card ("FIND YOUR DAILY." + handwritten scent labels + arrows) over an AI flat-lay background, and mux one mus
Install
npx skills add https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/render-multiworld
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install gooseworks-ai-goose-skills@llmmart
git clone https://github.com/gooseworks-ai/goose-skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole gooseworks-ai/goose-skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
render-multiworld
Assemble a silent, music-led "multi-world product tour" ad (≈27s, 9:16) — a tour of three distinct "third-place" worlds, one per product/scent, that lands on a Pinterest-style brand end card. Each world is a two-shot pair: a ~4.5s WIDE kinetic-calm ARRIVAL (the environment dominates, the bottle stays small) hard-cutting to a ~3.5s top-down MACRO product MOMENT (the sealed bottle nested with its botanical companion). Scent identity is carried by the world + botanical companion, not by bottle color. No VO, no captions in the scenes — one music bed carries the whole thing.
This capability is the FREE, deterministic assembler. The paid steps — the six per-world clips, the AI flat-lay end-card background, the ElevenLabs music bed — are separate capabilities (see the gap below for the clips); the recipe orchestrates and gates them.
Run
- Trim clips (FFmpeg, FREE) — trim each per-world clip to its
scene_grid[].duration_sec(arrival 4.5 / macro 3.5), re-encode to the master spec (720×1280, 24fps, yuv420p, scale+pad, audio stripped). Trimming the macro so the top-down portion dominates also hides any label misrender at the clip's upright tilt extreme. - End card (Playwright/HTML, FREE) — screenshot
end_card.htmlover the AI flat-lay BACKGROUND, then FFmpeg-encode to adwell_sec(3.0s) static clip. Headline ("FIND YOUR DAILY.", Inter 900), one handwritten Caveat scent label + hand-drawn SVG arrow per bottle, Playfair wordmark + URL. End-card text is HTML, NEVER AI-rendered — the AI step produces the background only. - Hard-cut concat (FFmpeg, FREE) — concat the six trimmed clips in scene order (S01 arrival → S02 macro → … → S06 macro) + the end-card clip. Hard cuts (no dissolves), normalized to one fps/codec first so concat-copy is safe.
- Music mux + web encode (FFmpeg, FREE) — mux the single instrumental bed onto the
silent concat with
afadein/out +loudnorm I=-16:TP=-1.5:LRA=11, AAC 192k, clamped to 27.0s, explicit single-audio map so no silent scene-track leaks in → the H.264 (+ AAC) 720×1280 master.
Contract
- Deterministic + FREE (Playwright + PIL/HTML + FFmpeg); no paid calls, no AI-rendered end-card text. Iterate the cut for free by re-running the assembly.
- Silent, music-led — no VO, no captions during the scenes; on-screen text appears ONLY on the end card, HTML-composited.
- Per world = WIDE arrival (bottle small, environment dominant) → top-down macro (product + botanical, no hands). Hard cuts between scenes; end card is a static hold with legible HTML text; music starts at t=0 and fades the tail.
- Sealed-bottle rule is enforced at QC — trim/concat can't fix an open-cap or spraying clip; that's a re-roll (paid), not an assembly fix. Identity via world + botanical, never bottle color.
- The template recipe (DB) supplies the per-brand config (worlds, palettes, botanicals, prompts, end-card copy, music mood); this capability is the generic assembler.
Gaps / routing notes
- The six per-world clips need a Higgsfield-proxy capability that does not exist. The
source molecule fires them through Higgsfield Marketing Studio
(
marketing_studio_video/product_showcase) grounded on imported product UUIDs, with the sealed-bottle safety block front-loaded on every prompt.create-video-falis a FAL i2v proxy — a different provider and job shape — so it cannot serve this step. Wiring the clip step to templates-as-data requires acreate-video-higgsfieldproxy (Marketing Studioproduct_showcase, imported-product grounding, per-prompt safety block) that does not exist yet. Until it lands, the clips are generated via the Higgsfield Marketing Studio path directly (CLI/MCP) and that step is not a fetchable capability. - The end-card background is an AI flat-lay render (text-free, all three sealed bottles + botanicals) that in prod routes through create-image-fal (NB2); only the HTML text overlay + encode run locally as FREE assembly.
- The music is a paid ElevenLabs call that in prod routes through create-music-elevenlabs; only the loudnorm + fade + mux run locally as FREE assembly.
See scripts/PIPELINE.md for the full config-field → source-step map and scripts/README.md
for the FREE-assembly detail.
Files (goose-skills)
-
scripts
-
config.example.json 11.7 KB
{ "_comment": "Primally Pure 'Three-Place Tour' multi-world product tour \u2014 THE WORKED EXAMPLE (clients/Primally pure/ad-runs/run-03-run-03, finals/master-v2.mp4). Copy to config.json and edit. Three scent worlds, each = a WIDE kinetic-calm ARRIVAL clip (bottle small, environment dominates) + a top-down MACRO product MOMENT clip. Six Higgsfield Marketing Studio product_showcase clips grounded on imported product UUIDs, an NB2 text-free flat-lay end-card BACKGROUND + an HTML/Playwright text overlay, one ElevenLabs music bed. Silent otherwise (no VO, no captions in scenes). FFmpeg trims to the grid + hard-cut concats + muxes music. 720x1280 9:16, 27.0s. SEALED-BOTTLE is a hard safety rule.", "brand_name": "Primally Pure", "width": 720, "height": 1280, "fps": 24, "duration_sec": 27.0, "visual_style": "Sunlit-natural / handmade / farm-to-skin. Soft daylight from upper-left, faint contact shadows, linen + clay + cedar. Camera language KINETIC-CALM (slow drift, lateral track, soft push) \u2014 NOT whip-pan/fast-dolly. Each scent gets its own color world; bottles are NOT color-coded so world palette + botanical companion carry scent identity.", "higgsfield": { "model": "marketing_studio_video/product_showcase", "arrival_duration_sec": 5, "macro_duration_sec": 4, "safety_block": " No bare skin, no exposed body parts in frame. NO smoke, NO vapor, NO aerosol, NO atomizer spray, NO scent visualization \u2014 bottle is a sealed twist-stick deodorant, never depict it open, extruded, or spraying. NO whip pans, NO shake, NO wobble, NO earthquake. Label identical to imported product reference. No on-screen text." }, "worlds": [ { "slug": "lavender", "product": "Lavender Deodorant", "product_uuid": "f805f78e-5b74-41da-85fe-eb40b3435202", "world": "Private sunrise reformer pilates studio \u2014 sheer linen curtains diffusing mauve-pink dawn light, blonde-pine floor, one wood reformer with cream-strap loops, folded cream linen towel on the carriage edge.", "palette": "Mauve dawn + cream linen + blonde pine", "botanical": "fresh lavender sprig", "bottle_color": "cream/beige", "arrival_prompt": "9:16 KINETIC-CALM WIDE inside a sunrise reformer pilates studio for Primally Pure Lavender Deodorant. Bottle stays small; environment dominates, never macro. Sheer linen curtains diffusing mauve-pink dawn light, blonde-pine floor, one wood reformer with cream-strap loops, a folded cream linen towel on the carriage edge. The cream-colored sealed Lavender Deo + a fresh lavender sprig rest on the towel. The toe of a cream canvas sneaker visible at the very lower edge of frame implies a recent presence. 3 ambient-not-frenetic cuts: slow drift past the linen curtain catching mauve light; lateral track past the reformer past the bottle; soft push-in to the towel at medium scale. Sunlit-natural palette: mauve dawn + cream linen + blonde pine. Soft daylight from upper-left.", "macro_prompt": "9:16 top-down macro product-only shot for Primally Pure Lavender Deodorant. Cream-colored sealed Lavender Deo lies horizontally nested into a folded cream linen towel on a pale-pine surface, fresh lavender sprig draped across the cap, small unglazed clay bud vase to the side. Slow parallax tilt revealing more of the linen weave. Soft mauve-warm daylight from upper-left, faint contact shadow. Cream + mauve + blonde pine palette. NO hands in frame." }, { "slug": "blue_tansy", "product": "Blue Tansy Deodorant", "product_uuid": "fa4e5e33-ee9e-45de-8db5-4b4d71fe9ba9", "world": "Spa / sauna threshold anteroom \u2014 vertical cedar slat wall, dark sage-teal slate floor, fresh eucalyptus bundle hanging from a leather loop, low slate bench in foreground, faint soft steam drifting laterally in the back.", "palette": "Sage-teal + bone + warm cedar", "botanical": "blue tansy flower + eucalyptus bundle", "bottle_color": "cream/beige", "arrival_prompt": "9:16 KINETIC-CALM WIDE spa anteroom for Primally Pure Blue Tansy Deodorant. BOTTLE STAYS SEALED, CAP STAYS ON. Bottle stays small; environment dominates, never macro. Vertical cedar slat wall, dark sage-teal slate floor, fresh bundle of eucalyptus hanging from a leather loop on the wall, low slate bench in foreground. Cream-colored sealed Blue Tansy Deo sits on the bench next to a cracked-glaze sage-blue ceramic bowl holding small blue tansy flowers. Faint soft steam drifting laterally in the back, NOT billowing. Bare ankle in cream linen robe just visible at upper-right edge, no face. 3 ambient cuts: lateral track from hanging eucalyptus down past wall; soft tracking past bench catching bottle and bowl; gentle push-in at medium scale. Sage-teal + bone + warm cedar palette. Soft cool daylight from upper-right.", "macro_prompt": "9:16 top-down macro product-only shot for Primally Pure Blue Tansy Deodorant. Cream-colored sealed Blue Tansy Deo rests horizontally on a large cracked-glaze sage-blue ceramic dish on smooth slate stone surface. Two small blue tansy flowers + two fresh eucalyptus leaves arranged loose around it. Cool sage-teal + bone palette, soft cool daylight from upper-left. Slow parallax tilt. NO hands in frame.", "_note": "Arrival re-rolled once (S03 v1 \u2192 v2): v1 rendered the bottle with the cap removed \u2014 violated the sealed-bottle safety rule. v2 front-loads 'BOTTLE STAYS SEALED, CAP STAYS ON'." }, { "slug": "bergamot_eucalyptus", "product": "Bergamot + Eucalyptus Deodorant", "product_uuid": "fc4369ce-8060-4125-b0f0-36202f0463d9", "world": "Outdoor Saturday farmers market stall \u2014 cream linen-canvas market tent overhead with dappled morning sunlight, wooden crates of yellow bergamot fruit and sage stems, cream open-weave linen tote bag on a weathered wood crate.", "palette": "Citrus yellow + warm linen + sage", "botanical": "bergamot fruit + eucalyptus stems", "bottle_color": "matte black", "arrival_prompt": "9:16 KINETIC-CALM WIDE outdoor Saturday farmers market for Primally Pure Bergamot + Eucalyptus Deodorant. Bottle stays small; environment dominates, never macro. Cream linen-canvas market tent overhead with dappled morning sunlight breaking through, wooden crates of yellow bergamot fruit and sage stems in foreground, cream open-weave linen tote bag set on weathered wood crate. The matte-black sealed B+E Deo pokes out of the tote alongside three long fresh eucalyptus stems. Bare hand at lower edge reaching to pick a bergamot fruit (only fingers, no face). 3 ambient cuts (slightly more energy to mirror the brighter morning palette, still NO whip pans): slow push past canvas tent catching dappled light; lateral track past crates landing on tote; soft push-in to bottle at medium scale. Citrus yellow + warm linen + sage palette. Crisp contact shadows.", "macro_prompt": "9:16 top-down macro product-only shot for Primally Pure Bergamot + Eucalyptus Deodorant. Matte-black sealed B+E Deo rests horizontally on cream linen napkin on pale wood farmhouse table. Halved bergamot fruit (cut face up showing citrus pulp) + one long fresh eucalyptus stem with leaves arranged loose around the bottle. Bright warm morning daylight from upper-left, faint contact shadow. Cream linen + citrus yellow + sage palette. Slow parallax tilt. NO hands in frame.", "_note": "Arrival's mid-clip frame showed a gloved leather hand (storyboard called for bare fingertips) \u2014 minor deviation, accepted. Macro (S06) label misrendered 'Eucalyptus'\u2192'Eucaiyptus' at the upright extreme; not visible in the top-down portion the trim dominates." } ], "scene_grid": [ { "scene": "S01", "world": "lavender", "shape": "arrival", "duration_sec": 4.5 }, { "scene": "S02", "world": "lavender", "shape": "macro", "duration_sec": 3.5 }, { "scene": "S03", "world": "blue_tansy", "shape": "arrival", "duration_sec": 4.5 }, { "scene": "S04", "world": "blue_tansy", "shape": "macro", "duration_sec": 3.5 }, { "scene": "S05", "world": "bergamot_eucalyptus", "shape": "arrival", "duration_sec": 4.5 }, { "scene": "S06", "world": "bergamot_eucalyptus", "shape": "macro", "duration_sec": 3.5 }, { "scene": "S07", "world": "end-card", "shape": "endcard", "duration_sec": 3.0 } ], "end_card": { "nb2_model": "nano_banana_2", "nb2_input_product_uuids": [ "f805f78e-5b74-41da-85fe-eb40b3435202", "fa4e5e33-ee9e-45de-8db5-4b4d71fe9ba9", "fc4369ce-8060-4125-b0f0-36202f0463d9" ], "nb2_prompt": "Editorial top-down flat-lay product photograph of three Primally Pure deodorant bottles arranged casually on a soft warm cream-blush gradient background. Bottle 1 (cream-beige cylindrical twist-stick, identical to the Lavender reference) tilted at a 15-degree angle in the upper-right with a small fresh lavender sprig laid beside its base. Bottle 2 (cream-beige cylindrical twist-stick, identical to the Blue Tansy reference) standing upright in the center foreground with two small blue tansy flowers and a single fresh eucalyptus leaf laid beside its base. Bottle 3 (matte-black cylindrical twist-stick, identical to the Bergamot + Eucalyptus reference) tilted at a 15-degree angle in the lower-left with a sprig of fresh eucalyptus and one halved bergamot fruit (cut face up) laid beside its base. The three bottles overlap slightly but each is clearly visible, with soft diffused shadows pooling beneath them on the cream-blush surface. All three bottles have identical Primally Pure black thin-serif labels exactly matching the imported product references. Pinterest-style editorial product photography, soft natural overhead daylight, clean and uncluttered farm-to-skin sunlit-natural register, generous negative space at the top of the frame. No text overlays, no typography, no captions, no logos other than what is printed on the bottles.", "html": "endcard.html", "dwell_sec": 3.0, "overlay": { "headline": "FIND YOUR DAILY.", "headline_font": "Inter 900, 'DAILY' outlined via -webkit-text-stroke", "scent_labels": [ { "label": "lavender.", "font": "Caveat 600", "arrow": "hand-drawn, points to upper-right bottle" }, { "label": "blue tansy.", "font": "Caveat 600", "arrow": "hand-drawn, points to center bottle" }, { "label": "bergamot + eucalyptus.", "font": "Caveat 600", "arrow": "hand-drawn, points to lower-left bottle" } ], "wordmark": "PRIMALLY / PURE (Playfair Display serif, two rows)", "url": "primallypure.com", "text_compositing_rule": "Headline + labels + arrows + wordmark composited via HTML/Playwright/ffmpeg, NEVER AI-rendered. NB2 generates the flat-lay BACKGROUND ONLY (no text)." } }, "music": { "provider": "elevenlabs", "prompt": "Warm acoustic-pop / dreamy-indie instrumental bed, calm and aspirational, soft guitar + gentle percussion + warm bass, major key, wellness-ritual register (NOT jingle, NOT neon pop-house), instrumental only, energetic-but-gentle from t=0.", "length_ms": 27000, "trim_intro_sec": 0.0, "force_instrumental": true }, "master": { "loudnorm": "I=-16:TP=-1.5:LRA=11", "audio_bitrate": "192k", "fade_in_sec": 0.3, "fade_out_sec": 0.5 }, "post_production": { "music": { "default": "on", "note": "ElevenLabs bed, default on" }, "captions": { "default": "n/a", "note": "silent / music-led \u2014 no VO" }, "end_card": { "default": "on", "note": "HTML 'FIND YOUR DAILY.' end card, default on" } } } -
PIPELINE.md 6.1 KB
# PIPELINE — multiworld-product-tour How each `config.example.json` field maps to the source generation step. This molecule ships as **config + documentation**, not a rebuilt runnable Higgsfield harness — the six clips are fired through Higgsfield Marketing Studio (CLI/MCP), which reserves credits server-side. The real render/assembly scripts live in the source project: `clients/Primally pure/ad-runs/run-03-run-03/working/` (`render_clips.py`, `render_endcard.py`, `build_master.py`) and `production/` (`scene-contract.json`, `generation-jobs.json`, `audio-plan.json`). ## The 3×3 grid (from `idea-brief.md`) The format's core IP: three products, each locked to its own **world + palette + botanical companion**, so scent identity is carried by the *set*, not by bottle color. | Scent (product) | Third place (world) | Palette | Botanical companion | Bottle color | |---|---|---|---|---| | Lavender | Sunrise reformer pilates studio | Mauve sunrise + cream linen + blonde pine | fresh lavender sprig | cream/beige | | Blue Tansy | Spa anteroom / sauna threshold | Sage-teal + bone + warm cedar | blue tansy flower + eucalyptus bundle | cream/beige | | Bergamot + Eucalyptus | Saturday outdoor farmers-market stall | Citrus yellow + linen + sage | bergamot fruit + eucalyptus stems | matte black | Note: eucalyptus appears in BOTH the Blue Tansy and B+E worlds (a connective brand thread) — differentiate via the *other* botanical (blue tansy flower vs bergamot fruit) so the two worlds don't read as the same scent. ## Field → generation step ### `worlds[]` → six Higgsfield Marketing Studio clips (`render_clips.py`, PAID) - Each world produces **two** `marketing_studio_video/product_showcase` clips grounded on its `product_uuid` (the brand's imported Higgsfield product): - `arrival_prompt` → the WIDE kinetic-calm arrival (renders `higgsfield.arrival_duration_sec` = 5s; trimmed to 4.5s at master). - `macro_prompt` → the top-down macro product moment (renders `macro_duration_sec` = 4s; trimmed to 3.5s). - `higgsfield.safety_block` is appended to **every** prompt: sealed-bottle discipline + no smoke/vapor/aerosol + no whip-pans/shake + label-match + no on-screen text. - Six clips fired in parallel (ThreadPoolExecutor); per-job result JSON + mp4 land in `working/clips/`. Job ledger → `production/generation-jobs.json`. - **Gotchas seen on the demo** (all in `generation-jobs.json`): - S03 (Blue Tansy arrival) v1 rendered the bottle **cap-off** → P0 sealed-bottle violation → re-rolled as v2 with "BOTTLE STAYS SEALED, CAP STAYS ON" front-loaded. - S05 (B+E arrival) mid-clip showed a gloved leather hand vs the called-for bare fingertips — minor, accepted. - S06 (B+E macro) first submission failed HTTP 502 (transient) → retried; and the label misrendered "Eucalyptus"→"Eucaiyptus" at the upright tilt extreme — not visible in the top-down portion the trim dominates. ### `end_card.nb2_*` → NB2 flat-lay background (`render_endcard.py`, PAID) + HTML overlay - `nb2_prompt` + the 3 `nb2_input_product_uuids` → one `nano_banana_2` render of the **text-free** editorial flat-lay: all three sealed bottles + their botanicals on a cream-blush gradient, generous negative space at top. Prompt explicitly forbids text/typography (`No text overlays, no typography, no captions`). Output → `working/endcard/layer1.png`; job → `generation-jobs.json` (`job-endcard-001`, model `nano_banana_2`). - `end_card.html` (the overlay layer) is screenshotted by Playwright over that background, then encoded to a `dwell_sec` (3.0s) mp4: - `overlay.headline` "FIND YOUR DAILY." — Inter 900, "DAILY" outlined via `-webkit-text-stroke`, rise-in animation. - `overlay.scent_labels[]` — three handwritten Caveat-font labels, each with a hand-drawn SVG arrow (staggered `drawArrow` animation) pointing to its bottle. - `overlay.wordmark` "PRIMALLY / PURE" (Playfair Display, two rows) + `url`. - Text animates across ~0–2.4s, then a ~0.6s hold (`scene-contract.json` S07). - **Rule:** the end-card text is HTML-composited, NEVER AI-rendered. NB2 = background only. ### `music` → one ElevenLabs bed (curl → ElevenLabs, PAID) - `music.prompt` → a single instrumental bed (`force_instrumental: true`), `length_ms` = 27000. Trimmed to `working/music/music_trimmed.mp3`. Job → `generation-jobs.json` (`job-music-001`, provider `elevenlabs`). - No VO, no captions anywhere in the scenes — the whole tour is silent-but-music-led (`audio-plan.json` has no VO auditions; `scene-contract.json` every scene `captionStyle: none`). `audio-plan.json` sets `climaxBeatId: beat-07-endcard`. ### `scene_grid` + `master` → FFmpeg stitch (`build_master.py`, FREE/deterministic) - Trims each clip to its grid `duration_sec` (arrival 4.5 / macro 3.5 / end card 3.0), re-encodes each to the master spec (`width`×`height` = 720×1280, `fps` = 24, yuv420p, scale+pad, no audio). - Hard-cut concat via the concat demuxer → a silent master (S06→S07 is the one whip-pan-to-end-card transition; the rest are hard cuts, per `scene-contract.json` `transitionPlan`). - Muxes the music: `afade` in `master.fade_in_sec` / out `master.fade_out_sec` + `loudnorm master.loudnorm` (I=-16:TP=-1.5:LRA=11), AAC `master.audio_bitrate`, clamped to `duration_sec` (27.0s). - Output → `finals/master-v2.mp4`. Total = `3×(4.5+3.5) + 3.0 = 27.0s`. ## Source-of-truth files (in the demo project) - `production/scene-contract.json` — the 7-scene contract (worldLock, per-scene shot + frameDescription, transitionPlan, `visualVarietyAudit`). - `production/generation-jobs.json` — the job ledger (models, costs, re-rolls, the sealed-bottle P0). - `production/audio-plan.json` — silent/music-led config. - `working/{lavender,blue_tansy,bergamot_eucalyptus}_product.json` — the imported product refs (UUIDs + CloudFront media). - `working/endcard/{endcard.html, nb2_result.json}` — the overlay + the NB2 background job. - `working/{render_clips,render_endcard,build_master}.py` — the real render/assembly code. - `idea-brief.md` — the 3×3 grid + guardrails + the Touchland-departure table. -
README.md 5.3 KB
# render-multiworld — FREE assembly This capability ships the **recipe** (`config.example.json`) + a config→step map (`PIPELINE.md`) for the multi-world product-tour format, plus this note documenting the **FREE, deterministic assembly** — everything between the paid model calls. The paid steps (the six per-world clips, the NB2 end-card background, the ElevenLabs music bed) are separate capabilities; the recipe orchestrates and gates them. Everything below is $0 (Playwright + PIL/HTML + FFmpeg), keeps the end-card text pixel-crisp, and never makes an AI or paid call. ## The format in one line A silent, music-led tour of three "third-place" worlds — one per product/scent. Each world is a **two-shot pair**: a WIDE kinetic-calm ARRIVAL (environment dominates, bottle stays small) hard-cutting to a top-down MACRO product MOMENT (the sealed bottle nested with its botanical companion). The six clips land on a Pinterest-style brand end card. 720×1280, ≈27.0s = `3×(arrival 4.5 + macro 3.5) + end-card 3.0`. ## What's FREE here ### 1. Trim each clip to its grid duration (FFmpeg) The paid per-world clips render long (arrivals ~5s, macros ~4s) so the cut has slack. FREE step: trim each clip to its `scene_grid[].duration_sec` (arrival 4.5 / macro 3.5) and re-encode to the master spec — `width`×`height` = 720×1280, `fps` = 24, yuv420p, scale+pad, **audio stripped** (the scenes are silent; the music is muxed at the end). Trimming the macro so the top-down portion dominates also hides any label misrender at the clip's upright tilt extreme. ### 2. HTML/Playwright end card (never AI-rendered) The paid NB2 step renders the **text-free flat-lay background only** (all three sealed bottles + their botanicals, generous negative space at top). The message text is composited FREE over it: - **Headline** — `overlay.headline` "FIND YOUR DAILY." (Inter 900, "DAILY" outlined via `-webkit-text-stroke`, rise-in animation). - **Scent labels + arrows** — one handwritten Caveat-font `scent_labels[].label` per bottle, each with a hand-drawn SVG arrow (staggered `drawArrow` animation) pointing at its bottle. - **Wordmark + URL** — `overlay.wordmark` (Playfair Display, two rows) + `overlay.url`. Playwright screenshots `end_card.html` over the NB2 background, then FFmpeg encodes it to a `dwell_sec` (3.0s) static clip. **The end-card text is HTML, NEVER AI-rendered** — NB2 generates the background only, so no claim or copy can be invented and the type stays crisp. ### 3. Hard-cut concat (FFmpeg) Concat the six trimmed per-world clips **in scene order** (S01 arrival → S02 macro → … → S06 macro) + the end-card clip via the concat demuxer, re-encoded to the master spec. Hard cuts everywhere (no dissolves) — the one optional exception is the S06→S07 whip-to-end-card transition per the scene contract. Because every clip is normalized to one fps/codec first, the concat is safe. ### 4. Music mux + web encode (FFmpeg) Mux the single ElevenLabs instrumental bed onto the silent concat: `afade` in `master.fade_in_sec` (0.3s) / out `master.fade_out_sec` (0.5s), `loudnorm master.loudnorm` (I=-16:TP=-1.5:LRA=11), AAC `master.audio_bitrate` (192k), and clamp to `duration_sec` (27.0s) with an explicit `-map 0:v:0 -map 1:a:1`-style single-audio map so no silent scene-track leaks in. Output is the H.264 (+ AAC) web master at 720×1280. The assembly is deterministic — iterate the cut for free by re-running it; only re-roll a clip (paid) when a scene itself is wrong. ## Contract - Deterministic + FREE (Playwright + PIL/HTML + FFmpeg); no paid calls, no AI-rendered end-card text. - **Silent, music-led** — no VO, no captions during the scenes. On-screen text appears ONLY on the end card, and it's HTML-composited, never AI-rendered. - **Sealed-bottle rule is upstream but enforced here at QC** — the trim/concat can't fix an open-cap clip; a sealed-bottle violation is a re-roll (paid), not an assembly fix. - Per world = WIDE arrival → top-down macro; hard cuts between scenes; the end card is a static hold with legible HTML text; music starts at t=0 and fades the tail. - The paid steps — the six per-world clips, the NB2 end-card background, the ElevenLabs music bed — are separate capabilities (see the GAP below for the clips); the recipe orchestrates them and gates the spend. ## GAP — the per-world clips need a Higgsfield-proxy capability that does not exist yet The source molecule fires the six per-world clips through **Higgsfield Marketing Studio** (`marketing_studio_video/product_showcase`), grounded on the brand's imported product UUIDs, with the sealed-bottle safety block front-loaded on every prompt. Marketing Studio owns credit reservation server-side. There is **no generic proxy capability for this yet**. `create-video-fal` is a FAL image-to-video proxy — a different provider and a different job shape; it does not do Marketing Studio `product_showcase` off an imported product UUID. Wiring this format to templates-as-data requires a **`create-video-higgsfield`** proxy capability (Higgsfield Marketing Studio, `product_showcase`, imported-product grounding, per-prompt safety block) that **does not exist**. Until it lands, the six clips are generated by the Higgsfield Marketing Studio path directly (CLI/MCP) and this step is **not a fetchable capability**. See `PIPELINE.md` for the full config-field → source-step map.
-
-
tests
-
smoke-test.md 1.2 KB
# Smoke Test Trim each per-world clip to its grid duration (arrival 4.5 / macro 3.5, re-encode 720x1280 24fps yuv420p, audio stripped) ; Playwright screenshot `end_card.html` over the AI flat-lay background → 3.0s static end-card clip (HTML text, never AI-rendered) ; hard-cut concat the 6 clips in scene order + the end card ; mux one instrumental bed with `afade` in/out + `loudnorm I=-16:TP=-1.5:LRA=11`, AAC 192k, clamp 27.0s → the web master. Pass when the FREE assembly runs to a valid 720x1280, ≈27.0s (±0.3s), 24fps, h264 yuv420p master with an AAC music stream present, NO speech and NO burned captions in S01–S06 (Whisper the audio → music only), and legible HTML end-card text. Assembly (trim + end-card overlay + concat + mux) is FREE. GAP to confirm at review — the six per-world clips are generated via Higgsfield Marketing Studio (`marketing_studio_video/product_showcase`, imported-product grounding, sealed-bottle safety block per prompt), which is NOT yet a fetchable proxy capability (`create-video-higgsfield` does not exist; `create-video-fal` is FAL, not Higgsfield). The end-card background (create-image-fal / NB2) and music (create-music-elevenlabs) are paid proxy-routed calls; only their local composite/mux is FREE here.
-
-
SKILL.md 4.9 KB
--- name: render-multiworld description: Assemble a silent, music-led 3-world product-tour ad — trim and hard-cut-concat the per-world WIDE-arrival + top-down-macro clips, composite the HTML/Playwright brand end card ("FIND YOUR DAILY." + handwritten scent labels + arrows) over an AI flat-lay background, and mux one music bed into a 720x1280 web master. FREE, deterministic assembly (Playwright + PIL/HTML + FFmpeg); the recipe supplies the config and gates the paid clip/background/music calls. Use for the multiworld-product-tour format. status: active --- # render-multiworld Assemble a silent, music-led "multi-world product tour" ad (≈27s, 9:16) — a tour of three distinct "third-place" worlds, one per product/scent, that lands on a Pinterest-style brand end card. Each world is a **two-shot pair**: a ~4.5s WIDE kinetic-calm ARRIVAL (the environment dominates, the bottle stays small) hard-cutting to a ~3.5s top-down MACRO product MOMENT (the sealed bottle nested with its botanical companion). Scent identity is carried by the **world + botanical companion**, not by bottle color. No VO, no captions in the scenes — one music bed carries the whole thing. This capability is the **FREE, deterministic assembler**. The paid steps — the six per-world clips, the AI flat-lay end-card background, the ElevenLabs music bed — are separate capabilities (see the gap below for the clips); the recipe orchestrates and gates them. ## Run 1. **Trim clips (FFmpeg, FREE)** — trim each per-world clip to its `scene_grid[].duration_sec` (arrival 4.5 / macro 3.5), re-encode to the master spec (720×1280, 24fps, yuv420p, scale+pad, audio stripped). Trimming the macro so the top-down portion dominates also hides any label misrender at the clip's upright tilt extreme. 2. **End card (Playwright/HTML, FREE)** — screenshot `end_card.html` over the AI flat-lay BACKGROUND, then FFmpeg-encode to a `dwell_sec` (3.0s) static clip. Headline ("FIND YOUR DAILY.", Inter 900), one handwritten Caveat scent label + hand-drawn SVG arrow per bottle, Playfair wordmark + URL. **End-card text is HTML, NEVER AI-rendered** — the AI step produces the background only. 3. **Hard-cut concat (FFmpeg, FREE)** — concat the six trimmed clips in scene order (S01 arrival → S02 macro → … → S06 macro) + the end-card clip. Hard cuts (no dissolves), normalized to one fps/codec first so concat-copy is safe. 4. **Music mux + web encode (FFmpeg, FREE)** — mux the single instrumental bed onto the silent concat with `afade` in/out + `loudnorm I=-16:TP=-1.5:LRA=11`, AAC 192k, clamped to 27.0s, explicit single-audio map so no silent scene-track leaks in → the H.264 (+ AAC) 720×1280 master. ## Contract - Deterministic + FREE (Playwright + PIL/HTML + FFmpeg); no paid calls, no AI-rendered end-card text. Iterate the cut for free by re-running the assembly. - **Silent, music-led** — no VO, no captions during the scenes; on-screen text appears ONLY on the end card, HTML-composited. - Per world = WIDE arrival (bottle small, environment dominant) → top-down macro (product + botanical, no hands). Hard cuts between scenes; end card is a static hold with legible HTML text; music starts at t=0 and fades the tail. - **Sealed-bottle rule** is enforced at QC — trim/concat can't fix an open-cap or spraying clip; that's a re-roll (paid), not an assembly fix. Identity via world + botanical, never bottle color. - The template recipe (DB) supplies the per-brand config (worlds, palettes, botanicals, prompts, end-card copy, music mood); this capability is the generic assembler. ## Gaps / routing notes - **The six per-world clips need a Higgsfield-proxy capability that does not exist.** The source molecule fires them through **Higgsfield Marketing Studio** (`marketing_studio_video/product_showcase`) grounded on imported product UUIDs, with the sealed-bottle safety block front-loaded on every prompt. `create-video-fal` is a FAL i2v proxy — a different provider and job shape — so it cannot serve this step. Wiring the clip step to templates-as-data requires a **`create-video-higgsfield`** proxy (Marketing Studio `product_showcase`, imported-product grounding, per-prompt safety block) that **does not exist yet**. Until it lands, the clips are generated via the Higgsfield Marketing Studio path directly (CLI/MCP) and that step is **not a fetchable capability**. - **The end-card background** is an AI flat-lay render (text-free, all three sealed bottles + botanicals) that in prod routes through **create-image-fal** (NB2); only the HTML text overlay + encode run locally as FREE assembly. - **The music** is a paid ElevenLabs call that in prod routes through **create-music-elevenlabs**; only the loudnorm + fade + mux run locally as FREE assembly. See `scripts/PIPELINE.md` for the full config-field → source-step map and `scripts/README.md` for the FREE-assembly detail. -
skill.meta.json 311 B
{ "slug": "render-multiworld", "category": "capabilities", "domain": "ads", "tags": [ "ads" ], "installation": { "base_command": "npx goose-skills install render-multiworld", "supports": [ "claude", "cursor", "codex" ] }, "requires_skills": [ "watch" ] }
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.