# CB-5 fold: the 96 GB card's 70B window, read after its restore

**Written:** 2026-09-28, 08:50Z → 09:12Z (UTC, `date -u` on the laptop), by the CB-5 fold strand of the quick-wins workflow (prep only: nothing on the desktop was written, started, stopped or changed; every the desktop read was read-only; nothing was committed, pushed or posted). **What it folds:** CB-5, the cost-of-intelligence window on the desktop's 96 GB card (the desktop's larger card, the NVIDIA RTX PRO 6000 Blackwell Workstation Edition) at 300 W, opened by timer at 2026-09-28T08:00:07Z (estate D-20260928-001; `rtx-pro-6000-reading-0/PASTES-CB5-2026-09-27.md`, OVERNIGHT section). **Read with:** the kit's own `analyse.py` and the series' own `v2score.py` (parser v2) and `ladder.py`, from estate origin/master `864f8122`, on copies of the desktop's rows (§11).

---

## §0 · One screen

**The window ran 39 minutes, not 90, and the box is back.** The guard stopped the bench at 08:39:22Z on its I-3 rule (the door reader on this laptop went silent for 300 s). The dead-man restored the desktop's larger card to 420 W and the docent seat by itself: receipt `RESTORED` at 08:42:06Z, docent `/health` 200 after 155 s. Nothing is owed on the desktop.

**The silence was our own bug, not a door event.** `i3_reader.py` crashed at 08:34:40Z with a `UnicodeDecodeError`. It reads the mini node's day ledger with `tail -c 3000000` and decodes strictly as UTF-8. The ledger is 4,989,272 bytes today, and 3,008 of its lines hold non-ASCII text, so a 3 MB cut eventually lands inside a multi-byte character. **This must be fixed before any later window** (§6 has the two-line fix). Every later window would otherwise die the same way once the day's ledger passes 3 MB.

| Arm block | Arms | DONE | STOPPED | NOT RUN |
|---|---:|---:|---:|---:|
| The two M-9 anchors | 2 | 2 | 0 | 0 |
| The five 70B-class `w-*` arms | 5 | 5 | 0 | 0 |
| The six ★ rows | 6 | 1 | 1 | 4 |
| All | 13 | 8 | 1 | 4 |

- **Every arm that started loaded whole on the desktop's larger card** (0 MiB on the second board). The cap held at 300 W on every task, and no task was voided by a gate (`voided_by_gate` is null on all 18 tasks).
- **The 70B headlines, six-way (`c`, 108 items, parser v2 strict):** llama3.3:70b 93, qwen2.5:72b 93, gpt-oss:120b (think low) 84, llama3:70b 71 and llama2:70b-chat 1. llama2's 1 comes from 104 `late_letter` format failures (lenient 42). On the doorman set (`d`, 48): llama3.3 46, qwen2.5 41, llama3 36, gpt-oss 35 and llama2 24.
- **Both anchors reproduced reading 0 exactly.** The gemma4 anchor read 86/108 and 35/48, and mistral:v0.1 read 10/108 and 0/48. Their replies are byte-identical to reading 0's 420 W beside rows on all 312 items.
- **The plan's predictions, read with R-15's own test** (informational: §4 says why): llama3.3 clears B-anchor plain, not with margin (**held**). qwen2.5 was predicted to clear with margin, and it clears plain only (**missed**). llama2 fails B-chance (**held**). gpt-oss:120b was predicted at about 83 and read 84 (**held**).
- **Speed at 300 W:** the dense 70B arms decode at 24.3–26.3 tok/s, and gpt-oss:120b at 161.0 tok/s. The four dense 70B arms took 4 m 33 s to 5 m 33 s each, against the prep's 20–24 min. gpt-oss:120b took 5 m 45 s, against 9–12 min.
- **The UPS stayed calm:** the window-mean load was 27.2 % (budget ≤ 50 %) with a 51 % peak. The minimum runtime was 500 s, with 0 I-6 low rows and 0 stops.
- **Owed**, in order (§10): (1) the reader fix; (2) the rows home (L6, not done by this strand); (3) the A-17 (8) `cells.py` follow-up before any CB-5 row enters the series; (4) a ruling on st-gemma2-27b's energy (A-17 (4) voids it); (5) a short CB-5b for the four NOT RUN ★ rows and gemma2's probes.
- **For the lead:** the RESTORED receipt came at 08:42:06Z, before the ~09:30Z the overnight orders assumed. O-1's gate (d), "the real run starts after CB-5's RESTORED receipt", is open.

---

## §1 · What ran, arm by arm

The source is each arm's `arm.json` (`pin`, `tasks_run.<t>.cap_held`, `tasks_run.<t>.voided_by_gate`) and the verdict files beside it (`STOPPED.json`, `REFUSED.json`, `FAILED.json`, `*.VOID.json`). The rc is the driver's `ARM … rc=` line in `window/current.log`. The order is `window/arms-cb5.txt` (sha `c5cc49b9…`, equal on the desktop and on origin/master).

