# CB-1 part 1 · the OpenAI anchor sweep, read (15 cells, $6.4672 of the $25 cap)

**The registered prediction "j under 50 %" FAILED: the anchor read 91/119 = 76.5 % (93.3 % under the kit's `expected_ok` scoring), and all six j cells read 72.3–81.5 %.**

*Written 2026-09-27 (UTC; `date -u` read 09:58:10Z on the laptop when the writing began) by the CB-1 close-out lane
(Claude Opus 5.5), on branch `bench/coi-cb1` at `2586cb44` plus the commit that adds this file. The run itself was the
lead's. INTERNAL FILE (names boxes, like the rest of this kit). Every figure here is read from a file in this kit, by
`receipts/cb1-part1/closeout_check.py` (its output is `receipts/cb1-part1/closeout-check.json`) or by the command named
beside the figure. No billed call was made to write it: no request of any kind went to OpenAI.*

*Revised 2026-09-27 (`date -u` 10:27:19Z) to fold the PR #168 audit
(`bench-archive/plans-2026-09-26/coi/AUDIT-CB1-PART1-PR168.md`, verdict "land after fixes"). The revision prints the
held / failed verdict on each registered prediction (§3, §5, the line above), names the registered subject from the v1
plan (§5), names the cells' reading (§1), and lists the A-13 and `EXPOSURE.jsonl` gaps (§9). It also stops the check
script claiming a registered fingerprint for j, makes its kit-order checks able to fail, and cites the archived dry build
(§4, §6). No number changed.*

## 1 · What ran, when, and why

**Why.** CB-1 is the COI plan v2's OpenAI anchor sweep (`bench-archive/plans-2026-09-26/coi/COI-GAPS-AND-PLAN-v2.md`
§4 "CB-1"). an operator gave the go in D-20260927-007 and the priced go in D-20260927-009. Two reasons drive it. The anchor
`gpt-4-0613` stops serving on 2026-10-23, and a cell not landed by then is gone. The anchor's six-way repeat is the
determinism receipt (M-4), which the plan calls the one receipt the headline leans on (§7.5). Part 1 is every in-plan
cell that is not task_a, plus the registered bridge's (`gpt-4o-mini-2024-07-18`) f40 and j cells. Staged in
`CB1-STAGED.md` §1–§2: 15 cells, $10.1276 priced.

**Who and where.** The lead ran `receipts/cb1-part1/drive_part1.sh` on the laptop from this worktree. It followed
`CB1-STAGED.md` §7 exactly, with `gate.py` run before every cell. an operator's direct permission is recorded verbatim in
`receipts/topup-confirmed.json` ("you have my permission to role with all your recs", 08:36Z).

**Which reading.** These 15 cells are **reading 0.1** cells. Reading 0 closed at 2026-09-25T12:00Z, and PREREG-S0 §9.1
(`PREREG-S0.md:426`) says "a cell measured after a close belongs to the next reading". These cells were measured
2026-09-27 08:38:04Z → 09:47:17Z. The plan's A-13 (`COI-GAPS-AND-PLAN-v2.md:372-377`) says the same of the sweep's
cells ("The 18 sweep cells and the three Claude low rows are 0.1 cells"). D-20260927-016 applied the same rule to CB-2
and CB-5. The bridge's two cells were never on reading 0's list, so they are 0.1 cells on any reading. Under A-13, the
o-series cells here are single reps at reading 0's 1-rep rule. The directory name `openai-reading-0/` is the lane's,
not the reading's. A-13 itself is not yet registered in PREREG-S0 (§9, item 2).

