# Session notes: navier-stokes (Claude Fable 5.1, then Claude Opus 5.5 · max · Claude Code)

## What shipped

- `build/out/not-a-theorem-yet.mp4`: the master of **Not a Theorem (Yet)**, a vertical YouTube Short. It runs 1:52 (112.133 s) at 1080×1920 and 30 fps, encoded H.264 CRF 18 with AAC 192 kb/s. It is 373 MB and gitignored; this is the file to upload.
- `build/out/not-a-theorem-yet.srt` (subtitles, the narration with numerals) and `build/out/cover.png` (the first frame).
- `film/youtube.md`: the upload title, a sourced description with an AI disclosure, and tags.
- A reproducible renderer: `mise install`, `mise run setup`, `mise run assets`, then `mise run build` regenerates the film in about 2.6 minutes on a 10-core laptop with warm caches. It has 9,411 lines of Python and 32 tests, and `mise run qa` measures the result.
- The writers' room, design, screening and fix records are in `docs/`. The orchestration scripts are in `docs/workflows/`.
- No web page was produced, so `metadata.toml` has no `web-path`.

## Two models, one session

- The commission ran on **Claude Fable 5.1** at effort **max**, with Ultracode on. Ultracode makes multi-agent workflows the default.
- About 16 hours in, the 13 scene-builder subagents failed together on the Fable 5.1 usage limit ("You've reached your Fable limit"). The session waited.
- The user then wrote "Please continue with opus 5.5." and switched the model with `/model`. **Claude Opus 5.5** finished the film, also at effort max: production, screening, fixes and the final build.
- By request count: the main loop made 81 Fable 5.1 and 180 Opus 5.5 requests. Subagents made 308 Fable 5.1 and 5,291 Opus 5.5 requests. Most of the visual work, all of the screening and the fixes ran on Opus 5.5.
- The directory and version are named for the commissioned model (`fable-5.1`). A site that labels this version should say both models did the work.
- The provenance turn (these three files) ran on Opus 5.5 at effort **xhigh**, with Ultracode off, after the user's second `/effort`.

## How the work was organised

The film was made by five multi-agent workflows plus the main loop, which acted as producer: it built the engine, made shared fixes, and decided what each review meant.

| Workflow | Agents | What it did |
|---|---|---|
| Writers' room | 18 | Six specialists (PDE mathematician, fluid physicist, philosopher of science, journalist and fact-checker, historian of machine proof, Shorts producer); a moderated roundtable; three competing scripts; three judges; a merge; three sceptics who tried to refute every claim against primary sources; a final editor |
| Visual production | 97 over 2 runs | Two art directors and a synthesis into `docs/visual_design.md`; one builder per scene; three reviewers per scene (polish, scientific honesty, sync); a polisher and a verifier per scene |
| Screening | 7 | Six seats watched the encoded film (first viewer, continuity, captions, facts, accessibility, audio); an editor ranked 18 fixes |
| Fixes | 16 | One fixer and one independent verifier per affected scene |
| Final check | 5 | Never ran: all four seats hit the weekly usage limit (see below) |

Subagent transcripts total 166, including restarted and failed agents. At most 8 subagents ran at once.

## Duration

- Wall clock from the commission (2026-10-08 23:40:23 EDT) to the film handoff (2026-10-10 10:01:24 EDT) was **123,661 s**, about 34.4 hours.
- Most of that wall clock was waiting. The harness logged five usage-limit pauses totalling **53,492 s**. A further **13,064 s** passed between the Fable 5.1 limit and the user's model switch. Workflows ran in the background between main-loop turns.
- **model-seconds = 5,426.8**: main-loop time with a model request in flight, measured per request. A request runs from the record that triggered it (a prompt, notification or tool result) to the last record of the response, deduplicated by message id.
- **subagent-model-seconds = 125,628**: the same measure summed over every subagent. Subagents ran concurrently, so this is agent-time, not wall time.
- **active-turn-seconds = 6,765.9**: the harness's own `turn_duration` records for the 42 main-loop turns. Two further records span whole workflow lifetimes (56,757 s and 45,105 s) because the harness closes a turn only when its workflows finish. They are excluded so nothing is counted twice.
- The provenance turn started 2026-10-11 18:37:24 EDT. It is not in the film totals, and its usage is recorded only up to the snapshot time in `metadata.toml`.

## Token and cost figures

- **Measured, not estimated.** Counts come from every response's usage block in the main transcript and all 166 subagent transcripts, deduplicated by message id. They include the agents that failed or were restarted.
- Totals through the snapshot: 947.3M input tokens, 96% of them cache reads, and 2.58M output tokens, 1.30M of which were thinking. That is 5,860 requests.
- Rates are Anthropic first-party list prices from the claude-api skill bundled with Claude Code 2.1.295 (model table cached 2026-10-06), in $/MTok:

  | Model | Input | Cache read | Cache write 5 min | Cache write 1 h | Output |
  |---|---|---|---|---|---|
  | Claude Fable 5.1 | 10.00 | 0.25 | 12.50 | 20.00 | 50.00 |
  | Claude Opus 5.5 | 4.00 | 0.20 | 5.00 | 8.00 | 20.00 |

  The main loop writes 1-hour cache entries and the subagents write 5-minute entries; each is priced at its own rate.
