# Session notes

Conditions that shaped the output of this session, recorded for anyone comparing runs across
models, effort levels, or harnesses. Every number here was read from the session transcript
(`~/.claude/projects/…/548ff887-….jsonl`) and the subagent journals, not estimated.

---

## Model and effort

| | |
| --- | --- |
| Model | `claude-opus-5` for **every** request — main loop and all subagents |
| Effort | `xhigh` on all 339 main-loop assistant messages |
| Service tier | `standard` on all requests |
| Speed | `standard` — fast mode was **not** used |
| `inference_geo` | `not_available` (no US-pinned routing, no 1.1× multiplier) |
| Harness | Claude Code `2.1.243`, permission mode `auto`, mode `normal` |

**No downgrade occurred and no restoration was needed.** Every one of the 339 real assistant
messages carries `model: claude-opus-5`. Five additional `<synthetic>` assistant records appear in
the transcript — these are harness-generated notices (usage-limit messages and one request
timeout), not model output, and they carry no usage.

Effort was set by the user's opening `/effort` command:

```
Set effort level to ultracode (this session only): xhigh + dynamic workflow orchestration
```

Ultracode is the material variable here. It carries a standing instruction to author and run a
`Workflow` for every substantive task and to treat token cost as a non-constraint. Three workflows
were run (46 distinct agent invocations) where a non-ultracode session would very likely have used
one or two subagents, or none. The verification pass in §"Adversarial verification" below is
directly attributable to it.

---

## Interruptions that affected the run

### Two usage-limit lockouts

The session was cut off mid-workflow twice.

| # | Hit at | Reset | Idle | What was lost |
| --- | --- | --- | --- | --- |
| 1 | ~00:44 EDT | 05:10 EDT | 4 h 27 m | 16 of 23 agents in workflow #1: all 9 judges, both page drafts, both syntheses, all 3 verifiers |
| 2 | ~05:36 EDT | 10:10 EDT | 4 h 35 m | 4 of 23 agents in the resumed run: `synthesize:page` and all 3 verifiers |

**This is the single biggest structural influence on the artifacts**, and it changed the shape of
the work in two ways:

1. **Recovery used workflow resume rather than re-running.** After the first lockout the journal
   was inspected to confirm the seven completed agents had cached, non-empty results, then the run
   was relaunched with `{scriptPath, resumeFromRunId}`. The unchanged prefix replayed from cache
   instantly and only the failed agents re-ran. Without this the four grounding briefs (~194 KB of
   research) would have been regenerated at full cost, twice.

2. **`synthesize:page` never ran, and the essay prose is therefore mine.** The page-content
   synthesis agent died in both lockouts. Rather than spend a third workflow on it, the essay was
   written directly from the same four research briefs the agent would have used. Only the
   *narration script* is a workflow product (drafted 3×, judged 9×, synthesized at `xhigh`). A run
   without the lockouts would have had two synthesized artifacts instead of one — worth knowing
   when comparing prose quality across sessions.

3. **The verification workflow was re-scoped as a result.** Because the original `verify:*` agents
   were written to check *drafts* and kept dying anyway, a fresh workflow was authored to check the
   **actual shipped files on disk**. That is strictly better — it caught 15 real defects in the
   files as written, including several introduced during hand-editing that no draft-checker could
   have seen.

### One request timeout

The user first sent this meta-task (script.md / notes.md / metadata.toml) on **2026-08-28 14:18
EDT**. It failed with a synthetic `Request timed out` at 14:27 and produced no output. The prompt
was re-sent on **2026-08-29 16:48 EDT** and completed. Both copies of the prompt are present in the
conversation, which is why the instruction text appears twice in the final turn. The 26.4-hour gap
between them is idle wall-clock and dominates the raw session span.

---

## Concurrency

Work was **not** serial. Three levels of parallelism ran, often at the same time:

| Level | Detail |
| --- | --- |
| **Workflows in background** | All three `Workflow` runs were backgrounded. Scaffolding, the design system, the SHA-256 implementation and its fuzzing, and the scene renderer were all written while agents ran. |
| **Fan-out inside workflows** | Grounding = 4 parallel; drafting = 3 parallel; judging = 3 drafts × 3 lenses concurrently; verification = 4 checks pipelined into per-finding adjudication with no barrier between stages. |
| **Background Bash** | The two full video renders (≈12 min each) ran via `run_in_background`, with README writing, mobile screenshots and linting proceeding meanwhile. |

Agent counts: 23 + 23 + 27 = **73 agent slots**, of which 46 executed live (the rest were cache
replays or lockout failures). Subagents produced 796 assistant messages against the main loop's
339 — roughly 70 % of all model messages in this session were subagent messages.

**Notable:** the resumed workflow's cached prefix means the two `wf_302f6e13-1e2` rows are the same
run ID, not two runs. Comparing "agents spawned" across sessions should count 46 live agents, not
73 slots.

---

## Caching and persistence

- **Every cache write used the 1-hour TTL.** `cache_creation.ephemeral_1h_input_tokens` =
  8,913,854; `ephemeral_5m_input_tokens` = 0 across both the main loop and all subagents. At 2×
  base input, 1h writes cost $89.14 of the $176.31 total — the largest single line item. The
  trade paid off: the cache-read share was **92.8 %** of all input tokens, and the same work
  without caching would have cost **$649.71** instead of **$176.31** (a 3.7× saving).