| # | Arm | Pin | Started (UTC) | Ended (UTC) | Rc | Verdict | Whole | Growth on the desktop's larger card (MiB) | On the second board (MiB) | Cap held, `c` | Cap held, `d` | `voided_by_gate`, `c` | `voided_by_gate`, `d` |
|---:|---|---|---|---|---:|---|---|---:|---:|---|---|---|---|
| 1 | `b-gemma4-anchor-cd` | `5571076f3d70` | 08:00:19 | 08:05:08 | 0 | DONE | True | 18,402 | 0 | True | True | None | None |
| 2 | `b-mistral-v0.1-cd` | `b17615239298` | 08:05:09 | 08:07:08 | 0 | DONE | True | 5,100 | 0 | True | True | None | None |
| 3 | `w-llama3.3-70b-cd` | `a6eb4748fd29` | 08:07:08 | 08:11:56 | 0 | DONE | True | 42,114 | 0 | True | True | None | None |
| 4 | `w-qwen2.5-72b-cd` | `424bad2cc13f` | 08:11:56 | 08:16:29 | 0 | DONE | True | 46,688 | 0 | True | True | None | None |
| 5 | `w-llama3-70b-cd` | `f04e196898af` | 08:16:29 | 08:21:38 | 0 | DONE | True | 42,114 | 0 | True | True | None | None |
| 6 | `w-gpt-oss-120b-low-cd` | `a951a23b46a1` | 08:21:38 | 08:27:23 | 0 | DONE | True | 62,280 | 0 | True | True | None | None |
| 7 | `w-llama2-70b-chat-cd` | `8f88029f07f8` | 08:27:24 | 08:32:57 | 0 | DONE | True | 41,498 | 0 | True | True | None | None |
| 8 | `st-yi-34b-cd` | `5f8365d57cb8` | 08:32:57 | 08:35:40 | 0 | DONE | True | 20,080 | 0 | True | True | None | None |
| 9 | `st-gemma2-27b-cd` | `cfd95e5696e9` | 08:35:40 | 08:39:28 | 6 | STOPPED by the guard, in its probes | True | 18,224 | 0 | True | True | None | None |
| 10 | `st-phi4-14b-cd` | `ac896e5b8b34` | Not started | Not started | None | NOT RUN: the guard tripped | None | None | None | None | None | None | None |
| 11 | `st-qwen3-30b-a3b-2507-cd` | `19e422b02313` | Not started | Not started | None | NOT RUN: the guard tripped | None | None | None | None | None | None | None |
| 12 | `st-qwen3.6-27b-cd` | `3a40c32f1450` | Not started | Not started | None | NOT RUN: the guard tripped | None | None | None | None | None | None | None |
| 13 | `st-deepseek-r1-32b-on-c` | `edba8017331d` | Not started | Not started | None | NOT RUN: the guard tripped | None | None | None | None | None | None | None |

- **The posture on every arm** was `300.00 W enforced (a ruled rung)`, from `arm.json` `posture_verdict`, with `params.cap_w` = 300.0. Every arm ran in mode `window` on ollama 0.32.13 with `rehearsal` = false. `os` reads Ubuntu 26.04 LTS on kernel 7.0.0-31-generic.
- **st-gemma2-27b-cd:** both of its tasks finished before the trip. The task windows (`board_task_window_epoch`) were `c` 08:36:20Z → 08:37:43Z and `d` 08:37:56Z → 08:38:41Z, and the trip came at 08:39:22Z. The stop landed in its probes (`STOPPED.json` `"stopped": "guard-probes"`), so it has no probe figures. Its accuracy stands. Its energy is a ruling (§5).
- **No arm was REFUSED or FAILED, and no task was cut (`CUT`).** No `*.VOID.json` exists.

## §2 · Accuracy under parser v2

The source is `series/v2score.py` `score_pass()` (the frozen parser v2 with its sha check and 48-case selftest) on each copied row file. The last column is `analyse.py`'s lane-parser strict count, and it equals v2's on all 18 tasks. Every pass is complete (`fingerprint_ok` true, 0 missing, 0 stray, 0 instrument artefacts, 0 template-suspect), so each prints a `rate`.

| Arm | Task | V2 strict correct | Items scored | V2 strict (%) | Rate status | Lenient correct | V1 correct | Format failures | Lane-parser strict (analyse.py) |
|---|---|---:|---:|---:|---|---:|---:|---:|---:|
| `b-gemma4-anchor-cd` | `c` | 86 | 108 | 79.6 | `rate` | 86 | 86 | 0 | 86 |
| `b-gemma4-anchor-cd` | `d` | 35 | 48 | 72.9 | `rate` | 35 | 35 | 1 | 35 |
| `b-mistral-v0.1-cd` | `c` | 10 | 108 | 9.3 | `rate` | 10 | 10 | 0 | 10 |
| `b-mistral-v0.1-cd` | `d` | 0 | 48 | 0.0 | `rate` | 21 | 12 | 48 | 0 |
| `w-llama3.3-70b-cd` | `c` | 93 | 108 | 86.1 | `rate` | 93 | 93 | 0 | 93 |
| `w-llama3.3-70b-cd` | `d` | 46 | 48 | 95.8 | `rate` | 46 | 46 | 0 | 46 |
| `w-qwen2.5-72b-cd` | `c` | 93 | 108 | 86.1 | `rate` | 93 | 93 | 0 | 93 |
| `w-qwen2.5-72b-cd` | `d` | 41 | 48 | 85.4 | `rate` | 41 | 41 | 0 | 41 |
| `w-llama3-70b-cd` | `c` | 71 | 108 | 65.7 | `rate` | 94 | 94 | 27 | 71 |
| `w-llama3-70b-cd` | `d` | 36 | 48 | 75.0 | `rate` | 36 | 36 | 4 | 36 |
| `w-gpt-oss-120b-low-cd` | `c` | 84 | 108 | 77.8 | `rate` | 84 | 84 | 0 | 84 |
| `w-gpt-oss-120b-low-cd` | `d` | 35 | 48 | 72.9 | `rate` | 35 | 35 | 0 | 35 |
| `w-llama2-70b-chat-cd` | `c` | 1 | 108 | 0.9 | `rate` | 42 | 42 | 104 | 1 |
| `w-llama2-70b-chat-cd` | `d` | 24 | 48 | 50.0 | `rate` | 32 | 27 | 19 | 24 |
| `st-yi-34b-cd` | `c` | 19 | 108 | 17.6 | `rate` | 28 | 28 | 40 | 19 |
| `st-yi-34b-cd` | `d` | 36 | 48 | 75.0 | `rate` | 36 | 36 | 0 | 36 |
| `st-gemma2-27b-cd` | `c` | 72 | 108 | 66.7 | `rate` | 72 | 72 | 0 | 72 |
| `st-gemma2-27b-cd` | `d` | 41 | 48 | 85.4 | `rate` | 41 | 41 | 1 | 41 |

Where the format failures sit (the parse_v2 classes other than `clean` and `letter+name`, which are scored):

