# Session notes — 2040-agi

Claude Opus 5 · max effort · Claude Code · 2026-09-08/09

Caveats and things a reader of this artifact should know.

---

## The fiction seam is deliberate, and it is stated on screen

Everything through 2026 in this film is real history and real science. Every
person, lab, paper, date and event after 2026 is invented. That line is held
consistently and is declared three times: on screen for the first 11 seconds,
at the top of the transcript, and in `README.md`, which carries a table mapping
each beat to the actual research it extrapolates from — the 2024 *Nature*
loss-of-plasticity result, complementary learning systems, Landauer's limit,
equilibrium propagation, Pearl's ladder, the reafference principle, sparse
dictionary learning, Nisbett & Wilson 1977, cumulative cultural evolution.

**No line is attributed to a real person.** All nine interviewees are
characters. Real researchers' *ideas* are named where they are load-bearing
(Hopfield, Pearl, Moravec, von Holst & Mittelstaedt, Nisbett & Wilson), but no
real person speaks, and no real person is quoted or paraphrased as having said
anything they did not say.

## Token and cost figures are estimates

The harness surfaced no per-request token accounting, so `[usage]` in
`metadata.toml` is **estimated, not metered**. Method:

- **Output ≈ 380 k.** Built up from the work product: ~6,500 lines of Python
  emitted across all drafts and patches (the final tree is 4,380), the README,
  commit messages, verification scripts, and visible prose — roughly 150 k —
  plus adaptive thinking at max effort across ~80 substantive turns, which is
  the larger half.
- **Input ≈ 20 M.** ~110 API requests over a context growing from ~15 k to
  ~380 k tokens, so ~180 k average. Ten images (contact sheets and extracted
  frames) are included in that.
- **Cost ≈ $24.45.** Assumes ~95 % of input served from cache: 19.1 M cache
  reads at $0.50, ~0.9 M cache writes/uncached at ~$6.00, 0.38 M output at
  $25.00.

Treat these as order-of-magnitude. The rate table itself is not estimated — it
was read from the `claude-api` skill during the provenance pass rather than
recalled.

## Duration excludes a 7.5-hour idle gap

Two active spans, and `metadata.toml` reports their sum, not the span between
them:

| Span | Wall clock | Seconds |
|---|---|---|
| Build | 2026-09-08 23:21:53 → 2026-09-09 01:13:29 | 6,696 |
| *(idle — no session activity)* | 01:13 → 08:40 | *excluded* |
| Provenance pass (this file) | 2026-09-09 ~08:40 → ~08:55 | ~900 |

`model-seconds` (4,700) is that total minus time spent waiting on background
compute with nothing else in flight. Measured waits: TTS 296 s, three audio
builds 414 s, video previews and the bitrate sweep 245 s, the aborted render
~600 s, the final render 1,970 s, decode verification 120 s. About 900 s of
that was overlapped with real work — `visuals.py` was written during the TTS
pass, and the README and the continuity audit happened during renders.

## The nine-line continuity regression

Worth recording because it is the one place the process failed and nearly
shipped.

Mid-build, an automated pass cut 20 lines flagged as restating their
neighbours. It measured length, not sense, and six of those cuts left dangling
references — `"And that is not how it works"` with no naive picture to
contradict, `"And we got that"` with no antecedent, `"It's called motor
babbling"` with no baby in a crib.

This was caught by reading the generated transcript around every cut site, not
by any check in the pipeline. The first full render was already ~10 minutes in
and was killed. Nine lines were restored and each passage re-verified.

**The shipped film is clean.** But the lesson is that an automated edit on
prose needs a human-legible diff review, and the transcript export — added
afterwards, partly for this reason — is what made the review possible.

## Bugs found and fixed during the build

| Symptom | Cause |
|---|---|
| SFX smoke test hung | `ratchet_click`'s click interval shrank geometrically; the sum converged below the loop bound. Infinite loop. |
| Tape hiss under 4 minutes of dialogue | Cues run until the next cue starts; `archive_bed` had no return-to-bed cue after the news montages. |
| Four scenes upside down | The coordinate mesh runs top-down (y = −1 at the top); the ground-plane scenes assumed bottom-up. |
| Scenes invisible in the lower frame | The caption scrim was darkening the bottom 40 % by up to 72 %, crushing anything drawn there. |
| Mix would have taken minutes | Two envelope followers were per-sample Python loops over 144 M samples. Replaced with `maximum_filter1d` + one-pole release. |
| 34.7 Mbps encode | Full-resolution per-frame grain is incompressible. Half-resolution grain at amplitude 2.2 fixed it at ~4 Mbps. |
| Narration fighting the music | Beds sat ~8 dB under speech. Ducking deepened to ~13 dB under, swelling to −5 dB in the gaps. |

## Things that are true about the build

- **Nothing is sampled.** No stock audio, no stock footage, no hand-drawn
  frames. Every waveform and every pixel is computed.
- **Deterministic.** All RNG is seeded and every visual scene is a pure
  function of time — which is both why nine workers can render frames out of
  order and why a rebuild is byte-comparable.
- **The TTS cache is content-hashed**, so editing one line of the script
  re-synthesises one line, not 541.
- **`out/*.mp4` is gitignored.** A 311 MB preview binary was committed by
  mistake early on; it was removed and the object store garbage-collected back
  to 196 KB. Only text and the 143 KB poster are in the repo.

## Portability caveats

- **Fonts are macOS system faces** — DIN Condensed, Avenir Next, Menlo,
  Baskerville. On another platform, substitute in `FACES` in `src/agi2040/typo.py`.
  Nothing else in the build is macOS-specific.
- **Kokoro-82M** (Apache-2.0) downloads ~330 MB from Hugging Face on first run.
  Everything after that is offline.
- `build/` holds ~2 GB of intermediates when hot (848 MB WAV, 895 MB TTS cache,
  1.1 GB cue cache). The cue cache and frame segments were deleted after the
  final render; the TTS cache was kept because it saves five minutes on rebuild.

## Process notes

- **No subagents, no memory, no web search.** Single agent, single session,
  entirely from the model's own knowledge plus the `claude-api` skill (loaded
  only during the provenance pass, for pricing).
- **Safeguards were neither downgraded nor restored.** Nothing in this
  commission approached a boundary.
- Effort stayed at `max` throughout; the model was `Opus 5 (1M context)`, set
  before the first prompt.
- Two dependency choices are worth flagging as judgement calls: Kokoro over the
  built-in macOS `say` voices (quality — `say` would have sounded robotic across
  50 minutes), and pure numpy/PIL over any creative-coding framework (control,
  and no per-frame GPU dependency).

## What the commission did not produce

No web page. `video-path` is set in `metadata.toml`; `web-path` is deliberately
absent. The deliverables are the film, its transcript, and a poster frame.