- **Session-level context compaction was not triggered.** The session ran to ~15 M tokens of
  budget with no compaction event in the transcript.
- **Memory directory: created, never written.** The harness provisioned
  `~/.claude/projects/…/memory/` at 00:21. Nothing was saved to it and no `MEMORY.md` exists. The
  one genuinely non-obvious discovery of the session (the espeak path-length bug) was documented
  in the code that works around it — `video/src/bigworld_video/espeak_shim.py` — which the memory
  guidance prefers over a memory file, since the repo already records it.
- **Scratchpad used for all intermediates.** Research briefs (~194 KB), contact sheets and probe
  screenshots went to the session scratchpad, not the repo. The repo contains only shippable
  files.
- **Workflow journals are the durable artifact.** `journal.jsonl` per run is what made resume-from-
  cache possible after both lockouts.

---

## Adversarial verification — and what it caught

The final workflow was structured so that every finding faced a referee whose default was that the
finding is wrong ("plausible-sounding findings that do not survive checking are worse than no
findings at all"). Result: **16 raised, 18 adjudications, 15 confirmed, 3 rejected.**

The rejections mattered as much as the confirmations. One flagged a "parse hazard" in the
Dyson-shell line; the referee showed the grammatical rationale was backwards and the line was left
alone. Another claimed the closing line landed weakly; the referee showed the alleged mishearing
required two simultaneous errors. A one-sided review would have degraded the script on both counts.

The confirmations were substantive and would have shipped otherwise — a magnitude wrong by 2×
inside a sentence the page's own instrument contradicts; AES aged at 40 years instead of 25; two
post-quantum breaks conflated; "four words" attached to a five-word phrase.

**Three defects were found by the model's own checking rather than by any agent**, and are worth
noting because they are the kind a review pass usually misses:

1. **A real SHA-256 bug.** Fuzzing the hand-written implementation against Node's `crypto`
   revealed a padding error at every length ≡ 55 (mod 64). Found only because 1,100 vectors were
   run instead of the usual three.
2. **The espeak 160-byte path buffer.** Five hypotheses were tested before measuring the path
   length. A machine with a shallower checkout would never have hit it.
3. **The atom-computer cliché is false.** The `crypto-numbers` brief flagged it, and the futility
   instrument computes it live — so the page's own tool refutes the line the page quotes. This
   became a design feature rather than something to hide.

---

## Environment specifics that could change the output elsewhere

- **macOS `say` was rejected** in favour of Kokoro-82M. On a machine without network access at
  first run, Kokoro cannot fetch its checkpoint and the video pipeline would fall back or fail.
  This is the one dependency `uv.lock` cannot pin; it is called out in `README.md`.
- **The espeak workaround is path-length dependent.** On a shallower checkout the shim is a no-op
  (`len(parent) <= 110` short-circuits it). The bug is invisible on most machines.
- **Frame render throughput varied 5×** — ~16 fps on simple scenes, ~3.5 fps once the `lattice`
  and `onevsall` beats (O(n²) over 209 nodes) came in. Full render: ~12 minutes for 1,508 frames.
- **Playwright pinned Chromium** (`chromium-1187`, headless shell 140.0.7339.16). Font resolution
  in the video comes from macOS system fonts; a Linux render would substitute and shift metrics.
- **Two live pricing fetches** were made while writing `metadata.toml`, via the `claude-api`
  skill and `WebFetch`, rather than pricing from memory. One URL 404'd; the second and third
  resolved and agreed with the skill's bundled table.

---

## Duration accounting

The raw span is misleading, so here is the decomposition.

| Measure | Seconds | Note |
| --- | --- | --- |
| **Full span** (first → last message) | 145,770 | 40.5 h, 2026-08-28 00:20:47 → 2026-08-29 16:50:16 EDT |
| Usage-limit lockout #1 | 16,011 | 4.45 h, nothing running |
| Usage-limit lockout #2 | 16,523 | 4.59 h, nothing running |
| Gap before the re-sent meta-task | 94,885 | 26.4 h, user away; includes the timed-out attempt |
| Other idle > 240 s | 14,025 | mostly background renders and workflow waits |
| **Active session time** | **4,326** | 1.20 h of turns actually in flight |
| **Model processing time** | **4,043** | 1.12 h; sum of main-loop response latencies |

Model time is 93 % of active time — the session was model-bound, not tool-bound, which is what
`xhigh` on a 1 M-token context buys. Subagent model time is *not* included in `model-seconds`: it
ran concurrently inside the three workflows (56 m 53 s of combined workflow wall time) and would
double-count against the main loop's own clock.

---

## What a comparison run should hold constant

If this artifact is being compared against another model, effort level, or harness:

1. **The lockouts are not reproducible.** They cost one synthesized artifact (`synthesize:page`)
   and forced the essay prose to be written directly. A clean run gets more agent-authored prose.
2. **The research briefs are cached in the journals**, not in the repo. A fresh run regenerates
   them and will not get byte-identical grounding.
3. **The narration script is a judged-panel product**; the essay prose is not. Do not read the two
   as products of the same process.
4. **All quantitative claims were verified by computation in-session** (see `script.md`
   Appendix C). A run that skips that step will produce prose that reads the same and is wrong in
   at least a dozen places — this run's verification pass found exactly that many.
