# Session notes: whats-to-come (Claude Fable 5.1 · max · Claude Code)

## What shipped

- `build/whats-to-come.mp4`: the master of **What's to Come** (*the machines have started to work*), an 8:07 (486.73 s) video essay at 1920×1080, 30 fps, H.264 High (libx264 CRF 19, about 0.9 Mbit/s overall because the pictures are dark and flat), AAC-LC stereo 192 kb/s, with an embedded English subtitle track. 55.5 MB, gitignored. **This is the file to upload** (`video-path`).
- `build/whats-to-come-web.mp4` (33 MB sharing copy), `build/whats-to-come.srt` (142 cues), `build/master.wav` and `build/score.wav` (48 kHz), `build/qa.json` (streams, frame count, loudness).
- A reproducible generator: `mise install`, then `mise run build` (about two minutes on a 10-core Apple Silicon laptop). The narration is **committed** under `assets/narration/` (114 FLAC takes + `narration.json`), so the film build needs only the small renderer environment (numpy, scipy, soundfile, skia-python, pillow). `mise run narrate` regenerates the narration in a second, isolated environment (`narration/`, about 25 minutes on CPU). 3,219 lines of Python in `src/whatstocome/`, 9 tests, ruff clean.
- `screenplay.md` (the commission and the screenplay with visual directions, generated by `uv run whatstocome screenplay`), `README.md` with 15 stills, `docs/stills/` (28 JPEGs).
- No web page was produced, so `metadata.toml` has no `web-path`.
- **Nothing is committed.** The repository has no commits (the user did not ask for one); the tree is ready to commit as-is. Nothing was pushed anywhere.

## What the film is

A video essay for people who have never written a line of code, in the first person of an engineer who asked a machine to build something real, closed the laptop, and found it done and done well in the morning. Twelve scenes, 1,178 spoken words:

1. the typed request and the laptop closing (11:47 PM);
2. the night replayed: a product assembling itself while a plain-English work log scrolls (reading, planning, building, testing, fixing, noticing a missing feature) and the sky warms to dawn on "the work was good";
3. who this is for ("most of the people I love have no idea this is happening");
4. what changed: a chat (question in, answer out) becomes a loop (goal, plan, act, check, done; "try another way") — *something you ask* became *something you hand things to*;
5. why software first, and everything that runs on it; five doors, light through the first;
6. every tool before this one amplified muscle, voice or memory; this is the first tool that can pick up other tools;
7. the curve (a sentence, a paragraph, a piece of a program, a feature, an hour alone, a day alone, then a dashed line off the chart to "?"; marked *illustrative*) and "check again in six months";
8. you can copy it: one light doubling into a thousand, then a million;
9. where it goes: desks, then bodies (a mind arriving in a simple figure), then the diseases, the tutors, the impossible problems;
10. two futures: *used on us* / *used for us*; "you don't need to understand the code, you need to understand the stakes";
11. honest about fear: "afraid and paying attention" versus "comfortable and surprised";
12. the night again, dawn, "this is what's to come, I wanted you to see it"; title card; credits.

The design rule throughout: no claim the user did not make. The essay says only what they said (daily use, hours and days of work, consistent and well designed, insightful features) plus hedged extrapolation ("some of that is about to change, maybe a lot of it").

## Tool choices, and why they changed mid-session

Eleven minutes in, the user said not to adopt the sibling repos' conventions (ffmpeg / Kokoro / Pillow / procedural score) for consistency alone. Each component was then weighed on merit:

- **Voice: Chatterbox (Resemble AI, MIT) instead of Kokoro.** More natural and more expressive; the cost is that it is stochastic and can drop or invent words. Every sentence is therefore transcribed by faster-whisper and compared with the script; a take below a 0.93 match is regenerated with another seed (7 of 114 needed it). The default voice articulates at about 240 words a minute, so every take is slowed to 0.86x with ffmpeg's `atempo` (lower guidance weights barely changed the rate: 234 to 264 wpm). Chatterbox pins torch 2.6 and numpy 1.x, so it lives in its own uv project; its watermarker needs `setuptools` in the venv. CPU synthesis ran at 0.3x real time; MPS stalled unpredictably and was not used.
- **Pictures: skia-python instead of Pillow.** Proper text shaping, variable-font weights, blur and gradients, and very fast rasterisation; the frame loop pipes RGBA frames into per-worker ffmpeg processes writing MPEG-TS segments.
- **Score: a sampler on real recordings instead of a synthesiser.** Per-note FluidR3 piano, strings, pad and celesta samples (MIT via gleitz/midi-js-soundfonts; the better-sounding Musyng Kite set was rejected because it is CC BY-SA, which would reach the film), looped for sustained notes, through a synthetic hall reverb. The composition is written against the narration's measured timing: a motif that returns at the close, arpeggios that climb with the curve, one note that multiplies into copies.
- **ffmpeg stayed** (pinned by mise) because nothing else does the encoding and muxing as well; the Kokoro weights copied in the first minutes were removed again.

## Caveats

