broll-story · git:20260709.ec45941 · 2026-07-09 · sha256 019f67e578ac3bc2

broll-story git:20260709.ec45941A

Immutable. This exact content is served forever at /api/v1/blob/019f67e578ac3bc2.

---
name: broll-story
description: >-
  Generate a SILENT B-roll clip of an existing avatar (and optional invented
  side-characters) DOING a demonstrative activity — not a talking head, no
  lip-sync — for an avatar reel. Given a short script, the avatar's reference
  image and the reel ratio (9:16 or 16:9), it authors ONE 6-panel storyboard
  sheet with the gpt-image-2 skill and animates that single sheet into an 8s
  720p MUTED video with the seedance-2 skill. The avatar's voice is added later
  as voice-over by avatar-reel-composer (broll_source: existing), so these
  segments are intentionally silent and focus on what the avatar is DOING (POV,
  seen from behind, cooking, building, interacting with other characters), not on
  dialogue. Use when the user wants an avatar action/demonstration B-roll, a
  non-talking-head avatar scene, a "show don't tell" avatar sequence, or to
  animate the avatar doing an activity for a reel.
---

# B-roll Story (avatar doing an activity)

The **action / demonstration** counterpart of the broll skills. Where
`broll-generator` synthesizes presenter-free B-roll and `broll-finder` finds real
footage, **`broll-story` puts OUR avatar on screen DOING something** — a silent,
voice-over-ready clip where the focus is the *action*, not the dialogue (the
avatar may be speaking, but it's off-screen narration, so there is **no
lip-sync**). Think ALF grabbing the camcorder, or a full-body shot of the
presenter showing a place, taking calls and scheduling on screen, seen from
behind, cooking, building — optionally interacting with invented side-characters.

It is an **orchestrator** over two existing skills:
`gpt-image-2` (one storyboard sheet) → `seedance-2` (animate it) → muted clip.

