# Session Notes

Conditions that shaped the output of this session, recorded for reproducibility.

## Model, effort, harness

| | |
|---|---|
| Model | Claude Opus 5 (`claude-opus-5`; the harness labelled it "Opus 5 (1M context)") |
| Effort | `max` — set by `/effort` before the commission, never changed |
| Harness | Claude Code (CLI) 2.1.260, **auto mode** |
| Thinking | Adaptive, on throughout. Raw chain of thought never surfaced. |
| Model changes mid-session | **None.** |
| Refusals / safety interventions | **None.** |
| Plan mode | Not used. |
| Subagents | **None spawned.** The system prompt instructed against it and it was not overridden. |
| Persistent memory | Not read, not written. |
| Web searches | **None.** The one external fact the film asserts — the model it implements and its citation — was already known and is credited on screen. |

Auto mode asks for file work through the shell, so every source file in this
repository was written with heredocs and patch scripts rather than the `Write`
and `Edit` tools. That is why the transcript shows 170 `Bash` calls and no
edit-tool calls at all.

## The largest caveat: the film was never watched

**I cannot see video play or hear audio.** Everything in this repository was
verified by proxy:

- **Picture** — 34 rendered images read back and looked at over the session:
  parameter sweeps, composition and typography tests, and eight frames pulled
  from the finished file at 8 s, 40 s, 54 s, 63 s, 90 s, 120 s, 140 s and 157 s.
- **Motion** — never observed. It was *designed* (physically exact sub-tick
  interpolation, full-shutter motion blur accumulated from every simulation step
  inside a frame) and reasoned about, but no one has confirmed that the finished
  film moves the way it should.
- **Sound** — never heard. Verified numerically instead: integrated loudness
  (−14.0 LUFS), loudness range (16.3 LU), per-segment RMS at eight points to
  confirm the crescendo (−32.0 dB at 5 s rising to −11.0 dB at 140 s), and
  spectral centroid over time to confirm the chord descends as designed
  (4,905 Hz at 5 s → 664 Hz at 150 s, with low-band energy rising from 0.1% to
  42% as the fundamental arrives).

A person should watch it before it is published. The most likely failure modes
that this verification cannot rule out are temporal — strobing in the fast final
act, a camera move that reads as a stutter, or a score that measures correctly
and still does not work as music.

## A known blemish, left in deliberately

The cell the camera follows comes apart at **t = 53.9 s** (measured, not
assumed). The line that names it, *"And then there were two."*, lands at
**t = 63 s** — about nine seconds later, on an image of two unmistakably
separate daughters rather than on the moment of parting. Closing that gap would
have required a fourth full 95-minute re-render for a five-second refinement,
and the sequence is coherent as scheduled. It is a compromise, not an oversight.

## The failure that cost the most time

**The division detector never once fired**, across three separate render
launches, and each time it fell back silently to a guess.

It looked for the tracked cell's own particles landing in two separate connected
regions of the density field. But the morphological closing that makes a
ring-shaped membrane read as *one* body — necessary, or every cell fragments
into arcs — also welds two freshly divided daughters into one component. Real
cells stay in contact for hundreds of ticks after they divide. The condition was
therefore unreachable, and nothing in the output said so: the picture still
looked plausible, and the fallback still put the camera on a real cell.

The replacement measures geometry directly: the cohort is split in two, and a
division is declared only when the halves are far enough apart, each holds more
than a quarter of the cell, **and the space between them has emptied out**. The
third condition is the one that does the work — separation alone scores a merely
stretched cell (16.2 units) as highly as two daughters still touching (16.5),
and only the density valley tells them apart (0.01 vs 0.74). It was validated
against synthetic discs, rings, peanuts and uneven splits before being trusted.

## The storyboard was fighting the data

With a working detector, divisions turned out to cluster at ticks **320–500** and
again at **1900–2500**. The film's division beat had been written at tick 840 —
squarely in the gap. The clock was retimed so the film's slowest minute covers
the ticks where cells actually condense and first divide, and the one line that
names an event now follows the measurement. This is the reason the final render
was launched five times and killed four.

## What "deterministic" does and does not mean here

`metadata.toml` claims the simulation replays bit for bit, and the two-pass
camera depends on it. The basis is narrow and worth stating: the neighbour
counts `N`, `L` and `R` are **integers**, so their summation is exact and
independent of the order the GPU happens to accumulate them in. Every other
operation in the step is elementwise. Had those counts been floating-point sums,
GPU reduction order would have made them non-reproducible, chaos would have
amplified the difference, and pass two would have photographed a different world
than pass one scouted. The test suite asserts the property directly.

## Density was chosen empirically, and the first choice was wrong

The first long experiments ran at 0.09 particles per square unit, which produces
a gorgeous percolated tissue — and no discrete cells. The line *"An inside. An
outside."* landed on a formless mass. Sweeping 0.05 / 0.06 / 0.08 / 0.09 / 0.12
found **0.06**, which gives compact cells with visible ring membranes and warm
nuclei *and* the strongest coarsening of the set. The film's central claim
depends on that second property, so this was not a matter of taste.

## Two smaller things that went wrong

- **A cleanup silently did nothing.** `rm -f a b out/tc_*.mp4` in zsh aborts the
  entire command line when the glob matches nothing, so a 1.22 GB intermediate
  survived a deletion I had reported as done. Caught two turns later, and the
  file has been removed.
- **Two counts were written from memory into `metadata.toml`** — render launches
  and frames inspected — and were wrong. Both were recounted from the transcript
  and corrected in place (5 launches, not 4; 34 images, not 14).

## Conditions affecting the timings

The machine was shared. An unrelated concurrent Claude session was rendering its
own particle simulation on the same GPU for part of this one, which is why the
final render took 92.5 minutes rather than the ~70 the first frames projected.
The `[duration]` figures in `metadata.toml` are therefore honest about this
machine on this night, not a clean benchmark.

The session also has a gap of just over seven hours where the user was away,
between writing `metadata.toml` and this file. It is excluded from the duration
totals and recorded exactly, as `user-away-seconds-excluded`; counting it would
report a number that means nothing.

Most of the wall clock is neither model time nor tool time: the renders ran as
**background** tasks, so waiting on them is recorded separately as
`background-wait-seconds` (7,148 s), larger than model and tool time combined.

## Reproducibility

| | |
|---|---|
| Hardware | Apple M5, 10 cores, 16 GB unified memory |
| OS | macOS 26.6.2 |
| Python | 3.12.13, pinned by `mise.toml`, venv by `uv` |
| Key packages | torch 2.14.0 (Metal/MPS backend), numpy 2.5.3, scipy 1.18.1, pillow 12.3.0 |
| Encoder | ffmpeg 8.1.2, libx264 |
| Seed | `20161114` — the publication date of the paper the law comes from |
| Command | `uv run emergence film -q final -o film.mp4` |

The lock file is present in the working tree but is excluded from the published
artifact, per the site's conventions.

## State at the end of the session

**Nothing was committed.** The working tree holds the source, the tests, the
README, six reference stills, the finished `film.mp4` (243 MB) and
`film.score.wav`. Note that `film.mp4` is deliberately *not* gitignored — the
deliverable should be the user's call to commit or not, but 243 MB is a real
decision, and the site hosts films on YouTube rather than in the repository.
