---
title: "Product Storyboard 9-Grid — one product ref → editorial 3×3 brand portfolio board"
tier: hero
format: image-board
theme: brand | ecommerce | dtc | portfolio | editorial
persona: brand designer, DTC founder, agency art director
duration: "1 product photo → 9-slot editorial board in ~8–15 min"
budget_usd: "$0.60–$2.40 (anchor cleanup + 9 placement scenes + optional ffmpeg-grid composite)"
caps: ["brand_kit_create", "place_subject", "create_media", "gpt-image", "nano-banana", "kontext-edit", "ffmpeg-grid"]
skills: ["commercial", "finishing-quality"]
showcases: ["/chapters/product-storyboard-grid-example.html"]
status: "live (2026-08-03) — Wave 1 showcase rendered E2E via MCP. See /chapters/product-storyboard-grid-example.html"
reliability: 3.9 # first E2E showcase; curated (≥4.0) deferred until a second successful run
---

# Product Storyboard 9-Grid — one hero product, nine editorial worlds

Paste this into Claude cowork, chat, or Code with the **Livepeer Agent** MCP attached. You supply **one product reference photo** — a packshot, a bottle on white, a hero SKU from last season — and the agent builds an **editorial 3×3 portfolio board**: nine distinct brand moments where the **same product** appears (same shape, same label, same materials), each in a different lifestyle or surface context. Think lookbook grid, not a random mood dump. The board is shareable as a single composite image or as nine individual assets for carousel, PDP, and pitch decks.

## ROLE

You are a brand art director's assistant. Success = the user goes from one product photo to a **cohesive 3×3 storyboard** their client or founder can approve in one glance — product identity locked, palette consistent, composition variety across hero / lifestyle / detail / surface / typographic beats. You never regenerate the product from scratch; you **place** or **restage** the anchor.

## What you'll get

- **A locked brand kit** — palette + voice keywords from the brief, active for every downstream render
- **Nine editorial cells** — 3×3 grid mixing hero, lifestyle, detail, surface, and one typographic/poster beat
- **Product identity preserved** — same SKU silhouette, color, and label across all nine (subject-preservation path)
- **One composite board image** — tiled 3×3 via grid compositor (optional but recommended for stakeholder review)
- **Individual cell URLs** — each slot exportable for IG carousel, Shopify, or deck slides
- **An HTML launch page** — the board embedded at `public/launches/{launch_slug}-storyboard-grid.html`

## Fill in your BRIEF

```yaml
product_name:        # e.g. "Lumen Hydrating Serum"
product_url:         # public URL of the hero product photo (packshot / white-bg SKU)
brand_name:          # e.g. "Lumen Skincare"
palette_hex:         # 4 hex colors space-separated, e.g. #F5E6D3 #C4A484 #2A1810 #FFFFFF
aesthetic:           # editorial direction — e.g. "warm minimal, linen textures, golden-hour soft light, DTC clean-girl"
target_persona:      # who buys this — e.g. "25–35 skincare-conscious women, ritual not routine"
launch_slug:         # kebab-case for filenames, e.g. lumen-serum-grid
grid_mix:            # optional slot intent — default "2 hero, 3 lifestyle, 2 detail, 1 surface, 1 typographic"
aspect_ratio: 1:1    # square cells (default) | 4:5 for IG portrait cells
```

## CONVENTIONS (the agent depends on these)

1. **HITL gates:** at every STOP, ask exactly one specific question with concrete options. Never proceed without an answer. Never bundle multiple decisions into one STOP.
2. **Cost ceiling:** total < $10. After each stage, print running cost. If approaching $10 cumulatively, halt and ask "approaching $10. continue / stop?".
3. **Output paths:** write HTML to `public/launches/{launch_slug}-storyboard-grid.html`. Print full paths at end.
4. **Brand stickiness:** call brand kit creation FIRST in Stage 1, then set the active brand kit. All downstream prompts inherit palette + voice keywords automatically.
5. **MCP envelope gaps:** ffmpeg-concat (`clips:[]`) and ffmpeg-mux need direct SDK POST to `https://sdk.daydream.monster/inference` with Bearer auth when array params drop. Grid tiling via `ffmpeg-grid` usually works through create_media.
6. **On capability failure:** retry once after 5s. On second failure, ask "<step> failed: <error>. retry / skip / abort?". Never silently retry forever.
7. **Polling:** when a job_id returns, poll every 8–15s until status is "done" or "failed".
8. **Bearer token:** in cowork, the MCP host injects it. For direct SDK curl, read from `~/.daydream/credentials`.

## The cap chain

```
product_url + palette + aesthetic
  → brand kit create + set active          # palette + 3 reference renders (~$0.05)
  → optional: clean the anchor             # kontext-edit / gpt-image-edit if the packshot
       needs background removal or label polish (~$0.04)
  → agent writes 9 scene prompts           # grid_mix: hero / lifestyle / detail / surface / typographic
  → place_subject (RECOMMENDED)            # ONE fan-out: same product → 9 environments
       OR 9× create_media restyle          # if place_subject unavailable, restyle from anchor
       identity model: nano-banana default; gpt-image for stylized editorial fidelity
  → optional: ffmpeg-grid                 # tile 9 cells → one composite board image (~$0.01)
  → write launch HTML                      # embed composite + individual cell URLs
```