## Inputs (gather what's missing)
| Input | Used for |
|---|---|
| **Short script** | the beat/idea of the activity (the avatar's VO, added later) |
| **Avatar reference image** | character DNA (`--avatar-ref`, 1–3 images) |
| **Ratio** | `9:16` (default) or `16:9` — sets the storyboard grid + the video ratio |

## Prerequisites
- **gpt-image-2** ready (shared Replicate token) — produces the sheet.
- **higgsfield CLI** installed + authenticated with credits (`higgsfield account status`) — runs seedance.
- **ffmpeg** on PATH — mutes the clip.

## Pipeline
```
short script + avatar ref + ratio
  │
1 AGENT authors the Phase-1 storyboard prompt (6 panels) following gpt-image-2's
  │      prompts/storyboard_framework.md — adapted to broll-story, NOT simplified
  │      -> <slug>.board.txt
  │
2 make_broll_story.py:
  │   gpt-image-2 generate_image.py  -> ONE 6-panel storyboard sheet (the ratio's grid)
  │   seedance-2  (baseline storyboard→movie prompt via prompt_tools.py, verbatim)
  │               -> 8s 720p video, same ratio
  │   ffmpeg -an  -> MUTED clip in <avatar>/broll/story/<NNN>_<slug>.mp4 + manifest.json
  │
3 hand off to avatar-reel-composer as a broll scene (broll_source: existing)
```

## Hard rules (do not break)
- **6 panels, ONE storyboard image.** A single composite sheet for the requested
  ratio (16:9 → 3 columns × 2 rows; 9:16 → 2 columns × 3 rows).
- **Follow the baseline prompts verbatim, do NOT simplify them.** Author the
  storyboard image prompt by following gpt-image-2's storyboard framework
  (`~/.cursor/skills/gpt-image-2/prompts/storyboard_framework.md`, sections
  A–H). The seedance animation prompt is the baseline
  storyboard→movie one-liner produced by `prompt_tools.py storyboard` — the
  script uses it as-is. *"no simplifiques los baseline prompts."*
- **Do not tie the panels to 8 seconds.** *"no necesitas especificar en la imagen
  del storyboard que los paneles deban calzar en 8 segundos, eso lo determina el
  skill automáticamente … preocúpate que la historia esté bien representada en la
  imagen y no de su duración especificada."* The storyboard may carry the
  framework's own timecodes (even 15s/30s); seedance compresses the whole board
  into the requested 8s. Representing the story well in the 6 panels matters;
  the storyboard's stated duration does not.
- **Silent output, no audio requests.** *"No le pidas a seedance-2 sonidos ni
  voces específicas porque el resultado estará muteado."* The clip is muted; the
  avatar's voice is laid on later as voice-over by `avatar-reel-composer`.
- **No lip-sync / no talking-head.** Seedance cannot lip-sync without an audio
  reference, and these segments are not about what is said — write panels around
  what the avatar is **DOING** (action, blocking, camera changes), not dialogue.

## Workflow

### 1 — Author the storyboard prompt (the creative step)
Follow gpt-image-2's storyboard framework (Phase 1, sections A–H), **not
simplified**, adapted to broll-story:
- **Subject:** the avatar performing ONE activity across 6 beats (setup → do the
  thing → a small turn/interaction → result). Drive every panel with **action**,
  not dialogue.
- **Character DNA:** describe the avatar from `--avatar-ref` and demand identical
  identity/wardrobe across all panels. Invented side-characters are welcome — give
  each a distinct, consistent description.
- **Shot variety (this is the point):** first-person / POV, over-the-shoulder,
  from behind, full-body wide showing the whole action, inserts/close-ups of what
  the hands do, camera changes between panels. Never a centered talking-head.
- **Grid for 6 panels:** `16:9` → 3×2; `9:16` → 2×3 (flip the grid for vertical,
  per the framework).
- Save the prompt to `<slug>.board.txt`. See [REFERENCE.md](REFERENCE.md) for a
  broll-story Phase-1 template and worked examples.

### 2 — Generate + animate + mute (the mechanical step)
```bash
python3 .cursor/skills/broll-story/scripts/make_broll_story.py \
  --prompt-file <slug>.board.txt \
  --avatar-ref <avatar>/refs/<hero>.png \
  --ratio 9:16 --slug <slug> --avatar-dir <avatar> \
  --script "the short VO line for this beat (manifest only)"
```
It writes `<avatar>/broll/story/<NNN>_<slug>.mp4` (muted) + a `manifest.json`
entry and prints a JSON summary. Useful flags: `--sheet PATH` (reuse an existing
sheet, skip image gen), `--resolution`, `--duration` (default 8), `--panels 1-3`
(animate a sub-range), `--keep-audio` (rare). QA the printed `sheet` before
trusting the clip; re-author the prompt and re-run if a panel is off.

### 3 — Hand off to avatar-reel-composer
Drop the clip into a storyboard `broll` scene; the composer lays the avatar's
single master narration over it in sync:
```json
{ "id": "s3", "type": "broll", "broll_source": "existing",
  "broll_clip": "doki-monster/broll/story/001_doki-show-office.mp4",
  "text": "the contiguous slice of the narration spoken over this beat" }
```

## Notes / troubleshooting
- **Story longer than one clip?** Seedance is ≤15s and best ≤8s. For a longer
  beat, make ONE sheet and animate it once at 8s; if a sequence truly needs more
  time, split the script into two broll-story calls (two sheets) rather than one
  long clip.
- **`ip_detected` / blocked** — a photoreal human face in the sheet can trip
  seedance. Keep invented side-characters stylized to match the avatar; re-run.
- **`Session expired` / out of credits** — `higgsfield auth login` / top up, then
  re-run (the sheet is cached in the work folder; pass `--sheet` to skip image gen).

## Additional resources
- broll-story Phase-1 template, per-ratio grids, examples: [REFERENCE.md](REFERENCE.md)
- gpt-image-2 storyboard framework (verbatim baseline): `~/.cursor/skills/gpt-image-2/prompts/storyboard_framework.md`
- seedance-2 storyboard→video framework + baseline one-liner: `~/.cursor/skills/seedance-2/prompts/storyboard_video_framework.md`
- Consumer: `avatar-reel-composer` (`broll_source: existing`). Siblings: `broll-generator` (synthetic, presenter-free), `broll-finder` (real footage).