---
tier: hero
reliability: 3.7 # 6 beats: char-sheet gen .3 + place_subject fan .2 + kontext keyframe polish .2 + 6× i2v .6 + music .2 + ffmpeg 0 → 3.5; +0.2 once E2E showcase rendered
---

# 端午 · 龙舟小波 — Dragon Boat cartoon reel (manual reference-passing) ⭐

> Paste this whole file (with the BRIEF filled in) into Claude cowork, chat, or Code with the Storyboard MCP attached. The agent runs it top-to-bottom and stops for your approval at every step that matters. **One cute character image locks the whole reel.**

## What you'll get

A ~60-second vertical (9:16) cartoon reel that tells the 端午 dragon-boat-race story, starring **one chibi dragon spirit who looks the same in every shot** — the part most AI tools get wrong, and the part this playbook gets right.

What lands at the end:

- **One character sheet** of the hero — a chibi dragon spirit, "小波" (Bo), the carved dragon-head prow come to life. This single image is the only identity input.
- **Six animated beats** (~8–10s each), Bo identical across all of them, telling a clear race arc.
- **One stitched 9:16 reel** with a "端午安康" end-card.
- **An optional music bed** — festive drums + strings, instrumental.
- **A share page** (HTML) sized for Douyin / 小红书 / Reels, with a download button.

**Tone**: bright, warm, festive, kid-legible. Round shapes, big eyes, splashy water, red-and-gold festival palette. Funny, not solemn.

**Time**: ~12–15 minutes wall clock. **Your attention**: ~4 minutes across 4 approvals. **Cost**: $2.00 – $4.00 depending on the video tier you pick.

## The hardest part — character consistency from one image

Most AI tools draw a different dragon on every shot. That breaks the story — the viewer's brain says "wait, who is this now?"

This playbook **locks Bo on a character sheet first**, then carries that identity forward into every beat by passing Bo's image as the reference for each scene (subject-preservation), rather than re-drawing Bo from scratch. Same horns, same belly spot, same grin — different moment of the race every time.

