---
tier: hero
reliability: 3.9  # 5 stages: i2v .6 + test-swap edit .2 + face-swap-video .6 + music .2 + ffmpeg 0 → 3.4; +0.5 proven E2E showcase
---

# One Face · Six Lives — agent playbook ⭐ flagship

> Paste this whole file (with the BRIEF filled in) into Claude cowork, chat, or Code. **This is the face-swap showcase.** One identity photo → six cinematic scenes, all featuring that person, in ~6 minutes for ~$1.50. The pipeline that turns "I want to see myself in a film" into a 60-second reel.

## What you'll get

A 60-second cinematic reel where one person — the user — appears as the protagonist in six different lifestyle scenes:

- **One identity photo** (a selfie or a portrait of the subject)
- **Six cinematic 10-second scenes** generated via `seedance-i2v` with a generic actress as a stand-in
- **Six parallel face-swap passes** via `face-swap-video` to replace the actress with the user's face
- **One stitched 1920×1080 cinema reel** + optional `pre_swap` / `swapped` toggle viewer per scene
- **Optional music bed** via `create_media(action:"music")` — instrumental by default (`lyrics_prompt:"[Instrumental]"`)
- **Optional voice-over** via `gemini-tts` if the brief includes a script
- **Real finishing pass** — `ffmpeg-concat` → `ffmpeg-mux` (`audio_fill:"loop"`, no silent tail) → `ffmpeg-export` 1920×1080

**Time**: ~6 minutes wall clock. **Your attention**: ~3 minutes (one selfie + one approval gate). **Cost**: ~$1.50 e2e. *The fastest face-personalized flagship in the catalogue.*

## Tell the agent about the piece

```yaml
piece_title:           # e.g. "Maya — One Face, Six Lives"
piece_subtitle:        # 1-sentence about the piece

# The identity (the only required input)
identity_photo_url:    # 1 URL of a clear, well-lit portrait of the subject
                       # (or @last_image / a canvas card ref)
identity_name:         # display name for the subject in titles + UI

# Six scenes (the canonical default)
scenes:
  - id: 1
    setting: "skate park · golden hour · backlight"
    action: "the subject rolls past camera, looking back over shoulder"
  - id: 2
    setting: "foggy Embarcadero bridge · cool blue"
    action: "the subject walks along the pier, hand trailing the rail"
  - id: 3
    setting: "Mission alley · warm amber neon"
    action: "the subject leans against a wall, hands in pockets"
  - id: 4
    setting: "Golden Gate sunset · wide vista"
    action: "the subject sits on a rock looking out toward the bridge"
  - id: 5
    setting: "midnight Chinatown · cool blue + red neon"
    action: "the subject walks through rain reflections"
  - id: 6
    setting: "dawn beach · soft pink + lavender"
    action: "the subject runs barefoot toward the surf"

# Visual style
visual_style:          # e.g. "cinematic documentary", "music-video lookbook",
                       # "fashion editorial", "indie-film grain"

# Optional layers
music_brief:           # e.g. "soft ambient electronica with one piano motif"
narration_script:      # paragraphs of poetic VO ABOUT the subject

# Output
piece_slug:            # kebab-case for filenames. e.g. maya-six-lives
```

## Quality controls (auto-applied)

- **Cost upfront.** 6 × `seedance-i2v` 10s ($0.36 each = $2.16) + 6 × `face-swap-video` ($0.24 each = $1.44) = $3.60 *worst case for premium i2v*. With faster siblings (`seedance-i2v-fast`) it drops to ~$1.50. Approve before fire.
- **Identity quality gate.** Before fanout, the agent renders ONE test scene + face-swap and shows it to you. If the identity preservation is poor on the test (face too occluded, wrong lighting, "stuck-on" look), pick a better source photo BEFORE the other 5 fire — saves $1.20.
- **Per-scene face-detection check.** After each face-swap-video returns, parse for the `face_detected` flag in the response. Any scene that says `skipped:no_face` gets a warning chip on the canvas card; original (pre-swap) is kept as `pre_swap_url`.
- **Auto-chunk long clips.** If any scene runs >10s (extended via `director_retime`), the face-swap-video step auto-chunks to 5s segments + `ffmpeg-concat`. Single-call limit safety.
- **Final critique pass.** After the reel is stitched, optional drift gate via `marlin-video` (when registered): rate the identity-consistency across all 6 scenes 0-10. Below 6.5 → suggest a retry with a different source photo.

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

