---
name: scene-expander
description: "Use when expanding a one-line idea into the 12-block Cinematic Scene Blueprint — provider-agnostic, includes optional dialogue + ambient. Triggers 'expand this scene', 'blueprint for X'."
personas:
  - hollywood-director
source: package
domain: product
workspaces:
  - small-business
packs:
  - ai-video
lifecycle: experimental
trust:
  level: experimental
  confidence: high
  human_review_required: false
install:
  default: false
  removable: true
---

# scene-expander

> Expand a one-line idea or script line into the **Cinematic Scene
> Blueprint** — 12 labeled blocks consumed by
> [`parse-blueprint.sh`](./scene-blueprint.schema.yaml). Picks
> `hollywood-director` for live-action; hands off animated beats to
> [`pixar-storyteller`](../pixar-storyteller/SKILL.md). Output is
> provider-agnostic — provider tuning is
> [`motion-choreographer`](../motion-choreographer/SKILL.md).

## When to use

- A script line, idea, or beat needs a full blueprint before any
  adapter runs.
- A `/video:from-script` run is parsing `## Scene N` headings and
  needs each scene expanded.

Do NOT use when:

- The brief is already an 11-block cinematic prompt → call
  `video-director` directly to refine it.
- The brief is a static graphic → `canvas-design`.
- Provider-specific token tuning is the next step →
  `motion-choreographer`.

## Procedure

### Step 0: Inspect

1. Read the input line. Classify as **live-action / photoreal** or
   **animated / stylized**.
2. Live-action → load `hollywood-director` voice. Animated → hand
   off to [`pixar-storyteller`](../pixar-storyteller/SKILL.md) (its
   procedure carries the acting / beat-decomposition lens). Hybrid
   (live-action with VFX) → `hollywood-director`; record VFX intent
   in ENVIRONMENT.
3. Check for an existing `character.json` lock under
   `agents/reference/ai-video/<project>/characters/`.

### Step 1: Emit the 12 blocks

One label per line. Order is mandatory.

1. **STYLE** — stylistic anchor (live-action: film stock + decade,
   e.g. "Kodak 5219, 2015"; animated: specific film + year).
2. **SUBJECT** — character read; verbatim identity tokens when a
   lock exists.
3. **ENVIRONMENT** — location, time-of-day, weather, era; what the
   world does in response to the subject.
4. **ACTION** — anticipation / action / reaction with beat counts
   (`0.5s / 1.2s / 0.8s`). No adjective paragraphs.
5. **CAMERA** — position, height, distance, move (lock-off, dolly,
   handheld, push, pull). Off-axis when on-axis is default.
6. **LENS** — focal length in mm and aperture intent. "Cinematic"
   alone fails.
7. **LIGHTING** — key / fill / back / practical named; "golden
   hour" requires a sun angle.
8. **MOOD** — one emotional read.
9. **DIALOGUE** — optional. If present: `speaker: "line"`, one per
   line. Marks `audio: native` capability requirement.
10. **AMBIENT SOUND** — optional. Layer list (wind, traffic,
    crowd, ocean). Marks `audio: native` or routes to ffmpeg mux.
11. **DURATION** — seconds (integer or one decimal).
12. **NEGATIVE** — clichés to reject, load-bearing order top-first.
    Always names: centered framing, symmetric composition, generic
    "cinematic", soap-opera contrast.

### Step 2: Self-review

1. Live-action / animated classification consistent across blocks?
2. LENS present with mm (live-action) OR stylistic anchor with
   film+year (animated)?
3. LIGHTING with a direction?
4. ACTION names beat counts, not adjectives?
5. DIALOGUE / AMBIENT SOUND present → the run requires `audio:
   native` adapter OR ffmpeg-mux fallback declared.
6. NEGATIVE ≥ 4 entries, load-bearing top?
7. SUBJECT verbatim from `character.json` when a lock exists?

Any "no" → revise that block.

### Step 3: Validate

1. Pipe output through `scripts/ai-video/lib/parse-blueprint.sh` —
   exits 0 and emits valid adapter-contract JSON.
2. No provider tokens (no aspect / model / duration flags).

## Output format

1. **`scenes/<id>/prompt.txt`** — 12 labeled blocks, ready for
   `parse-blueprint.sh`.
2. **`scenes/<id>/blueprint.json`** — parser output, adapter-stdin
   ready.
3. **`scenes/<id>/review.md`** — one-paragraph rationale per
   non-obvious choice.

## Gotcha

- The model wants to skip optional DIALOGUE / AMBIENT SOUND blocks
  silently — if they could plausibly belong, emit them; the parser
  treats missing blocks as `null`, not as an error.
- Live-action without LENS mm fails the parser's strict mode.
- Animated without a film+year anchor in STYLE drifts on every run.
- ACTION written as "the character does X dramatically" fails —
  adapters need verbs with beat counts.
- DIALOGUE forces `audio: native` requirement — flag this to the
  orchestrator so it picks a capable adapter (Veo / Sora).

## Do NOT

- Do NOT emit provider tokens — that is `motion-choreographer`.
- Do NOT skip the blueprint parser validation step.
- Do NOT paraphrase identity tokens when a lock exists.
- Do NOT mix live-action LENS prescriptions with animated STYLE
  anchors in the same scene — pick one mode.

## Policies

The 12-block Cinematic Scene Blueprint is the policy choke point — every downstream skill (`motion-choreographer`, `video-director`) inherits whatever the blueprint encodes. Before emitting:

- [`agents/settings/policies/media/likeness.md`](../../../agents/settings/policies/media/likeness.md) — when the SUBJECT block names or visually identifies a real person.
- [`agents/settings/policies/media/public-figures.md`](../../../agents/settings/policies/media/public-figures.md) — when the SUBJECT block is a recognised public figure.
- [`agents/settings/policies/media/brand-impersonation.md`](../../../agents/settings/policies/media/brand-impersonation.md) — when STYLE / ENVIRONMENT references a recognised brand's visual identity.
- [`agents/settings/policies/media/style.md`](../../../agents/settings/policies/media/style.md) — when STYLE anchors to a named living artist or studio as the primary signature.
- [`agents/settings/policies/media/disclosure.md`](../../../agents/settings/policies/media/disclosure.md) — every distributed blueprint output carries the AI-generation disclosure downstream.

Refuse-and-surface at the blueprint layer; do not push policy questions down to the adapter.