| Arm | Task | Format class (parse_v2) | Items |
|---|---|---|---:|
| `b-gemma4-anchor-cd` | `d` | `unparsed` | 1 |
| `b-mistral-v0.1-cd` | `d` | `json_verdict` | 48 |
| `w-llama3-70b-cd` | `c` | `late_letter` | 27 |
| `w-llama3-70b-cd` | `d` | `unparsed` | 4 |
| `w-llama2-70b-chat-cd` | `c` | `late_letter` | 104 |
| `w-llama2-70b-chat-cd` | `d` | `json_verdict` | 16 |
| `w-llama2-70b-chat-cd` | `d` | `unparsed` | 3 |
| `st-yi-34b-cd` | `c` | `contradictory` | 3 |
| `st-yi-34b-cd` | `c` | `late_letter` | 37 |
| `st-gemma2-27b-cd` | `d` | `json_verdict` | 1 |

**Where these rows belong in the series.** All 13 CB-5 arms are **reading 0.1** cells, by A-17 clause (8) (D-20260927-016): the five `w-*` rows were measured after reading 0's close (2026-09-25T12:00Z). The same clause says `series/cells.py` still files a `w-*` row in reading 0 until its follow-up lands, and that **no CB-5 row enters `series.jsonl` before then** (§10 item 3). A-14's completeness condition for a 0.1 ratio on this card is met on both sets: both local anchors were re-read here on `c` and `d`.

## §3 · The anchors (M-9): 300 W in the window beside 420 W beside the seats

The same digest on the same card, read at two postures. The 300 W rows are this window's. The 420 W rows are reading 0's beside rows: `b1-gemma4-anchor-cd` and `b2-mistral-v0.1-q4_0-cd` (`rtx-pro-6000-reading-0/rows/`, and `TABLES-beside.md` for their figures). Agreement is per item under v2, joined on `prompt_sha256`.

| Anchor | Task | 300 W v2 strict | 420 W v2 strict | Items | Same strict choice | Byte-identical replies |
|---|---|---:|---:|---:|---:|---:|
| gemma4:26b-a4b-it-q4_K_M (`5571076f3d70`) | `c` | 86 | 86 | 108 | 108 | 108 |
| gemma4:26b-a4b-it-q4_K_M (`5571076f3d70`) | `d` | 35 | 35 | 48 | 48 | 48 |
| mistral:v0.1 (`b17615239298`) | `c` | 10 | 10 | 108 | 108 | 108 |
| mistral:v0.1 (`b17615239298`) | `d` | 0 | 0 | 48 | 48 | 48 |

| Anchor | Measure | 300 W, window (docent stopped) | 420 W, beside (docent up) |
|---|---|---:|---:|
| gemma4 anchor | Decode (tok/s, probe median) | 168.1 | 168.1 |
| gemma4 anchor | Prefill (tok/s, probe median) | 4,202 | 4,575 |
| gemma4 anchor | TTFT (s, median) | 1.196 | 1.206 |
| gemma4 anchor | J per 1k decode tokens (probe) | 1,812.2 | 1,826.7 |
| gemma4 anchor | Board J per correct on `c`, compute-phase | 13.0 | 12.7 |
| mistral:v0.1 | Decode (tok/s, probe median) | 256.1 | 271.1 |
| mistral:v0.1 | Prefill (tok/s, probe median) | 11,621 | 15,238 |
| mistral:v0.1 | TTFT (s, median) | 0.249 | 0.245 |
| mistral:v0.1 | J per 1k decode tokens (probe) | 1,204.2 | 1,511.1 |
| mistral:v0.1 | Board J per correct on `c`, compute-phase | 74.3 | 74.1 |

The two postures differ twice over: the cap (300 W against 420 W), and the co-tenants (the docent seat stopped here, up at 420 W). So no ratio here names the cap alone. The answers do not move at all, and that is the M-9 result the plan asked for.

For context only, and never as a ratio: the same digests on the reference RTX 3090 (`rtx-3090-reading-0`, same ollama 0.32.13) agree with this window on 104 of 108 six-way items for the gemma4 anchor (88 vs 86), 104 of 108 for yi:34b (21 vs 19) and 107 of 108 for gemma2:27b (73 vs 72). The doorman sets agree on 48, 48 and 47 of 48. That is the known cross-card greedy drift.

## §4 · The plan's predictions, read with R-15's test (informational)

The predictions are the plan's (`COI-GAPS-AND-PLAN-v2.md` §4 CB-5, "Metric / prediction"). The test is R-15's paired non-inferiority test as the ladder runs it: `ladder.paired_parts` (16 dinner clusters, 10,000 resamples, seed 20260923) against the anchor row `withheld-2026-10-14` (gpt-4-0613, 88/108), with δ = 5 points on the whole set. **This is not a ladder verdict.** The ladder tests reading-0 headline rows only, and these rows are 0.1 by A-17 (8). It is printed here only to check the predictions.

| Arm | V2 strict on `c` | Diff vs anchor | Lower 95 % | Upper 95 % | Clears B-anchor | With margin | Clears B-chance (> 24.0 %) | Plan's prediction | Prediction |
|---|---:|---:|---:|---:|---|---|---|---|---|
| `w-llama3.3-70b-cd` | 93 | +0.046 | −0.032 | +0.120 | True | False | True | Clears B-anchor plain, not with margin | Held |
| `w-qwen2.5-72b-cd` | 93 | +0.046 | −0.038 | +0.130 | True | False | True | Clears B-anchor with margin | Missed (plain only) |
| `w-llama3-70b-cd` | 71 | −0.157 | −0.255 | −0.062 | False | False | True | None stated | None |
| `w-gpt-oss-120b-low-cd` | 84 | −0.037 | −0.101 | +0.019 | False | False | True | About 83 | Held (84) |
| `w-llama2-70b-chat-cd` | 1 | −0.806 | −0.873 | −0.733 | False | False | False | Fails B-chance | Held |

- **Two verdicts sit near their line.** llama3.3's lower bound (−0.032) and qwen2.5's (−0.038) are inside the ladder's two-item seed-sensitivity band around −0.05, but not at the one-item boundary (`stats.near_line`: at_boundary False, seed band True). If they ever become ladder rows, the ladder prints seed rows for both.
- **On the parity halves,** llama3.3 clears on the odd half only (even: diff 0.000, lower −0.125), and qwen2.5 clears on both halves.
- **Not computed here:** the plan's "70B board J per correct 3–5× the 24 GB cards' best". That comparison crosses cards, so it belongs to the series build under its own rule, after item 3 of §10.