> This is the **manual reference-passing** approach: Bo's sheet is hand-fed as the reference into each shot. It's the fastest path and uses only primitives that exist today. (The forthcoming **Wire Graph** playbook — `dragon-boat-wire-graph.md` — produces the same reel by *wiring* Bo's node into every shot once; see that file + `docs/wire-graph-vs-manual-comparison.md` for the trade-offs.)

## Tell the agent about the reel

```yaml
reel_title:          # e.g. "小波的龙舟赛 / Bo's Dragon Boat Race"
hero_name:           # the chibi dragon's name, e.g. 小波 (Bo)
hero_look:           # 1-2 sentences. e.g. "a round chibi river-dragon spirit, jade-green scales,
                     #   a gold belly spot shaped like a water drop, two tiny curved horns, big friendly eyes,
                     #   a red ribbon tied at the neck. Cute mascot proportions, big head, stubby limbs."
crew_look:           # 1 sentence describing the rowers, e.g. "four cheerful cartoon animal rowers
                     #   (panda, rabbit, fox, frog) in matching red headbands"
art_style:           # one of: pixar-3d-cartoon | flat-2d-festival | watercolor-storybook | chibi-anime
hero_color:          # one hex anchoring the palette, e.g. #E63946 festival red (gold + jade accents)
language:            # the end-card + any on-screen text language, e.g. zh | en | bilingual
video_tier:          # premium (seedance-i2v, ~$0.36/10s) | fast (seedance-i2v-fast, ~$0.15/10s)
launch_slug:         # kebab-case for filenames, e.g. bo-dragon-boat
```

## The 6 beats (the canonical arc — fun, legible, shareable)

The agent uses these unless the BRIEF overrides them. Each beat is one clear visual moment.

1. **Dawn** — mist on the river, red lanterns on the banks; Bo yawns awake curled on the carved dragon-head prow.
2. **Lighting the drum** — the crew boards; Bo puffs a tiny spark from his nose to light the big drum. Everyone grins.
3. **The start** — gong sounds, paddles bite, water sprays; Bo zips alongside the boat trailing a ribbon of light, cheering.
4. **Falling behind** — a rival boat surges ahead; the crew strains, Bo's eyes go wide, he waves them on furiously.
5. **The climax** — final stroke; Bo breathes a rainbow gust into the sail; the boat lunges across the finish, spray everywhere.
6. **Victory** — zongzi tossed in the air, fireworks bloom, Bo beams on the prow. End-card: **"端午安康"**.

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

1. **CONFIRM (one message, ≤1 question).** Restate in 1 line ("6-beat 9:16 dragon-boat reel starring <hero_name>, <art_style>, ~$2–4, ~12–15 min") + the real choices: premium vs fast video tier · music bed on/off. Ask only the art-style/palette question; otherwise state assumptions and start.
2. **PREVIEW CHECKPOINT — the character sheet is non-negotiable.** Bo's sheet gates everything. Never animate a single beat until you've approved how Bo looks. If Bo is wrong here, every beat is wrong.
3. **NARRATE every stage.** Each generation returns a job id — poll every 8–15s and post one line per transition ("beats 3/6 animated · climax + victory next, ~2 min"). The 6-way animate fan-out takes 3–5 min; give the ETA up front, never go silent >2 min.
4. **FAIL GRACEFULLY.** Bo drifts on a beat → ONE re-render from the sheet with tightened "same dragon, same horns, same gold belly drop, same red ribbon." Video cap "fetch failed"/422 on a darker beat → soften the prompt, retry once, then fall back to a Ken-Burns push on the still keyframe. 1-line WHAT/WHY/fallback; ≤2 retries per beat; ship 6 beats with 1 flagged weak beat over stalling.
5. **DELIVER.** The reel + share page + one honest line ("Bo holds on 6/6; beat 4's horns thin slightly — i2v ceiling") + ONE next step ("post it, or refine beat 4").

## Quality controls (auto-applied)

- **Cost upfront.** Before the 6-way animate fan-out fires, print the total ($2.16 premium / $0.90 fast for video + ~$0.06 images + ~$0.10 music) and wait for approval. Nothing expensive runs un-gated.
- **Character anchor.** After the sheet is approved, capture its URL as the `quality_anchor_url` for every beat so the cross-asset critic catches Bo drift even when a per-image gate passes.
- **Auto-retry on weak shots.** Hero beats (1, 5, 6) run with a tighter quality threshold so a low-confidence first try auto-retries once before you see it.
- **Critic verdict.** When the keyframe batch finishes, read back the critic's ship/iterate verdict and surface it.
- **End-of-reel scorecard.** Final wrap-up prints succeeded count, mean quality, total cost, wall time.

## What can disappoint (cap ceilings)

- **Fast-water motion** can smear fine details (horns, ribbon) in i2v — the fast tier wobbles more than premium; pick premium for beats 5–6 if budget allows.
- **On-screen text** ("端午安康") is rendered as an **HTML overlay on the end-card**, never baked by the image model — AI text rendering is the hardest known failure mode.
- **Rival-boat beat (4)** is the busiest composition; if Bo gets lost in the crowd, the playbook re-renders it tighter on Bo.

## The steps

### Step 0 — Confirm and pick the look

The agent reads back the BRIEF and suggests a palette from `art_style` + `hero_color`:

- **pixar-3d-cartoon** → festival red + gold + jade + warm cream
- **flat-2d-festival** → vermilion + marigold + teal + ink
- **watercolor-storybook** → soft red + peach + sage + paper white
- **chibi-anime** → cherry red + gold + sky + blush

**STOP**: "Brief and look right? (approve / style [name] / palette [4 hexes] / edit [field] [value])"

### Step 1 — Lock the hero: Bo's character sheet (~30s, ~$0.04)

The agent draws **one character sheet** of Bo from `hero_look` — a clean 3/4 hero pose plus a small turn-around (front + side), neutral background, even light, the chosen art style. Use the stylization-strong image model (gpt-image / nano-banana-2) so the cute mascot proportions read clearly. This is the anchor; every beat references it.

**STOP**: "Here's <hero_name>. He has to look right — every beat uses this exact dragon. Approve, or refine? (approve / refine [direction])"

### Step 2 — Build the 6 keyframes by placing Bo into each beat (~2 min, ~$0.06)

The agent places Bo into each of the 6 beats — Bo keeps his horns, gold belly drop, and red ribbon while the scene around him changes. The crew, boat, water, and festival staging fill in per beat. This produces 6 still keyframes with a consistent Bo.

> The agent uses the subject-preservation placement so Bo's identity carries from the sheet into all 6 scenes in one pass, then polishes any weak keyframe with an identity-preserving edit from the sheet.

**STOP**: "Six keyframes ready — Bo should look the same in all of them. Approve, or refine one? (approve / refine [beat#] [direction])"

### Step 3 — Animate the 6 beats (~3–5 min, $0.90–$2.16) — **gated spend**

> Print the cost first and wait. Premium = `seedance-i2v` (~$0.36/10s, smoother water + held detail); fast = `seedance-i2v-fast` (~$0.15/10s).

The agent animates each approved keyframe into an ~8–10s clip — paddles biting, water spraying, Bo zipping and cheering, the rainbow-gust climax, fireworks on victory. Motion direction per beat comes from the arc above.

**STOP** (foldable): "All 6 beats animated. They should cut together as one race. Final approval? (approve / refine [beat#] [direction])" — if the keyframes were approved without edits, you may take a single approval here.

### Step 4 — Music bed (optional, ~30s, ~$0.10)

Festive instrumental — big drums, strings, a rising finish that hits on the victory beat. Instrumental by default.

**STOP**: "Listen to the music bed. Approve, or different mood? (approve / try [bigger drums | gentler | faster])"

### Step 5 — Stitch + end-card (no gate, ~1 min, ~$0.02)

Stitch the 6 clips in order with quick cuts (a soft splash transition into the climax), mux the music, and append a 2-second end-card with the **"端午安康"** title as an **HTML/text overlay** (not baked by the image model). Export 1080×1920.

### Step 6 — Write the share page

A single HTML file: the reel embedded, the title, a one-line blurb, a download button, and 9:16 framing so it previews like a social post. Saved to `public/launches/{launch_slug}-reel.html`.

### Final step — scorecard wrap-up

Call `get_scorecard({ project_id })` and print the report card (scenes shipped, critic verdict, mean quality, cost actual vs est, wall time). Paste it into the channel so reviewers see numbers, not vibes.

## When you're done

The agent prints:

```
✅ Dragon Boat reel: public/launches/{launch_slug}-reel.html
✅ Bo character sheet: <URL>
✅ 6 beats: see reel
✅ Reel MP4 (9:16): <URL>

Total spent: $X.XX
Total wall-clock: MM:SS

To post:
  Open the share page, hit download, and post to Douyin / 小红书 / Reels.
  Caption suggestion: "祝大家端午安康 🐲🚣 #端午 #龙舟"
```

## What to do next

1. **Post it** — it's already 9:16 with an end-card; drop it straight onto a vertical feed.
2. **Reuse Bo** — save Bo's sheet + the BRIEF. Next 端午 (or any festival) reuses the same dragon. Build a mascot.
3. **Make a 16:9 cut** — re-export landscape for YouTube/site headers.
4. **Try the Wire Graph version** — run `dragon-boat-wire-graph.md` for the same reel authored as a wired graph, then read `docs/wire-graph-vs-manual-comparison.md` to see which authoring style fits your team.

---

## Notes for the agent (only read if a step fails)

**Character anchor mechanism (manual reference-passing).** Step 1 generates Bo's sheet. Step 2 carries Bo into all 6 beats via subject-preservation placement (one fan-out call, source = Bo's sheet). Any beat that drifts gets ONE identity-preserving re-edit from the sheet URL with tightened "same dragon — same two curved horns, same gold water-drop belly spot, same red neck ribbon — only the scene changes." Always re-anchor from the **sheet**, not from a drifted beat, so drift never compounds.

**Beat 4 crowding.** If Bo is hard to find in the rival-boat beat, re-render the keyframe with Bo larger / foreground ("camera favors <hero_name> in the lower third").

**Video cap failures.** Video gen "fetch failed" / 422 on a busier or darker beat is fal-side latency or a content filter, not the orch. Soften the prompt, retry once, then fall back to a slow Ken-Burns push on the still keyframe so the reel still has 6 beats.

**Polling.** Poll `get_create_media` every 8–15s until `done` or `failed`.

**On capability failure.** Retry once after 5s. On second failure, ask the user "retry / skip / abort?". Never silently retry forever.

**Stitch + mux envelope gap.** `ffmpeg-concat` (`clips:[]`) and `ffmpeg-mux` (`video_url`+`audio_url`) may need a direct SDK POST to `https://sdk.daydream.monster/inference` with Bearer auth — the MCP `create_media` can drop array params. Use `audio_fill:"loop"` on the mux so there's no silent tail.

**Bearer token.** The user's Daydream API key; the MCP host injects it in cowork. For direct SDK curl, read `~/.daydream/credentials` (`DAYDREAM_API_KEY=sk_...`). Never echo it.
