# METRICS.md: energy and cost definitions for the cost-of-intelligence instrument

```
metrics_version: v1
status:          draft for amendment A-02. v1 is fixed when A-02 records this file's sha256; until then a revision is a new draft of v1, not v2
prereg_sha:      withheld-2026-09-29   (PREREG-S0.md at the A-00 freeze, commit 3abb216b)
rulings_sha:     withheld-2026-09-29   (RULINGS-2026-09-23.md: R-0 … R-21, R-10d + addendum, R-20 clarification, R-14a)
plan_sha:        withheld-2026-09-29   (PLAN-v2.md)
written_utc:     draft 1 2026-09-24T13:31Z → 13:35Z (date -u read 13:31:01Z at the start; the file's mtime 13:35:37Z at the end)
                 draft 2 2026-09-24T13:46Z → 14:03Z (date -u read 13:46:07Z at the start): the verifier's must-fix and should-fix items
carried_by:      amendment A-02 (PREREG-S0.md §9.3), which records this file's sha256
```

**What this file is.** PREREG-S0.md §7 says the metric definitions live here (§7.1, last bullet). §9.3 says what A-02 carries: section 7's definitions, the archetypes, the bias table, the three J/1k names, and the reading close rule. §4.5 moves the staircase `C_ours(t, bar)` here unchanged. The substance below follows the PREREG. Each entry gives its PREREG section, its source files, and a **test**. A test is either a command a reader can run now or, when the script does not exist yet, the script that owes it. `coi.py` and `ratio.py` owe most such tests, and no amendment number carries their shas yet (O-15), so every "owed" below names the script and points to O-15.

**Precedence.** From PREREG-S0.md, "Precedence": RULINGS wins over PREREG, and PREREG wins over PLAN-v2. This file sits under PREREG. If a sentence here differs from PREREG in substance, that is a defect in this file, and PREREG applies until an amendment fixes it. Where this file carries a PLAN-v2 rule that PREREG does not register, it says so at that place and lists it in O-22 for the lead to confirm or drop. The PREREG leaves some questions open, and the "Open before A-02" section lists them. This file does not settle any of them. Any value that no file holds is written as `null` with a *missing* note. This file does not supply such values.

**Versioning.** A change to any definition here, after A-02 records its sha, creates a new `metrics_version` (v2, …). It is never an edit of v1, and it never edits an earlier reading's figures (PREREG §7.1, last bullet; RULINGS R-10, lines 134–135). Every script that applies a rule from this file (`coi.py`, `ratio.py`) writes `metrics_version: "v1"` on every row it touches (PREREG §0, first bullet).

**How tests run.** Unless a test names another box, run it on the laptop from the bench root, `/workshop/estate/bench/cost-of-intelligence-2026-09-23`. Tests that import another lane's module set `PYTHONDONTWRITEBYTECODE=1`, so they write no `__pycache__` beside that lane's code. Tests skip any `rows/superseded-*` directory. Where a test gives synthetic inputs, those inputs are test values and were never measured.

**Units.** Time is UTC throughout. Energy is in J, and 1 kWh = 3.6 × 10⁶ J. Power is in W. Money is nominal USD unless a figure is labelled deflated. "Item" means one prompt of a set. "Correct" means `correct_strict` under parser v2 (`parser_version` = `parse_v2.py` sha `689254c5…`, PREREG §3.1 and §10), unless a figure is labelled lenient or v1.

---

## 1 · Energy instruments (PREREG §7.1, first bullet; RULINGS R-6, R-10b, R-10d and its addendum, R-16)

Every joule figure names its instrument. A ratio never combines `board` and `wall` figures unless it says so (R-6, RULINGS lines 60–64).

| `energy_instrument` | what it reads | rule | label it carries | test |
|---|---|---|---|---|
| `board` | `nvidia-smi` `power.draw` by card UUID at 1 Hz (`-lms 1000`), trapezoid-integrated over the sampler's own timestamps, per UUID, summed over boards when a model is split | `../jev-2026-09-21/run.py` `Boards`, lines 698–767 (sha `withheld-2026-10-14` = the PREREG §10 pin). The integrator is `Boards.integrate`, line 734: Σ (wᵢ + wᵢ₊₁)/2 × (tᵢ₊₁ − tᵢ). Its `mean_watts` is joules ÷ span, and its `peak_watts` is the largest sample | "board" | **T-1 (runs now):** `PYTHONDONTWRITEBYTECODE=1 python3 -c 'import sys,json;sys.path.insert(0,"../jev-2026-09-21");import run;d="rtx-3090-reading-0/rows/k0a-gemma4-anchor-cd/";r=run.Boards.integrate(d+"k0a-gemma4-anchor-cd.c.watts.csv");j=json.load(open(d+"k0a-gemma4-anchor-cd.c.report.json"))["energy"]["joules"];print("PASS" if abs(r["joules"]-j)<1e-6 else "FAIL")'` re-integrates the raw 1 Hz file and must match the report's `energy.joules`. T-9 (§2) repeats this over every benchbox and laptop task file |
| `wall` | benchbox only: the UPS `ups.realpower` for the whole box (CyberPower CP1500PFCLCDa via NUT `usbhid-ups`), polled at 1 Hz | This is a step function: NUT's `pollinterval 2`, and the value moves only on `pollfreq 12`. The value changed at a median interval of 14.0 s (p10 6.0 s, p90 28.0 s) across 52 arm files (`rtx-3090-reading-0/instrument/NOTES.md` lines 28–38; `rows/wall-cadence.json`). It is honest over a task window of **one minute or more** and **never per item**. At reading 0, 51 of benchbox's 93 task windows are shorter than a minute (O-20) | "wall (whole box)" | **T-2 (runs now):** `python3 -c 'import json;d=json.load(open("rtx-3090-reading-0/rows/wall-cadence.json"));print(d["median_s_between_changes"],d["p10_s"],d["p90_s"],d["files"])'`. **T-2b (runs now), the window lengths:** `python3 -c 'import json,glob;s=[v["wall_task"]["seconds"] for f in glob.glob("rtx-3090-reading-0/rows/*/arm.json") for v in (json.load(open(f)).get("tasks_run") or {}).values() if v.get("wall_task")];print(len(s),sum(x<60 for x in s))'` prints `93 51` as read 2026-09-24 ~13:5xZ |
| `box-delta` | the desktop only: `upsc cp2000@localhost ups.realpower`, integer watts, stderr dropped. Any other output is refused and counted | R-16 (RULINGS lines 253–263). Reader: `rtx-pro-6000-reading-0/instrument/coilargecard.py` lines 224–242 (the sha read today, `ac9f40eb…`, is **not** the PREREG §10 pin `f5f19bb0…`; see O-17). The CP2000 stays the instrument until the BMC paste lands. The change of instrument then prints as a dated delta | "box delta; includes the desktop's 3090 and the host", **never "wall"** | **T-3 (on the desktop):** `upsc cp2000@localhost ups.realpower 2>/dev/null` prints one integer |
| `rapl` | the laptop (the laptop) only: **package-0** from `/run/rapl/energy`, which a root sampler rewrites every second. Each line is `<epoch> <domain> <energy_uj> <max_energy_range_uj>`. Energy is a counter difference, with wraps added back at `max_energy_range_uj` = 262,143,328,850 µJ | R-10d (RULINGS lines 308–315). Reader: `laptop-reading-0/instrument/coilaptop.py` `integrate_rapl`, lines 430–449 (sha `0b5dcb41…` = the pin). **psys is recorded, labelled IMPLAUSIBLE, and never enters a figure** (PREREG §7.1; the R-10d addendum, RULINGS lines 326–331: it read about 0.3 W both idle and loaded). The IMPLAUSIBLE label is applied today only in the lane's tables and report (`instrument/tables_laptop.py` lines 6 and 151; `rows/FIGURES.md` line 39; `LAPTOP-READING-0.md` line 837). The sampler's own string still reads "psys = the platform's own reading (not wall)", and other code still lets psys in; see O-24 | "rapl package-0 (the CPU package)", **never "wall", never "platform"**. The laptop's energy figures are "board + package", labelled so | **T-4 (runs now, the laptop):** `cat /run/rapl/energy` shows four domain lines. `python3 -c 'import json;a=json.load(open("laptop-reading-0/rows/k1-mistral-v0.1-cd/arm.json"));[print(k,{d:round(x["mean_watts"],2) for d,x in v["rapl_task"]["domains"].items()}) for k,v in a["tasks_run"].items()]'` should show psys below 1 W while package-0 reads tens of watts. This k1 row was written by the earlier `coilaptop.py` `4d07c3cd…` (commit `2cd9bb79`; the row's `arm.json` → `instrument.coilaptop_py`), not the pin. `integrate_rapl`'s text is byte-identical in both versions (sha256 of the function's text `b48256ac…` in each) |
| `none` | cloud rows (OpenAI, Claude CLI, the ollama.com shelf) | No joule is claimed (R-6; R-10, line 133). `series/lanes.py` writes `energy_instruments: "none"` on these rows (lines 396, 460, 510) | "none" | **T-11 (runs now):** `cat openai-reading-0/rows/*.jsonl anthropic-reading-0/rows/*.jsonl cloud-reading-0/rows/*.jsonl \| grep -ci 'joule\|"j_per\|_watts'` prints `0`. That the row's `energy_instrument` is `none` and every joule field null is owed in `coi.py` (O-15) |

