---
reliability: 2.7 # 5 − LoRA .8 − image gen .3×3 (antagonist anchor / key frames / key art) − 3 stages over 5 (.6); sizzle reel (i2v .6 + tts .2 + music .2) is OPTIONAL — with it ~1.7; no proven E2E showcase yet
---

# Series bible + pilot key frames — agent playbook

> Paste this whole file (with the BRIEF filled in) into Claude cowork, chat, or Code. The agent walks through it with you and stops for your approval at every step that matters. **This is the artifact that lives on a network executive's desk for the four weeks they're deciding whether to greenlight your pilot.** Treatment-quality writing, character bibles for protagonist + antagonist, 10-12 pilot key frames with a face that doesn't drift, optional sizzle reel. 90 minutes, under $12, scorecard-validated.

## What you'll get

A pitch package built the way a streamer's development executive actually wants to read it:

- **Series bible (single-page HTML)** — title, logline, target audience, 4-episode arc, character bibles for protagonist + antagonist, world description, tone keywords. Self-contained, scroll-snap, brand-colored.
- **Protagonist character anchor** — LoRA reference or kontext-edit anchor that holds across every key frame. The single biggest pain point in AI-assisted series pitches, solved.
- **Antagonist character anchor** — same discipline applied to the rival or threat. The opposition has to feel like it lives in the same world as the hero.
- **10-12 pilot key frames** — the most important visual moments of episode 1, rendered cinematically. Cold open, inciting incident, midpoint reversal, climax setup, button. Each anchored to the protagonist, each at `quality_threshold: 0.85`.
- **Cross-asset drift critic** — `critique_shot` runs across the full set with `focus: "consistency"`. Surfaces face drift, palette drift, world drift before you ship the bible.
- **Cinematic key art** — the show's promotional shot at 1920×1080, premium quality, two retries. Goes on the bible cover.
- **Optional 30-second sizzle reel** — animated stills from the key frames, narrated, music-bedded. The 30 seconds that close the pitch meeting.
- **Project archive** — every URL persisted, every prompt saved, ready to extend to episodes 2-4 when the network asks for more.

**Time**: ~90 minutes wall clock. **Your attention**: about 18 minutes across 11 gates. **Cost**: $7.00–$12.00 end to end. *Premium tier — every key frame is anchored and critiqued.* The budget variant ($3-4) drops the sizzle reel and runs 6 key frames instead of 10-12 — useful for a writer's-room internal read, not a network meeting.

## Tell the agent about the series

```yaml
series_title:           # e.g. "Salt & Iron"
logline:                # 1 sentence — appears on bible cover, drives every prompt downstream
target_audience:        # e.g. adult animation YA · 18-34 prestige drama · Cartoon-Network Saturday-AM
protagonist_lora_id:    # OPTIONAL — if set, character anchor active. Leave blank for kontext-edit reference workflow
protagonist_brief:      # 3-5 visual identifiers — used to train LoRA if not set, or for reference prompts
antagonist_brief:       # 3-5 visual identifiers for the rival or threat
world_brief:            # 2-3 sentences about the world — geography, technology level, magic / tech rules
episode_titles:         # list of 4, e.g. ["Pilot", "The Salt March", "Iron in the Blood", "The Shrine Burns"]
palette_hex:            # 3-4 hex colors space-separated. Drives bible color theming + key-frame palette injection
tone:                   # warm · dark · comedic · dramatic · bittersweet — drives lighting + voice in narrations
sizzle_reel:            # true / false — adds ~$2 + 15 min for the 30s narrated reel
sizzle_narration:       # OPTIONAL — voiceover line for the sizzle reel. Blank uses logline as the script
voice_id:               # OPTIONAL — voice from your library, voice_attached to project for the sizzle + future cuts
series_slug:            # kebab-case, used in filenames, e.g. salt-and-iron
```

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