## §5 · Energy and speed, as `analyse.py` prints them

The board is the desktop's larger card by UUID at 300 W. J per correct divides by the strict count, which is the same as v2's on every task (§2). The session is `20260928T080011Z-window`. `analyse.py` read the desktop's own journals for the collision join and the canary (§11).

| Arm | Task | Board J per correct, gross | Board J per correct, net of the seats' idle | Board J per correct, compute-phase | Box-delta J per correct | Median s per item | Collided items | Items reached |
|---|---|---:|---:|---:|---:|---:|---:|---:|
| `b-gemma4-anchor-cd` | `c` | 158.6 | 30.2 | 13.0 | 109.4 | 1.199 | 3 | 108 |
| `b-gemma4-anchor-cd` | `d` | 197.6 | 42.2 | 20.7 | 56.9 | 1.312 | 0 | 48 |
| `b-mistral-v0.1-cd` | `c` | 431.1 | 250.3 | 74.3 | 223.5 | 0.263 | 0 | 108 |
| `b-mistral-v0.1-cd` | `d` | No correct answer | No correct answer | No correct answer | No correct answer | 0.304 | 0 | 48 |
| `w-llama3.3-70b-cd` | `c` | 199.6 | 108.3 | 67.6 | 57.8 | 0.899 | 0 | 108 |
| `w-llama3.3-70b-cd` | `d` | 260.0 | 150.3 | 119.2 | 85.7 | 1.209 | 0 | 48 |
| `w-qwen2.5-72b-cd` | `c` | 189.6 | 111.8 | 66.5 | 77.3 | 0.798 | 11 | 108 |
| `w-qwen2.5-72b-cd` | `d` | 275.3 | 168.6 | 130.6 | 49.3 | 1.096 | 0 | 48 |
| `w-llama3-70b-cd` | `c` | 288.7 | 248.3 | 110.3 | 23.9 | 0.914 | 0 | 108 |
| `w-llama3-70b-cd` | `d` | 333.7 | 289.6 | 152.8 | 152.0 | 1.177 | 0 | 48 |
| `w-gpt-oss-120b-low-cd` | `c` | 356.0 | 306.3 | 139.4 | 256.6 | 1.336 | 1 | 108 |
| `w-gpt-oss-120b-low-cd` | `d` | 410.5 | 354.4 | 174.4 | 286.2 | 1.477 | 0 | 48 |
| `w-llama2-70b-chat-cd` | `c` | 22,317.2 | 16,268.3 | 14,731.8 | 10,211.3 | 0.801 | 0 | 108 |
| `w-llama2-70b-chat-cd` | `d` | 590.0 | 428.8 | 421.2 | 289.5 | 1.148 | 0 | 48 |
| `st-yi-34b-cd` | `c` | 518.0 | 319.4 | 209.3 | 182.6 | 0.407 | 0 | 108 |
| `st-yi-34b-cd` | `d` | 153.2 | 93.3 | 68.2 | 71.9 | 0.509 | 0 | 48 |
| `st-gemma2-27b-cd` | `c` | 198.5 | 166.6 | 42.8 | 133.1 | 0.778 | 5 | 108 |
| `st-gemma2-27b-cd` | `d` | 185.6 | 155.3 | 45.4 | 53.4 | 0.954 | 0 | 48 |

| Arm | Decode (tok/s, median) | Prefill (tok/s, median) | TTFT (s, median) | J per 1k decode tokens (probe, board gross) |
|---|---:|---:|---:|---:|
| `b-gemma4-anchor-cd` | 168.1 | 4,202 | 1.196 | 1,812.2 |
| `b-mistral-v0.1-cd` | 256.1 | 11,621 | 0.249 | 1,204.2 |
| `w-llama3.3-70b-cd` | 25.4 | 971 | 0.888 | 12,119.0 |
| `w-qwen2.5-72b-cd` | 24.3 | 985 | 0.784 | 12,599.2 |
| `w-llama3-70b-cd` | 25.3 | 967 | 0.897 | 12,162.6 |
| `w-gpt-oss-120b-low-cd` | 161.0 | 4,986 | 0.927 | 2,214.6 |
| `w-llama2-70b-chat-cd` | 26.3 | 994 | 0.589 | 15,804.6 |
| `st-yi-34b-cd` | 63.3 | 2,303 | 0.332 | 5,084.3 |
| `st-gemma2-27b-cd` | Not measured: the guard stopped the arm in its probes | Not measured | Not measured | Not measured |

**Read these with four caveats, each from the files:**
- **st-gemma2-27b-cd's energy is void by A-17 clause (4):** "A guard stop voids that arm's energy, never its accuracy." `analyse.py` does not read `STOPPED.json`, so it prints the two rows above anyway. Its task windows closed 41 s and 99 s before the trip, with the cap held (§1). Keeping them would take a ruling. **The rec is to void them as registered, and to re-read the arm whole in CB-5b.**
- **llama2:70b-chat's `c` row fails B-chance** (1 correct), so its J per correct divides by one answer. `$ per correct` prints only for rows that clear B-chance (PREREG-S0 §7.2), and the same caution applies to J.
- **The box delta is coarse at these task lengths.** Its pre-load baseline is one 13 s read of the CP2000, which changes value about every 14 s (0–3 changes per baseline). That baseline ran from 206.1 W to 314.3 W across the arms (`arm.json` `idle_preload.box`). So the box-delta J per correct reads below the board's own net figure on 16 of 18 rows here (reading 0's first beside session does the same on 4 of its 6 rows, `TABLES-beside.md`). It is the kit's labelled instrument ("includes the second board and the host"), never a wall figure.
- **Collisions never void accuracy** (temperature 0). qwen2.5's `c` has 11 of 108 items that overlapped a co-tenant request, the gemma4 anchor 3, gemma2 5 and gpt-oss 1. The docent was down, so every collision is the ollama seat or the reranker.