**When** (UTC, the laptop's clock, from `receipts/cb1-part1/driver.log`, the ledger stamps and the batch objects):

| time (UTC) | what |
|---|---|
| 08:38:02Z | cell 1 starts: `gpt-4-0613` c, 108 synchronous calls (first ledger line 08:38:04Z) |
| 08:40:05Z | the determinism receipt: "2 of 108 disagree with the frozen row" (§3) |
| 08:40:05Z → 08:44:31Z | cells 2–11: 20 synchronous calls each, then `batch.py build --skip 20` and `submit` |
| 08:44:44Z | **WAIT** before cell 12 (`o1-2024-12-17` f): gate A read $26.5184 against $25.00 (recorded $2.5223 + pending batches' worst $16.4580 + the cell's worst $7.5381). The driver ingested the completed batches (`collect_sweep.sh`), slept 600 s and re-checked |
| 08:54:48Z | gate re-check: recorded $5.3642 + pending worst $2.7261 + cell worst $7.5381 = $15.6284 → GO |
| 08:54:48Z → 08:56:30Z | cells 12–15 (last synchronous ledger line 08:56:29Z) |
| 08:56:30Z | all 14 batches submitted; the collect loop begins (passes 1–7) |
| 09:39:39Z | the last batch completes (`o3-mini-2025-01-31` j) |
| 09:47:22Z | "DONE: all 14 submitted batch cells completed and scored" (last ledger line 09:47:17Z) |

The log shows two `sleep 600` waits ended early. Pass 5 came at 09:36:35Z, 8 min 45 s after pass 4, and pass 6 came
8 s after that. Each ended wait prints "Terminated". The log does not say who ended them. `collect_sweep.sh` re-scores
every completed cell on each pass. So each batch cell's `report.json` `started`/`ended` and every row's `stamp` give
the last replay-scoring time (09:46:43Z → 09:47:22Z), not the call time. The call times are the ledger stamps
(synchronous calls) and the batch objects (below).

| # | model | set | sync rows | batch rows | batch id | created | completed | total / completed / failed |
|---:|---|---|---:|---:|---|---|---|---|
| 1 | gpt-4-0613 | c six-way (108) | 108 | — | — (sync) | — | — | — |
| 2 | gpt-4-0613 | j judge (119) | 20 | 99 | `batch_6ab8d67e2ce88190b81e447be731b5df` | 08:40:30Z | 08:42:44Z | 99 / 99 / 0 |
| 3 | gpt-4-turbo-2024-04-09 | j judge (119) | 20 | 99 | `batch_6ab8d6a0069881908d8ab427481906cf` | 08:41:04Z | 09:18:54Z | 99 / 99 / 0 |
| 4 | gpt-4o-2024-05-13 | j judge (119) | 20 | 99 | `batch_6ab8d6ae6abc8190adfa36dc9f3067ee` | 08:41:18Z | 08:42:34Z | 99 / 99 / 0 |
| 5 | o1-2024-12-17 | c six-way (108) | 20 | 88 | `batch_6ab8d6f340e48190ae476ab671f1dfa4` | 08:42:27Z | 08:44:10Z | 88 / 88 / 0 |
| 6 | o3-mini-2025-01-31 | j judge (119) | 20 | 99 | `batch_6ab8d70a01f481909b8a4bd9a601fc1b` | 08:42:50Z | 09:39:39Z | 99 / 99 / 0 |
| 7 | o4-mini-2025-04-16 | j judge (119) | 20 | 99 | `batch_6ab8d72802808190b69bf512c5cd8068` | 08:43:20Z | 08:45:24Z | 99 / 99 / 0 |
| 8 | gpt-4o-mini-2024-07-18 | j judge (119) | 20 | 99 | `batch_6ab8d7370c9881908a35174bf3e1e8d2` | 08:43:35Z | 08:45:40Z | 99 / 99 / 0 |
| 9 | gpt-4-0613 | f40 (40) | 20 | 20 | `batch_6ab8d74dd27881908c5bebbf211dca8d` | 08:43:57Z | 08:44:15Z | 20 / 20 / 0 |
| 10 | gpt-4-turbo-2024-04-09 | f40 (40) | 20 | 20 | `batch_6ab8d76ef36081908f8c65657ca732ab` | 08:44:30Z | 09:09:44Z | 20 / 20 / 0 |
| 11 | gpt-4o-2024-05-13 | f40 (40) | 20 | 20 | `batch_6ab8d77cba1081909bd860721bef8967` | 08:44:44Z | 08:45:52Z | 20 / 20 / 0 |
| 12 | o1-2024-12-17 | f40 (40) | 20 | 20 | `batch_6ab8da02b94481908800720a5b9e5464` | 08:55:30Z | 08:56:42Z | 20 / 20 / 0 |
| 13 | o3-mini-2025-01-31 | f40 (40) | 20 | 20 | `batch_6ab8da1682788190935a2d840526da4a` | 08:55:50Z | 08:57:20Z | 20 / 20 / 0 |
| 14 | o4-mini-2025-04-16 | f40 (40) | 20 | 20 | `batch_6ab8da2fb6808190b8fa53f515bb28bf` | 08:56:15Z | 08:57:26Z | 20 / 20 / 0 |
| 15 | gpt-4o-mini-2024-07-18 | f40 (40) | 20 | 20 | `batch_6ab8da3e1cc48190ab27c0fcde2c4677` | 08:56:30Z | 08:57:45Z | 20 / 20 / 0 |

(created / completed: the batch object's `created_at` / `completed_at` at its last poll, in `batch/sweep/*.batch.json`;
request counts from the same object.)

## 2 · The money

**The ledger.** `receipts/spend.jsonl` is cumulative: 4,859 lines. Its first 3,649 lines are byte-identical to the
file at `2586cb44` (reading 0's). CB-1 part 1 appended 1,210 lines, stamped 08:38:04Z → 09:47:17Z. The stage values
found:

| stage | lines | usd | whose |
|---|---:|---:|---|
| `probe` | 33 | 0.0087782 | reading 0 |
| `pilot` | 160 | 0.3470443 | reading 0 |
| `rows` | 3,456 | 4.11833905 | reading 0 |
| `sweep` | 388 | **2.8682239** | CB-1 part 1, the synchronous calls (108 + 14 × 20) at the standard price row |
| `sweep-batch` | 822 | **3.598936725** | CB-1 part 1, the Batch answers (6 × 99 + 88 + 7 × 20) at the Batch tier's own price row, written at ingest |

**The sweep total against the cap.** Stage `sweep` alone is $2.868224. The ruled $25 cap counts every stage whose name
starts with "sweep", which is how `oai.Ledger(scope="sweep")` and `gate.py` count it. On that basis the sweep total is
**$6.467161 against $25.00: 25.9 % of the cap, $18.532839 under it.** The priced projection was $10.1276. No sweep line
is `billed_unknown`, and every sweep line belongs to one of the 15 cells (0 outside). The audit found a server-side
receipt as well (`AUDIT-CB1-PART1-PR168.md` I-5). On all 14 batches, each batch object's own `usage` equals the sum of
that batch's `sweep-batch` ledger lines. The audit also re-priced every one of the 1,210 lines with `oai.Prices`, and 0
differ.

| # | model | set | sync $ | batch $ | cell $ | priced $ | batch worst $ |
|---:|---|---|---:|---:|---:|---:|---:|
| 1 | gpt-4-0613 | c six-way (108) | 0.955980 | — | 0.955980 | 0.9553 | — |
| 2 | gpt-4-0613 | j judge (119) | 0.501210 | 1.300110 | 1.801320 | 1.8152 | 2.1388 |
| 3 | gpt-4-turbo-2024-04-09 | j judge (119) | 0.165470 | 0.430005 | 0.595475 | 0.6112 | 0.7169 |
| 4 | gpt-4o-2024-05-13 | j judge (119) | 0.083220 | 0.217808 | 0.301028 | 0.3014 | 0.3585 |
| 5 | o1-2024-12-17 | c six-way (108) | 0.570435 | 1.256670 | 1.827105 | 3.8189 | 11.1189 |
| 6 | o3-mini-2025-01-31 | j judge (119) | 0.024497 | 0.065430 | 0.089927 | 0.2093 | 0.9697 |
| 7 | o4-mini-2025-04-16 | j judge (119) | 0.025241 | 0.068257 | 0.093497 | 0.2078 | 0.9697 |
| 8 | gpt-4o-mini-2024-07-18 | j judge (119) | 0.002516 | 0.006582 | 0.009098 | 0.0092 | 0.0108 |
| 9 | gpt-4-0613 | f40 (40) | 0.128400 | 0.067275 | 0.195675 | 0.1989 | 0.1157 |
| 10 | gpt-4-turbo-2024-04-09 | f40 (40) | 0.042640 | 0.021245 | 0.063885 | 0.0690 | 0.0394 |
| 11 | gpt-4o-2024-05-13 | f40 (40) | 0.022720 | 0.011538 | 0.034258 | 0.0330 | 0.0197 |
| 12 | o1-2024-12-17 | f40 (40) | 0.327180 | 0.145538 | 0.472718 | 1.7600 | 2.5130 |
| 13 | o3-mini-2025-01-31 | f40 (40) | 0.008422 | 0.003906 | 0.012327 | 0.0690 | 0.1843 |
| 14 | o4-mini-2025-04-16 | f40 (40) | 0.009623 | 0.004236 | 0.013858 | 0.0683 | 0.1843 |
| 15 | gpt-4o-mini-2024-07-18 | f40 (40) | 0.000671 | 0.000340 | 0.001011 | 0.0011 | 0.0006 |
| | **total** | | **2.868224** | **3.598937** | **6.467161** | **10.1276** | |

(sync $ / batch $: the ledger lines of that cell by stage. priced $: `usd_projected` in the gate's priced file (§6).
batch worst $: `worst_case_usd` in the cell's `batch/sweep/*.manifest.json`, which is `batch.py build`'s bound. The
six o-series cells' reasoning tokens: o1 c 42,368 (max 1,344 on one item), o1 f 7,616 (max 512), o3-mini j 7,744
(max 256), o3-mini f 1,024 (max 192), o4-mini j 9,088 (max 192), o4-mini f 1,280 (max 128). None was truncated at the
4,096 budget.)

**Cuts: none.** All 15 cells ran in full. The gate printed GO 15 times and WAIT once (08:44:44Z, above), and never CUT.
Rule B (S-13, "cut f40 cells before j and task_a"; D-20260927-009) was read 8 times on the seven f40 cells, the WAIT
included. It read between $18.7527 and $20.8913 against $23.50, with the third-pass reserve included every time (the
driver never passed `--repeat-resolved`). Rule C (the $5 account floor) read at most $21.0994
against $47.66 on a GO (before cell 5).

Rule C counted the sweep scope only. CB-10 billed its own $5.45283 (`receipts/spend-cb10.jsonl` on `origin/master`,
55 lines, 08:49:43Z → 08:56:17Z) on the same account while the sweep ran. The highest GO reading plus CB-10's whole
spend is $26.55223 against the $47.66 floor line.

**The expected account balance: an ESTIMATE of $40.74.** $52.66 (an operator's second dashboard read,
`receipts/topup-confirmed.json`) − $6.467161 (CB-1 part 1, above) − $5.45283 (CB-10) = **$40.740009**, which is $35.74
above the $5 floor. It is an estimate for four reasons:
- the key cannot read the balance (`receipts/balance-read.json`: three 403s);
- both dashboard reads are bound only as "before 08:24:53Z" (D-20260927-010). The first sweep call was at 08:38:04Z and
  CB-10's first at 08:49:43Z, so both spends come after the read;
- the ledgers price each call at the list rows in `receipts/pricing.md`, and what the dashboard shows is what OpenAI
  billed;
- spend outside these two ledgers is invisible here. `origin/master` holds no other OpenAI ledger: the other two
  `spend.jsonl` files are the Anthropic lanes'.

## 3 · The determinism receipt (M-4), cell 1

The comparator is `CB1-STAGED.md` §7's (`series/mdc.py` `compare`: parse_v2 on both passes, joined on
`prompt_sha256`). It compares the frozen row `rows/gpt-4-0613.c.jsonl` (sha256 `19dd5517…287c`) with the repeat
`sweep/gpt-4-0613.c.jsonl` (sha256 `2b9f00da9d7583b93bb27cd284e0fe9e9b448c98769b1cb7602d29a4e677085b`). The driver
read it at 08:40:05Z, and this lane re-ran it offline for this report. Both reads give **2 of 108** with a different
strict choice.

| n paired | same strict choice | strict v2, frozen | strict v2, repeat | right only in the frozen / only in the repeat | same format class | paired bootstrap diff (95 %, clusters) | McNemar p |
|---:|---:|---:|---:|---:|---:|---|---:|
| 108 | 106 | 88 | 88 | 1 / 1 | 101 | 0.0 [−0.0270, +0.0275] | 1.0 |

The two items:

| item (x_seq) | label | frozen reply → strict | repeat reply → strict |
|---|---|---|---|
| `c-einstein-01-main-01` (23) | einstein | `[F] socrates: Socrates of` → socrates | `[B] einstein: Albert Einstein` → einstein |
| `c-hypatia-01-main-01` (43) | hypatia | `[C] hypatia: Hypat` → hypatia | `[B] einstein: Albert Einstein` → einstein |

Seven more items changed only their format class (`clean` ↔ `letter+name`) with the same choice. Both passes sent
temperature 0 and seed 20260921, and `system_fingerprint` is null on every row of both.

§5's rule is "> 2 of 108 → a third pass". The read is 2, so no third pass ran and the $0.9553 reserve was not spent.

**The registered prediction "repeat agreement ≥ 105/108" (`COI-GAPS-AND-PLAN-v2.md:194`; `CB1-STAGED.md` §5; v1
`COI-GAPS-AND-PLAN.md:127-128`): HELD, 106/108.** v1's line "A repeat under 97 % agreement makes every OpenAI row's
determinism caveat a headline sentence, not a footnote" (`COI-GAPS-AND-PLAN.md:129-130`) is not triggered: 106/108 is
98.1 %.

## 4 · Integrity, per cell

Every check below holds on all 15 cells. The figures are in `closeout-check.json`.

- **Rows versus the registered items.** Every cell's `sweep/*.jsonl` holds exactly its registered items: c 108, j 119,
  f40 40, taken from `KIT.lock.json` `sets.{c,j,f40}.items_list`. The checks, all zero on every cell: rows without a
  `prompt_sha256`, duplicate shas, missing ids, unregistered shas. The set fingerprint (rule 1.1-a's form) equals c's
  registered `1feac3433cb4217b` and f40's registered `a307cf40b16dda28`. j has no registered fingerprint: KIT.lock.json
  reads `registered: null`, and `closeout-check.json` records `fingerprint_registered: null` and
  `fingerprint_equals_registered: null` for j, with the basis "kit rebuild (none registered)". All six j cells equal
  the kit rebuild's `69102b8d51dd5d64` (KIT.lock.json `computed_from_kit_rebuild`; `fingerprint_equals_kit_rebuild`).
- **Served model = requested model** on every row: `x_model_resolved` (the response's own `model` field) equals the id
  asked on all 1,210 rows. Every Batch output body's `model` and every Batch request body's `model` also equal it.
  Every row answered HTTP 200. None is refused, failed or truncated.
- **No failed or expired batch lines.** All 14 batches read `completed`, with `failed` 0 in `request_counts`, no
  `error_file_id` and no `errors.jsonl`. None has an `expired_at` or `failed_at`. Every output line has status 200 and
  no `error`.
- **Every batch output line joins its request.** Output `custom_id`s equal input `custom_id`s, with no duplicates on
  either side. The manifest's `custom_ids` equal the input file's in order. The input file's sha256 equals the
  manifest's `input_sha256`. Each input file is byte-identical to the offline `batch.py build --skip 20` the staging
  lane made before the launch, 14 of 14 (`CB1-STAGED.md` §6). That dry build is dated 08:25:04Z, before the 08:38:02Z
  launch. It is archived with its sums at `/workshop/bench-archive/coi-cb1-raw-2026-09-27/batch-dry/` (29 files;
  `cd …/batch-dry && sha256sum -c ../batch-dry.SHA256SUMS` passes). The ledger's `sweep-batch` lines for the cell carry
  exactly those `custom_id`s once each, under the one batch id.
- **The synchronous 20 and the Batch half, in kit order.** "Kit order" means KIT.lock.json's items sorted by
  `kit_index`, compared element by element:
  - the synchronous rows, in file order, equal the first k items (108 for cell 1, 20 for the rest);
  - so do the cell's `sweep` ledger lines, in ledger order, with no duplicates;
  - the Batch input's `custom_id`s equal the sha16 of the items after k, in order;
  - each rows file as a whole is in kit order.

  `closeout_check.py --selftest` shows each of these checks reads false on a swapped or shifted list. The first version
  of this check compared the file with itself and could not fail (audit S-5). Synchronous ∪ Batch equals the
  registered set, with an overlap of 0: no duplicates and no gaps.
- **The instrument**, per every `report.json`: `run_openai.py` `deaf73bb…`, `oai.py` `102e0bbc…`, Jev `run.py`
  `withheld-2026-10-14`, `run_addenda.py` `a34aca61…`. These are CB1-STAGED §6's shas, and `run.py` equals `origin/master`'s. The
  task kits: `task_c.json` `61a0b1d6…`, `judge_seat.json` `3acfcdd0…`, `field_exam_ground.json` `781108e6…`. The raw
  answers the replay scored are in `raw/sweep/` (gitignored): 1,210 files, one per row.

| # | model | set | rows / registered | set fingerprint | served = requested | sync ∪ batch = registered; overlap | batch input = offline dry build | ledger lines (sync + batch) |
|---:|---|---|---:|---|---|---|---|---:|
| 1 | gpt-4-0613 | c six-way (108) | 108 / 108 | `1feac3433cb4217b` = registered | 108 of 108 | yes; 0 | — (sync) | 108 + 0 |
| 2 | gpt-4-0613 | j judge (119) | 119 / 119 | `69102b8d51dd5d64` = kit rebuild (none registered) | 119 of 119 | yes; 0 | yes | 20 + 99 |
| 3 | gpt-4-turbo-2024-04-09 | j judge (119) | 119 / 119 | `69102b8d51dd5d64` = kit rebuild (none registered) | 119 of 119 | yes; 0 | yes | 20 + 99 |
| 4 | gpt-4o-2024-05-13 | j judge (119) | 119 / 119 | `69102b8d51dd5d64` = kit rebuild (none registered) | 119 of 119 | yes; 0 | yes | 20 + 99 |
| 5 | o1-2024-12-17 | c six-way (108) | 108 / 108 | `1feac3433cb4217b` = registered | 108 of 108 | yes; 0 | yes | 20 + 88 |
| 6 | o3-mini-2025-01-31 | j judge (119) | 119 / 119 | `69102b8d51dd5d64` = kit rebuild (none registered) | 119 of 119 | yes; 0 | yes | 20 + 99 |
| 7 | o4-mini-2025-04-16 | j judge (119) | 119 / 119 | `69102b8d51dd5d64` = kit rebuild (none registered) | 119 of 119 | yes; 0 | yes | 20 + 99 |
| 8 | gpt-4o-mini-2024-07-18 | j judge (119) | 119 / 119 | `69102b8d51dd5d64` = kit rebuild (none registered) | 119 of 119 | yes; 0 | yes | 20 + 99 |
| 9 | gpt-4-0613 | f40 (40) | 40 / 40 | `a307cf40b16dda28` = registered | 40 of 40 | yes; 0 | yes | 20 + 20 |
| 10 | gpt-4-turbo-2024-04-09 | f40 (40) | 40 / 40 | `a307cf40b16dda28` = registered | 40 of 40 | yes; 0 | yes | 20 + 20 |
| 11 | gpt-4o-2024-05-13 | f40 (40) | 40 / 40 | `a307cf40b16dda28` = registered | 40 of 40 | yes; 0 | yes | 20 + 20 |
| 12 | o1-2024-12-17 | f40 (40) | 40 / 40 | `a307cf40b16dda28` = registered | 40 of 40 | yes; 0 | yes | 20 + 20 |
| 13 | o3-mini-2025-01-31 | f40 (40) | 40 / 40 | `a307cf40b16dda28` = registered | 40 of 40 | yes; 0 | yes | 20 + 20 |
| 14 | o4-mini-2025-04-16 | f40 (40) | 40 / 40 | `a307cf40b16dda28` = registered | 40 of 40 | yes; 0 | yes | 20 + 20 |
| 15 | gpt-4o-mini-2024-07-18 | f40 (40) | 40 / 40 | `a307cf40b16dda28` = registered | 40 of 40 | yes; 0 | yes | 20 + 20 |

**Short cells: none.** No cell is short of its item count, so nothing is listed for a re-ask.

## 5 · Scores

The columns and their sources:
- **strict (report)** is `summary.strict_correct` / `n_labelled` from each cell's `sweep/*.report.json`, written by the
  kit's own scorer: parsed, and the choice equals the label.
- **strict v2** and **lenient v2** come from `python3 parse_v2.py --census <rows> --set <c|j|f40>`, the series' frozen
  parser (`689254c5…`, PREREG-S0 §3). The report carries no lenient figure, so the lenient column is parse_v2's.
- **refused** and **failed calls** come from the report.
- **$** is the cell's ledger total, which equals the report's `summary.usd` to float precision.

On every cell, the report's `correct` (run.py's v1 rule), `strict_correct`, parse_v2 strict and parse_v2 lenient are
the same number, and `unparsed` is 0.

**The registered expectations, and their subject.** v2 registers them in §4 CB-1: "**Prediction, held.** Repeat
agreement ≥ 105/108; f40 ≥ 36/40 (saturated); j under 50 %" (`COI-GAPS-AND-PLAN-v2.md:194`). v1 names the anchor as
the subject: "the anchor reads ≥ 36/40 on f40 (the shelf's capable readers saturate it) and under 50 % on j (the set
"that still separates")" (`COI-GAPS-AND-PLAN.md:128-129`). v2 kept the thresholds. So the anchor's cells carry the
registered verdicts. Every other cell's figure prints beside the threshold, marked unregistered, with no verdict.

| registered prediction | source | subject | read | verdict |
|---|---|---|---|---|
| repeat agreement ≥ 105/108 | v2 `:194`; `CB1-STAGED.md` §5; v1 `:127-128` | the anchor's c repeat against the frozen `19dd5517` row | 106/108 same strict choice (§3) | **HELD** |
| f40 ≥ 36/40 | v2 `:194`; v1 `:128` | the anchor | 40/40 | **HELD** |
| j under 50 % | v2 `:194`; v1 `:128-129` | the anchor | 91/119 = 76.5 % strict; 111/119 = 93.3 % under `expected_ok` | **FAILED** |

The `j expected_ok` column comes from the rows' own `expected_ok` field, which is `run_addenda.task_j`'s alternation
(`correct_alt`: OFF-PAGE counts correct on either reading). It is `j_expected_ok_correct` in `closeout-check.json`.

| # | model | set | n | strict (report) | strict v2 | lenient v2 | j `expected_ok` | refused | failed calls | $ (ledger) | registered expectation | verdict |
|---:|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---|---|
| 1 | gpt-4-0613 | c six-way (108) | 108 | 88/108 (81.5 %) | 88 | 88 | — | 0 | 0 | 0.955980 | "repeat agreement ≥ 105/108" (registered; the anchor): 106/108 same strict choice, §3 | **HELD** |
| 2 | gpt-4-0613 | j judge (119) | 119 | 91/119 (76.5 %) | 91 | 91 | 111/119 (93.3 %) | 0 | 0 | 1.801320 | "under 50 % on j" (registered; the anchor) | **FAILED** |
| 3 | gpt-4-turbo-2024-04-09 | j judge (119) | 119 | 90/119 (75.6 %) | 90 | 90 | 110/119 (92.4 %) | 0 | 0 | 0.595475 | "j under 50 %" (beyond the registration) | unregistered |
| 4 | gpt-4o-2024-05-13 | j judge (119) | 119 | 86/119 (72.3 %) | 86 | 86 | 106/119 (89.1 %) | 0 | 0 | 0.301028 | "j under 50 %" (beyond the registration) | unregistered |
| 5 | o1-2024-12-17 | c six-way (108) | 108 | 97/108 (89.8 %) | 97 | 97 | — | 0 | 0 | 1.827105 | none registered (its first read) | — |
| 6 | o3-mini-2025-01-31 | j judge (119) | 119 | 95/119 (79.8 %) | 95 | 95 | 115/119 (96.6 %) | 0 | 0 | 0.089927 | "j under 50 %" (beyond the registration) | unregistered |
| 7 | o4-mini-2025-04-16 | j judge (119) | 119 | 97/119 (81.5 %) | 97 | 97 | 117/119 (98.3 %) | 0 | 0 | 0.093497 | "j under 50 %" (beyond the registration) | unregistered |
| 8 | gpt-4o-mini-2024-07-18 | j judge (119) | 119 | 90/119 (75.6 %) | 90 | 90 | 110/119 (92.4 %) | 0 | 0 | 0.009098 | "j under 50 %" (beyond the registration) | unregistered |
| 9 | gpt-4-0613 | f40 (40) | 40 | 40/40 (100.0 %) | 40 | 40 | — | 0 | 0 | 0.195675 | "≥ 36/40 on f40" (registered; the anchor) | **HELD** |
| 10 | gpt-4-turbo-2024-04-09 | f40 (40) | 40 | 39/40 (97.5 %) | 39 | 39 | — | 0 | 0 | 0.063885 | "f40 ≥ 36/40" (beyond the registration) | unregistered |
| 11 | gpt-4o-2024-05-13 | f40 (40) | 40 | 39/40 (97.5 %) | 39 | 39 | — | 0 | 0 | 0.034258 | "f40 ≥ 36/40" (beyond the registration) | unregistered |
| 12 | o1-2024-12-17 | f40 (40) | 40 | 40/40 (100.0 %) | 40 | 40 | — | 0 | 0 | 0.472718 | "f40 ≥ 36/40" (beyond the registration) | unregistered |
| 13 | o3-mini-2025-01-31 | f40 (40) | 40 | 40/40 (100.0 %) | 40 | 40 | — | 0 | 0 | 0.012327 | "f40 ≥ 36/40" (beyond the registration) | unregistered |
| 14 | o4-mini-2025-04-16 | f40 (40) | 40 | 40/40 (100.0 %) | 40 | 40 | — | 0 | 0 | 0.013858 | "f40 ≥ 36/40" (beyond the registration) | unregistered |
| 15 | gpt-4o-mini-2024-07-18 | f40 (40) | 40 | 40/40 (100.0 %) | 40 | 40 | — | 0 | 0 | 0.001011 | "f40 ≥ 36/40" (beyond the registration) | unregistered |

## 6 · Reproducibility: `receipts/cb1-part1/`

**Copied from the run.** The first five files were copied (never moved) from the lead's scratch,
`/tmp/claude-withheld-2026-10-14/scratchpad/coi-cb1/`, where the originals remain.
Each is byte-identical to its original.

| file | sha256 | what |
|---|---|---|
| `drive_part1.sh` | `903ef9da55471211c366cd7b9f46f966c1a55ea9ae434ae71c7a5a7da388562c` | the driver: cell 1 → the determinism receipt → cells 2–15 behind the gate → the collect loop |
| `gate.py` | `30b8b92f0e496b2674c19890bc9b8a41b36bd8d272013507bae8d74c49e7a2e2` | the between-cell gate (rules A, B, C; `CB1-STAGED.md` §4) |
| `driver.log` | `3d61c51c28c7c6c905cb6dfbfda13f798b5d7a674d674230d1377ffbb286f12d` | the driver's log, 08:38:02Z → 09:47:22Z |
| `collect.log` | `83ec59e10933a22ff266286517855f02131a0e5b09f91921b652c7f7624980ba` | every `collect_sweep.sh` pass (the WAIT's ingest and passes 1–7) |
| `sp_here/receipts/sweep-priced.json` | `0fdb796a7d848913d66d45b63312032cec84f29110df9fbb7fd9246d468a066e` | the gate's priced input, read at `<gate dir>/sp_here/receipts/sweep-priced.json` and so copied at that relative path |

**Written by the close-out lane.** These two files have no original: they are not part of the run.

| file | sha256 | what |
|---|---|---|
| `closeout_check.py` | `150325bda1f37dbabe4820292799f43c7ac2b4593f5a1984946444dc3517cf2e` | this report's checks, revised for the audit (S-1, S-5; an `egress` block for §9) |
| `closeout-check.json` | `0475d7b992cb70de0371c7ebaf4ebfb71c2d652833eef95874b7c413cb161253` | its output, regenerated by the revision; re-running the script reproduces it byte for byte |

**Archived outside the repo** (by the lead):
- the raw answers: `/workshop/bench-archive/coi-cb1-raw-2026-09-27/` (1,210 files; `sha256sum -c --quiet SHA256SUMS`
  passes, read by this lane at 10:2xZ);
- the offline dry build: `/workshop/bench-archive/coi-cb1-raw-2026-09-27/batch-dry/` (29 files, dated 08:25:04Z;
  `cd …/batch-dry && sha256sum -c ../batch-dry.SHA256SUMS` passes; its 14 Batch inputs equal the lead's scratch copy
  byte for byte).

`sp_here/receipts/sweep-priced.json` holds `receipts/sweep-priced.json`'s 24 cells unchanged, plus
`receipts/cb1-bridge-priced.json`'s four `priced_cells`. Only `made` and `planned_usd` differ from the committed file.
`drive_part1.sh` and `gate.py` hard-code this worktree's kit path. `run_openai.py` imports the Jev bench from its
hard-coded `JEV_DIR` (`/workshop/estate/bench/jev-2026-09-21`), and the reports' `jev_run_py_sha256` records what it
read (`withheld-2026-10-14`, equal to `origin/master`'s).

To re-check (offline, from this directory):
`PYTHONDONTWRITEBYTECODE=1 python3 -B receipts/cb1-part1/closeout_check.py --dry-build /workshop/bench-archive/coi-cb1-raw-2026-09-27/batch-dry/sweep | cmp - receipts/cb1-part1/closeout-check.json`
prints nothing when the output matches. The lead's scratch copy of the dry build gives the same bytes. Without
`--dry-build`, the dry-build check reads "not checked". `--selftest` shows that each kit-order check and the
fingerprint basis can read false.

## 7 · The OS stamp

Estate law says bench files record the OS (`hostos.py`, estate `ef00b697`). The kit's runner (`run_openai.py`
`deaf73bb…`) predates that commit and does not stamp its reports. The OS was therefore read **after the run**:
`read_os()` from `origin/master`'s canonical `bench/render-grid-2026-09-24/hostos.py` (sha256 `a6a74bba…`; all three
copies agree), on the laptop, at **2026-09-27T09:51:35Z**. That is 4 min 13 s after the driver's DONE at 09:47:22Z.
The box had been up since 2026-09-22T22:52:59Z (`uptime -s`, local −06:00), and dpkg's last change was at
2026-09-25T12:48:48Z (`/var/log/dpkg.log`). So neither a reboot nor a package change came between the run and the read:

```json
{"arch": "x86_64", "id": "ubuntu", "kernel": "7.0.0-34-generic", "pretty_name": "Ubuntu 26.04.1 LTS", "source": "/etc/os-release", "version_id": "26.04"}
```

This is the client's OS. The models ran on OpenAI's servers, which the stamp does not describe.

## 8 · What part 2 waits on

- **The six task_a cells, $10.6814 priced** (`CB1-STAGED.md` §3: `gpt-4-0613` $3.4369, `gpt-4-turbo-2024-04-09`
  $4.1016, `gpt-4o-2024-05-13` $2.0433, `o3-mini-2025-01-31` $0.5195, `o4-mini-2025-04-16` $0.5187, the bridge
  `gpt-4o-mini-2024-07-18` $0.0614). They bill **only after the M-5 runner fix merges**. The brief is
  `bench-archive/plans-2026-09-26/BRIEF-COI-M5-refused-row-sha.md` (branch `fix/coi-m5-refused-sha`). The fix makes
  every refused task_a row carry its offline `prompt_sha256`, proven in a dry run on the two refused Jev passes A05
  dropped, with `task_a@8k`'s 36 checked as a subset of the anchor's 39.
- Then, before part 2's first call:
  - the bridge's census `receipts/census/gpt-4o-mini-2024-07-18.task_a.json`, made by `sweep_plan.py` once the bridge
    id is in its SWEEP/ENCODING/CONTEXT (`run_openai.py` refuses task a without it);
  - the task_a lines appended to `receipts/sweep-cells.txt`. `CB1-STAGED.md` §3's last sentence says "its five task_a
    lines", while §3's table lists six cells. The part-2 lane appends one line per table row, or says why not.
- **Headroom:** $25.00 − $6.467161 = $18.532839 under the sweep cap, against part 2's $10.6814 priced.
- **Deadline:** 2026-10-23. The anchor stops serving then.

## 9 · Owed

1. **Archive `raw/sweep/`: done** by the lead, at `/workshop/bench-archive/coi-cb1-raw-2026-09-27/` (1,210 files,
   `SHA256SUMS` passes). It is gitignored in the worktree, and it holds the answers every replay-scored row reads. The
   committed `batch/sweep/*.output.jsonl` carry the Batch answers, but the full responses of the 388 synchronous calls
   (headers, timings, attempts) exist only in that archive.
2. **A-13 is not registered, so these rows landed before their amendment.** The plan lists A-13 under "Amendments to
   register before the rows" (`COI-GAPS-AND-PLAN-v2.md:370-377`). PREREG-S0 on `origin/master` carries A-00 … A-05 and
   A-09 … A-12 only. Until A-13 lands, two things rest on the plan's text and not on a registered amendment: the
   cells' 0.1 placement (§1) and the o-series cells' 1-rep read.
3. **The series does not read `sweep/` yet, and would not place these rows as 0.1.** `series/lanes.py` `_openai` globs
   `openai-reading-0/rows/*.report.json`, and `series/mdc.py` `anchor_repeat` globs `rows/gpt-4-0613*.c*.jsonl`. So a
   series build today still prints the anchor's determinism as "ABSENT … not probed" (A-05). The fix is either to
   teach the series the sweep directory or to place the repeat where it reads. When the series does read these rows,
   it must file them as reading 0.1 by measured time (the `series/cells.py` change D-20260927-016 names). That is the
   lead's call, and nothing was moved here.
4. **j cannot enter the series yet.** `KIT.lock.json` `sets.j.set_fingerprint.registered` is null (rule 1.1-a
   registers a new set's fingerprint by amendment; the kit rebuild's is `69102b8d51dd5d64`, which all six j cells
   match). `series/v2score.py` `score_pass(…, "j")` raises `KeyError: 'j'` because `series/kitlock.py` `TASK_SET` has no
   j. The c and f40 cells score through it today.
5. **This sweep's egress is missing from `EXPOSURE.jsonl`.** PREREG-S0 §1.2 (`PREREG-S0.md:60`) says the egress
   ledger "records every egress of every set: set, endpoint, served model, item ids, first/last UTC". This sweep sent
   the following to api.openai.com, both synchronously and by Batch (`closeout-check.json` `egress`):
   - j to six models, 119 items each, 08:40:06Z → 08:43:34Z. j's claims are private (`PREREG-S0.md:35`), and this is
     the first time the set went to a frontier endpoint.
   - f40 to seven models, 40 items each, 08:43:36Z → 08:56:30Z.
   - c to o1 (108 items, its first read) and to the anchor (the 108-item repeat), 08:38:04Z → 08:42:27Z.

   The times are the synchronous answers' ledger stamps and each Batch's upload stamp. `EXPOSURE.jsonl` holds 39 rows,
   all doorman: non-doorman egress has never been logged, and reading 0's c rows and kimi's f40 have no rows either.
   The rows are owed, or the lead rules that the ledger is doorman-only and says so.
6. **The account.**
   - A fresh dashboard read by an operator replaces the $40.74 estimate.
   - The ≈ $10.01 gap after the first top-up: D-20260927-009 gives it to the CB-1 lane to reconcile against
     `spend.jsonl`, and `CB1-STAGED.md` §4 did that. The first top-up's amount was never stated. *Derived, not stated*
     (audit I-3): $17.14 − $4.474162 = $12.665838 before the first top-up, and $32.66 − $12.665838 = $19.994162. That
     is consistent with a $20 first top-up to within $0.01, so the gap does not imply unledgered spend.
   - Every OpenAI ledger on file now reads $4.474162 (reading 0) + $6.467161 (CB-1 part 1) + $5.45283 (CB-10).
7. **The determinism caveat.** Plan §4 CB-1: "the disagreement prints as a caveat and F-1's fixed-ratio sensitivity
   row widens the interval by the rep noise". The read is 2 of 108 (§3).
8. **The OS at run time for part 2.** This report's stamp was read after the run (§7). Part 2's driver can log
   `read_os()` at its start.
9. **Part 2 itself** (§8), before 2026-10-23. Its gate should subtract every OpenAI ledger, not only the sweep's
   (audit I-1).