1. **CONFIRM (one message, ≤1 question):** restate in 1 line ("<series_title> bible: 2 character anchors + 10–12 key frames + key art [+ sizzle], ~$7–12, ~90 min") + real choices: premium 10–12 frames vs budget 6-frame writer's-room cut (~$3–4) · LoRA train (15 min, reusable forever) vs kontext-edit reference · sizzle reel on/off (OPTIONAL, +$2 +15 min). Ask only the miniseries-vs-continuing question; state the rest as assumptions and start.
2. **PREVIEW CHECKPOINT:** the Step-1 protagonist 4-view + Step-4 beat outline (~$0.50 total) are the cheap gates — the 10–12-frame batch (~$2.40) and the $1.50 key art NEVER fire before both are approved. 80% of bible quality is locked in those two gates.
3. **NARRATE:** 1 line + ETA per step ("LoRA training ~15 min, polling `get_lora_train` every 30s"; "key-frame batch ~12 min, ≤4–5 in flight, job …"); poll `get_create_media` every 10–15s; never silent >2 min.
4. **FAIL GRACEFULLY:** LoRA train failure → fall back to kontext-edit reference anchor (~90% vs ~95% hold — say so); image 422/timeout → soften prompt → nano-banana; sizzle seedance-i2v hang → retry once → `ltx-q-i2v` (resolution:"auto", `num_frames:241` for 10s) → Ken-Burns stills. ≤2 retries per asset; a bible with one drift-flagged frame beats no bible.
5. **DELIVER:** bible HTML + scorecard + one honest line ("face consistency 0.XX — the kontext-anchor ceiling is ~90%; the last 10% needs the LoRA") + ONE next step (extend to episode 2 at ~half cost, or send to the exec).

## Quality controls (new — auto-applied)

This playbook leverages the closed quality loop. The agent applies these by default; you don't have to ask:

- **Cost upfront.** Before any multi-step batch fires, the agent calls `submit_plan` with `confirm:false` and shows you the proposed steps + total cost. Nothing runs until you approve.
- **Auto-retry on weak shots.** The server default is `quality_threshold: 0.7`. **This playbook uses 0.85 routine, 0.9 on the key art** — every shot is brand-locked to the series anchors.
- **Critic verdict on the result.** The cross-asset critic fires twice — once after the 10-12 key-frame batch (catches face drift between scenes) and once across the full bible (catches palette / world coherence). Each verdict surfaces ship / iterate plus specific issues.
- **One-click recovery.** If a step fails, `get_plan` returns a `recovery` hint pointing at `replan({plan_id})` — the agent classifies the failure and proposes a recovery plan you can approve.
- **End-of-project scorecard.** The final wrap-up calls `get_scorecard({project_id})` with succeeded count, mean quality score, critic verdict, total cost, and wall time. The scorecard explicitly reports the cross-shot character consistency score, the metric network execs ask about first.

> **Why this playbook is premium-tier (not the default 0.7):** development executives are pattern-matchers. The moment they see a protagonist whose face shifts between Scene 3 and Scene 7, they stop reading. Premium thresholds + the cross-asset critic + character-anchored prompts catch that drift before the bible hits their desk.

## How this works

Eleven gates. The first three — character anchors for both protagonist and antagonist, plus the world style lock — are 80% of the bible's quality. Get them right and the 10-12 key frames are downstream of decisions you've already made. The expensive steps (key art with retries, optional sizzle reel) only fire after you've approved a world you believe in.

## The steps

### Step 0 — Confirm the brief

The agent reads back the BRIEF and asks two development-discipline questions:
- "Is this a closed-arc miniseries (4-episode resolution) or a season-1 pilot for a continuing show?" (drives episode-4 framing — finale vs. cliffhanger)
- "Network feedback hat: who's the comparable series this lives next to on the platform?" (drives tone + visual style calibration)

The answers tune every prompt downstream.

**STOP**: "Brief looks right? (approve / edit [field] [new value])"

### Step 1 — Protagonist anchor lock (~5 min if LoRA preset, ~15 min if training)

If `protagonist_lora_id` is set: `apply_lora({lora_id})`, confirm load, done.

If not: the agent prompts for 4-6 reference images of the protagonist and asks "Train a LoRA (15 min, persists across this and every future series asset) or kontext-edit reference (faster, less consistent across many shots)?" For a 10-12 key-frame bible, **train**. The LoRA pays for itself by frame 5.

Either way, the agent renders a 4-view anchor sheet of the protagonist at `quality_threshold: 0.85` to confirm the lock holds across angles.

> **For the agent**: if training, `submit_lora_train` with the reference set, poll `get_lora_train` every 30s, surface progress to the user. If reference-only, register the strongest reference as `character_anchor` keyed on a protagonist name derived from `protagonist_brief`.

**STOP**: "Protagonist 4-view anchor shown. Lock for the bible? (lock / refine [direction])"

### Step 2 — Antagonist anchor lock (~3 min, ~$0.40)