**Instruments per box at reading 0.** These come from PREREG §2.2's table (lines 78–88):
- benchbox (the 3090): `board` and `wall`.
- the laptop (the laptop 5090): `board` and `rapl` package-0.
- the desktop (the desktop's larger card): `board` and `box-delta`.
- cloud: `none`.
- The laptop has no wall instrument and no platform instrument. Its box-level cells read "unmeasured" (PLAN-v2 §2.4, line 92).
- Each local box therefore carries two instruments. Where the second one goes in a row is open (O-23).

**Posture, recorded beside every energy figure.** These rules come from PREREG §2.4 D-7 (line 106), RULINGS R-12 and R-20.
- **The 3090:** `x_cap_w` 300.00 W with `x_persistence` Enabled, read per task. The arm refuses with rc 4 otherwise.
- **The laptop:** its posture is a **range**. Dynamic Boost is on (`nvidia-powerd` active), the clock lock is off, AC is online, and the enforced limit sits in (95, 175] W. The limit is reported per task as min / median / max from the 1 Hz trace (`laptop-reading-0/instrument/analyse_laptop.py` `enforced_range`, line 139).
- **The desktop's larger card:** 420 W, as run.
- **Jev rows:** a 250 W Jev "pre-0" row never enters a J ratio with a 300 W row without saying so.

---

## 2 · Per-local-row energy quantities (PREREG §7.1, bullets 2–6; RULINGS R-10, R-10b, R-10c)

Symbols for one row, meaning one (model, card, set, pass):
- `N`: the items in the pass.
- `K`: strict correct.
- `T_w`: the task window in seconds (from the sampler's first stamp to its last).
- `E_gross`: the `board` integral over `T_w`.
- `pe_ms`, `ev_ms`, `ld_ms`, `tot_ms`: the server's summed `prompt_eval`, `eval`, `load` and `total` durations over the row's items.
- `n_in`, `n_out`: the summed prompt and generated tokens.

| name | definition | PREREG / ruling | reading-0 implementation (file:line) | test |
|---|---|---|---|---|
| `joules_gross` (whole window) | `E_gross`: what the owner's meter sees over the task window | §7.1 bullet 2 | `report.json` → `energy.joules` (run.py `Boards`) | T-1; T-9 |
| `joules_net` | `E_gross − P_idle,net × T_w`, where **`P_idle,net` = the median of the 1 Hz samples in the 60 s before the task, taken in a minute whose co-tenant journal shows no request**. Reported raw and net | §7.1 bullet 3 | **not computable on reading-0 rows** (see O-1). The traces hold a 10 s resident-idle read (run.py `idle_reading`, lines 770–782; net used at line 929) and a 15 s pre-load read (`coi3090.py` line 470). No trace covers 60 s before a task | owed: `coi.py` (O-15) |
| `joules_compute_phase` | board power over the server-timed `prompt_eval + eval` phases | §7.1 bullet 2 | `analyse_laptop.py` line 124: task-window mean board W × (`pe_ms + ev_ms`)/1000 (apportioned; see O-4) | owed: `coi.py` (O-15) |
| J per correct, whole window | `E_gross / K`, and beside it `joules_net / K` | §7.1 bullet 2 ("two ways") | `analyse_laptop.py` lines 122–123 | owed: `coi.py` (O-15) |
| J per correct, compute phase | `joules_compute_phase / K` | §7.1 bullet 2 | `analyse_laptop.py` line 124 | owed: `coi.py` (O-15) |
| J per generated token (decode) and J per prompt token (prefill) | the power integrated over the server-timed phase ÷ that phase's token count | §7.1 bullet 2, first clause; R-10 (RULINGS lines 121–123) | the probes: `board_j_per_gen_token_phase` and `board_j_per_prompt_token_phase` (`analyse_laptop.py` lines 173 and 195; benchbox `analyse.py` lines 263 and 282), written to the series as `j_per_gen_token` and `j_per_prompt_token` (`series/lanes.py` lines 323 and 326). Whether these are the registered quantities or further names is open (O-21) | owed: `coi.py` (O-15) |
| `j_per_decode_token_task` | board energy over the server-timed decode phase ÷ `n_out`. **Unit open (O-21):** PREREG calls this one of three "named J/1k quantities", and its name and every lane's implementation are per token | §7.1 bullet 2 | per token in every lane, under three names: the laptop's `j_per_decode_token_task` (`analyse_laptop.py` line 128), benchbox's and the desktop's larger card's `j_per_gen_token_apportioned` (`analyse.py` line 225; `benchbox_parser.py` line 221), and the series' `j_per_gen_token_task` (`series/lanes.py` line 293; `series/schema.py` line 97). Each is mean W × `ev_ms`/1000 ÷ `n_out` (apportioned; see O-4) | owed: `coi.py` (O-15), after O-21 |
| `j_per_prompt_token_task` | board energy over the server-timed prefill phase ÷ `n_in`. **Unit open (O-21)**, as above | §7.1 bullet 2 | per token: `analyse_laptop.py` line 127; benchbox `analyse.py` line 224 and the desktop's larger card `benchbox_parser.py` line 220 (`j_per_prompt_token_apportioned`); `series/lanes.py` line 292. Mean W × `pe_ms`/1000 ÷ `n_in`. Prompt tokens are counted as reported, so a prefix-cache hit counts in full (the note at `analyse_laptop.py` lines 129–131) | owed: `coi.py` (O-15), after O-21 |
| `j_per_1k_decode_probe@roster` | board J per 1,000 generated tokens under **exactly `compare_cards`' conditions**: Q4_K_M, ollama 0.32.13, 256 tokens out, board power only (`/workshop/s2s-research-hub/tools/compare_cards.py` `LADDER_WRITE`, lines 287–292; the joules tables at lines 326–347). The roster's arithmetic is busy-sample mean W × `eval_duration` ÷ `eval_count` × 1000 (`../tier-10-12gb-2026-09-19/harness/benchlib.py` `energy_j_per_1k_tokens`, line 3721, with the busy-sample mean chosen in `bench_gpu.py` lines 961–986) | §7.1 bullet 2; R-10 ("the tier bench's existing unit, so rows compare with the hardware roster") | The decode probe is 3 × 256 tokens of the smoke's lighthouse prompt (`coi3090.py` lines 89–92, 575–590). The analysis uses window mean W × Σ`eval_s` ÷ Σ`eval_count` × 1000 (`analyse_laptop.py` line 174; benchbox `analyse.py` line 264), written to the series as `j_per_1k_decode_probe` (`series/lanes.py` line 324). See O-5 on which rows meet the roster's conditions | **T-5 (runs now):** `PYTHONDONTWRITEBYTECODE=1 python3 -c 'import sys;sys.path.insert(0,"../tier-10-12gb-2026-09-19/harness");import benchlib as B;print("PASS" if B.energy_j_per_1k_tokens(250.0,1000,4e9)==1000.0 else "FAIL")'` (synthetic). Per arm: `python3 -c 'import json,sys;p=json.load(open(sys.argv[1]))["decode"];ev=sum(r["eval_count"] for r in p["runs"]);es=sum(r["eval_s"] for r in p["runs"]);print(p["board"]["mean_watts"]*es/ev*1000)' rtx-3090-reading-0/rows/k0-gemma4-26b-c/probes.json` |
| (the rule on the names) | A bare "J/1k" is **never** printed (§7.1 bullet 2). The three names above are the registered J/1k names. The lanes also write J-per-token and J/1k figures under names PREREG does not register; O-21 lists them | §7.1 bullet 2 | none yet | **T-12 (runs now):** `grep -n '"j_per_1k"' series/*.py rtx-3090-reading-0/instrument/*.py laptop-reading-0/instrument/*.py rtx-pro-6000-reading-0/instrument/*.py` prints nothing: no field is named bare `j_per_1k` today. The refusal itself is owed in `coi.py` (O-15) |
| tokens per joule | the inverse of each per-token J above, with the same instrument and phase named | §7.1 bullet 2; R-10 | the probes' `gen_tokens_per_board_j` (`analyse_laptop.py` line 176; benchbox `analyse.py` line 266), written as `tokens_per_j` (`series/lanes.py` line 325) | **T-7 (runs now, both lanes):** `PYTHONDONTWRITEBYTECODE=1 python3 -c 'import sys,json,glob;sys.path.insert(0,"laptop-reading-0/instrument");import analyse_laptop as L,analyse as K;A=[(m,a,json.load(open(a))) for m,l in ((K,"rtx-3090-reading-0"),(L,"laptop-reading-0")) for a in sorted(glob.glob(l+"/rows/*/arm.json")) if "/superseded" not in a];R=[(m.probe_record(a[:-9],a.split("/")[-2],d)["decode"],d["probes"]["decode"]) for m,a,d in A if d.get("probes")];g=lambda q:(sum(r["eval_count"] for r in q["runs"]),sum(r["eval_s"] for r in q["runs"]),q["board"]["mean_watts"]);bad=[1 for x,q in R for ev,es,mw in [g(q)] if abs(x["gen_tokens_per_board_j"]*x["board_j_per_gen_token_phase"]-1)>5e-4*x["board_j_per_gen_token_phase"]+5e-5*x["gen_tokens_per_board_j"]+1e-9 or x["tok_s_per_board_w"]!=round(ev/es/mw,4)];print(len(R),"PASS" if not bad else "FAIL %d"%len(bad))'`. It checks that tokens per joule is the inverse of J per generated token, within the two fields' rounding, and that tok/s per W is decode tok/s ÷ mean board W. It printed `73 PASS` as read. It calls the analysers directly because the laptop's `rows/figures.json` (generated 2026-09-23T18:39:42Z) predates the laptop's re-runs |
| tokens per second | decode = `n_out ÷ (ev_ms/1000)`, and prefill = `n_in ÷ (pe_ms/1000)`, each separately, per item and summarised as median and p95 | §7.1 bullet 2; R-10c (RULINGS lines 152–159: "per item and summarised as median / p95") | Per task, the analysers write only the pooled Σ÷Σ figure (`decode_tok_s_task`, `prefill_tok_s_task_as_reported`: `analyse_laptop.py` lines 104–105; benchbox `analyse.py` lines 205–206). The probes write the median of 3 runs (`decode_tok_s_median`). For local rows, no script writes the per-item median and p95 yet | **T-8 (runs now, one row):** `python3 -c 'import json,statistics as S;r=[json.loads(l) for l in open("rtx-3090-reading-0/rows/k0a-gemma4-anchor-cd/k0a-gemma4-anchor-cd.c.jsonl")];f=lambda v:(round(S.median(v),1),round(sorted(v)[round(.95*(len(v)-1))],1),len(v));print("decode",f([x["eval_tokens"]/x["x_eval_ms"]*1e3 for x in r if x.get("x_eval_ms")]),"prefill",f([x["prompt_tokens"]/x["x_prompt_eval_ms"]*1e3 for x in r if x.get("x_prompt_eval_ms")]))'` applies the definition to one row file (the p95 index follows benchbox `analyse.py` `pct`, line 118). Writing it on every row is owed in `coi.py` (O-15) |
| TTFT | streamed where the path allows. The local probe replays the first 12 task_c prompts with `stream: true`, timed by the client clock on localhost (`coi3090.py` docstring, lines 32–34; `TTFT_ITEMS`, line 95). Otherwise the row prints "TTFT not measured". Cloud TTFT includes the network and says so | §7.1 bullet 2; R-10c; D-11 | `series/lanes.py` lines 327–331 | **T-7b (runs now):** `PYTHONDONTWRITEBYTECODE=1 python3 -c 'import sys,json,glob;sys.path.insert(0,"laptop-reading-0/instrument");import analyse_laptop as L,analyse as K;print(sorted({p["ttft"]["n"] for m,l in ((K,"rtx-3090-reading-0"),(L,"laptop-reading-0")) for a in glob.glob(l+"/rows/*/arm.json") if "/superseded" not in a for p in [m.probe_record(a[:-9],a.split("/")[-2],json.load(open(a)))] if p}))'` prints `[12]` |
| tokens per second per watt | decode tok/s ÷ mean board W | §7.1 bullet 2; R-10 | the probes' `tok_s_per_board_w` (`analyse_laptop.py` line 177; benchbox `analyse.py` line 267). benchbox also writes `tok_s_per_wall_w` (line 270) from windows under a minute (O-20) | T-7 |
| mean and peak W; idle W | mean and peak board W over `T_w`. Card idle W, and box idle W where a `wall` or `box-delta` exists | §7.1 bullet 2; R-10 | `report.json` → `energy.mean_watts` / `peak_watts`; `arm.json` → `idle_preload.{board,wall}` | **T-9 (runs now, both lanes):** `PYTHONDONTWRITEBYTECODE=1 python3 -c 'import sys,json,glob;sys.path.insert(0,"../jev-2026-09-21");import run;P=[(run.Boards.integrate(w),json.load(open(w[:-9]+"report.json"))["energy"]) for l in ("rtx-3090-reading-0","laptop-reading-0") for w in sorted(glob.glob(l+"/rows/*/*.[a-z].watts.csv")) if "/superseded" not in w];bad=[e for r,e in P if abs(r["joules"]-e["joules"])>1e-6 or abs(r["mean_watts"]-e["mean_watts"])>1e-9 or r["peak_watts"]!=e["peak_watts"]];print(len(P),"PASS" if not bad else "FAIL %d"%len(bad))'` re-integrates every task file and printed `172 PASS` as read. The idle reads are open (O-1, O-3) |
| posture, temperature | the posture as read, and card temperature at start and end | §7.1 bullet 2; R-10 | per-row `x_cap_w`, `x_persistence` (benchbox); `enforced_range` (laptop); the first and last temperature of the `*.ext.csv` trace (`coi3090.py` docstring, lines 27–28; benchbox `analyse.py` `ext_stats`, lines 127–143) | **T-10 (runs now):** (a) `python3 -c 'import json,glob;print({(d.get("x_cap_w"),d.get("x_persistence")) for f in glob.glob("rtx-3090-reading-0/rows/*/*.[a-z].jsonl") for l in open(f) if l.strip() for d in [json.loads(l)]})'` prints `{(300.0, 'Enabled')}`; (b) `PYTHONDONTWRITEBYTECODE=1 python3 -c 'import sys,glob;sys.path.insert(0,"laptop-reading-0/instrument");import analyse_laptop as L;R=[L.enforced_range(f) for f in sorted(glob.glob("laptop-reading-0/rows/*/*.[a-z].ext.csv")) if "/superseded" not in f];print(len(R),"PASS" if all(r and 95<r["min"] and r["max"]<=175 for r in R) else "FAIL")'` printed `79 PASS`; (c) `PYTHONDONTWRITEBYTECODE=1 python3 -c 'import sys,glob;sys.path.insert(0,"rtx-3090-reading-0/instrument");import analyse as K;R=[K.ext_stats(f) for l in ("rtx-3090-reading-0","laptop-reading-0") for f in sorted(glob.glob(l+"/rows/*/*.[a-z].ext.csv")) if "/superseded" not in f];print(len(R),"PASS" if all(r and r["temp_first_c"] is not None and r["temp_last_c"] is not None for r in R) else "FAIL")'` printed `172 PASS` |
| `load_ms`, `eval_ms`, `total_ms` | the server's own fields, per item | §7.1 bullet 2; D-10 | `x_load_ms`, `x_eval_ms`, `x_total_ms` on every local row | `jq .x_load_ms` on any benchbox row |
| J per judged-acceptable response | energy ÷ the count of responses the blind panel judges acceptable (quality tasks, R-8) | RULINGS R-10 (line 125). **Not in PREREG §7.1** | none: no quality cell is on reading 0's list (PREREG §9.2, "reading 0.1") | `null` at reading 0. *Missing:* the acceptability rule arrives with the quality family's exam (R-8) |

**Cold runs only.** Per-token energy comes from **cold runs only**. On a warm pass, ollama's prefill tok/s is inflated by the cache: the server reports the full `prompt_eval_count` on a cache hit (PREREG §7.1 bullet 3; `smoke/SMOKE-REPORT.md` §4, items 2–4, lines 154–166). The score pass is pass 1, which runs cold: unload, warm-load, then the pass (PREREG §4.1).

**The 2× rule.** `ratio.py` refuses a cross-card J or $ ratio when the two cells' median `load_ms` differ by more than 2×, unless the compute-phase figure prints beside it (PREREG §7.1 bullet 4; D-10, line 109).
- The input is `load_ms` on every local row.
- A same-model pair: benchbox's median `load_ms` for `mistral:v0.1` is 125 ms. The smoke's is 33 ms for the same model (`rtx-3090-reading-0/instrument/NOTES.md` lines 82–86). The smoke ran on the laptop's system daemon (0.32.14, PREREG D-8), and its rows are `series: false`, so the pair illustrates the rule and is never a ratio of record.
- D-10's own figures: benchbox 778 ms median for K0 (`gemma4:26b`), and 743 ms on row 1 of benchbox's `k0a`. The laptop read 255 ms on row 1 of its 16G `k0a`, now superseded, a timing receipt and not the energy row of record.
- **Test:** owed in `ratio.py` (O-15).

**CO2e per correct** applies to local rows only.
- Formula: CO2e per correct = (J per correct ÷ 3.6 × 10⁶) × the what-it-costs piece's round mixed-grid figure, **about 400 g CO2e per kWh** (`/workshop/estate/docs/article/what-it-costs-to-run-v10.md` line 60 and its table row at line 138).
- It is labelled "**not measured here**", and it never uses the local grid (PREREG §7.1 bullet 5; PLAN-v2 §2.4, line 92).
- **Test:** `grep -n 'round mixed-grid' /workshop/estate/docs/article/what-it-costs-to-run-v10.md`

**The desktop's larger card (the 96 GB card)** gets energy figures only (PREREG §7.1 bullet 6).
- It carries board J gross and net, plus the CP2000 box delta.
- Every row carries `shared_card`, `cotenant_requests` and `collided`.
- Speed and energy are computed over collision-free items only.
- Every `$` cell is `blank_reason: "P-6"`.
- `ratio.py` emits no `usd*`, `cost_*`, `u_star` or `c_star` field for `card_arch = blackwell-ws`, and has a test for that (**owed:** `ratio.py`, O-15).

---

## 3 · The local cost model: cost per correct answer (PREREG §7.2; PLAN-v2 §5)

### 3.1 The two owner archetypes

Every cost row carries exactly one archetype (`archetype: A | B`). **No ratio and no ladder mixes the two** (PREREG §7.2 bullet 1).

| | **A · the buyer** (looks forward; the decision a reader faces) | **B · the incumbent** (the estate as it stands; the capital is sunk) |
|---|---|---|
| capital basis | **C** = the replacement cost of the whole working machine at the reading's date, re-read each reading | the opportunity cost of not selling: **V × (r + δ)** per year |
| the 3090 | the rig with one card: **$3,198.86 on 2026-09-13, before tax** (exhibit 46). See O-12 | V = **$1,094.44**, August 2026's average completed sale (exhibit 46) |
| the laptop | **$3,099.99 PAID, whole machine**, ordered 2026-07-03 (exhibit 57). Its box idle is "unmeasured, understates" | C = 0 (bought for development anyway) |
| the 96 GB card | no C, no C\*, no dollar cell (P-6) | 0 (marginal); no dollar cell (P-6) |
| fuel | **gross**: whole-window board J. On benchbox, "the UPS net of box idle" (see O-2; most benchbox task windows are under the wall's one-minute floor, O-20). Elsewhere, board ÷ 0.9, labelled "assumed" (the laptop's second basis is O-13) | **net** of idle, with no idle term |
| idle term | P_idle × (1 − u)/u × t_busy × p_e (see O-3 on which P_idle) | none |
| card-only row | 3090 only: the LISTING **$1,879.99**, read by hand 2026-09-17 15:00–15:30Z, labelled "**not comparable across cards**" | — |
| marking to market | Never in the headline. The holding gain or loss prints as a labelled line, outside the levelised cost, with its sign | same |
| struck, never used | the "$1,899 pair" and the $1,849.99 figure (article M-2) | same |

Where each input comes from: see the inputs table in §3.8.

**The one-line derivation, for why archetype A adds idle to gross fuel** (PLAN-v2 §5, line 216; `panel/economics.md` #13, line 269). Per busy hour, the machine's true energy is P_busy + P_idle × (1 − u)/u. That is gross busy energy plus the idle drawn over the (1 − u)/u non-busy hours that come with each busy hour. Writing (P_busy − P_idle) + P_idle × (1 − u)/u (net fuel plus idle) loses P_idle × t_busy. So archetype A uses gross fuel plus the idle term, and archetype B uses net fuel with no idle term.

**Per-answer cost, archetype A, at utilisation u.** This is this file's reading of §7.2's words "capital per answer = annual capital ÷ answers served per year", with answers served per year = u·Y/t (the lead confirms it, O-19). Symbols: `e` = gross busy J per item (the fuel basis above). `t` = t_busy, in s per item (see O-11). `p` = p_e in $ per J (¢/kWh ÷ 100 ÷ 3.6 × 10⁶). `Y` = seconds per year. `a_L` = K / N.

```
fuel_per_item(u)    = e·p + P_idle·(1 − u)/u·t·p
capital_per_item(u) = C·CRF(n, i)·t / (Y·u)            (R = 0 in the primary)
$ per correct       = (fuel_per_item + capital_per_item) / a_L
CRF(n, 0) = 1/n ;  CRF(n, i) = i / (1 − (1 + i)^(−n))
```

The reading-0 implementation takes `Y` = 365.25 × 86,400 s (`series/money.py` line 15). It takes `t` = the task window ÷ items (line 95).

**Archetype B.** Here capital per item = V·(r + δ)·t / (Y·u), and fuel = e_net·p, where e_net is net of idle.

**Fuel share.** Fuel ÷ (fuel + capital) prints on every levelised row (§7.2 bullet 6).

**Test (the inputs, runs now):** `cd series && PYTHONDONTWRITEBYTECODE=1 python3 -c 'import money;r=money.load_cost_inputs();print(r["checks"])'`. This re-finds each capital quote in its cited file, re-parses p_e from the saved EIA page, and refuses on any mismatch (`series/money.py` `load_cost_inputs`, lines 46–75; `series/cost_inputs.json`). **Test (the equation):** owed in `coi.py` (O-15).

### 3.2 Primary convention, sensitivity rows, and the print rule (PREREG §7.2 bullet 2)

- **Primary (archetype A):** n = 3 years, R = 0, i = 0 (straight line).
- **Sensitivity rows:**
  - archetype B's user-cost row, V × (r + δ);
  - **n = 5 / i = 5 %** (see O-7 on whether that is one row or two);
  - p_e at commercial and industrial rates (§3.3).
- **The print rule:** "owning wins" or "owning loses" prints **only if it holds under the sensitivity row most favourable to the losing side**. Otherwise the page says "depends on the convention: X under …, Y under …". **Test:** owed in `coi.py`/`ratio.py` (O-15). The rule has to be applied to every such sentence before it is printed.

### 3.3 p_e, the price of electricity (PREREG §7.2 bullet 3)

- **Primary:** the latest U.S. residential month of EIA table 5.6.A at the reading's date.
  - For reading 0 that is **June 2026: 18.34 ¢/kWh**, read 2026-09-23 around 15:36Z (`recon/sources-economics/prices/eia-epm-table-5-6-a-read-2026-09-23.html`, sha `7d5bcbe3…`, the "U.S. Total" row at line 1130).
  - The July month releases 2026-09-24 and applies from then. No file holds it yet (see O-6).
  - Frozen per reading, and registered as `p_e_rule` in `prices.json` (A-06).
- **Like periods only.** June 2026 is set against **June 2025: 17.47 ¢**, from the same table and row, which is **+5.0 % nominal**. An annual figure is never set against a month.
- **Sensitivity rows:** commercial **14.19 ¢** and industrial **9.17 ¢**, both June 2026, same row.
- **Trailing-12-month mean:** printed once twelve receipted months exist. **Today: `null`.** *Missing:* only one table page is receipted (June 2026 and June 2025 columns). Eleven more monthly releases, each receipted, will supply it.
- **Deflation:** every dated price is also deflated with CPI-U (FRED `CPIAUCSL`, using the price's own month) wherever a rate meets Epoch's real-dollar line.
  - The series is pinned: `recon/sources-economics/fred/CPIAUCSL-fetched-2026-09-23T2154Z.csv`, sha `f8ecddf5…`.
  - Its receipt (`…receipt.json`) records: 955 observations, 1947-01 → 2026-08, month 2025-10 listed without a value, fetched 2026-09-23T21:54:18Z.
  - The base month is not registered by PREREG (see O-9).
- **Test (runs now):** `python3 -c 'import re;t=open("recon/sources-economics/prices/eia-epm-table-5-6-a-read-2026-09-23.html",encoding="utf-8",errors="replace").read();i=t.find("U.S. Total");print(re.findall(r"\d+\.\d+",re.sub(r"<[^>]+>"," ",t[i:i+3000]))[:6])'`. This prints the residential, commercial and industrial pairs in order: June 2026, June 2025. Then `sha256sum recon/sources-economics/fred/CPIAUCSL-fetched-2026-09-23T2154Z.csv` must equal the receipt's `sha256`.

### 3.4 u, utilisation (PREREG §7.2 bullet 4)

- **`U_demand`** = Σ over request classes of (served product requests in the window × the measured t_busy for that class) ÷ the window.
  - Bench windows and warm-seat re-pins are excluded (PREREG §7.2). PLAN-v2 §5 (line 224) also excludes the canary. PREREG does not name the canary, so that exclusion is carried here unregistered (O-22). Each exclusion is listed.
  - The source is qm's call records.
  - Label: "**the estate's demand, served on this card**".
  - The value at reading 0 is `null`. *Missing:* `coi.py` computes it from qm's records over a stated window of at least 24 h. For scale only, not the registered figure, the recon read the live seats' request-derived duty as 0.37 % (ollama) and 0.29 % (vLLM) (`recon/estate.md` lines 27–28).
- **The tick figure** is a second, labelled row, with bench hours removed.
- **Scenarios:**
  - **U100** = 1, the card's ceiling.
  - **U25** = 0.25, six hours a day (D-20260912-18, `~/estate/DECISIONS.md` line 854; see O-18).
- **u\*** is solved; see §3.6.
- **Beside every u,** what it means in answers per day: answers per day = u × 86,400 ÷ t_busy.
- **Never** hour-of-day profiles. Aggregate over at least 24 h.
- **Test:** owed in `coi.py` (O-15).

### 3.5 c, concurrency (PREREG §7.2 bullet 5)

- **Two values:** c = 1 (a person at a keyboard), and c = the card's best measured.
- **Fuel at c is measured at c,** and is never carried over from c = 1.
- **Operating mode:** whatever mode the cloud's price row assumes, the local side gets the same mode, measured. Batch maps to a queued local arm. Cached input maps to a warm-prefix row.
- **Test:** owed in `coi.py` (O-15). A row carries `c` and the arm that measured its fuel.
- **At reading 0,** PREREG §9.2's list names no queued arm, so every local row is c = 1.

### 3.6 The bands on the two 24 GB cards, u\* and C\* (PREREG §7.2 bullet 6)

1. **Fuel only.** Label: "**the meter only, not a price**". It never enters a ratio with a cloud price.
2. **Levelised.** Archetype A at U100, U25 and U_demand, and archetype B.
3. **u\* and C\*.**
   - These are computed against two comparators: the same weights rented, and the frontier.
   - Each set prints its in/out tokens per item beside its u\*, because u\* is a property of the set's token mix.
   - PLAN-v2 §5 (line 228) adds a rule that PREREG does not register: C\* is computed on the card's **whole served demand** (all tenants' requests valued at the rental rate of the same work), with the bench workload as a labelled scenario. It is carried here unregistered (O-22).

**The closed forms.** Derived here from §3.1's equation. They add no new rule, and the lead confirms them (O-19). Let ρ = the comparator's $ per correct × a_L (the comparator's price per local item at equal correct answers). Let F = e·p, I = P_idle·t·p, and κ = C·CRF(n, i)·t / Y.

```
Archetype A:
  u*   = (I + κ) / (ρ − F + I)            no solution when ρ − F + I ≤ 0
  C*(u) = (u·(ρ − F + I) − I) · Y / (t · CRF(n, i))
Archetype B (fuel e_net, no idle term):
  u*_B = (V·(r + δ)·t / Y) / (ρ − e_net·p)
```

**Printed forms when there is no solution:**
- u\* > 1, or no solution: "**no break-even at this concurrency: owning costs more than renting even when busy every hour**".
- C\* ≤ 0: "**no purchase price breaks even at this duty: the idle draw alone costs more than renting**".

**$ per correct** prints **only for rows that clear B-chance** (PREREG §7.2 bullet 6).
- **The interval.** PREREG writes "(cost ÷ N × the Wilson bounds)". This file reads the grouping as `panel/economics.md` #22 writes it (line 394): cost ÷ (N × the Wilson upper bound) to cost ÷ (N × the Wilson lower bound).
- **"$ per correct above the floor"** prints beside it, labelled. PREREG and economics #22 (line 395) describe it only in words: "correct answers beyond the 24.0 % addressee floor". This file writes it as cost ÷ (K − 0.240 × N).
- The lead confirms both readings (O-19). See O-8 for sets other than c.

**Tests:**
- **T-6 (runs now):** check the closed forms against the equation, using synthetic inputs:
  `python3 -c 'Y=365.25*86400;e,Pi,t,p,C,n,a,rho=200.0,20.0,1.0,0.18/3.6e6,3000.0,3,0.8,1e-4;o=lambda u,C:(e*p+Pi*(1-u)/u*t*p+C/n*t/(Y*u))/a;F,I,k=e*p,Pi*t*p,C/n*t/Y;us=(I+k)/(rho*a-F+I);u=0.25;Cs=(u*(rho*a-F+I)-I)*Y/t*n;print("PASS" if abs(o(us,C)-rho)<1e-12 and abs(o(u,Cs)-rho)<1e-12 else "FAIL")'`
- The bands themselves are owed in `coi.py` (O-15).

### 3.7 Bias-direction table (PREREG §7.2 bullet 2; PLAN-v2 §5, line 220; `panel/economics.md` #4 (a))

For each choice, the table gives which side the primary favours and a factor. **Every factor is the alternative's cost term ÷ the primary's, on the one term the choice touches** (capital, fuel or idle), computed from the registered constants with the command below. The anchor row is read here as the local anchor `gemma4:26b-a4b-it-q4_K_M@5571076f` on each 24 GB card (see O-19).

**Why every "on the anchor row" cell is `null` at v1.** In a primary-against-alternative comparison on one row, a_L = K / N divides both sides and cancels, so the v2 strict count does not block these cells. What blocks them:
- P_idle (O-3);
- t_busy (O-11);
- the fuel basis: benchbox's (O-2, O-20) and the laptop's (O-13).

The rows for C kind, R and c each also need a value that no file holds, named in their factor cell. The panel's illustrations are cited for scale only. They used superseded inputs (a card-only C of $1,879.99, and 250 W Jev rows). PREREG §7.4 bars the panel's u\* sketch from publication.

| choice | primary | alternative (sensitivity or archetype B) | the primary favours | factor = alternative ÷ primary (computed) | on the anchor row | scale from the panel (superseded inputs; not a registered value) |
|---|---|---|---|---|---|---|
| C kind | the whole machine at replacement (a dated listing) | V × (r + δ), the user cost | renting (it charges a 2026 listing to a board that resells for less) | `null`. *Missing:* r (FRED `DTB3`, not fetched) and δ (no rule written; see O-10) | `null` | "roughly 1.5–2× the economist's user cost" (`panel/economics.md` line 112) |
| n | 3 years | 5 years | renting | capital × 0.6 (CRF(5, 0) ÷ CRF(3, 0)) | `null` | — |
| R | 0 | resale value (for the 3090, V = $1,094.44) | renting | `null`. *Missing:* no whole-machine resale figure for the rig exists in any file | `null` | "R = 0 on a 3-year life is … contradicted by the card's own market" (`panel/economics.md` line 108) |
| i | 0 | 5 % | owning | capital × 1.1016 at n = 3, and × 1.1549 at n = 5, each against i = 0 at the same n. If O-7 reads "n = 5 / i = 5 %" as one row, that row's capital is × 0.6929 against the primary (CRF(5, 5 %) ÷ CRF(3, 0)) | `null` | "+10 % at 5 %" (`panel/economics.md` line 110) |
| u | U100 | U25; U_demand | owning (at U100) | capital per answer × 4 at U25 (it scales as 1/u). The idle multiplier (1 − u)/u goes from 0 at U100 to 3 at U25, so the idle term has no ratio | `null` | "the honest u makes the result against owning stronger" (PLAN-v2 line 224) |
| c | c = 1 | c = the best measured | renting (at c = 1) | `null`. *Missing:* no best-c arm is on reading 0's list | `null` | "falls by up to ~5×" on input-heavy sets if the 0.87 s is per-request overhead (`panel/economics.md` #6 (c)) |
| idle scope | box-level where measured (benchbox `wall`) | card-only (the laptop, whose box is unmeasured) | renting, relative to card-only. Card-only "understates" | `null`. *Missing:* box and card P_idle on one card (O-3) | `null` | — |
| fuel basis | gross plus idle (A) | net, with no idle term (B) | renting, relative to net | `null`. The net basis drops P_idle × t_busy per item (economics #13). *Missing:* O-2, O-3, O-11 | `null` | "some 9 % of the energy" for a 3090 at U100 (`panel/economics.md` line 269) |
| p_e *(beyond PLAN-v2's list of eight; §7.2 registers these sensitivity rows)* | residential, 18.34 ¢ | commercial 14.19 ¢; industrial 9.17 ¢ | renting | fuel × 0.7737 (commercial) and × 0.5000 (industrial) | `null` | — |
| PSU factor *(beyond the eight; §7.2's assumed factor)* | board ÷ 0.9 where no box meter exists | board only | renting, relative to board only. Unknown relative to a true meter | fuel × 0.9 | `null` | — |

**Test (the computed factors, runs now):**
`python3 -c 'crf=lambda n,i:1/n if i==0 else i/(1-(1+i)**-n);print(round(crf(5,0)/crf(3,0),4),round(crf(3,.05)/crf(3,0),4),round(crf(5,.05)/crf(5,0),4),round(crf(5,.05)/crf(3,0),4),round(14.19/18.34,4),round(9.17/18.34,4),round(0.9,4))'`
This prints `0.6 1.1016 1.1549 0.6929 0.7737 0.5 0.9`.

### 3.8 Inputs table (every value, and where it lives)

| input | value | file (line or key) | read | status |
|---|---|---|---|---|
| C, the 3090 rig with one card, archetype A | $3,198.86 | `/workshop/s2s-research-hub/site/home-inference-and-diffusion-rig-cost/index.md` lines 3, 44 (sha `9d34409c…`); `series/cost_inputs.json` → `capital_usd.rtx-3090` | 2026-09-13 06:00–06:14Z (page line 31) | registered; see O-12 |
| C, the laptop, archetype A | $3,099.99 | `/workshop/s2s-research-hub/site/a-laptop-asked-the-desktops-questions/index.md` line 221 (sha `00b1e34f…`); `site/hardware/rows.json` line 51191 | ordered 2026-07-03 | registered |
| C, the 96 GB card | `null`, `blank_reason: "P-6"` | `series/cost_inputs.json` → `capital_usd.rtx-pro-6000`; `../ampere-ladder-2026-09/PRICES.md` line 118 | — | by rule |
| card-only LISTING, the 3090 | $1,879.99 | rig-cost `index.md` line 132; `../ampere-ladder-2026-09/PRICES.md` lines 113, 163 | 2026-09-17 15:00–15:30Z, by hand | registered, "not comparable across cards" |
| V, the 3090's resale, archetype B | $1,094.44 | rig-cost `index.md` line 124; `site/hardware/rows.json` line 11620 | August 2026 average | registered |
| r | `null` | *missing:* FRED `DTB3` at the reading's date has not been fetched. `series/cpi.py`'s fetch pattern would supply it | — | owed |
| δ | `null` | *missing:* PREREG says "from the card class's own dated price history". Neither the rule nor the value is written in any file (O-10) | — | owed |
| n, R, i (primary) | 3, 0, 0 | PREREG §7.2 bullet 2; `series/cost_inputs.json` → `life_years` | — | registered |
| n, i (sensitivity) | 5, 5 % | PREREG §7.2 bullet 2 | — | registered; O-7 |
| PSU factor | 0.9, "assumed" | PREREG §7.2 bullet 1; `series/cost_inputs.json` → `psu_factor_assumed` | — | registered |
| p_e (primary) | 18.34 ¢/kWh (June 2026, residential) | EIA page, `U.S. Total` row, line 1130 (sha `7d5bcbe3…`) | 2026-09-23 ~15:36Z | registered; O-6 |
| p_e (like period) | 17.47 ¢ (June 2025) | same row | same | registered |
| p_e (sensitivity) | 14.19 ¢ commercial; 9.17 ¢ industrial (June 2026) | same row | same | registered |
| p_e trailing-12 mean | `null` | *missing:* eleven more receipted monthly releases | — | owed |
| CPI-U | the FRED `CPIAUCSL` series | `recon/sources-economics/fred/CPIAUCSL-fetched-2026-09-23T2154Z.csv` (sha `f8ecddf5…`) plus its receipt | 2026-09-23T21:54:18Z | pinned; O-9 |
| U100, U25 | 1, 0.25 | PREREG §7.2 bullet 4; `series/cost_inputs.json` → `utilisation` | — | registered |
| U_demand | `null` | *missing:* `coi.py` over qm's call records (at least a 24 h window) | — | owed |
| Y (s per year) | 365.25 × 86,400 | `series/money.py` line 15 | — | reading-0 implementation, not a PREREG value |
| CO2e intensity | ~400 g CO2e/kWh | `/workshop/estate/docs/article/what-it-costs-to-run-v10.md` lines 60, 138 (sha `5b9a0c95…`) | — | registered, "not measured here" |
| "rent the card" hourly rate per GPU class | `null` | *missing:* no dated public hourly rate is receipted in any file. It goes in `prices.json`; none exists for the 96 GB class (⧖-12) | — | owed |
| OpenRouter snapshot | 1 file | `recon/sources-economics/prices/openrouter-models-2026-09-23T1537Z.json` (sha `9c6e2f1a…`) | 2026-09-23T15:37Z | first of the daily series (A-06 needs twelve) |

### 3.9 What this model does not price (carried from PLAN-v2; PREREG registers only the holding gain; O-22)

- **The holding gain.** It prints as a labelled line (§3.1). This one is registered (PREREG §7.2 bullet 1).
- The rest come from PLAN-v2 §5 (line 234) and §8 item 8 (line 323). PREREG does not register them, so they are carried here unregistered until the lead confirms or drops them (O-22):
  - **Operator time.** It prints as hours over the window by a stated rule, and is never priced in the headline. A dollar row needs an operator's ruling of a rate.
  - **The metered attendant.** The estate's operations run on Claude Code agents on a subscription, and the page says so plainly.
  - **The flat-rate lens.** scribe's `v_costs` meters every session; the figures are raw and not yet de-duplicated, and they are public only on an operator's word (line 234).
  - **Reliability of supply** (`supply.jsonl` and the failed-call column; line 323).
  - **The vendors' own energy disclosures**, as a labelled side table (line 323).

---

## 4 · Frontier cost (PREREG §7.3; PLAN-v2 §5, line 230)

**Per call j**, where every call counts, including failures:

```
cost_j = (in_uncached × p_in + cache_write × p_cw + cache_read × p_cr + out_total × p_out) × m_geo × m_batch
out_total includes reasoning tokens
```

**The price block**, frozen per reading, is `{url, read_date, sha, in, cached_in, cache_write, out}`.
- **Reading 0's OpenAI block:** `openai-reading-0/receipts/pricing.md` (sha `3046f29b…`), fetched from `https://developers.openai.com/api/docs/pricing.md` at **2026-09-23T15:40:55Z**, standard tier, short context (`openai-reading-0/OPENAI-READING-0.md` lines 89–90).
- **Launch-price block per id (R-4):** `openai-reading-0/receipts/launch-prices/launch-prices.json` (sha `a065e1e9…`). The lane checked all 33 quotes against their saved pages (`OPENAI-READING-0.md` line 99).
- **m_geo:** 1 on every reading-0 OpenAI call. The calls went to `https://api.openai.com/v1` (`openai-reading-0/oai.py` line 32) at the standard tier. The 10 % uplift applies only to regional-processing (data-residency) endpoints (`receipts/pricing.md` line 74).
- **m_batch:** 1. **A batch row is a receipt, not a multiplication.** Its dollars are the billed amount recorded at ingest (`openai-reading-0/run_openai.py` line 408).
- **With 3 reps:** $ per correct = the mean over reps of (that rep's bill ÷ that rep's correct answers).
- **Metered-spend test (runs now):** `sha256sum openai-reading-0/receipts/pricing.md`. The per-call dollars are in `openai-reading-0/receipts/spend.jsonl`. `series/money.py` `openai_money` (lines 131–152) re-derives the per-correct figures.

**The Claude rows** enter a ratio **only** through the **derived direct-API 1× figure**:
- **Formula:** (input tokens − the fitted scaffold) × p_in + output × p_out, at Anthropic's published prices, with **batch × 0.5** printed beside it.
- **Scaffold:** **428.8 tokens**, fitted for haiku (`anthropic-reading-0/ANTHROPIC-READING-0.md` line 448, "428.8 + 0.2348 × chars"). The per-model intercepts are in that file's projection table (from line 442). The fit is `tables_anthropic.py` `fit_tokens`, line 349 (sha read today `297075ba…`; the PREREG §10 pin is `140d75a8…`, see O-17).
- **Prices:** `anthropic-reading-0/receipts/model-facts.json` → `models.<id>.price_in_per_mtok` / `price_out_per_mtok`, each with its `source` URL, fetched 2026-09-23T16:47:12Z (sha `3305dbd2…`).
- **The CLI's `total_cost_usd`** is a list rate ("client-side estimates"), with the one-hour cache-write premium at 2×. It prints labelled and **never enters a ratio**. Cost state: **no-figure-held**.
- **Test:** `python3 -c 'import json;d=json.load(open("anthropic-reading-0/receipts/model-facts.json"));print({k:(v.get("price_in_per_mtok"),v.get("price_out_per_mtok")) for k,v in d["models"].items()})'`. The derived figure itself is owed in `coi.py` (O-15).

**Cost states** come from PREREG §2.2 and PLAN-v2 §2.2. Every row carries `cost_state`:
- **metered** (OpenAI, a receipt);
- **no-figure-held** (the Claude CLI);
- **plan-included** `$0.00*` (the ollama.com shelf; "what these tokens list at" from the OpenRouter snapshot, labelled);
- **own-silicon** (local: derived dollars on the two 24 GB cards, energy only on the 96 GB card).

`usd` is metered only. Otherwise it is null, **never 0** (PLAN-v2 App. C).

**The bar-matched cost ratio.** At bar B: (the cheapest local clearer, archetype A, stated u) ÷ (the cheapest frontier clearer of B), within one think-setting class.
- "Cheapest" = archetype-A levelised cost at the stated primary u.
- The cheapest model must clear on **both parity halves** of the set (PREREG §4.4's split), or on S1 once it exists. Otherwise the ratio is marked "provisional".
- A bar that both sides saturate prints "saturated" and no cheapest clearer (PREREG §5, "Cheapest clearer", line 311).
- **Test:** owed in `ratio.py` (O-15).

**"Renting the same weights"** = the median provider price with its quantisation stated, the minimum beside it, and `:free` excluded (the OpenRouter daily snapshot). With ⧖-21's key, the rented $ per correct is measured through the same provider. **Test:** owed in `coi.py` (O-15), with the snapshots under A-06. The snapshot series has one file today (§3.8).

**"Rent the card"** = a dated public hourly rate per GPU class × our measured seconds per answer at the same c. There is none for the 96 GB class (⧖-12). **Value today: `null`** (§3.8).

**Epoch's unit** ($ per question at a fixed accuracy) = $ per correct × accuracy. It prints for the cross-walk only.

---

## 5 · Our own staircase, `C_ours(t, bar)` (PREREG §4.5 bullet 3, moved here unchanged)

For a UTC date t and a bar, **`C_ours(t, bar)` is the minimum, taken over frontier ids released on or before t whose strict accuracy (rep mean) on the set is ≥ the bar, of $ per item at that id's launch-price block** (`openai-reading-0/receipts/launch-prices/`, R-4). This is Epoch's unit on a task set that postdates every model.

- **Bars:** **B-anchor** (PREREG §5), and **one lower bar at 60 % strict**.
- **The rate:** prints as the log-point slope from the first step to the last, plus each step's own factor. **No fitted curve.**
- **Survivorship:** listed. These are the ids that could have been on a step and are no longer callable, with their closure dates.
- **Output:** one sentence, *Epoch's 47 %/quarter on public benchmarks against X %/quarter on a set no model could have seen*, with the direction held in advance (PLAN-v2 §1's prediction, restated in §6).
- **Reading 0 display:** per R-14a (RULINGS lines 366–374, which win over PREREG), the right panel of chart C2 at reading 0 shows this within-reading staircase at the launch price **and** today's price, in nominal dollars on its own log axis. It carries the caption "reading 0: dollars on our tasks, not comparable in level with Epoch's index; compare slopes only". A CPI-U-deflated column goes beside it. From reading 1, C2 switches to R-14's index. A-00 says R-14a is folded by amendment A-10 (see O-16).
- **Test:** owed in `ratio.py` (O-15). It reads `series.jsonl` and the launch-price block only, types no number, and refuses before A-05.

---

## 6 · Bench 3's decision rule: the form (PREREG §7.4)

There are three outcomes at each bar, and they apply to forward readings only:
- ***toward ownership*** when the bar-matched owned ÷ rented cost ratio fell by more than the registered band;
- ***against*** when it rose by more than the band;
- ***inconclusive*** otherwise.

**The band** = the OpenRouter daily snapshots' own quarter-on-quarter price spread, combined with the accuracy interval carried into $ per correct. **A-06 carries the band's numbers** once twelve daily snapshots exist. Until then the rule prints "**band not yet registered**".

`ratio.py` prints the earliest reading that can answer. **No ×/year figure from readings under 12 months apart.**

**The prediction** (PREREG §7.4, from PLAN-v2 §1): at B-anchor, the cloud's $ per correct falls faster than the owned figure by a factor between 1 and 1.6 a year. The result that argues against owning is publishable. The panel's u\* ≈ 0.87 and 1.11 on the Jev rows is a sketch on superseded inputs and will not be published.

**Band value today:** `null`. *Missing:* A-06, after twelve daily snapshots. **Test:** owed in `ratio.py` (O-15).

---

## 7 · Reading 0's window and close rule (PREREG §9.1)

- **Opened:** 2026-09-23T15:43:21Z (the smoke's first scored row).
- **Closes** at the **earlier** of "every registered cell done" and **2026-09-25T12:00Z** (the pour freeze).
- `reading_closed_utc` is written to `KIT.lock.json` (A-04) and to every row.
- **The cell list decides, not the calendar.**
  - A cell on PREREG §9.2's list that lands before the close is reading 0.
  - A cell not on the list is **reading 0.1** even if it lands earlier. Reading 0.1 closes no later than **2026-10-14T00:00Z**.
  - A cell measured after a close belongs to the next reading, never to a page already poured.
- **Reading 1:** 2026-12-23 UTC, with `S1-2027Q1`.
- **Test:** `python3 -c 'import json;print(json.load(open("KIT.lock.json"))["reading_0"]["reading_closed_utc"])'` must print a stamp ≤ `2026-09-25T12:00:00Z` once the reading closes.
  - As read 2026-09-24 ~13:5xZ, `KIT.lock.json` exists as A-04's draft (`written_utc` 2026-09-24T13:42:39Z, sha `5308dfbc…`), not yet carried by an amendment. It keeps the stamp at `reading_0.reading_closed_utc`, and that value is `null` until the close.
  - Every row's `reading` is also checked against §9.2's cell files (shas in PREREG §10).
  - Both checks are owed in `coi.py` (O-15).

---

## 8 · Row fields this file governs (PLAN-v2 App. C, line 503, as PREREG amends it)

`energy_instrument` takes one of **`board | wall | box-delta | rapl | none`**. PREREG §7.1 adds `rapl`, which App. C's list omits (O-14).

App. C has one `energy_instrument` and one `joules_*` triple per row. Every local box carries two instruments (§1), so where the second one goes is open (O-23).

The other fields:
- `joules_gross`, `joules_net`, `joules_compute_phase`
- `shared_card`, `cotenant_requests`, `collided`
- `archetype` (`A | B | null`)
- `usd` (metered only; null otherwise, never 0), `usd_derived_direct` (Claude rows)
- `cost_state`, `price_block_ref`, `blank_reason`
- `posture`, `persistence`
- `prompt_tokens`, `cached_tokens`, `eval_tokens`, `reasoning_tokens`
- `seconds_wall`, `ttft_s`, `prompt_eval_ms`, `eval_ms`, `load_ms`, `total_ms`
- `reading`, `reading_closed_utc`
- `metrics_version` (`"v1"`)

---

## Open before A-02: questions PREREG leaves open, and contradictions found while writing (stated, not resolved)

- **O-1 · Net of idle cannot be computed on reading-0 rows.**
  - PREREG §7.1 bullet 3: "the median of the 60 s before each task in a minute whose co-tenant journal shows no request".
  - Every reading-0 local trace holds a 10 s resident-idle read (`run.py` lines 770–782) and a 15 s pre-load read (`coi3090.py` line 470). For example, `k0a-gemma4-anchor-cd.c.idle.csv` spans 17:53:18Z → 17:53:27Z and the task starts at 17:53:28Z.
  - Tasks run back to back, so the 60 s before task d contain task c's load.
  - `panel/compute.md` S-10's fallback ("otherwise takes the next quiet minute and states the stamp", line 304) did not reach PREREG.
  - The rows' "net" figures (`report.json` → `energy.net_joules_per_decision`) are therefore not the registered quantity. Whether they print, and under what label, is the lead's call.
- **O-2 · benchbox's fuel basis for archetype A.**
  - PREREG §7.2 reads "Fuel **gross** (whole-window board J; **benchbox's UPS net of box idle**; …) **plus idle** P_idle × (1 − u)/u × t_busy".
  - The ruling-level source of "net of box idle" is R-10b (RULINGS line 146: "wall figures net of the box's idle"), and RULINGS outranks PREREG. The words in §7.2 come from economics C-24 (`panel/economics.md` lines 403–405).
  - Net-of-idle fuel plus the (1 − u)/u idle term is the form economics #13 (`panel/economics.md` line 269) shows loses P_idle × t_busy.
  - The pre-freeze series builder uses the UPS joules **gross**, with the no-model box idle as P_idle (`series/lanes.py` lines 333–336).
- **O-3 · Which P_idle, and the wall's one-minute rule for the idle reads.**
  - PREREG does not say whether P_idle is the no-model (pre-load) idle or the model-resident idle, or at card or box scope.
  - benchbox's box idle reads come from windows under a minute. `arm.json` → `idle_preload.wall`: the window is set to 15 s (`coi3090.py` line 470), and k0a's record holds 13.0 s of wall samples (14 samples). `tasks_run.c.wall_idle_resident` covers 8.0 s.
  - That contradicts "honest over a task window of a minute or more" (PREREG §7.1; `NOTES.md` line 38, "Read no WALL figure from a window under a minute"). The task windows have the same problem (O-20).
- **O-4 · Per-token energy.**
  - PREREG says "the power integrated over the server-timed phase".
  - The lanes compute the task-window mean W × the summed phase seconds (`analyse_laptop.py` lines 127–131, the "apportion_note"; benchbox `analyse.py` lines 224–225). At 1 Hz, with sub-second phases per item, the two differ.
- **O-5 · `j_per_1k_decode_probe@roster` holds "exactly" only where the roster's conditions hold.**
  - Those conditions are `gemma4:26b` or `mistral-small3.2:24b`, Q4_K_M, ollama 0.32.13, 256 tokens out (`compare_cards.py` lines 287–347).
  - The anchor is `gemma4:26b-a4b-it-q4_K_M@5571076f`. The registry's bare tag `gemma4:26b` is `08ae7ec1…` (MTP draft plus vision projector) per PREREG D-15 and the Jev substrate receipt (`../jev-2026-09-21/receipts/2026-09-21-substrate.md`). benchbox's probe includes that MTP draft (`NOTES.md` lines 87–88).
  - **No roster file records which digest the roster's `gemma4:26b` rows ran.** `site/hardware/rows.json` carries no digest field, and `compare_cards.py` matches on the tag only. The tier bench's leg-H pin file names benchbox's own `gemma4:26b` as `08ae7ec1744b…` and the laptop's system-store `gemma4:26b` as `5571076f3d70…` (`../tier-10-12gb-2026-09-19/harness/legh_pins.py` lines 25–28 and 31–33). So the tag alone does not fix the bytes, and the equivalence between the roster's rows and either digest is unsourced.
  - The roster's arithmetic uses the busy-sample mean W (`bench_gpu.py`). The lanes' probe uses the window mean W.
- **O-6 · p_e for reading 0.**
  - "The latest … month at the reading's date": reading 0 opened 2026-09-23 and closes by 2026-09-25T12:00Z, and the July month releases 2026-09-24, between those two dates.
  - No file holds July. This file carries June 2026 as PREREG freezes it.
- **O-7 · "n = 5 / i = 5 %".** This could be one sensitivity row (n = 5 with i = 5 %) or two (n = 5; i = 5 %). PREREG §7.2 and PLAN-v2 §5 use the same slash. §3.7 gives the factor for both readings.
- **O-8 · $ per correct is gated on B-chance, which PREREG §5 registers on set c only.**
  - "Above the floor" uses the 24.0 % addressee floor, which is also c only.
  - These have no registered gate or floor for a price: the sets a, d48, f40, j and task_b; the registered derived ids `task_a@8k`, `doorman36-json` and `f60` (PREREG §1.1); and `d36`.
  - `d36` appears in §4.3 (line 272) and in §5's B-seat row, but §1.1's table does not define it.
- **O-9 · The CPI-U deflation base month is not registered.**
  - `series/cpi.py` lines 14–18 use "the latest month the pinned series publishes". A price in an unpublished month is taken at factor 1.
  - The pinned series has no value for 2025-10.
- **O-10 · r and δ.** `DTB3` has not been fetched. The δ rule is "stated" nowhere: PLAN-v2 §5 line 217 and `panel/economics.md` line 125 both say "with the rule stated" but give no rule.
- **O-11 · t_busy is not defined in PREREG.**
  - The reading-0 implementation takes the task window ÷ items (`series/money.py` line 95).
  - PLAN-v2 §2.4 (line 90) requires the ~0.87 s per item of unaccounted time to be named before t_busy enters a capital figure. benchbox's `NOTES.md` lines 82–86 attributes most of it to the per-call `load_duration`.
- **O-12 · The 3090's archetype-A C is built on a struck figure.**
  - $3,198.86 = $1,348.87 ("everything but the cards") + **$1,849.99** (the card on 2026-09-13), per rig-cost `index.md` lines 35, 43 and 44.
  - PREREG §7.2 strikes "the $1,849.99 figure (article M-2)". `../ampere-ladder-2026-09/PRICES.md` line 165 marks it "NO for this article … superseded by the 17 September hand-read".
  - "Re-read each reading" has not produced a newer whole-rig figure in any file.
- **O-13 · The laptop has two energy bases.** §7.1 says its energy figures are "board + package". §7.2's fuel is "board ÷ 0.9, assumed". Where the second basis goes in a row depends on O-23.
- **O-14 · `energy_instrument` enum.** PLAN-v2 App. C lists `board | wall | box-delta | none`. PREREG §7.1 adds `rapl`, and this file follows PREREG.
- **O-15 · `coi.py` and `ratio.py` have no amendment number.**
  - Most tests above are owed in them.
  - PREREG §0 says rules are "applied by scripts … `ratio.py`, `coi.py` … this week", and that a test that cannot run yet names "which amendment will carry the sha". §9.3 assigns no A-nn to these two scripts.
  - Neither file exists in the bench root (find, 2026-09-24 ~13:5xZ).
- **O-16 · A-10 is referenced and absent.**
  - A-00 says R-14a "is folded by amendment **A-10** below", and that A-05 follows A-01 … A-04 **and A-10**.
  - The file ends at A-00 (line 498).
- **O-17 · PREREG §10 pins that the files at the freeze commit `3abb216b` no longer match.** Each file's sha at the freeze equals today's:

  | file | at the freeze | PREREG §10 pin | last commit |
  |---|---|---|---|
  | `rtx-pro-6000-reading-0/instrument/coilargecard.py` | `ac9f40eb` | `f5f19bb0` | `01262c20` |
  | `rtx-pro-6000-reading-0/instrument/guard.py` | `3c7d72c5` | `87d62db1` | `01262c20` |
  | `anthropic-reading-0/tables_anthropic.py` | `297075ba` | `140d75a8` | `6b73f291` |
  | `anthropic-reading-0/run_anthropic.py` | `2ca74176` | R-21 pin `29605396` | `6b73f291` |
  | `rtx-3090-reading-0/instrument/analyse.py` | `74395ddc` | `08a158f6` | `970fec3f` |

  The files this document cites for tests are listed under Sources with the sha read today. One observation: `rtx-pro-6000-reading-0/instrument/benchbox_parser.py` reads `08a158f6…` today, which is the sha that PREREG §10 pins for benchbox's `analyse.py`.
- **O-18 · The id D-20260912-18 appears twice in `~/estate/DECISIONS.md`.** Line 660 is the docent's v1.0.0 deployment. Line 854 is the "six hours a day" ruling that U25 cites.
- **O-19 · Readings this file makes of PREREG's words, for the lead to confirm.**
  - "The anchor row" in the bias table is read as the local anchor on each 24 GB card (PLAN-v2 line 220's example is the 3090).
  - §3.1's equation writes "answers served per year" as u·Y/t.
  - The u\*/C\* closed forms in §3.6 are this file's algebra from that equation.
  - The Wilson interval's grouping follows economics #22, line 394 (§3.6).
  - "$ per correct above the floor" = cost ÷ (K − 0.240 × N). PREREG and economics #22 give it only in words (§3.6).
- **O-20 · benchbox's wall fuel is read over windows under a minute.**
  - §7.2 makes benchbox's UPS the archetype-A fuel instrument. §7.1, §1 here and `NOTES.md` line 38 say a wall reading is honest only over a minute or more, and never per item.
  - 51 of the 93 `tasks_run.*.wall_task.seconds` values in benchbox's 52 `rows/*/arm.json` files are under 60 s (one of the 52, `b-nemotron3-nano-30b`, has no `tasks_run`). Without the `dryrun-k0` dry run, it is 49 of 91. Examples: `b-falcon-7b` c 31 s and d 15 s; `b-glm4.7-flash` d 32 s; `b-gemma1.1-7b` c 59 s; the anchor `k0a-gemma4-anchor-cd` d 50 s (T-2b).
  - `series/lanes.py` lines 333–336 already take the UPS joules over these windows as busy energy.
  - benchbox's analyser also writes per-token wall figures from the probe windows (`analyse.py` lines 269, 270 and 285: `wall_j_per_gen_token_phase`, `tok_s_per_wall_w`, `wall_j_per_prompt_token_window`). All 39 probe records in `rtx-3090-reading-0/rows/figures.json` have decode and prefill windows under 60 s; the longest decode window is 26.01 s.
  - O-3 covers only the idle windows. PREREG gives no fallback for a task window under a minute. The lead's call.
- **O-21 · The J/1k names: unit and scope.**
  - **Unit.** PREREG §7.1 calls `j_per_decode_token_task` and `j_per_prompt_token_task` "named J/1k quantities". Their names, and every lane's implementation, are per token (`analyse_laptop.py` lines 127–128; benchbox `analyse.py` lines 224–225; `series/schema.py` lines 96–97). The two readings differ by a factor of 1,000, so §2 leaves the unit open.
  - **Scope.** The same bullet first registers "J per generated token (decode) and per prompt token (prefill)" in its own clause, and R-10 (RULINGS lines 121–123) registers both plus "J per 1,000 tokens, the tier bench's existing unit". PREREG does not say that the three names are the only J-per-token quantities, and this file no longer says so.
  - **Unregistered names in use.** The series writes `j_per_gen_token`, `j_per_1k_decode_probe` and `j_per_prompt_token` from the probes (`series/lanes.py` lines 323–326; `j_per_prompt_token` is the prefill probe's J per token). The task figure goes by `j_per_gen_token_apportioned` (benchbox, the desktop's larger card), `j_per_decode_token_task` (laptop) and `j_per_gen_token_task` (series). Every lane also writes `j_per_1k_tokens_all`, a J/1k over prompt and generated tokens together (benchbox `analyse.py` line 223; `analyse_laptop.py` line 126; `benchbox_parser.py` line 219). The laptop's `rows/FIGURES.md` prints it as "BOARD J per 1k tokens (in+out)" (line 39).
  - How each maps to the registered names is the lead's call.
- **O-22 · PLAN-v2 rules this file carries that PREREG did not register.** PREREG's precedence line says it is "where the plan's proposals stop being proposals", so each needs the lead to confirm or drop it:
  - the canary's exclusion from U_demand (PLAN-v2 line 224; §3.4);
  - C\* on the card's whole served demand, with the bench workload as a labelled scenario (PLAN-v2 line 228; §3.6);
  - the "does not price" list: operator time, the metered attendant, the flat-rate lens (PLAN-v2 line 234), reliability of supply and the vendors' energy disclosures (line 323); §3.9;
  - PLAN-v2 #15 (line 441) also puts `coefficients.json` and the context-census boundary rule into METRICS v1. PREREG §9.3 does not list either. §1.1 registers the boundary rule for `task_a@8k`, and no `coefficients.json` exists in the bench root (find, 13:5xZ).
- **O-23 · The row schema allows one instrument per row.**
  - App. C (PLAN-v2 line 503) gives one `energy_instrument` and one `joules_gross` / `joules_net` / `joules_compute_phase` triple per row. benchbox (board + wall), the laptop (board + rapl) and the desktop's larger card (board + box-delta) each carry two instruments.
  - §8 of this file and PREREG §7.1 do not say where the second one goes: a second row per instrument, extra columns, or a sub-object.
  - The pre-freeze series schema answers it one way: `energy_instruments` joined with "+", and one `j_per_correct_<instrument>` column per instrument (`series/schema.py` lines 86–104). Neither App. C nor PREREG registers that form. O-13 depends on the answer.
- **O-24 · psys is still named "the platform's own reading", and can still enter a figure.**
  - PREREG §7.1 and the R-10d addendum say psys is labelled IMPLAUSIBLE and never enters a figure.
  - `coilaptop.py` writes "psys = the platform's own reading (not wall)" into each RAPL block's `instrument` string (lines 29 and 432–433), and every laptop `arm.json` carries it. `series/schema.py` line 102 describes `j_per_correct_psys` the same way.
  - `series/lanes.py` lines 309–316 drop psys only when its mean is below package-0's. Otherwise they write `j_per_correct_psys`, which is a conditional exclusion, not "never".

---

## Sources read for this file (sha256 as read 2026-09-24 ~13:1xZ–13:5xZ, the laptop)

| file | sha256 (first 8) | used for |
|---|---|---|
| `PREREG-S0.md` | `withheld-2026-09-29` | §§0, 1.1, 2, 4.3, 4.5, 5, 7, 8, 9, 10 |
| `RULINGS-2026-09-23.md` | `withheld-2026-09-29` | R-4, R-6, R-10 … R-10d, R-12, R-14, R-14a, R-16, R-20 |
| `PLAN-v2.md` | `withheld-2026-09-29` | §2.4, §5, §8 item 8, #15, App. C |
| `SERIES-SETS.md` | `withheld-2026-09-29` | set ids |
| `panel/economics.md` | `eea90362` | #1, #4, #6, #11, #13, #22–#24 (scale, derivation) |
| `panel/compute.md` | `cef39a59` | S-10's idle rule and its fallback |
| `recon/economics.md` | `withheld-2026-09-29` | §4.1–§4.2 cost model origin |
| `../jev-2026-09-21/run.py` | `withheld-2026-10-14` | `Boards`, `idle_reading` |
| `rtx-3090-reading-0/instrument/coi3090.py` · `NOTES.md` · `rows/wall-cadence.json` · `instrument/analyse.py` · `rows/figures.json` | `d16088cd` · `7f3d6ffc` · `fe513fea` · `74395ddc` · `ba7d6e9d` | probes, wall, idle windows, J/1k, per-token wall figures |
| `laptop-reading-0/instrument/coilaptop.py` · `analyse_laptop.py` · `tables_laptop.py` | `0b5dcb41` · `24da34be` · `d6a727d6` | rapl, per-token apportionment, the IMPLAUSIBLE label |
| `laptop-reading-0/LAPTOP-READING-0.md` · `rows/FIGURES.md` · `tables_laptop.py` (lane root) | `withheld-2026-09-29` · `63c5a55b` · `31ace3af` | the IMPLAUSIBLE label; `j_per_1k_tokens_all`'s printed name |
| `rtx-pro-6000-reading-0/instrument/coilargecard.py` · `guard.py` · `benchbox_parser.py` | `ac9f40eb` · `3c7d72c5` · `08a158f6` | the CP2000 reader; the desktop's larger card's per-token field names |
| `/workshop/s2s-research-hub/tools/compare_cards.py` | `48bdae21` | the roster's J/1k conditions |
| `../tier-10-12gb-2026-09-19/harness/benchlib.py` · `bench_gpu.py` · `legh_pins.py` | `1bb86997` · `21359b77` · `85badc4d` | the roster's J/1k arithmetic; the two boxes' `gemma4:26b` digests |
| `series/money.py` · `series/cost_inputs.json` · `series/lanes.py` · `series/cpi.py` · `series/schema.py` | `60a4e0bf` · `95b71dff` · `86f615f1` · `e45c059c` · `cb269567` | the reading-0 implementation of the inputs, names and instruments |
| `KIT.lock.json` (A-04's draft, not yet carried) | `5308dfbc` | the close stamp's key |
| `recon/sources-economics/prices/eia-epm-table-5-6-a-read-2026-09-23.html` | `7d5bcbe3` | p_e |
| `recon/sources-economics/fred/CPIAUCSL-fetched-2026-09-23T2154Z.csv` | `f8ecddf5` | CPI-U |
| `recon/sources-economics/prices/openrouter-models-2026-09-23T1537Z.json` | `9c6e2f1a` | renting the same weights (first snapshot) |
| `/workshop/s2s-research-hub/site/home-inference-and-diffusion-rig-cost/index.md` (exhibit 46) | `9d34409c` | C (3090 rig), V, LISTING |
| `/workshop/s2s-research-hub/site/a-laptop-asked-the-desktops-questions/index.md` (exhibit 57) | `00b1e34f` | C (the laptop) |
| `/workshop/s2s-research-hub/site/hardware/rows.json` | `37577d9f` | the same prices as shelf rows; no digest field |
| `../ampere-ladder-2026-09/PRICES.md` | `9fe129b1` | P-6; the struck $1,849.99 |
| `/workshop/estate/docs/article/what-it-costs-to-run-v10.md` | `5b9a0c95` | CO2e intensity |
| `openai-reading-0/receipts/pricing.md` · `OPENAI-READING-0.md` · `oai.py` · `run_openai.py` · `receipts/launch-prices/launch-prices.json` | `3046f29b` · `withheld-2026-09-29` · `68802ee0` · `03de0fa5` · `a065e1e9` | the frontier price block, m_geo, m_batch |
| `anthropic-reading-0/ANTHROPIC-READING-0.md` · `tables_anthropic.py` · `receipts/model-facts.json` | `withheld-2026-09-29` · `297075ba` · `3305dbd2` | the scaffold fit, Anthropic prices |
| `smoke/SMOKE-REPORT.md` | `731e9ed8` | cold runs only (§4) |

**Rows and figures the author had seen while writing.**
- The author read no v2 score, and computed no ratio, ladder or cost figure.
- **Draft 1:**
  - For T-1, the author re-integrated one raw board file, `rtx-3090-reading-0/rows/k0a-gemma4-anchor-cd/k0a-gemma4-anchor-cd.c.watts.csv`, against its report.
  - The author read the key names of that arm's `arm.json` and `probes.json`, and the trace stamps of its `.idle.csv`, `.watts.csv`, `.ext.csv`, `wall.csv` and `idle-preload.board.csv` files (for O-1 and O-3).
  - The author read the laptop's `k1-mistral-v0.1-cd/arm.json` RAPL means (for T-4).
  - The author read the K0-vs-Jev and K1 figures quoted in `rtx-3090-reading-0/instrument/NOTES.md` lines 42–54.
  - The author read the panel's superseded illustrations in `panel/economics.md` (u\* 0.538 / 0.687 / 0.867 / 1.107 in its receipts block).
- **Draft 2:**
  - benchbox's 93 `wall_task.seconds` values, with the 51 under 60 s listed by arm and task.
  - k0a's `idle_preload` block (board 14.0 s, wall 13.0 s at a mean of 97.9 W) and its `wall_task` and `wall_idle_resident` blocks (c: wall mean 238.9 W over 103.0 s; d: 245.4 W over 50.0 s).
  - The 39 benchbox probe windows (all under 60 s), and the laptop `figures.json` probe values for `dry12-anchor-4096` and `k0a` (1.443 / 1.444 tokens per J), against the re-run's probe (1.426).
  - The pass counts of T-7, T-7b, T-9, T-10 and T-11. T-10 (a)'s set of benchbox rows' cap and persistence values.
  - T-8's per-item speeds on the anchor's c row: decode median 135.2 and p95 136.6 tok/s; prefill median 2,711.7 and p95 2,916.7 tok/s.
  - The key names of `KIT.lock.json` and its `reading_0` block.
- None of these shaped a definition above. Every definition is PREREG §7's, §4.5's or §9.1's. The tests and open items above were written after reading them.