1. **CONFIRM first (one message, then go).** Restate the brief in 1 line ("[name]'s face → 6 [style] scenes, ~60s reel") + 2-3 real choices: `seedance-i2v` premium (~$3.60) vs `seedance-i2v-fast` (~$1.50) · music bed on/off · 16:9 vs 9:16. Quote cost + ~6 min wall. Ask at most ONE question; otherwise state assumptions and start.
2. **PREVIEW CHECKPOINT — the test swap is non-negotiable.** Stage 2 (one face-swap on scene 1, ~$0.30) fires BEFORE the other 5 swaps. Show pre-swap vs post-swap, ask "good, or different photo?" — the user redirects here for $0.30 instead of $1.50.
3. **NARRATE every stage.** Each `create_media` returns a job_id — poll `get_create_media` ~10s and post one line per transition: "Scenes 4/6 animated · swaps next (~2 min)". The two 6-way fanouts take 2-4 min each; give the ETA up front, never go silent >2 min.
4. **FAIL GRACEFULLY, per scene.** seedance hang / "fetch failed" → 1 retry, then `ltx-q-i2v` (`num_frames: 241`, `resolution: "auto"`); face-swap `skipped:no_face` → keep `pre_swap_url`, flag it, move on; fal 422 → soften the scene prompt once. ≤2 retries/scene, always a 1-line WHAT/WHY/fallback. A 5/6-scene reel beats no reel — ship the partial and name the dropped scene.
5. **DELIVER honestly.** Final reel URL + 1-line quality note ("identity holds in 5/6 — scene 4 shimmers in profile") + ONE next step ("want the 9:16 vertical cut?").

## The 6-scene pipeline (canonical)

```
Stage 1 — generic scenes (parallel)
  6 × create_media(action=animate, model_override=seedance-i2v,
                   prompt=[setting + action + generic-actress placeholder],
                   duration=10)
  → 6 × video URLs of a stand-in actress in your 6 scenes

Stage 2 — IDENTITY QUALITY GATE (your attention, ~30s)
  Run 1 test face-swap on scene 1 (cheapest fast path).
  Show: pre-swap actress + post-swap subject. If poor, pick a new
  identity photo and re-fire stage 2 BEFORE stage 3.

Stage 3 — fanout face-swap (parallel)
  6 × create_media(model_override=face-swap-video,
                   source_url=<scene_video>,
                   face_ref_url=<identity_photo>)
  → 6 × videos with the subject's face

Stage 4 — finishing (MANDATORY real finishing pass)
  a. ffmpeg-concat (6 swapped scenes, transition:"cut") → 60s silent reel
  b. music → create_media(action:"music", prompt:music_brief,
       lyrics_prompt:"[Instrumental]", duration:60)   # ≥ reel length
  c. (optional) gemini-tts narration about the subject
  d. ffmpeg-mux: lay audio under the 60s reel with audio_fill:"loop"
       (loop guarantees NO silent tail if the bed is short)
       narration at 1.0, music ducked to 0.55 when both present
  e. ffmpeg-export size:"landscape_16_9" → final reel.mp4 (1920×1080)

Stage 5 — publish (OPTIONAL — the reel from Stage 4 is the deliverable)
  Upload to /chapters/<piece_slug>/
  Optional: showcase HTML with pre_swap / swapped toggle per scene
  Optional: publora_publish_post to push the reel to socials
```

## Why this is the flagship for face-swap