Same discipline, abbreviated. The agent generates 4 silhouette options for the antagonist derived from `antagonist_brief`, you pick the strongest, then a 4-view at `quality_threshold: 0.85`. Antagonists usually don't need a LoRA in a 10-12 frame bible — they appear in 3-4 frames max, and kontext-edit reference holds well enough for that count.

The antagonist palette can match or contrast the protagonist's; the agent asks. "Faction palettes" (matching) reads as "same world, different ideology"; "contrast palettes" reads as "the visual opposition is the conflict." Both legitimate, depends on tone.

**STOP**: "Antagonist anchor shown. Lock? (lock / refine [direction])"

### Step 3 — World + palette + tone style guide (~1 min, ~$0.05)

The agent writes a 1-page style guide derived from `world_brief` + `palette_hex` + `tone`: hero color, accent, neutral, disruption, plus 4-6 visual style keywords ("hand-painted cels, salt-flat blown-out highlights, rust accents, cinematic depth, 2.35:1 aspect intent"). No render yet. This becomes the prompt-prefix injected into every key frame.

If `palette_hex` was set, the agent honors it. Otherwise it derives from `tone` + `world_brief`.

**STOP**: "Style guide approved? (approve / shift [direction])"

### Step 4 — Episode 1 beat outline (~1 min, ~$0.05)

The agent writes a 10-12 beat outline for episode 1 (`episode_titles[0]`), structured as: cold open → inciting incident → escalation 1 → escalation 2 → midpoint reversal → consequences → climax setup → climax → resolution → button. Each beat is a single sentence describing what happens visually. This becomes the spec for the 10-12 key frames.

The agent writes from the logline + protagonist_brief + world_brief — no LLM "creative liberty." If the user wants to direct any beat, they can edit one at this gate.

**STOP**: "Episode 1 beat outline shown. Approve, or edit specific beat? (approve / edit [#] [direction])"

### Step 5 — Generate 10-12 pilot key frames (~12 min, ~$2.40)

The agent fans out the 10-12 beats as parallel `create_media` calls. Each prompt combines:
- The beat description from Step 4
- The style guide prefix from Step 3
- The protagonist anchor (LoRA or reference)
- The antagonist anchor where the beat calls for it (typically 3-4 frames)
- The palette colors named explicitly
- Cinematic framing keywords ("wide establishing", "medium two-shot", "extreme close-up" — calibrated to the beat function)

> **For the agent**: use `flux-dev` with LoRA if `protagonist_lora_id` set; `kontext-edit` otherwise with the anchor as `image_url`. Pass `quality_threshold: 0.85` on every frame. After all 10-12 land, call `critique_shot` with `focus: "consistency"` across the batch — surface the verdict before the user picks favorites, so face drift gets caught before bible assembly.

**STOP**: "10-12 key frames + consistency critic shown. Approve all, or redo specific? (approve / redo [#] [direction])"

### Step 6 — Cinematic key art (1920×1080, ~6 min, ~$1.50)

The bible's cover shot. 1920×1080 cinematic composition combining protagonist + the visual idea of the show in one frame. The agent uses `flux-dev` with the protagonist anchor as reference, framing derived from `logline`.

> **For the agent**: pass `quality_threshold: 0.9` AND `max_quality_retries: 2`. Use `quality_anchor_url` for character consistency. Surface the first attempt before any retry — the user can ship as-is if it's already strong.

**STOP**: "Key art shown. Approve, refine, or restart? (approve / refine [direction] / restart)"

### Step 7 — Character bibles (LLM-written) (~30s, ~$0.02)

Two ~300-word character bibles, one per anchor — written by the agent from the brief + the visual you just locked. Protagonist bible: name, role, archetype, traits, 2-paragraph backstory, what drives them, what they're afraid of, the wound they don't talk about. Antagonist bible: same structure, plus the moment when their and the protagonist's paths first crossed.

These are the bibles the writer's room actually wants — character through psychology, not character through plot.

**STOP**: "Bibles shown. Approve, or refine? (approve / refine [direction])"

### Step 8 — Cross-asset critic across the full bible (~30s, ~$0.05)

Before assembly, the agent runs `critique_shot` on the full set — protagonist anchor, antagonist anchor, 10-12 key frames, key art — with `focus: "world coherence"`. Surfaces verdict: SHIP / ITERATE plus specific drift (palette divergence, character drift, world inconsistency).

If ITERATE: the agent proposes a replan for the flagged shots. The user approves or skips.

**STOP**: "Cross-asset critic verdict shown. Proceed to bible assembly, or replan flagged shots? (proceed / replan)"

