Eight scenes, four episodes, one identity

A cinematic short where the lead character has to look the same in every shot — and the system delivered, with auto-anchor, drift grading, selective retries, and four animated episodes from the same keyframes.

Vertical Film / storyboard Persona Director, indie short Capabilities exercised generate_project (auto-anchor), drift gate, prop check, seedance-i2v Models flux-dev × 8 scenes, nano-banana anchor, seedance-i2v × 4 episodes

A 70-year-old fisherman named Grandpa Tom takes his 8-year-old grandson Sam on his last sunrise fishing trip. Eight scenes, one boat, two characters that have to look like the same two characters in every shot. This is the failure mode every multi-shot generative tool faces: the marks drift, the wardrobe drifts, the faces drift. By scene 5 you're looking at a different grandfather.

How the system handled identity

The agent submitted eight scenes through generate_project with character_anchor: "auto". That triggered a four-step pipeline server-side:

  1. Extract anchors from the brief. Gemini Vision (server-side, behind the MCP) parsed the brief and identified two characters + three named props. Latency: 11.0 s.
  2. Generate an anchor sheet. nano-banana produced one image showing both characters in neutral poses — the canonical reference the rest of the pipeline grades against. Latency: 13.2 s. View the anchor sheet.
  3. Fan out 8 scenes in parallel with the anchor URL injected as source_url. Each scene rendered through flux-dev. Wall clock per scene: 7.8 – 21.2 s.
  4. Drift-grade every scene via Gemini Vision against the anchor. When the weighted score (face 0.4 + marks 0.4 + wardrobe 0.1 + palette 0.1) fell below 0.70, the worker retried the scene with stronger anchor language. Budget: 5 retries total.
8 / 8
scenes delivered
4 / 4
episodes animated (i2v)
~70 s
scenes wall clock
~3 min
episodes wall clock (parallel)
2 + 2
auto-retries (scenes + episodes)
0.78 avg
final drift score
$1.50
total spend (stills + episodes)

The actual eight scenes

Viewer URL the director can share: storyboard.daydream.monster/v/proj_3a433187c484

Scene 1 — Dawn arrival Scene 2 — Pushing off Scene 3 — The lesson Scene 4 — Quiet patience Scene 5 — First bite Scene 6 — The catch Scene 7 — Passing the rod Scene 8 — Rowing home

From keyframes to cinematic episodes

The eight stills are the storyboard — the deliverable a director would have shipped a decade ago. The same MCP surface keeps going. The director's agent picked four key narrative beats (Scene 1 Dawn, Scene 3 Lesson, Scene 6 Catch, Scene 8 Rowing home), passed each scene URL as source_url, and called create_media action=animate model_override=seedance-i2v in parallel. The keyframe is the first frame; seedance generates 5-6s of cinematic motion from it.

Two of the four initial calls failed transiently with a worker abort. The agent saw the typed error, branched on retryable=true, and re-submitted both. Both succeeded on retry — the workflow is robust to fal-side flakes by design (AX-1 error envelope + idempotency-friendly retries).

Episode 1 · 5s · seed 624534974
Dawn arrival
Camera pushes in across calm lake water at golden hour; Grandpa Tom's silhouette appears as a mist tendril drifts past the dock.
Episode 2 · 6s · seed 555540173
The lesson
Grandpa Tom guides Sam's small hands on the rod; intimate handheld, warm sunrise sidelight, the boat rocks softly.
Episode 3 · 6s · seed 736606628
The catch
Rod bends, line zips taut; Sam wide-eyed laughing in joy, Grandpa Tom steady at his shoulder. Action cinematic.
Episode 4 · 6s · seed 368363989 (after 1 retry)
Rowing home
Wide shot, two figures row across glassy evening water; long shadows, rhythmic oar splash. Emotionally resolved.

Total cost for the four episodes: ~$1.10 (seedance-i2v ~$0.25/clip). Total time wall-clock: 195-230s per clip, all in parallel. The director now has a paper edit — eight beats — plus four moving shots they can drop directly into Premiere or DaVinci.

The honest drift trace

This case study doesn't smooth over what happened. The drift gate logged every grading call. The first three scenes scored well (0.87, 0.83, 0.79). Scenes 3 and 4 dipped below the 0.70 threshold and triggered the retry path. The retries pulled scores back to ~0.78 average. Three stable scenes were also captured into a LoRA-training-ready bucket (anchor_hash v1_58a688c6ad8ae48a45cff009) — the substrate for future Z4 auto-LoRA work.

Specific grader observations the system logged:

"The wardrobe for both characters is completely different from the anchor sheet." — drift_check, score 0.28, scene retried
"The older man's wardrobe is inconsistent, wearing a plain top instead of the cable-knit sweater from the anchor." — drift_check, score 0.87, passed threshold
"Neither the man nor the boy are wearing their canonical outfits from the anchor sheet, and the boy's face is obscured." — post-retry, score 0.63, second retry queued

The system surfaces drift not by claiming consistency it doesn't have, but by grading and retrying when the score is below threshold. That's the substantive difference vs prompt-and-pray.

How this compares

CapabilityStoryboard MCPRunway References / Gen-4Midjourney character refsSora 2
Auto-extract characters from brief✓ Gemini Vision NERManual uploadManual upload + --crefManual
Auto-generate anchor sheet✓ nano-banana, ~13 sManual compositionManual compositionn/a
Drift detection per scene✓ Vision LLM, 0–1 weighted scoreNone (style transfer only)NoneNone
Auto-retry below threshold✓ 5-retry budget, anchor-strengthened promptsManual re-rollManual re-rollManual
LoRA-training-ready capture✓ Stable scene URLs logged for downstream trainingSeparate Gen-4 training flowManual gallery curationn/a
Cost for 8 scenes with auto-anchor~$0.40~$1.80 (Gen-4 credits, no anchor)~$0.70 (Standard, no drift gate)~$2.40 (preview pricing)

The agent-level affordances Z+AX added

Eight months ago, the same brief would have required the director's agent to:

  1. Pick a base model.
  2. Generate eight prompts manually, hand-tuning consistency cues.
  3. Run eight separate calls.
  4. Eyeball each result.
  5. Manually re-roll the ones that didn't match.
  6. Pay for every retry without server-side budget protection.

What the agent actually did, post Z+AX:

  1. generate_project({ title, scenes, character_anchor: "auto" }) — one call.
  2. Polled get_creative_job twice while the worker fanned out scenes + ran the drift gate + queued retries.
  3. Received viewer_url, anchor_url, and a full consistency_log with every drift score and retry decision.

Three tool calls. Two characters. Eight scenes that mostly look like the same characters. A consistency log the director can audit.

Run the same flow

Submit your own multi-scene brief: mcp__storyboard__generate_project with character_anchor: "auto" when you have 3+ scenes. The pipeline does the rest.

Live: storyboard.daydream.monster/v/proj_3a433187c484 · Anchor sheet: view