## §6 · Why the window ended at 08:39: the door reader's decode error

| Time (UTC) | What happened | Source |
|---|---|---|
| 08:42:06 | The restore reads `RESTORED`, and the backstop timer is disarmed | `journalctl -u coi-window-deadman.service` on the desktop |
| 08:42:05 | vLLM `Application startup complete` | `journalctl -u docent-vllm.service` |
| 08:39:32 | `docent-vllm.service` started (the desktop's larger card free 75,885 MiB, 0 bench processes left) | the dead-man's R2 and R3 lines |
| 08:39:31 | the desktop's larger card set to 420.00 W from 300.00 W (R2c, the cap first) | the dead-man's R2c line |
| 08:39:31 | The dead-man begins: "the guard tripped: I-3 …"; the driver is stopped, and `WINDOW-DONE` reads `bench rc=4` | the dead-man; `window/WINDOW-DONE` |
| 08:39:28 | `ARM st-gemma2-27b-cd rc=6 … STOPPED guard-probes`; the four ★ arms after it print NOT RUN | `window/current.log` |
| 08:39:23 | The bench is gone, 1.17 s after the trip (`systemctl_stop_rc` 0) | `state/STOP-RECEIPT.json` |
| 08:39:22 | The guard trips I-3: "the laptop-side door reader silent for over 300 s" (last heartbeat 08:34:20Z) | `state/TRIP.json` |
| 08:34:40 | `i3_reader.py` exits 1 with `UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0` | `journalctl --user -u coi-i3-window.service` on the laptop |
| 08:34:20 | The reader's last cycle: rc 0, no failed the desktop row | `~/bench-archive/coi-cb5-2026-09-27/i3-reader.jsonl` |
| 07:55:00 | The reader starts, then runs 119 cycles: rc 0 on all of them, 25 the desktop rows, 0 failed, 0 expected-down | the same log |

**The fault.** `i3_reader.py` line 61 runs `tail -c 3000000 ~/quartermaster/records/days/<day>.jsonl` on the mini node, and line 38 reads the output with `subprocess.run(..., text=True)`, which decodes strictly. `tail -c` starts at a byte offset. Once the day's file is larger than 3 MB, that offset moves every 20 s as the file grows, and sooner or later it lands inside a multi-byte UTF-8 character. The first byte is then a continuation byte (0x80), the decode raises, and `ssh()` catches only `TimeoutExpired`, so the reader exits. The reader was always meant to drop the partial first line (its `json.loads` `ValueError` skip), but not a partial character. Today's file read 4,989,272 bytes at 08:46Z, and 3,008 of its lines carry non-ASCII bytes (`stat` and `grep -c` on the mini node, read-only). 2026-09-27's file closed at 14,126,657 bytes. The 23:50Z attempt also read a file past 3 MB, and survived its 2 minutes by luck.

**The fix (for a lane, not done here).** Decode leniently. The only bytes a lenient decode can mangle are in the partial first line, and the reader already skips that line:

```python
p = subprocess.run([...], capture_output=True, timeout=timeout)   # bytes, no text=True
return p.returncode, p.stdout.decode("utf-8", "replace")
```

Also, a test that feeds `ssh()` a fixture starting on a continuation byte and expects a cycle with rc 0. Whether a reader that faults in some other way should keep touching the heartbeat is a design question: today, silence is the safe default. The lane's audit should decide it, not this fold. `i3_reader.py` is not among the twelve files A-17 (3) pins. It is staged from the same worktree (sha `ea56586a…`, equal on origin/master and in `cb5-window` at `1e703e3e`).

**A second finding, smaller: the session's own receipt is missing.** The restore's R1 stops the driver (`coi-window-driver.service`, `--no-block`) as its first act. That killed `window.sh` and `bench.sh` in the middle of `TEARDOWN`, 9 s after the trip. So `bench.sh` never ran its last lines: `compute-apps-after.txt`, `cp -r state $SESSION/state`, and the `RECEIPT session=…` line. `sessions/20260928T080011Z-window/` has no `state/`. The guard's receipts (`TRIP.json`, `STOP-RECEIPT.json`, `RECOVERY.json`, `GUARD-END.json`, the traces) are intact in the live `~/bench-coi-2026-09-23/state/`. The next window's `window.sh` moves that directory to `sessions/state-before-window-<stamp>/`, so nothing is lost. This fold copied the live `state/` into its copy of the session to run `analyse.py`, exactly what `bench.sh` would have done. The rec is a one-line `cp -r` of `state/` into the session in `window.sh`'s EXIT trap, so a restore-killed teardown still leaves a whole session. That is should-fix, not must-fix.

## §7 · The restore receipt, and the desktop after it

The receipt is the only line of `/run/coi-window/RESTORE-RECEIPTS.jsonl`: the backstop was disarmed after `RESTORED`, so it never ran a second, no-op restore.

| Field | Value |
|---|---|
| `verdict` | `RESTORED` |
| `why` | The guard tripped: I-3 - the laptop-side door reader silent for over 300 s |
| `started` | 2026-09-28T08:39:31Z |
| `bench_gone_s` | 1 |
| `health_s` | 155 |
| `health_code` | 200 |
| `free_mib_at_start_of_seat` | 75885 |
| `cap_w_after` | 420.00 |
| `cap_restore_w` | 420 |
| `cap_restored` | True |
| `mains_wait_s` | 0 |
| `residents` | withheld-2026-10-14: gemma4:26b, nomic-embed-text:latest; withheld-2026-10-14: mistral-small3.2:24b, nomic-embed-text:latest |
| `docent_state_before` | Inactive |
| `stamp` | 2026-09-28T08:42:06Z |

The desktop after the restore, read at 08:43:11Z (read-only: `systemctl is-active`, `nvidia-smi`, `curl` of `/health` and `/api/ps`). A second read at 09:10:21Z matched: the docent, ollama and ComfyUI active, the desktop's larger card at 420.00 W, `/health` 200, no `RESTORE-NOW` or `SCHEDULED-OPEN-HOLD` marker, and no `coi-*` timer armed.

| Check | Reading | Expected |
|---|---|---|
| `docent-vllm.service` | Active | Active |
| Docent `/health` (:withheld-2026-10-14) | 200 | 200 |
| the desktop's larger card enforced power limit | 420.00 W | 420.00 W |
| the desktop's larger card memory used | 66,063 MiB | The docent (44,692 MiB), the ollama seat, the reranker and ComfyUI back |
| the desktop's larger card memory free | 31,187 MiB | Whatever those tenants leave |
| the desktop's 3090 Ti (the second board) enforced power limit | 350.00 W | 350.00 W (untouched) |
| `ollama.service` :withheld-2026-10-14 `/api/ps` | gemma4:26b, nomic-embed-text:latest | The same |
| the desktop's 3090 Ti's seat :withheld-2026-10-14 `/api/ps` | mistral-small3.2:24b, nomic-embed-text:latest | The same |
| `comfyui.service` | Active | Active |
| `rerank-seat-withheld-2026-10-14.service` (user unit) | Active | Active |
| `coi-window-deadman.service` | Inactive | Inactive (the watcher done) |
| `coi-window-deadline.timer` | Inactive | Inactive (the backstop disarmed) |
| `coi-window-driver.service` (user unit) | Inactive | Inactive |
| `coi-ollama-desktop.service` (user unit) | Inactive | Inactive |
| `coi-guard-desktop.service` (user unit) | Inactive | Inactive |
| Bench processes on the desktop's larger card | 0 (no `bench-coi` process in `--query-compute-apps`) | 0 |
| the desktop's larger card persistence mode | Disabled | Unchanged from before the window (`nvidia-smi` warned of it at R2c) |

The laptop's `coi-cb5-morning-check.service` also caught the receipt: `morning-check.out` reads `08:45:07Z RESTORED after the overnight window: …`, and the unit has exited. No push notification was owed: the trigger in the pastes is anything other than `RESTORED`.

## §8 · Interference and the UPS

| Measure | Value | Source |
|---|---:|---|
| UPS window-mean load (%) | 27.2 | `GUARD-END.json` `ups_i6.load` (2,360 rows at 1 Hz) |
| UPS peak load (%) | 51 | The same |
| UPS load budget (%) | 50 (printed, never a stop) | The same |
| UPS minimum runtime (s) | 500 (at 08:27:17Z) | `ups_i6.rule` |
| I-6 low rows (runtime < 300 s) | 0 | The same |
| I-6 stops | 0 | The same |
| The desktop's larger card free, minimum (MiB) | 13,597 | `analyse.py` interference line |
| Bench memory, maximum (MiB) | 62,282 | The same |
| The desktop's larger card temperature, maximum (°C) | 65 | The same |
| Seat canary before (60 min): readings | 55 | The same |
| Seat canary before: median (ms) | 220.3 | The same |
| Seat canary during: readings | 36 | The same |
| Seat canary during: median (ms) | 233.3 | The same |
| Seat canary during: p95 (ms) | 835.4 | The same |
| Seat canary during: maximum (ms) | 980.7 | The same |
| Seat canary during: over 805 ms | 4 | The same; `state/guard-slow-canaries.jsonl` (1 of the 4 overlapped a bench item) |
| Seat canary after (30 min): readings | 26 | The same, re-run at 09:10:13Z (complete) |
| Seat canary after: median (ms) | 210.5 | The same |
| Seat canary after: p95 (ms) | 411.0 | `figures-cb5.json` `canary_after_30min` |
| Guard recovery watch | NOT-JUDGED (the watch was stopped by a restore) | `state/RECOVERY.json` |

The canary is estate-watch's probe on the ollama seat (:withheld-2026-10-14), which stayed up on the desktop's larger card throughout. The slow canaries were logged, never a stop.

## §9 · The first attempt (2026-09-27 23:50Z), superseded and kept

Paste A opened the window at 23:50:24Z, an operator then asked to move it overnight, and the lead stopped it with `RESTORE-NOW` at 23:52:50Z. Its one arm, `b-gemma4-anchor-cd`, had written 83 of 108 six-way rows before its SIGTERM (`run.log`: `KeyboardInterrupt: SIGTERM 2026-09-27T23:52:50Z`). At 08:00:19Z tonight's bench moved that directory to `rows-superseded/b-gemma4-anchor-cd.20260928T080019Z/`: the rows key matched (same arm, same 300 W), and the move is never a delete (`current.log`: `SUPERSEDED …`). Its session is `sessions/20260927T235024Z-window/`. Its restore receipt (`window/stale-20260928T080007Z/`, and the copy in `/run/coi-window/stale-20260928T080006Z/`) reads `RESTORED`, with the reason "operator: RESTORE-NOW", started at 23:52:50Z, health 200 after 154 s and the cap back at 420.00 W. Nothing from it enters any figure.

## §10 · What is owed, in order

1. **Must fix before any later window: the door reader's decode** (§6). A lane on the kit, with the fixture test, and its own audit. Until it lands, any window whose day ledger passes 3 MB will stop itself early.
2. **L6, the rows home.** This strand copied into its scratch only and deleted the copy. The rows stay on the desktop, untouched. L6 as written (`PASTES-CB5-2026-09-27.md`) rsyncs `rows/`, `sessions/` and `window/` into `~/bench-archive/coi-cb5-2026-09-27/`. It should also copy the live `state/` (§6), because the session has none. Its `systemctl --user stop coi-i3-window.service` is a no-op now, since the reader is dead and collected. The rows then go into the estate kit (`rtx-pro-6000-reading-0/rows/`) on a branch, as reading 0's did.
3. **The A-17 (8) series follow-up before any CB-5 row enters `series.jsonl`.** `cells.py` must place a listed cell by its rows' measured time against the close, with a test. The `lanes.py` follow-up A-17 (7) names also belongs here: the `posture_othercard_before` reader, the "the desktop's 3090" labels, the VOID handling, and now STOPPED (A-17 (4)).
4. **A ruling on st-gemma2-27b-cd's energy.** A-17 (4) voids it as written. The rec is to void it and re-read the arm whole in CB-5b (a re-run at 300 W supersedes its rows by the rows key, never deletes them).
5. **CB-5b, a short window for what did not read:** `st-phi4-14b-cd`, `st-qwen3-30b-a3b-2507-cd`, `st-qwen3.6-27b-cd`, `st-deepseek-r1-32b-on-c`, and gemma2's probes. From the measured pace (yi 2 m 43 s, gemma2 3 m 48 s), the three think-off ★ arms plus gemma2 come to roughly 10–15 min (derived, not measured). The deepseek think-on row sets the length: on the 3090 its median item took 19.8 s (`RTX-3090-READING-0.md:184`), about 36 min for 108 items, and the desktop's larger card has never read it. It needs an operator's hour and cap in one message, as CB-5 did. The prep's timing table ran about 4–5× long on the 70B arms, so a CB-5b sized from measured pace is much shorter than 90 min.
6. **Should fix: `window.sh`'s EXIT trap copies `state/` into the session** (§6), so a restore-killed teardown still leaves a whole session.
7. **For the article's facts lane:** the §4 prediction read (qwen2.5 missed "with margin") is informational until item 3 lands and the ladder decides which rows it tests.

## §11 · Provenance: what was read, and how

- **The restore wait.** A 60 s poll from 08:29Z: `tail -1 /run/coi-window/RESTORE-RECEIPTS.jsonl` on the desktop over ssh (read-only), with `morning-check.out` beside it. RESTORED, started 08:39:31Z, was read at 08:42:29Z.
- **The copies.** `scp -rp` from the desktop (read-only on the desktop) into this strand's scratch folder: `rows/` for the nine arms that started, `rows-superseded/b-gemma4-anchor-cd.20260928T080019Z/`, `sessions/20260928T080011Z-window/` and `sessions/20260927T235024Z-window/`, the live `state/`, `window/`, and `/run/coi-window/`'s receipts, `open-at.log`, `window.env` and `stale-20260928T080006Z/`. That came to 6.4 MB. The scratch folder was deleted after this file was written.
- **The tooling.** Estate origin/master `864f8122` was extracted by `git archive` into the scratch folder: no worktree, because the laptop's disk is at 100 % with 7.7 GB free. The kit's files on the desktop equal origin/master's by sha256 on all 13 checked: `analyse.py` `b689832f…`, `coilargecard.py` `19c403e4…`, `bench.sh` `a5faff5a…`, `bench_arms.sh` `eb2440e3…`, `guard.py` `b3a1ebb6…`, `desktop_rules.py` `392725e8…`, `benchbox_parser.py` `08a158f6…`, `window/restore.sh` `9eb0d01f…`, `window/open.sh` `6797af6e…`, `window/open-at.sh` `db64b119…`, `window/window.sh` `e679573f…`, `window/arms-cb5.txt` `c5cc49b9…` and `window/params.conf` `1caed91d…`. The three root copies in `/run/coi-window/` also equal their pins. Every arm's `arm.json` `instrument` block names the same coilargecard, guard, bench_arms and desktop_rules shas.
- **`analyse.py`** ran with `PYTHONDONTWRITEBYTECODE=1` on the copied session (plus the live `state/`, §6) and rows. Its two `journalctl` reads (the ollama seat's `[GIN]` lines, the reranker's user unit) went through a scratch shim that runs `journalctl` with the same arguments on the desktop over ssh. That is read-only, and it returns the same journal `analyse.py` reads when it runs on the desktop, as its docstring asks. The first run (08:44:14Z) had the AFTER canary window incomplete. It was re-run at 09:10:13Z for §8's AFTER rows, and the per-arm figures did not change between the runs.
- **The v2 re-score** is `series/v2score.score_pass()`. The paired test is `series/ladder.paired_parts()` and `verdict_lines()`, with `series/items.json`'s anchor and seat vectors. Both were checked against the series' own files first. `score_pass` reproduces `b1-gemma4-anchor-cd`'s 86/108 and 35/48 as `series.csv` prints them. `paired_parts` reproduces `charts/data/c3-tests.csv`'s B-anchor diff, bounds and verdicts to six decimals on two single-pass rows, `withheld-2026-10-14` (claude-sonnet-4-5) and `withheld-2026-10-14` (the seat). A row with two reps, `withheld-2026-10-14`, does not match, because the build tests its rep mean. Every CB-5 row is single-pass.
- **Not touched:** no the desktop unit, cap, file or seat was changed. No model seat and no qm door was called; `/api/ps` and `/health` are status reads. the mini node got one read-only `stat` and `grep -c` of today's ledger file. Nothing was committed, pushed or posted.

## Appendix · `analyse.py`'s table, verbatim

This is the tool's own Markdown, as it wrote it at the 09:10:13Z run. Its cells are the tool's, not re-cased, and its strict column is the lane parser's, which equals v2 on every task here (§2).

**the desktop's larger card reading 0 — generated by analyse.py (2026-09-28T09:10:12Z); every figure from the rows; strict = benchbox's lane parser (provisional until parser v2), v1 = run.py decide(); J per correct uses STRICT correct**

**session 20260928T080011Z-window (bench resident ['08:00:43Z', '08:39:22Z'])**

| arm | model · digest | task | strict correct / n (lane parser v2-benchbox-1; v1 beside) | J/correct board gross (whole window) | J/correct net of the seats' idle | J/correct compute-phase | box-delta J/correct | median s/item | median load ms | collided | clean J/item gross | decode tok/s | prefill tok/s | TTFT median s | J/1k decode (probe) |
|---|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| b-gemma4-anchor-cd | gemma4:26b-a4b-it-q4_K_M · 5571076f3d70 | c | 86 / 108 (v1 86) | 158.6 | 30.2 | 13.0 | 109.4 | 1.199 | 1003 | 3 of 108 | 125.7 | 168.1 | 4202 | 1.196 | 1812.2 |
| b-gemma4-anchor-cd | gemma4:26b-a4b-it-q4_K_M · 5571076f3d70 | d | 35 / 48 (v1 35) | 197.6 | 42.2 | 20.7 | 56.9 | 1.312 | 1002 | 0 of 48 | 144.3 | 168.1 | 4202 | 1.196 | 1812.2 |
| b-mistral-v0.1-cd | mistral:v0.1 · b17615239298 | c | 10 / 108 (v1 10) | 431.1 | 250.3 | 74.3 | 223.5 | 0.263 | 178 | 0 of 108 | 39.9 | 256.1 | 11621 | 0.249 | 1204.2 |
| b-mistral-v0.1-cd | mistral:v0.1 · b17615239298 | d | 0 / 48 (v1 12) | — | — | — | — | 0.304 | 179 | 0 of 48 | 51.7 | 256.1 | 11621 | 0.249 | 1204.2 |
| w-llama3.3-70b-cd | llama3.3:70b-instruct-q4_K_M · a6eb4748fd29 | c | 93 / 108 (v1 93) | 199.6 | 108.3 | 67.6 | 57.8 | 0.899 | 524 | 0 of 108 | 172.9 | 25.4 | 971 | 0.888 | 12119.0 |
| w-llama3.3-70b-cd | llama3.3:70b-instruct-q4_K_M · a6eb4748fd29 | d | 46 / 48 (v1 46) | 260.0 | 150.3 | 119.2 | 85.7 | 1.209 | 527 | 0 of 48 | 252.6 | 25.4 | 971 | 0.888 | 12119.0 |
| w-qwen2.5-72b-cd | qwen2.5:72b-instruct-q4_K_M · 424bad2cc13f | c | 93 / 108 (v1 93) | 189.6 | 111.8 | 66.5 | 77.3 | 0.798 | 441 | 11 of 108 | 157.2 | 24.3 | 985 | 0.784 | 12599.2 |
| w-qwen2.5-72b-cd | qwen2.5:72b-instruct-q4_K_M · 424bad2cc13f | d | 41 / 48 (v1 41) | 275.3 | 168.6 | 130.6 | 49.3 | 1.096 | 440 | 0 of 48 | 236.9 | 24.3 | 985 | 0.784 | 12599.2 |
| w-llama3-70b-cd | llama3:70b-instruct-q4_K_M · f04e196898af | c | 71 / 108 (v1 94) | 288.7 | 248.3 | 110.3 | 23.9 | 0.914 | 521 | 0 of 108 | 189.9 | 25.3 | 967 | 0.897 | 12162.6 |
| w-llama3-70b-cd | llama3:70b-instruct-q4_K_M · f04e196898af | d | 36 / 48 (v1 36) | 333.7 | 289.6 | 152.8 | 152.0 | 1.177 | 523 | 0 of 48 | 251.7 | 25.3 | 967 | 0.897 | 12162.6 |
| w-gpt-oss-120b-low-cd | gpt-oss:120b · a951a23b46a1 | c | 84 / 108 (v1 84) | 356.0 | 306.3 | 139.4 | 256.6 | 1.336 | 819 | 1 of 108 | 278.8 | 161.0 | 4986 | 0.927 | 2214.6 |
| w-gpt-oss-120b-low-cd | gpt-oss:120b · a951a23b46a1 | d | 35 / 48 (v1 35) | 410.5 | 354.4 | 174.4 | 286.2 | 1.477 | 818 | 0 of 48 | 302.4 | 161.0 | 4986 | 0.927 | 2214.6 |
| w-llama2-70b-chat-cd | llama2:70b-chat-q4_K_M · 8f88029f07f8 | c | 1 / 108 (v1 42) | 22317.2 | 16268.3 | 14731.8 | 10211.3 | 0.801 | 179 | 0 of 108 | 206.4 | 26.3 | 994 | 0.589 | 15804.6 |
| w-llama2-70b-chat-cd | llama2:70b-chat-q4_K_M · 8f88029f07f8 | d | 24 / 48 (v1 27) | 590.0 | 428.8 | 421.2 | 289.5 | 1.148 | 180 | 0 of 48 | 295.9 | 26.3 | 994 | 0.589 | 15804.6 |
| st-yi-34b-cd | yi:34b-chat-q4_0 · 5f8365d57cb8 | c | 19 / 108 (v1 28) | 518.0 | 319.4 | 209.3 | 182.6 | 0.407 | 170 | 0 of 108 | 92.5 | 63.3 | 2303 | 0.332 | 5084.3 |
| st-yi-34b-cd | yi:34b-chat-q4_0 · 5f8365d57cb8 | d | 36 / 48 (v1 36) | 153.2 | 93.3 | 68.2 | 71.9 | 0.509 | 174 | 0 of 48 | 116.6 | 63.3 | 2303 | 0.332 | 5084.3 |
| st-gemma2-27b-cd | gemma2:27b-instruct-q4_K_M · cfd95e5696e9 | c | 72 / 108 (v1 72) | 198.5 | 166.6 | 42.8 | 133.1 | 0.778 | 488 | 5 of 108 | 131.2 | — | — | — | — |
| st-gemma2-27b-cd | gemma2:27b-instruct-q4_K_M · cfd95e5696e9 | d | 41 / 48 (v1 41) | 185.6 | 155.3 | 45.4 | 53.4 | 0.954 | 492 | 0 of 48 | 160.2 | — | — | — | — |
| st-phi4-14b-cd | — | — | absent:  | | | | | | | | | | | | |
| st-qwen3-30b-a3b-2507-cd | — | — | absent:  | | | | | | | | | | | | |
| st-qwen3.6-27b-cd | — | — | absent:  | | | | | | | | | | | | |
| st-deepseek-r1-32b-on-c | — | — | absent:  | | | | | | | | | | | | |

Interference: canary BEFORE 60 min (n 55, median 220.328903 ms, p95 403.102577) · DURING (n 36, median 233.270988, p95 835.43786, max 980.66287; 17 overlapping a bench item, 4 over 805 ms) · AFTER (n 26, median 210.4575605, complete=True) · docent ITL windows 0 (max None ms vs 8.43) · trip I-3 · UPS load max 51.0 % · the desktop's larger card free min 13597.0 MiB · bench max 62282.0 MiB · temp max 65.0 C