### Step 9 — Optional 30-second sizzle reel (~15 min, ~$2.00) — *only if `sizzle_reel: true`*

The agent picks the 6 strongest key frames from Step 5, animates each to 4-5s clips via `seedance-i2v` (`resolution:"auto"`), generates narration via `chatterbox-tts` using `voice_id` (or `gemini-tts` if no voice set), and generates a 30s instrumental score via `create_media action:"music"` with `lyrics_prompt:"[Instrumental]"`. Finishing pass: `ffmpeg-concat` the 6 clips → `ffmpeg-mux` the narration onto the cut → `ffmpeg-mux` the score under the **full** 30s with `audio_fill:"loop"` (score never cuts out) → `ffmpeg-export` at 16:9 1080p.

If `voice_id` is set, the agent also calls `voice_attach({project_id, voice_id})` so the same voice locks to the project for episodes 2-4 when you extend.

> **For the agent**: the `ffmpeg-*` finishing steps go through the direct-SDK fallback pattern. Surface a cost-preview via `submit_plan` before firing the export.

**STOP**: "Sizzle reel shown. Approve, or refine? (approve / refine [direction])"

### Step 10 — Series bible HTML assembly

The agent writes `public/launches/{series_slug}-bible.html` — a scroll-snap HTML page with these sections in order:

1. **Cover** — `series_title`, `logline`, key art full-bleed, `target_audience` footer
2. **The world** — `world_brief` + palette swatches + style keywords
3. **The protagonist** — 4-view anchor + character bible from Step 7
4. **The antagonist** — 4-view anchor + character bible from Step 7
5. **The 4-episode arc** — `episode_titles` with 2-3 sentence summaries per episode (the agent writes summaries 2-4 from logline + arc structure)
6. **Pilot key frames** — the 10-12 frames in beat order with their one-sentence beat descriptions as captions
7. **Sizzle reel** (if generated) — embedded video that plays on slide entry
8. **Tone references** — palette + style keywords, footer credits

Brand-colored from `palette_hex`. Self-contained — open in any browser, email-attach to a development executive, drop in a pitch packet.

### Final step — scorecard wrap-up

Call `get_scorecard({project_id: ...})` — paste output to your channel.

```
Scorecard for cjob_xxx
N/N bible assets shipped — critic: SHIP
Title: {series_title} bible
Steps: N/N succeeded (100%)
Quality: mean X.XX · M/N passed · K retries
Critic verdict: SHIP — character face consistency 0.XX, world coherence 0.XX
Cost: $X.XX actual (est $Y.YY) · Ts wall time
Viewer: <bible URL>
```

## When you're done

The agent prints:

```
✅ Series bible HTML: public/launches/{series_slug}-bible.html
✅ Key art (1920×1080): <URL>
✅ Protagonist 4-view anchor: <URL × 4>
✅ Antagonist 4-view anchor: <URL × 4>
✅ Pilot key frames: <URL × 10-12>
✅ Sizzle reel (30s) [if generated]: <URL>
✅ Character bibles (markdown): <URL × 2>
✅ Project viewer: <project URL>

Total spent: $X.XX
Total wall-clock: MM:SS
Critic verdict: SHIP — character face consistency 0.XX, world coherence 0.XX
```

## What to do next

The protagonist LoRA you locked in this playbook is the single most reusable asset you've ever produced. Every key frame for episodes 2-4 starts from it. Every promo cut for the season starts from it. Every "concept art for season 2" you generate downstream starts from it. The 15 minutes you spent training is amortized across a thousand future renders.

If the bible gets traction, run the playbook a second time on episode 2 with `episode_titles` shifted and a different beat outline. The protagonist anchor carries over. The world style guide carries over. Episode 2's bible costs $4 instead of $9 because the foundation already exists. Network executives notice the visual consistency across episodes — that's what "production-ready" looks like to them.

If you're shopping the bible to multiple networks, the HTML version emails cleanly and previews on every modern mail client. Some development executives will open it on their phone during a commute — the scroll-snap layout is responsive. Some will print it. Both work because the HTML embeds every image as a CDN URL with proper Open Graph tags.

If you're applying to fellowship programs (Sundance Episodic Lab, the Black List Episodic, Writers Lab) — the bible HTML + the sizzle reel is the package that gets past the first read. The bible proves you've thought through the world; the sizzle proves you can deliver it. Most applicants submit one or the other. You submit both.
