Purpose
Bootstrap the full creative-prep package for a new brand: research the product, analyze any existing ads, source logos and reference photos, generate brand-anchored product + lifestyle imagery, and write the brand-context docs the pipeline consumes.
This molecule emits the exact brand-context contract that video-orchestrator-with-control-plane reads at State 0.1 — the four brand-research/*.md files and brand-assets/manifest.json at the brand root. Filling these is the whole point: a brand researched by this skill needs no manual fill in the desktop Brand view, and the orchestrator's State 0.1 finds populated context and advances instead of gating. It also writes a supplementary concept-brief.md (brand-level concept seeds) and the populated brand-assets/ folders.
Layout note: write everything under the brand root — the directory that holds
ad-runs/,brand-research/, andbrand-assets/(by convention<your-project>/<brand>/, but never hardcode that; use thebrand_dirinput or the path the caller is in). The orchestrator locates this root by walking up from a run folder until it findsbrand-assets/manifest.jsonorbrand-research/, so the only requirement is that these three siblings live together.
Inputs
brand(required) — short slug used as the brand folder name, e.g.amex,liquid-death.brand_dir(optional) — absolute path to the brand root to write into. Defaults to the conventional<your-project>/<brand>/under the workspace root, or the caller's cwd if it's already a brand root. Never hardcode the location — resolve it from this input.product(required) — specific product/SKU/offer to research, e.g. "Platinum Card", "Sparkling Water". Disambiguates brands with many SKUs.brand_url(optional) — canonical homepage. Strongly recommended to avoid wrong-entity confusion (e.g. Apple band vs. Apple Inc.).existing_ads_dir(optional) — path to a folder of .mp4 ads. If present, each is analyzed viawatch:watch. If absent, ad-analysis is skipped and voice/tone is inferred from web research only.brand_video_urls(optional) — list of the brand's own video URLs (launch films, product demos, explainers). If provided, run the sibling moleculebuild-brand-clip-libraryafter this skill to cut them into an indexed, reusable clip library underbrand-assets/clips/.concept_count(optional, default 6–10) — number of social-ad concepts to draft.skip_generation(optional, default false) — skip Higgsfield image generation and ship research + brief only.
Composed Atoms
source-brand-assets— scrape logos + reference hero photos intobrand-assets/understand-brand-assets— distill web research + reference photos into thevisual-identity.mdcontent (colors, typography, photography style)analyze-ad-hooks— extract recurring hooks/motifs from existing ads (when provided)generate-ad-concepts— produce the concept list forconcept-brief.mdcreate-product-images-higgsfield-product-photoshoot— 4–6 hero/end-card product stillscreate-product-images-nanobanana— 8–12 vertical 9:16 lifestyle stills- External skills:
watch:watch(ad analysis),WebSearch/WebFetch(research)
Workflow
- Disambiguate. Confirm
brand+productresolves to one entity. Ifbrand_urlis missing and the name is ambiguous, stop and ask. - Scaffold the brand root in the orchestrator-native layout (at
<brand_dir>):
Only create asset subfolders that will be populated. Do NOT create<brand_dir>/ brand-research/ # ← orchestrator State 0.1 reads *.md here brand-summary.md # written in step 7 visual-identity.md # written in step 7 competitors.md # written in step 7 audience.md # written in step 7 asset-urls.md # written in step 7 (sourced URLs + access dates) ui-references.md # written in step 7 ONLY if the product has notable UI brand-assets/ # ← orchestrator reads manifest.json here manifest.json # written in step 6 (File 0 contract) logos/ reference-photos/ generated-product-shots/ generated-lifestyle/ songs/ concept-brief.md # supplementary brand-level concept seeds (step 8) ad-runs/ # empty; runs created later by the app / orchestrator existing-ads/ # left as-is if the user populated itbackground_research.md— its content now lives split across the fourbrand-research/*.mdfiles. If a brand already has a legacy flatbackground_research.md, fold it into the four files and delete it. - Web research via
WebSearch+WebFetch. Priority order: brand site → trade press (Adweek/AdAge/Campaign) → reputable category reviewers. Capture: product overview, mechanics/pricing, benefits, target audience, current named campaigns with dates, core positioning, voice/tone. Record every URL with access date. - Existing-ads analysis (conditional). If
existing_ads_dirprovided, runwatch:watchon each video. Capture VO transcript, visual style, recurring motifs, implicit promise. Skip cleanly if absent. - Source brand assets via
source-brand-assets:- Logos: brand press kit or Wikipedia SVG →
brand-assets/logos/. - Reference photos: 2–4 high-quality third-party shots of the product/hero →
brand-assets/reference-photos/. Mark "not licensed for redistribution" in each manifest entry'sdescription. - Songs: if existing ads exist, extract the audio bed of one ad as tone reference →
brand-assets/songs/.
- Logos: brand press kit or Wikipedia SVG →
- Generate brand-anchored imagery (skip entirely if
skip_generation=true):- 4–6 product-photoshoot stills via
create-product-images-higgsfield-product-photoshoot, grounded on the strongest reference photo so the SKU stays consistent →brand-assets/generated-product-shots/. - 8–12 lifestyle stills via
create-product-images-nanobanana(Nano Banana Pro), 2k vertical 9:16, same reference grounding →brand-assets/generated-lifestyle/. - Write
brand-assets/manifest.json— the File 0 contract the orchestrator reads. One entry per binary asset (every logo, reference photo, generated still, song). Schema (exact):{ "schemaVersion": "1.0.0", "updatedAt": "<iso-8601>", "projectId": "<Brand>", "assets": [ { "id": "brand-asset-<uuid>", "path": "brand-assets/logos/wordmark-black.svg", "kind": "wordmark", "name": "Wordmark (black on transparent)", "description": "Composite in end cards via PIL/ffmpeg, never AI-render. Min height 36px.", "addedAt": "<iso-8601>" } ] }kind∈logo | wordmark | product_photo | lifestyle | video_ref | style_ref | ui_ref | asset.pathis relative to the brand root (e.g.brand-assets/...), never absolute.nameis the short label Claude searches by;descriptionis how/when to use it + any usage constraint (incl. "not licensed for redistribution" on scraped photos). A vague description defeats the file's purpose.- Use a fresh UUID per
id. Do NOT also write aREADME.md—manifest.jsonis the contract; the README was the old lossy format.
- 4–6 product-photoshoot stills via
- Write the four
brand-research/*.mdfiles — the brand-context contract State 0.1 reads. Use these exact section headers (they match the desktop app'screate_projectscaffold, so a researched file is a drop-in replacement for the empty stub), filled from research — never leave a placeholder marker behind:brand-research/brand-summary.md— headers:What the company sells,Who they sell to,Why people buy (jobs-to-be-done),Brand voice in three words,What to never say.brand-research/visual-identity.md— headers:Primary colors (hex),Typography,Logo usage rules,Photography style,Off-limits styles.brand-research/competitors.md—## Direct(each competitor: one-line positioning, pricing tier, and how<brand>wins / loses vs them) and## Reference creative(links / vibes to emulate or avoid).brand-research/audience.md— headers:Primary persona,Where they spend time online,Objections they raise,Proof points that land. Include 3–4 distinct ICP segments and verbatim audience phrasing (Reddit/forums) — these become VO seeds downstream.brand-research/asset-urls.md— every sourced URL with its access date (the provenance trail formanifest.json+ research claims).brand-research/ui-references.md— ONLY if the product has notable in-app/product UI worth recreating; catalog the key screens. Omit the file entirely otherwise.
- Write
<brand_dir>/concept-brief.mdwith sections: Observed patterns from existing ads (only if step 4 ran), Strategic foundation, Concept ideas (concept_count, each with hook + format + 15s/30s beat-by-beat + why-it-works + KPI it serves), Production notes, Open questions. This is supplementary brand-level seeding — the orchestrator still runs its own per-run brainstorm; do not writeproduction/concepts.jsonhere.
Decision Rules
- Refuse to proceed without a disambiguated brand+product. Don't guess between two entities sharing a name.
- If a generated product image trips a provider safety flag, fall back to the alternate model (gpt_image_2 → nano_banana_2). This mirrors the Amex confetti-hero workaround.
- All generated imagery must use the same reference photo so the SKU is consistent across the asset library.
- Never claim licensed rights to scraped reference photos. Always note "not licensed for redistribution" in that asset's
descriptioninbrand-assets/manifest.json. - If Higgsfield credit balance is too low, emit a warning, skip generation, and still ship the research doc + concept brief.
- If
existing_ads_diris absent, the concept brief must not fabricate "Observed patterns" — omit the section. - This skill produces research, sourced assets, generated imagery, and a concept brief. It does NOT clip the brand's own videos. When the brand has its own footage worth reusing (or
brand_video_urlsis provided), run the sibling moleculebuild-brand-clip-libraryto download those videos and cut them into an indexed clip library — the footage counterpart to this skill's generated assets.
Output
Brand-context contract (read by video-orchestrator-with-control-plane State 0.1):
<brand_dir>/brand-research/brand-summary.md<brand_dir>/brand-research/visual-identity.md<brand_dir>/brand-research/competitors.md<brand_dir>/brand-research/audience.md<brand_dir>/brand-research/asset-urls.md<brand_dir>/brand-research/ui-references.md(only when the product has notable UI)<brand_dir>/brand-assets/manifest.json(File 0 contract) + populatedlogos/,reference-photos/, and (unless skipped)generated-product-shots/,generated-lifestyle/,songs/
Supplementary:
<brand_dir>/concept-brief.md<brand_dir>/ad-runs/(empty, for the app/orchestrator to fill)
Not written (deprecated): background_research.md, brand-assets/README.md, a top-level manifest.json. Their content now lives in the four brand-research/*.md files and brand-assets/manifest.json.
Quality Checks
- All four
brand-research/*.mdfiles exist with no remaining placeholder markers and use the exact section headers above (drop-in for the app scaffold). brand-research/asset-urls.mdcites real, dated sources for every research claim and sourced asset.brand-assets/manifest.jsonparses, follows the File 0 schema, and has one entry per binary asset on disk — everypathis relative to the brand root and resolves to a real file; everykindis in the allowed enum; no entry is missingname/description.- Concept brief references specific moments from each analyzed existing ad (when step 4 ran).
- Generated imagery is visibly the same SKU end-to-end (same colorway, finish, branding).
- Folder shape is the orchestrator-native brand root:
brand-research/+brand-assets/+ad-runs/as siblings. Nobackground_research.mdorbrand-assets/README.mdleft behind. - Sanity-check against the orchestrator: from a (hypothetical)
ad-runs/run-01/folder, walking up reaches this brand root viabrand-assets/manifest.json— i.e. State 0.1 would see populated context and skip its gate.
Failure Modes
- Brand name collides with another entity and
brand_urlwas not provided. - Brand press kit is unavailable and no acceptable third-party reference photos exist — flag and stop before image generation.
- Higgsfield credit balance too low — warn, skip step 6 cleanly, still ship steps 7–9.
existing_ads_dirprovided but contains unreadable files — log each failure, skip that file, continue.