---
title: "Museum Installation — place-as-protagonist 2-minute museum-bench piece (no characters)"
reliability: 3.9 # 5 − keyframe img gen .3 − 12× kling-v3-i2v .6 − tts .2 − music .2 − 8-stage path .3 + .5 proven showcase (ATELIER · Vermeer's Light rendered E2E); no-characters = zero cast-drift risk (the usual worst failure mode is absent)
---

# Museum installation — agent playbook ⭐ flagship

> Paste this whole file (with the BRIEF filled in) into Claude cowork, chat, or Code. **This is the no-characters showcase that proves a single workhorse i2v cap can carry a 2-minute museum-bench piece.** The protagonist is the place. The example is [ATELIER · Vermeer's Light](/chapters/atelier-vermeers-light-example.html) — a 17th-century Delft atelier at the moment of arrival, just before the painter steps in.

## What you'll get

A museum-grade installation piece, long-form, place-as-protagonist:

- **12 keyframes** of one place rendered in a locked visual style — same window, same easel, same beam of light across every shot.
- **12 disciplined i2v animations** — every shot has exactly ONE allowed motion (dust drifts OR lace stirs OR light brightens OR pigment-glint pulses, never two).
- **Single workhorse cap** — all 12 shots are `kling-v3-i2v` 10s. No premium-cap mixing; the discipline is in the prompts, not the cap budget.
- **Scholarly TTS narration** over baroque chamber music — curator-bench voice, not Hollywood narrator.
- **Cinema 1920×1080 reel**, ~120s, ready for a lobby loop, exhibit wall, or museum bench monitor.
- **Place bible** preserved as a re-pasteable 5-axis spec (no cast — the bible is the room, not a person).

**Time**: ~60 minutes wall clock. **Your attention**: ~12 minutes across 2 audit gates. **Cost**: $7–$10 e2e. *Cheapest premium showcase you can ship* — "no characters" means zero cast-lock drift risk.

## Tell the agent about the place

```yaml
piece_title:           # e.g. "ATELIER · Vermeer's Light"
piece_subtitle:        # 1-sentence about the piece. e.g. "An empty 17th-century atelier at the moment of arrival."

# 5-axis place spec (NOT cast — there are no characters)
place_identity_anchor: # 1 short sentence — the agent's seed for every prompt.
                       # e.g. "17th-century painter's studio in Delft, oak-beam ceiling, plaster walls, wide plank floor, single tall north window"
place_signature_object: # the one object that anchors the room's identity across shots.
                       # e.g. "single tall leaded-glass window with lace curtain caught against the frame"
place_palette:         # ≤5 colour names that define the painterly palette.
                       # e.g. "ultramarine lapis, lemon-ochre, lead-white, vermillion, plaster cream"
place_light_direction: # where the light comes from, what time of day.
                       # e.g. "north window left, low warm morning angle, golden beam diagonal across floor"
place_change_policy:   # always "SAME ROOM across every shot" + describe an arc.
                       # e.g. "SAME ROOM across every shot · light intensity grows ~10% per shot through the 12-shot arc"
absence_invariant:     # what MUST NEVER appear. Critical for "no characters" pieces.
                       # e.g. "no figures, no hands, no shadows of a body — only the room and the light"

# Style
visual_style:          # e.g. "Vermeer painterly", "Hopper light", "Hammershøi interior", "Wyeth tempera".
                       # Pick a single painter / movement reference, not a list.

# Narration + music
narration_voice:       # gemini-tts voice id. Recommended: "Gacrux" (warm scholarly female).
narration_paragraphs:  # 3-4 paragraphs of curator-voice text. The agent will TTS the whole script.
music_brief:           # 1-sentence brief for minimax-music.
                       # e.g. "baroque chamber music, lute and viola da gamba, period-appropriate, instrumental"

# Output
total_shots:           # 12 (default for 120s). 6-9 for shorter pieces, up to 18 for 180s.
piece_slug:            # kebab-case for filenames. e.g. atelier-vermeers-light.
```

---

## Quality controls (auto-applied)

- **Cost upfront.** 12 × krea-2-large (~$0.76) + 12 × kling-v3-i2v (~$6.30) + 1 × gemini-tts (~$0.25) + 1 × minimax-music (~$0.30) = ~$7.61. Approve before fire.
- **Place spec re-pasted verbatim** in every prompt. Same room, same window, same easel — the bible is unchanged.
- **Absence-of-figures invariant.** Every prompt includes the absence clause: "no figures, no hands, no shadows of a body". This is the museum-installation guarantee.
- **ONE motion per shot rule.** Each i2v prompt has exactly ONE allowed motion. The agent will refuse to write a prompt with two simultaneous motions; this is the discipline that makes a single cap carry the whole piece.
- **Audit gate after keyframes.** All 12 laid out in a grid: same room? same palette? same light arc (S1 to S12 ~10% brighter)? Zero accidental figures? Pass → fire animations.
- **Audit gate after animations.** Did the easel drift? Did the stool move? Did a figure appear in a render? Re-fire offenders before concatenation.
- **Long-form audio mix covers the full runtime.** Voice 1.0 + music ducked 0.15, muxed via `ffmpeg-mux` with `audio_fill:"loop"` so the instrumental bed runs under the whole piece (it bridges the gaps between narration paragraphs — no silent stretches). Voice fades in 0.4s / out 2.0s; music fades in 1.5s / out 2.0s; both trimmed to total runtime.

> **Why one cap, not premium-mixed:** in a place-as-protagonist piece, the camera does very little — usually no fancy moves. kling-v3-i2v handles "camera holds, ONE small thing moves" beautifully at $0.05/s. Spending grok-imagine-video money on shots that are 90% stillness is wasted budget.

---

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

1. **CONFIRM (one message, ≤1 question):** restate in 1 line ("12-shot, 120s, 1920×1080 place piece on <place>, kling-v3-i2v workhorse, ~$7.61, ~60 min wall clock") + real choices: 9 vs 12 vs 18 shots · the single painter/style reference · narration on/off. If the place spec is filled in, state assumptions and start; only ask when the 5-axis spec is missing.
2. **PREVIEW CHECKPOINT:** the 12-keyframe grid (~$0.76) is the first audit gate — same room? same palette? light arc S1→S12? ZERO accidental figures? — and it MUST pass before the ~$6.30 of i2v fires. The second gate (post-animation drift check) gates concat.
3. **NARRATE:** animate in batches of 3 (12 × kling 10s ≈ 30–45 min total); per batch: "shots 4–6 animating, job …, ~5 min"; poll `get_create_media` every 10–15s, never silent >2 min.
4. **FAIL GRACEFULLY:** `kling-v3-i2v` hang/422 → retry once → `ltx-q-i2v` (`num_frames:241`, `resolution:"auto"`) for that shot → Ken-Burns slow-zoom on the keyframe (stillness suits this format); a figure appears in a render → re-fire with the absence clause restated FIRST in the prompt; music comes back sung → re-run with `lyrics_prompt:"[Instrumental]"`. ≤2 retries per shot; an 11-shot piece with a note beats no piece.
5. **DELIVER:** the 1080p reel + one honest line ("shot 7 fell back to ltx-q; light arc held S1→S12; zero figures verified across all 12") + ONE next step ("export the lobby-loop version, or run the next room with the same brand kit").

## The 12-shot beat sheet (canonical)

| Shot | Role | Motion budget |
|------|------|---------------|
| S1 | ARRIVAL | light brightens 5%, signature object stirs once |
| S2 | ABSENCE | dust mote drifts across an empty surface |
| S3 | OBJECT-A | one element catches a breath of air |
| S4 | DETAIL-A | a glint travels across a surface |
| S5 | TEXTILE | drape edge lifts subtly |
| S6 | DUST | three motes drift through the beam |
| S7 | TOOL-A | light gleam moves across a tool |
| S8 | TOOL-B | secondary tool catches + releases a glint |
| S9 | BREATH | the room exhales — curtain billows once + settles |
| S10 | FLOOR | the light diagonal advances ~3 inches |
| S11 | WALL | a warm shadow softens + lifts |
| S12 | HELD | the room breathes once, held in full light |

Substitute role labels for your place type. For a kitchen: ARRIVAL/STEAM/KNIFE/SPICE/FIRE/etc. For a workshop: ARRIVAL/BENCH/CHISEL/WOOD-DUST/HAND-VICE/etc. The shape is: arrival → small details → atmosphere → held finish.

---

## Reproduce via MCP

1. `brand_kit_create` — palette + style keywords. The kit lives across future installation pieces.
2. `generate_project({ project_id, scenes: 12, style: visual_style })`.
3. 12 × `create_media({ action: "generate", model_override: "krea-2-large", prompt: STYLE + PLACE_SPEC + ABSENCE_CLAUSE + SHOT_DETAIL })` parallel.
4. Audit gate.
5. 12 × `create_media({ action: "animate", model_override: "kling-v3-i2v", source_url: keyframe_url, prompt: ONE_MOTION + PLACE_SPEC + ABSENCE_CLAUSE, duration: 10 })` — fire in batches of 3 to stay polite to the orch.
6. `create_media({ action: "tts", model_override: "gemini-tts", voice: "Gacrux", prompt: narration_script })` parallel.
7. `create_media({ action: "music", prompt: music_brief, lyrics_prompt: "[Instrumental]" })` parallel. **Critical:** museum-installation scores are always instrumental — pass `lyrics_prompt: "[Instrumental]"` explicitly. NEVER omit it; minimax-music sings whatever is in `lyrics_prompt` verbatim, so without this you'd hear `music_brief` sung. See `public/playbooks/music-video-mtv.md` §"The lyrics-vs-style bug".
8. Audit gate.
9. `ffmpeg-concat` the 12 clips → silent base reel, then `create_media model_override:"ffmpeg-mux"` with `audio_fill:"loop"` (voice 1.0 + music ducked 0.15, both trimmed to runtime) → `ffmpeg-export` 1920×1080. Audio covers every second.

---

## Honest limits

- **No characters means no character-arc story.** If your brief secretly wants a protagonist, run beat-driven-opera.md instead.
- **Long-form (>3 min) needs more shots.** The "12 shots × 10s = 120s" math is the safe default. For 180s use 18 shots; for 90s use 9. Beyond 3 minutes consider chunking the piece into multiple installations.
- **Voice script length matters.** gemini-tts pace is ~140 wpm — a 120s narration is ~280 words. Write to the runtime; don't try to fit 500 words into 120s.