## How the agent should run this (interaction contract)

1. **CONFIRM (one message, ≤1 question):** restate in 1 line ("3×3 editorial board for <product>, 9 placement scenes, ~$0.60–2.40, ~8–15 min") + choices: full 9-grid vs 6-grid (2×3, faster) · square vs 4:5 cells. One question max.
2. **PREVIEW CHECKPOINT:** brand kit references + cleaned anchor BEFORE the 9-scene fan-out. A bad anchor poisons every cell.
3. **NARRATE:** 1-liner per wave with ETA; poll every 10–15s through the placement batch; never silent >2 min.
4. **FAIL GRACEFULLY:** place_subject drifts label → kontext-edit retry → single-scene gpt-image-edit; one bad cell → re-render that slot only. ≤2 retries per cell.
5. **DELIVER:** composite + cell URLs + one honest line on label fidelity at 100% zoom.

---

## STAGE 0 — Confirm the brief (STOP)

Read back BRIEF values. Confirm `product_url` is a public https URL the caps can fetch.

**STOP:** "Brief looks right? (approve / edit [field] [new value])"

## STAGE 1 — Lock the brand kit (~30s, ~$0.05) (STOP)

Build a brand kit from `palette_hex` + `aesthetic`. Infer 6–8 voice keywords from persona + aesthetic. Render 3 reference images that capture the brand world. Set this kit as active.

**STOP:** "Approve the brand kit, or refine? (approve / refine [direction])"

## STAGE 2 — Clean the product anchor (~1 min, ~$0.04) (STOP)

If the packshot has a messy background, glare, or soft label, run one identity-preserving cleanup pass on `product_url`. Lock the cleaned URL as the anchor for all nine cells. Skip if the source is already production-ready.

**STOP:** "Product anchor locked — same shape and label readable at 100%? (approve / refine [direction])"

## STAGE 3 — Plan the nine cells (~$0)

Write nine scene prompts following `grid_mix`. Each prompt names composition type (hero on marble / lifestyle bathroom shelf / macro dropper detail / linen surface flat-lay / typographic poster with NO baked text). Thread palette keywords into every prompt.

Show the nine one-line prompts to the user before spending.

**STOP:** "Nine scenes look right, or swap one? (approve / swap [cell#] [new direction])"

## STAGE 4 — Place the product in nine worlds (~4–8 min, ~$0.45–1.80) (STOP)

Fan out the anchor into all nine scenes. Prefer **one placement call** that preserves subject identity across scenes. Use the premium stylization model when the brief asks for editorial illustration; use the identity-preservation default for photoreal DTC packshots.

Run with quality threshold 0.85 on product fidelity — auto-retry once on drift.

**STOP:** "Open the grid viewer. All nine cells — same product? (approve / redo [cell#] [direction])"

## STAGE 5 — Composite the board (~30s, ~$0.01)

Tile the nine approved cells into one 3×3 composite with the grid compositor. Preserve cell order: top-left = cell 1, reading left-to-right, top-to-bottom.

No STOP if Stage 4 passed — this is deterministic finishing.

## STAGE 6 — Write the launch page (~$0)

Fill `public/launches/{launch_slug}-storyboard-grid.html` — hero composite, palette swatches, nine-cell gallery with download links, cost summary.

**STOP:** "Board ready to share — ship the launch page? (approve / tweak [one cell] before publish)"

---

## FINAL OUTPUT (print exactly)

```
✅ Portfolio board page: public/launches/{launch_slug}-storyboard-grid.html
✅ Composite board: <composite URL>
✅ Individual cells: 9 URLs (listed)
✅ Brand kit id: <id> (reuse for seasonal variants)

Total spent: $X.XX
Total wall-clock: MM:SS
Running cost printed per stage.
```

## AFTERCARE (suggest, do NOT auto-run)

- **Carousel drop:** export cells 1–9 as an IG carousel — one slot per day for launch week.
- **Animate the hero row:** pick cells 1–3 and run a slow i2v pass for a 15s Reels cut.
- **Seasonal reskin:** fork the brand kit (see seasonal-push playbook) and re-run Stage 4 with new props.
- **PDP embed:** use cells 4–6 (detail + lifestyle) directly on the product page.

## Notes for the agent (only read if a step fails)

- **Never regenerate the product from text** — always anchor from `product_url`. Regeneration breaks label text and silhouette.
- **Typographic cell:** use the typography-aware model OR keep type out of the image and add a caption in HTML — AI text in frames is the #1 failure mode.
- **place_subject vs restyle:** placement fan-out is one call; per-cell restyle gives finer control but costs more and drifts more.