- **One-photo onboarding.** No LoRA training, no multi-image upload, no waiting 10 minutes. A single selfie unlocks 6 cinematic scenes.
- **The toggle is the proof.** The showcase HTML shows pre_swap + swapped side-by-side per scene. Viewers see exactly what the cap does. No magic, no claim — just before/after.
- **Cheap enough to be personal.** $1.50 per reel means a creator can offer "personalized cinematic reels" as a $5–10 product. Storyboard becomes the engine behind a creator's customer-facing offering.
- **The pattern generalizes.** Substitute the 6 scene-setting briefs and you have: a tourist promo (your-face in 6 city scenes), an actor reel (one headshot in 6 genre tones), a memorial (a loved one in 6 scenes from their life), a brand-influencer kit (one influencer in 6 brand contexts).

## Reproduce via MCP

The full call sequence (single user, single project, no auto-injection):

```typescript
// 1. Identity photo upload (one-time)
const identity = await upload_image({ url: "https://your-selfie.png", tag: "identity" });

// 2. Generic scene generation (parallel)
const scenes = await Promise.all([
  // Scene 1: skate park
  create_media({
    action: "animate", model_override: "seedance-i2v",
    prompt: "young person, skate park, golden hour backlight, rolls past camera looking back over shoulder, cinematic documentary, painterly grain",
    duration: 10,
    source_url: identity.url,  // seedance uses this as a pose / framing reference
  }),
  // ... scenes 2-6 same pattern
]);

// 3. Identity quality gate (manual approval)
const test_swap = await create_media({
  action: "generate",
  model_override: "face-swap-image",
  prompt: "face swap test",
  source_url: scenes[0].url_first_frame,
  face_ref_url: identity.url,
});
// → show user, get approval before continuing

// 4. Fanout face-swap (parallel)
const swapped = await Promise.all(scenes.map(s => create_media({
  action: "generate",
  model_override: "face-swap-video",
  prompt: "face swap pass",
  source_url: s.url,
  face_ref_url: identity.url,
})));

// 5. Finishing — concat → music → mux (loop) → export
const reel = await create_media({ model_override: "ffmpeg-concat",
  prompt: "stitch", params: { clips: swapped.map(s => s.url), transition: "cut" } });
const music = await create_media({ action: "music",
  prompt: "soft ambient electronica, one piano motif",
  lyrics_prompt: "[Instrumental]", duration: 60 });   // ≥ reel length
const mixed = await create_media({ model_override: "ffmpeg-mux",
  source_url: reel.url, audio_url: music.url, audio_fill: "loop" });  // no silent tail
const final = await create_media({ model_override: "ffmpeg-export",
  source_url: mixed.url, params: { size: "landscape_16_9" } });
```

## Honest limits

- **Identity quality depends on the source photo.** A clear front-facing selfie in even lighting works best. Profile shots, heavy shadows, sunglasses, or low-resolution sources degrade output 30-60%. The first test render exists specifically to catch this.
- **Multi-face scenes need flag.** If a scene has more than one person, pass `multi_face: true`. Without it, only the largest face gets swapped.
- **No live face-swap (yet).** This playbook ships images + video. Live LV2V face-swap lands in the Scope-graph-node sprint (PR-C in the face-swap rollout). When that lands, the same identity photo will drive both the VOD reel AND a live afterparty stream.
- **Consent is your responsibility.** See `face-swap.md` skill's consent section. The agent will gate the first face-swap call with a confirmation prompt; pass `consent_confirmed: true` to bypass after the first warning.
- **i2v is the wobbliest stage.** seedance occasionally hangs (fal latency) or frames the stand-in so the face is too small / occluded to swap well — fall back to `ltx-q-i2v`, and re-prompt with "face clearly visible, medium close-up" for swap-hostile scenes.
- **Music will SING your prompt** if `lyrics_prompt:"[Instrumental]"` is omitted. It's in the recipe; don't drop it.

## Cross-surface parity (where to invoke this playbook)

- **MCP**: `generate_project` with playbook=one-face-six-lives + brief YAML above
- **Webapp slash**: `/six-lives <identity-card-ref> [--scenes <setting1>,<setting2>,...]`
- **CLI**: `livepeer playbook one-face-six-lives --identity <url-or-card> --piece-slug <slug>`
- **Webapp right-click**: image card → "Six Lives reel with this face"

All four routes drive the same MCP playbook execution.