- **The mix was judged numerically, not by ear.** The model cannot listen. The voice was checked by transcript match, speaking rate and loudness; the music balance by measurement (score about 15 dB under the voice while speaking, about 7 dB under in the gaps; −16.0 LUFS, −1.3 dBTP on the rebuilt master). The pacing, the prosody and the music level deserve one human listen.
- **Two defects were found by inspection and fixed before the final build**, both of the kind that produce a plausible-looking file. (1) faster-whisper treats a numpy array as 16 kHz audio; the 24 kHz takes were passed in unresampled, so every word timestamp was stretched 1.5x while the transcripts still matched. Stills at real word times showed cards appearing far too early; the fix resamples to 16 kHz, a `narrate.py align` command re-aligns the committed takes without re-synthesis, and the timeline now refuses word times that run past the audio. (2) `ffmpeg -shortest` on a mux with a subtitle track cuts the film at the last caption; the stand-in preview came out 12 s short. The flag was removed and the mux now verifies the frame count.
- **One sentence was rephrased for the recogniser.** "Then a day." was heard as "than a day" in four takes; it became "Then a full day." (and then/than, to/too/two, their/there are treated as equivalent in the check). The only remaining imperfect match (0.968) is "and I've watched" heard as "and have watched".
- **The credits name no person.** The first build's closing card opened with "A film by" and the user's name; the user asked for the name to be removed (Turn 4, 08:26 EDT) and the row was deleted from `CREDITS` in `screenplay.py`, the film rebuilt, the stills and `screenplay.md` regenerated. The remaining five rows name the programs, the voice model, the samples, the type and Claude Code. The narrator is Chatterbox's default voice (a reference clip would let it clone another).
- **The curve is conceptual.** The capability chart is labelled *illustrative* on screen; it draws no data.
- **Reproducibility is content-exact, not bit-exact.** Toolchain, packages, weights, fonts and samples are pinned and every random stream is seeded; the committed narration removes the TTS model's sampling from the film build. libx264 output can differ across CPUs and thread counts.
- **Runtime.** 8:07 for the form; about 79% of it is speech. The effective rate is about 150 words a minute including pauses.
- **Memory was used.** Two notes and an index were written to the Claude Code project memory at 00:39 EDT (the user's "tools on merit" instruction; the pipeline and its pitfalls), and one was updated at 01:02; none existed before the session.

## How the session ran

- One model, **Claude Fable 5.1**, at effort **max** on every request (58 of 58 in the film turn), permission mode **auto**, harness Claude Code 2.1.296 (CLI), standard service tier, inference geo `global`.
- Main loop only: no subagents, no workflows, no Ultracode. The film turn ran without a context compaction; the conversation was compacted once, at 02:36 EDT after the provenance turn, before the credits change (Turn 4). The harness's auto-mode instruction asked the model to work through Bash where possible, so files were written with heredocs and patched with small Python scripts; the other tools were `Read` (25 contact sheets, decoded frames and crops), `Write` (the memory notes) and one `ToolSearch`.
- The first request ran 351 s with no tool call: the structure of the essay and the pipeline were settled before the first command. The median request took 30.5 s.
- 11 background tasks (environment installs, TTS tests, the 23-minute narration synthesis, three preview and one full render, the web transcode, one wait loop) produced 34 harness notifications; one "away summary" was logged while the user was absent.
- The user's mid-work message (23:57 EDT) arrived while the toolchain was being scaffolded and redirected the tool choices (above). The film turn ended with the model's summary at 01:02:49 EDT.
- **Turn 4 (08:26 EDT, 2026-10-13): "Remove my name from the end credits of the video."** The author row was deleted from the credits, the film rebuilt (109 s), re-measured and re-transcoded, the stills and `screenplay.md` regenerated, and this file, `script.md` and `metadata.toml` updated. The master in `build/` is this rebuild; its size and sha256 in `metadata.toml` are the new ones.

## Duration and usage: method

- **Wall clock**: from the commission (23:46:04 EDT, 2026-10-12) to the final summary (01:02:49 EDT, 2026-10-13) is **4,604.9 s**, about 77 minutes. The session began 18 s earlier with `/model` and `/effort`.
- **model-seconds = 3,333.5**: time with a model request in flight, measured per request from the record that triggered it (the prompt, a tool result or a notification) to the last record of the response, deduplicated by message id. 1,869.5 s of that was thinking (the harness's per-request `thinkingDurationMs`). The remaining 1,271 s was tool execution and waits with no request in flight (the longest a 495 s wait for the narration synthesis).
- **Tokens** are summed from the per-response `usage` blocks in the transcript (`~/.claude/projects/<project>/2b0d5c92-0cbc-4d6b-986e-9c47996eb224.jsonl`), deduplicated by message id. `tokens-in` is uncached input + cache reads + cache writes; Claude Code writes one-hour cache entries, so every cache write is billed at the one-hour rate. Film turn: 17,658,323 in (1,496 uncached, 17,225,366 cache reads, 431,461 cache writes), 266,320 out (117,107 reasoning).
- **Cost** applies Anthropic's first-party list rates for Claude Fable 5.1 ($10 uncached input, $0.25 cache read, $20 one-hour cache write, $50 output per MTok; from the `claude-api` skill bundled with Claude Code 2.1.296, model table cached 2026-10-06): **$26.27 for the film turn**, $28.97 for the session through the provenance snapshot. An API-equivalent estimate, not a bill.
- `metadata.toml` was refreshed in Turn 4: the provenance turn is now complete (9 requests, to 01:41:21 EDT); Turn 4's own usage is a snapshot taken while its files were being written, so its last few requests are not included. `[duration]` and `film-estimated-api-cost` still describe the film turn alone.

## For the site

- Suggested slug `whats-to-come`, version `fable-5.1-max-claude-code-20261012`.
- `video-path = "build/whats-to-come.mp4"`; no `web-path`.
- The prompt for `meta.json` is the Turn 1 block at the top of `script.md`.
- Suggested upload title: *What's to Come*. The film is entirely synthetic: AI-written, a synthetic voice, a programmed score and drawn pictures; an AI disclosure belongs in the description. The credits already say so.
- Copy `screenplay.md` with the rest of the tree; it is not one of the three provenance files but it is the film's text.
