---
name: camera-test
description: Enforce the Camera Test across episode scripts — every action paragraph must describe exactly ONE camera shot. Splits multi-shot paragraphs, flags outliers.
allowed-tools: Read, Write, Glob, Bash
argument-hint: "[project] ep [N|N-M] [--review]"
---

# /camera-test — One Paragraph Per Camera Shot

Enforce the Camera Test across episode scripts: every action paragraph must describe exactly ONE camera shot. If the camera setup changes (different subject, scale, or area), start a new paragraph.

## Usage

```
/camera-test [project] ep [N]           # Single episode
/camera-test [project] ep [N-M]         # Episode range
/camera-test [project]                  # All episodes
/camera-test [project] --review         # Flag high-ratio episodes for manual review
```

**Examples:**
```
/camera-test leviathan ep 1             # Camera Test episode 1
/camera-test leviathan ep 1-10          # Episodes 1-10
/camera-test leviathan --review         # Audit all, flag outliers
```

## What It Does

Reads each episode's action paragraphs and enforces: **one paragraph = one camera shot**.

### SPLIT when:
- **Subject changes** — camera moves from one character to another (she → he, Jinx → Varek)
- **Scale changes** — shot size shifts (wide establishing → CU detail, MS → ECU)
- **Area changes** — camera points at different part of the space (door → ceiling, terminal → corridor)

### KEEP TOGETHER when:
- **Verbless fragments** continuing the same shot — "Massive. Still." / "Chrome and polymer. Built to settle accounts."
- **Rhythmic beats** describing one held camera — "The polish gone. The certainty gone."
- **Continued description** of same subject at same scale — sensory details, emotional coloring
- **POV/HUD shots** — overlaid data on same visual
- **Single continuous action** — "She stands. Turns slowly."

### SUSPENSE FRAGMENTATION (the hard part)

In high-tension moments (standoffs, reveals, life-or-death beats, cliffhangers), fragmentation into separate shots IS legitimate:

- **Leone punch-ins**: CU gun → CU eyes → ECU trigger finger. Each IS a separate camera setup.
- **Emotional discovery builds**: "Jinx stops." (MS halt) → "Her jaw works." (CU face) — the cuts are doing emotional work.
- **Series finale single-word beats**: "Present." / "Worth." / "Finally." — when each word carries different thematic weight.

**BUT** — suspense fragmentation needs pattern interrupts. If 4+ consecutive paragraphs are all single-sentence staccato fragments, insert a held-shot paragraph (longer, flowing) to break the rhythm. Uniform fragmentation becomes robotic.

**The test:** Would an editor actually CUT here? If the camera would hold and observe a continuous action, keep it as one paragraph. If the editor would punch in, dolly, or cut to a new setup, split.

### When Suspense Fragmentation is Appropriate

| Beat | Fragmentation Level |
|------|-------------------|
| THE HOOK | Usually 1-3 shots max. Striking single image or quick setup. |
| THE SETUP | Establishing — longer paragraphs, less fragmentation |
| THE ESCALATION | Building — moderate fragmentation, following the tension curve |
| THE TURN | Peak — maximum fragmentation allowed (with pattern interrupts) |
| THE CLIFFHANGER | Final image — 2-5 shots, each carrying weight |

### When NOT to Fragment

- Establishing/transitional moments (walking, arriving, surveying)
- Environmental description (the room, the corridor, the landscape)
- Detail inventory (props, set dressing, wardrobe)
- Distance/time progression ("Twenty feet. Thirty." = one tracking shot)

## Rules (ABSOLUTE)

1. **Only add blank lines** between sentences. NEVER change, add, or remove words.
2. **Preserve all metadata** — headers, word counts, Kill Box timestamps, footer annotations.
3. **Preserve all dialogue** — character cues, lines, parentheticals untouched.
4. **Preserve scene headings** — INT./EXT. lines untouched.
5. **When in doubt, keep together.** Conservative splitting > over-splitting.

## Parameters

| Parameter | Required | Default | Description |
|-----------|----------|---------|-------------|
| `project` | Yes | — | Project folder name |
| `ep N` or `ep N-M` | No | All | Episode range |
| `--review` | No | — | Audit mode: count before/after, flag high-ratio outliers |

## Execution

When this skill is invoked:

1. **Read each episode** in the specified range
2. **First pass — identify multi-shot paragraphs:**
   - For each action paragraph, check if it contains subject/scale/area changes
   - Mark split points (blank line insertion locations)
3. **Second pass — check for over-splitting:**
   - If the result would have 4+ consecutive single-sentence paragraphs, reconsider
   - Check if verbless fragments were incorrectly separated
   - Check if rhythmic beats were broken
4. **Write the corrected file** (only if changes were made)
5. **Validate** with `episode_metrics.py` — word count must not change
6. **Report** — before/after paragraph counts, changes made

### Review Mode (--review)

1. Count action paragraphs in each episode
2. Flag episodes over 40 action paragraphs for manual review
3. Report series statistics (average, min, max, outliers)
4. Do NOT modify any files

## Output

Modified episode files in place. No separate output file.

## Downstream Impact

The Camera Test makes scripts readable as shot lists:
- **Storyboard agent** can map paragraphs to shots 1:1
- **Shot counting** becomes mechanical (count action paragraphs)
- **Previz** knows exactly how many frames to generate
- **Editing rhythm** is visible in the paragraph structure

## History

- **Feb 2026:** First applied to Leviathan (60 episodes) via parallel sub-agents
- Manual outlier review required for 9 episodes with over-aggressive splitting
- Key insight: suspense fragmentation is legitimate but needs pattern interrupts
- Key insight: the WRITER should produce the rhythm; Camera Test only enforces it

## Related

- **Format rules:** `/skills/format_v12/SKILL.md`
- **Storyboard agent:** `/agents/storyboard_agent.md` (consumes Camera Test output)
- **Episode metrics:** `/tools/episode_metrics.py` (validation after Camera Test)