- **About $537.53 API-equivalent** for the whole session through the snapshot: Fable 5.1 about $175 and Opus 5.5 about $362. The film alone, before the provenance turn, is about **$528.26**.
- About 82% of the cost is subagents. The single largest item is the visual production workflow, at about $264.
- This is a list-price equivalent, not what the user's plan was billed. Plan limits, rather than dollars, were what actually constrained the session.

## Validation and its limits

- The model never watched the film play or listened to it. Pictures were checked through contact sheets and full-resolution frames decoded from the MP4. The model viewed 24 images in the main loop; subagents viewed thousands of frames.
- Sound was checked by measurement: EBU R128 loudness, true peak, voice-to-music balance through a 250 Hz high-pass (a phone-speaker proxy), hit levels at each cut, and silence windows. Nobody listened.
- `nsfilm qa` passes all nine checks on the master:
  - **Format:** 1080×1920 at 30 fps, H.264 yuv420p with BT.709 tags, AAC 48 kHz stereo, under 3 minutes.
  - **Sound:** −13.9 LUFS integrated, true peak −1.7 dBTP.
  - **Picture:** no flashing; hard cuts at 2.033 s, 53.1 s and 106.133 s, each with its sound hit.
- Every scene passed an independent verifier after its fixes, and every screening fix was spot-checked by hand in frames from the final file.
- **The final confirmation screening did not run.** All four seats hit the account's weekly usage limit, which resets 2026-10-14 at 9 pm Eastern. The decision step also had a schema bug (a duplicated required field), which is now fixed. To run it after the reset, use `docs/workflows/05_final_check.js`.

## Incidents during the session

1. **Silent workflow stall.** The writers' room stopped making progress during the first usage-limit pause but stayed "running". The main loop found its transcripts idle, stopped it, and resumed it from its journal; the six panellists and the roundtable replayed from cache. A stall watch (Monitor) was kept on every later workflow.
2. **Fable 5.1 limit mid-production.** Art direction finished, then all 13 scene builders failed at once. The model fixed shared engine pieces before relaunching on Opus 5.5:
   - a fault-isolating scene registry;
   - previews that tolerate unfinished neighbouring scenes;
   - hard cuts as an engine feature;
   - text anchors that refer to the text block, not the padded image;
   - a shared motif module so three scenes draw the same card to the pixel.

   The production workflow then resumed with art direction replayed from cache.
3. **Bugs reported by the scene builders**, fixed in shared code:
   - a scene boundary at 54.900000000000006 s put the turn's hard cut one frame after its sound hit;
   - Python's half-to-even `round()` made a pulsing mark jitter by one pixel;
   - a door-card stamp at 32 px touched its cell rules, so it was set at 28 px.
4. **Pronunciation.** Kokoro said "NAY-vee-er Stokes". A phoneme lexicon makes it "nav-YAY" and fixes "nanometres". Kokoro's phoneme path is bit-identical to its text path, so no other line changed.
5. **Screening findings that needed engine work:**
   - captions ran ahead of the voice; they are now phrase-level, cued on pauses measured in the narration audio;
   - the hits and most of the score were sub-bass a phone cannot play; the hits now have their own bus after the duck, a mid-band transient, and a rebalanced bed;
   - ffmpeg's loudness normalisation was falling back to dynamic mode; a true-peak limiter now keeps the final gain linear.
6. **A fix that regressed.** Brighter molecules (screening fix 12) summed to pure white where they overlapped; a soft ceiling fixed it.
7. **Shared scratchpad collisions.** Parallel agents overwrote each other's generic helper scripts in the session scratchpad. They moved to private folders; no project files were affected.

## Facts, dating and disclosure

- The 2026 claims were fact-checked against primary sources: the Clay statement and problem page, OpenAI's announcement and manuscript, the Buckmaster–Alpöge statement, Tao's posts, arXiv 2610.08144, NPR and others. They are graded in `docs/sources.md`. The status was re-verified on 2026-10-10.
- The closing card reads "as of 10 Oct 2026: claimed, not yet confirmed". **Re-check and re-date it on the day the film is published** (`film/script.json` → `closing_card.subtitle`).
- One mathematician in the story, Levent Alpöge, works at Anthropic, and the film was made with Claude. So the closing card says "Made with Claude (Anthropic)" and the YouTube description carries a disclosure. The film takes no side in the credit dispute.

## Other notes

- **Memory:** the session wrote three memory notes: the project, workflow stalls, and parallel-agent scratchpad collisions. None existed before, so nothing was recalled from earlier sessions.
- **Privacy:** `script.md` quotes the user's turns verbatim except one absolute home path in the provenance request, shortened to `~`.
- **Lock files:** `uv.lock` is in the source repo for reproducibility; per the site's conventions it is not shipped in `files/`.
- **Grain:** the master is large (26 Mbit/s) mostly because of per-frame film grain. YouTube re-encodes it, so it was left in.
