scene-expander
Expand a one-line idea or script line into the Cinematic Scene
Blueprint — 12 labeled blocks consumed by
parse-blueprint.sh. Picks
hollywood-director for live-action; hands off animated beats to
pixar-storyteller. Output is
provider-agnostic — provider tuning is
motion-choreographer.
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
- Read the input line. Classify as live-action / photoreal or
animated / stylized.
- Live-action → load
hollywood-director voice. Animated → hand
off to pixar-storyteller (its
procedure carries the acting / beat-decomposition lens). Hybrid
(live-action with VFX) → hollywood-director; record VFX intent
in ENVIRONMENT.
- 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.
- STYLE — stylistic anchor (live-action: film stock + decade,
e.g. "Kodak 5219, 2015"; animated: specific film + year).
- SUBJECT — character read; verbatim identity tokens when a
lock exists.
- ENVIRONMENT — location, time-of-day, weather, era; what the
world does in response to the subject.
- ACTION — anticipation / action / reaction with beat counts
(
0.5s / 1.2s / 0.8s). No adjective paragraphs.
- CAMERA — position, height, distance, move as an INTENT
class (static hold, push-in, pull-back, lateral track, handheld
drift, orbit). Intent vocabulary, never one provider's move
grammar — the per-provider encoding happens in
motion-choreographer.
Off-axis when on-axis is default.
- LENS — focal length in mm and aperture intent. "Cinematic"
alone fails. mm + aperture are cinematography units, not provider
tokens — they stay.
- LIGHTING — key / fill / back / practical named; "golden
hour" requires a sun angle.
- MOOD — one emotional read.
- DIALOGUE — optional. If present:
speaker: "line", one per
line. Marks audio: native capability requirement.
- AMBIENT SOUND — optional. Layer list (wind, traffic,
crowd, ocean). Marks
audio: native or routes to ffmpeg mux.
- DURATION — seconds (integer or one decimal). Free value;
per-provider clip-length clamping is the encoder's concern, not
the blueprint's.
- 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
- Live-action / animated classification consistent across blocks?
- LENS present with mm (live-action) OR stylistic anchor with
film+year (animated)?
- LIGHTING with a direction?
- ACTION names beat counts, not adjectives?
- DIALOGUE / AMBIENT SOUND present → the run requires
audio: native adapter OR ffmpeg-mux fallback declared.
- NEGATIVE ≥ 4 entries, load-bearing top?
- SUBJECT verbatim from
character.json when a lock exists?
Any "no" → revise that block.
Step 3: Validate
- Pipe output through
scripts/ai-video/lib/parse-blueprint.sh —
exits 0 and emits valid adapter-contract JSON.
- No provider tokens (no aspect / model / duration flags).
Output format
scenes/<id>/prompt.txt — 12 labeled blocks, ready for
parse-blueprint.sh.
scenes/<id>/blueprint.json — parser output, adapter-stdin
ready.
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 an audio-native adapter
(capability.audio = native).
Do NOT
- Do NOT emit provider tokens — that is
motion-choreographer.
- Do NOT shape any block toward one provider's prompt grammar — the
blueprint is the decoupling layer; the anti-leak schema test scans
it for provider tokens.
- 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
Paths, enforcement model, and the full set: the
media policy preamble.
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:
likeness — when the SUBJECT block names or visually identifies a real person.
public-figures — when the SUBJECT block is a recognised public figure.
brand-impersonation — when STYLE / ENVIRONMENT references a recognised brand's visual identity.
style — when STYLE anchors to a named living artist or studio as the primary signature.
disclosure — 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.
1---2name: scene-expander3description: When expanding a one-line idea into the 12-block Cinematic Scene Blueprint — optional dialogue + ambient. Triggers 'expand this scene', 'blueprint for X'. 11-block refine → video-director.4---56# scene-expander78> Expand a one-line idea or script line into the **Cinematic Scene9> Blueprint** — 12 labeled blocks consumed by10> [`parse-blueprint.sh`](./scene-blueprint.schema.yaml). Picks11> `hollywood-director` for live-action; hands off animated beats to12> [`pixar-storyteller`](../pixar-storyteller/SKILL.md). Output is13> provider-agnostic — provider tuning is14> [`motion-choreographer`](../motion-choreographer/SKILL.md).1516## When to use1718- A script line, idea, or beat needs a full blueprint before any19 adapter runs.20- A `/video:from-script` run is parsing `## Scene N` headings and21 needs each scene expanded.2223Do NOT use when:2425- The brief is already an 11-block cinematic prompt → call26 `video-director` directly to refine it.27- The brief is a static graphic → `canvas-design`.28- Provider-specific token tuning is the next step →29 `motion-choreographer`.3031## Procedure3233### Step 0: Inspect34351. Read the input line. Classify as **live-action / photoreal** or36 **animated / stylized**.372. Live-action → load `hollywood-director` voice. Animated → hand38 off to [`pixar-storyteller`](../pixar-storyteller/SKILL.md) (its39 procedure carries the acting / beat-decomposition lens). Hybrid40 (live-action with VFX) → `hollywood-director`; record VFX intent41 in ENVIRONMENT.423. Check for an existing `character.json` lock under43 `agents/reference/ai-video/<project>/characters/`.4445### Step 1: Emit the 12 blocks4647One label per line. Order is mandatory.48491. **STYLE** — stylistic anchor (live-action: film stock + decade,50 e.g. "Kodak 5219, 2015"; animated: specific film + year).512. **SUBJECT** — character read; verbatim identity tokens when a52 lock exists.533. **ENVIRONMENT** — location, time-of-day, weather, era; what the54 world does in response to the subject.554. **ACTION** — anticipation / action / reaction with beat counts56 (`0.5s / 1.2s / 0.8s`). No adjective paragraphs.575. **CAMERA** — position, height, distance, move as an INTENT58 class (static hold, push-in, pull-back, lateral track, handheld59 drift, orbit). Intent vocabulary, never one provider's move60 grammar — the per-provider encoding happens in61 [`motion-choreographer`](../motion-choreographer/SKILL.md).62 Off-axis when on-axis is default.636. **LENS** — focal length in mm and aperture intent. "Cinematic"64 alone fails. mm + aperture are cinematography units, not provider65 tokens — they stay.667. **LIGHTING** — key / fill / back / practical named; "golden67 hour" requires a sun angle.688. **MOOD** — one emotional read.699. **DIALOGUE** — optional. If present: `speaker: "line"`, one per70 line. Marks `audio: native` capability requirement.7110. **AMBIENT SOUND** — optional. Layer list (wind, traffic,72 crowd, ocean). Marks `audio: native` or routes to ffmpeg mux.7311. **DURATION** — seconds (integer or one decimal). Free value;74 per-provider clip-length clamping is the encoder's concern, not75 the blueprint's.7612. **NEGATIVE** — clichés to reject, load-bearing order top-first.77 Always names: centered framing, symmetric composition, generic78 "cinematic", soap-opera contrast.7980### Step 2: Self-review81821. Live-action / animated classification consistent across blocks?832. LENS present with mm (live-action) OR stylistic anchor with84 film+year (animated)?853. LIGHTING with a direction?864. ACTION names beat counts, not adjectives?875. DIALOGUE / AMBIENT SOUND present → the run requires `audio:88 native` adapter OR ffmpeg-mux fallback declared.896. NEGATIVE ≥ 4 entries, load-bearing top?907. SUBJECT verbatim from `character.json` when a lock exists?9192Any "no" → revise that block.9394### Step 3: Validate95961. Pipe output through `scripts/ai-video/lib/parse-blueprint.sh` —97 exits 0 and emits valid adapter-contract JSON.982. No provider tokens (no aspect / model / duration flags).99100## Output format1011021. **`scenes/<id>/prompt.txt`** — 12 labeled blocks, ready for103 `parse-blueprint.sh`.1042. **`scenes/<id>/blueprint.json`** — parser output, adapter-stdin105 ready.1063. **`scenes/<id>/review.md`** — one-paragraph rationale per107 non-obvious choice.108109## Gotcha110111- The model wants to skip optional DIALOGUE / AMBIENT SOUND blocks112 silently — if they could plausibly belong, emit them; the parser113 treats missing blocks as `null`, not as an error.114- Live-action without LENS mm fails the parser's strict mode.115- Animated without a film+year anchor in STYLE drifts on every run.116- ACTION written as "the character does X dramatically" fails —117 adapters need verbs with beat counts.118- DIALOGUE forces `audio: native` requirement — flag this to the119 orchestrator so it picks an audio-native adapter120 (`capability.audio = native`).121122## Do NOT123124- Do NOT emit provider tokens — that is `motion-choreographer`.125- Do NOT shape any block toward one provider's prompt grammar — the126 blueprint is the decoupling layer; the anti-leak schema test scans127 it for provider tokens.128- Do NOT skip the blueprint parser validation step.129- Do NOT paraphrase identity tokens when a lock exists.130- Do NOT mix live-action LENS prescriptions with animated STYLE131 anchors in the same scene — pick one mode.132133## Policies134135Paths, enforcement model, and the full set: the136[media policy preamble](../../../agents/settings/policies/media/README.md).137138The 12-block Cinematic Scene Blueprint is the policy choke point — every downstream skill (`motion-choreographer`, `video-director`) inherits whatever the blueprint encodes. Before emitting:139140- **`likeness`** — when the SUBJECT block names or visually identifies a real person.141- **`public-figures`** — when the SUBJECT block is a recognised public figure.142- **`brand-impersonation`** — when STYLE / ENVIRONMENT references a recognised brand's visual identity.143- **`style`** — when STYLE anchors to a named living artist or studio as the primary signature.144- **`disclosure`** — every distributed blueprint output carries the AI-generation disclosure downstream.145146Refuse-and-surface at the blueprint layer; do not push policy questions down to the adapter.147