# CELLS-2-6 · CB-1 part 2, cells 2–6: four closing OpenAI ids and the bridge on task_a (2026-10-01)

*Written 2026-10-01, 17:40Z → 18:1xZ (UTC, `date -u` on the laptop), by the CELLS lane of workflow wf_aa614744-110, under
D-20261001-039 (an operator's go, ~14:44Z: "sounds great on benchbox, perfect time to run benches today, some nice cool fall
weather finally :)", then "and also, any additional "cost of intelligence" benches we still need to run, let's do those
too") and the priced go D-20260927-009 (the $25 sweep cap, above the $5 account reserve). INTERNAL FILE. No key,
account name, address, card ID or local offset is printed. Every dollar is a list-price API SUBTOTAL, and "derived
here" marks arithmetic no kit file holds. All times are UTC.*

**What this page is, for a reader who scrolled straight here.** It reports five cells of the cost-of-intelligence
series on task_a, the docent gate (S0 set `a`, 63 items, with the task_a@8k fence of 36): the four other OpenAI ids
that stop serving on 2026-10-23 (`gpt-4-turbo-2024-04-09`, `gpt-4o-2024-05-13`, `o3-mini-2025-01-31`,
`o4-mini-2025-04-16`) and the bridge `gpt-4o-mini-2024-07-18`. They were read through the OpenAI API by the series' own
runner from **2026-10-01T15:56:29Z** (cell 2's unit start) to **18:06:59Z** (the bridge's collect). Each is a
reading-0.1 cell at one rep (A-13): 5 synchronous calls (they carry TTFT and latency) and 58 by Batch. They follow cell
1, the anchor `gpt-4-0613`, read from 15:10:04Z to 15:15:09Z the same day (`FIRST-MEASURE.md`: strict 39 of 63 with 24
context refusals, task_a@8k 36 of 36, $3.3678).

---

## 0 · One screen

| cell | id | first row (UTC) | strict, of 63 (v2) | task_a@8k, of 36 | subtotal $ | priced $ | sweep scope after $ | cap left $ | refusals |
|---|---|---|---:|---:|---:|---:|---:|---:|---|
| 2 | `gpt-4-turbo-2024-04-09` | 15:56:44Z (`on-01`) | **58** (92.1 %) | 34 | 4.377300 | 4.1016 | 14.212261 | 10.787739 | none |
| 3 | `gpt-4o-2024-05-13` | 15:57:21Z (`on-01`) | **59** (93.7 %) | 34 | 2.184920 | 2.0433 | 16.397181 | 8.602819 | none |
| 4 | `o3-mini-2025-01-31` | 15:57:39Z (`on-01`) | **63** (100.0 %) | 36 | 0.489355 | 0.5195 | 16.886535 | 8.113465 | none |
| 5 | `o4-mini-2025-04-16` | 15:58:00Z (`on-01`) | **62** (98.4 %) | 36 | 0.490008 | 0.5187 | 17.376544 | 7.623456 | none |
| 6 | `gpt-4o-mini-2024-07-18` (bridge) | 16:00:24Z (`on-01`) | **62** (98.4 %) | 35 | 0.065515 | 0.0614 | 17.442059 | 7.557941 | none |

- **The score is the series' own** (`series/v2score.py` `score_pass(rows, "a")`, parser v2 `689254c5…`, and
  `parse_v2.py --census`), never a DONE line. task_a@8k is score_pass's own per-item strict mark over KIT.lock.json's
  36 members (derived here; the series has no separate scorer for the subset). Every pass is complete, in kit order,
  fingerprint `1d5310ddbdb247c6` = registered, rate status `rate`.
- **No refusal of any kind.** Every page fits every window (each census refuses 0 pages), so all 63 items were sent in
  every cell. Provider refusals 0, content filter 0, failed calls 0, truncated rows 0, format failures 0.
- **Each cell's first row is its first counted call** (no cell refused a page). Its time is the sync pass's own row
  stamp, kept by `cell.sh` before the replay at collect re-stamped every row, and it equals the cell's first ledger
  line to the second.
- **The money.** Cells 2–6 spent **$7.607099** against $7.2445 priced. The sweep scope now reads **$17.442059 of the
  $25 cap ($7.557941 left)**. The OpenAI balance ESTIMATE is **$29.77** (derived here: $52.66 − $6.467161 − $5.45283 −
  $3.3678 − $7.607099); the key cannot read the balance.
- **Each gate read GO before its cell was billed**, the cells ran in closure order, and each was collected alone by
  `cell-collect.sh` (never `collect_sweep.sh`, FIRST-MEASURE §5.1). **Nothing was re-run. No amendment was needed.**
- **The bridge's Batch was slow, not refused:** created 16:00:32Z, it read 0 of 58 done at every poll until 17:46:38Z,
  49 at 17:51:37Z, and completed at 18:04:12Z (2 h 04 min; its four siblings took 2.4 to 23.4 minutes).
- **PR #225** (draft until this page's cell 6 landed; stacked on #220) carries all five cells: commit `a1228df3`
  (cells 2–5, the bridge's census, pushed 17:39:12Z) and the cell-6 commit on top.

---

## 1 · What ran

| field | value |
|---|---|
| cells | CB-1 part 2, cells 2–6, each × task_a (S0 set `a`, 63 items), stage `sweep`, in closure order; the bridge last |
| registration | PREREG-S0 §9.2 (`sweep-priced.json` `66e15d0c…`: each of the four ids `in_plan: true`, "batch 58 + sync subsample 5"); the bridge's cell in `receipts/cb1-bridge-priced.json` (`in_plan: true`, the same mode, $0.0614) and CB1-STAGED §3; A-13 (0.1 cells, one rep); A-23 (the instrument shas, the refused-row sha, the task_a@8k fence) |
| PREREG read | `PREREG-S0.md` sha256 `withheld-2026-09-29` (= `PREREG-S0.md.sha256`) |
| instrument | `run_openai.py` `c8664ab5`, `dryrun.py` `35561aaa`, `refusedsha.py` `6e091dad`, `oai.py` `102e0bbc`, `batch.py` `dc80205d`, `collect_sweep.sh` `a8b5706a` (all = A-23's), `KIT.lock.json` `0bca44b4`, Jev `run.py` `withheld-2026-10-14`, `parse_v2.py` `689254c5`, `sweep_plan.py` `8e795b51`; every cell log prints the full shas at its start |
| box · card | the laptop → api.openai.com; no card |
| client OS | Ubuntu 26.04.1 LTS, kernel 7.0.0-34-generic, x86_64, at every unit's start (the cell logs), and by the canonical `hostos.py` `read_os()` (`a6a74bba…`) at 16:07:12Z (`os-stamp-cells2-6.json`); Python 3.14.4. The models ran on OpenAI's servers, which this stamp does not describe |
| worktree | `/workshop/estate-worktrees/coi-cb1-part2-b`, new branch `bench/coi-cb1-part2-b`, stacked on #220's head `a33822b1`, so #220's audit reads a frozen head |
| units | per cell `coi-cb1p2-a-<id>` (`cell.sh`: sync 5 → Batch build → submit) and `coi-cb1p2-a-<id>-collect` (`cell-collect.sh`: ingest → replay score), each `systemd-run --user` with MemoryMax 2G; the census in `coi-cb1p2-bridge-census-2` (MemoryMax 4G) |
| requests | `gpt-4-turbo`, `gpt-4o` and the bridge: temperature 0, seed, `max_tokens` 8 (run.py's predict). `o3-mini` and `o4-mini`: reasoning effort `low`, `max_completion_tokens` 4,096, temperature not sent (the probe's registered profile). Served model = requested on every row and every Batch output body |

**The offline proof, before any call** (15:53:58Z → 15:56:24Z; the bridge's at 16:00Z): the shas above; the offline
suites `test_refused_sha_offline.py` 21 OK, `test_batch_offline.py` 4 OK, `test_completions_offline.py` 11 OK,
`test_doorman_egress.py` 7 OK; and a dry run per cell (`dryrun.py --task a --limit 3 --out` into the lane scratch,
committed as `receipts/cb1-part2/dry-<id>.a.first3.txt`): 63 rendered, 0 sent, 0 refused, 63 of 63 shas = KIT.lock.json
`a` in kit order, fingerprint = registered, task_a@8k 36 of 36 sent, every body's prompt = the harness's byte for byte.

**The gates** (`receipts/cb1-part2/gate_b.py`: part 2's `gate.py` with only `K` repointed at this worktree;
`gate-cell<n>.txt`). Each counted every submitted, un-ingested Batch at its worst case:

| cell | gate (UTC) | recorded $ | pending Batches, worst $ | cell worst $ | A: sum ≤ 25.00 | C: sum ≤ 42.21 | verdict |
|---|---|---:|---|---:|---:|---:|---|
| 2 | 15:56:24Z | 9.8350 | none, 0.0000 | 6.5278 | 16.3628 | 16.3628 | GO |
| 3 | 15:57:12Z | 11.0008 | turbo, 4.8976 | 3.2639 | 19.1623 | 19.1623 | GO |
| 4 | 15:57:32Z | 11.5814 | turbo + 4o, 7.3464 | 1.3299 | 20.2578 | 20.2578 | GO |
| 5 | 15:57:53Z | 11.7114 | turbo + 4o + o3-mini, 8.4070 | 1.3299 | 21.4484 | 21.4484 | GO |
| 6 | 16:00:16Z | 11.8403 | the four, 9.4677 | 0.0980 | 21.4059 | 21.4059 | GO |

**Timeline** (UTC, 2026-10-01; the cell logs, the sync passes' own rows and the Batch objects' own stamps):

| cell | unit start | first row | sync pass ended | Batch created | in progress | completed | collected (ingest + replay) |
|---|---|---|---|---|---|---|---|
| 2 `gpt-4-turbo` | 15:56:29Z | 15:56:44Z (a 72,446-token page, TTFT 14.81 s) | 15:57:00Z | 15:57:02Z | 15:58:03Z | 16:03:08Z | 16:06:54Z |
| 3 `gpt-4o-2024-05-13` | 15:57:16Z | 15:57:21Z | 15:57:26Z | 15:57:27Z | 15:57:29Z | 15:59:52Z | 16:00:43Z |
| 4 `o3-mini` | 15:57:37Z | 15:57:39Z | 15:57:47Z | 15:57:48Z | 15:57:49Z | 16:21:09Z | 16:21:22Z |
| 5 `o4-mini` | 15:57:57Z | 15:58:00Z | 15:58:07Z | 15:58:08Z | 15:58:12Z | 16:00:35Z | 16:00:54Z |
| 6 `gpt-4o-mini` (bridge) | 16:00:21Z | 16:00:24Z | 16:00:30Z | 16:00:32Z | 16:00:35Z | 18:04:12Z | 18:06:59Z |

---

## 2 · The scores, and the integrity checks

Every figure is computed from the files by `receipts/cb1-part2/closeout_cells.py`, run offline. It runs cell 1's
`closeout_cell1.py --model <id> --k 5` unchanged for each cell and adds task_a@8k, the first row, the timings and the
money. Its output is `receipts/cb1-part2/closeout-cells2-6.json`.

| cell | id | sync $ | Batch $ | cell $ | ledger lines (sync + Batch) | $ per correct (derived here) | TTFT median s (min–max, the 5 sync rows) | wrong items (label → answer) |
|---|---|---:|---:|---:|---|---:|---|---|
| 2 | `gpt-4-turbo-2024-04-09` | 1.165850 | 3.211450 | 4.377300 | 5 + 58 | 0.07547 | 3.27 (2.50–14.81) | on-01, on-02, on-18, on-23, on-42 (each yes → no) |
| 3 | `gpt-4o-2024-05-13` | 0.580620 | 1.604300 | 2.184920 | 5 + 58 | 0.03703 | 1.26 (0.48–4.48) | off-04, off-08, off-14, off-17 (each no → yes) |
| 4 | `o3-mini-2025-01-31` | 0.130015 | 0.359340 | 0.489355 | 5 + 58 | 0.00777 | 1.76 (1.36–2.33) | none |
| 5 | `o4-mini-2025-04-16` | 0.128862 | 0.361147 | 0.490008 | 5 + 58 | 0.00790 | 1.78 (1.32–2.41) | off-04 (no → yes) |
| 6 | `gpt-4o-mini-2024-07-18` | 0.017410 | 0.048105 | 0.065515 | 5 + 58 | 0.00106 | 0.94 (0.60–2.90) | off-17 (no → yes) |

For comparison, cell 1 (the anchor) cost $0.0864 per correct on its 39 answered items.

- **The misses, read descriptively.** `gpt-4-turbo` missed five pages labelled `yes`, answering `no` each time,
  including two task_a@8k members (`on-18`, `on-42`). `gpt-4o-2024-05-13` missed four pages labelled `no`, answering
  `yes`, including two members (`off-08`, `off-17`). The bridge missed `off-17` too, a member; `o4-mini` missed `off-04`;
  `o3-mini` missed none. The anchor answered all four of those members right (cell 1, 36 of 36). These are one-rep
  cells (the three non-reasoning ones at temperature 0; the o-series at effort low, temperature not sent), so an item is
  one reading, never a trend.
- **Format.** `gpt-4o-2024-05-13` wrote its letter and then its option's name on 57 of 63 replies, and the bridge on 22,
  each reaching `max_tokens` 8 (finish `length`); every one parses as letter+name under v2, and none is a format
  failure. The other three cells are clean on all 63. `v1` (run.py's parse, kept for continuity) and lenient both equal
  strict on every cell here.
- **Reasoning.** `o3-mini`'s hidden reasoning ran 0 to 192 tokens an item (median 0); `o4-mini`'s 0 to 192 (median 64).
  No reply came near the 4,096 budget.

**Integrity, all held on every cell** (per cell, in `closeout-cells2-6.json`):

- **Rows against the registered set.** 63 rows in kit order, 63 of 63 shas equal KIT.lock.json `a`'s at their
  position; no unkeyed, duplicate or unregistered row; fingerprint `1d5310ddbdb247c6` = registered.
- **The split.** The first 5 sent items (kit order) are the 5 synchronous raw files; the other 58 equal the Batch input
  in order by `custom_id`; their union is the 63 sent, with an overlap of 0.
- **The Batch.** `completed`, `request_counts` 58/58 with failed 0, no error file; the output `custom_id`s equal the
  input's, once each; every output line HTTP 200; the model is the requested id in every request and every output
  body; the manifest's input sha holds and its `custom_ids` equal the input file's.
- **The ledger.** Each cell's lines are 5 `sweep` + 58 `sweep-batch` under its one batch id, each `custom_id` once; their
  sum equals the report's `summary.usd`. The ledger only grew: +315 lines (5 × 63), 0 removed; it holds 5,213 lines,
  sha256 `9105f698fa2cbd49…`.
- **The report.** `task_a8k_check.ok` true with no member refused; the `instrument` block's shas equal A-23's;
  `replay_only` true at collect.
- **The offline count was exact.** Each cell's server-side prompt tokens equal its census's offline count: 758,686
  (`gpt-4-turbo`, cl100k_base), 756,440 (`gpt-4o-2024-05-13` and the bridge, o200k_base), 756,377 (`o3-mini`,
  `o4-mini`).
- **The raw answers** (gitignored; the replay's source) are archived at
  `/workshop/bench-archive/coi-cb1p2-cells2-6-raw-2026-10-01/`: 315 files under `raw/sweep/<id>/a/` (63 a cell) and
  the five sync passes' own rows and reports under `sync-pass/`. `SHA256SUMS` (325 lines; its own sha256
  `7f578c75b35a1416…`) passes `sha256sum -c`.

---

## 3 · The money

| line | figure | source |
|---|---:|---|
| the sweep scope before these cells | 9.834961 | the ledger's own sum less these cells' lines (= FIRST-MEASURE §0's $9.834961) |
| cells 2–6, recorded | 7.607099 | `receipts/spend.jsonl`, each cell's lines (§2) |
| cells 2–6, priced | 7.2445 | `sweep-priced.json` (7.1831) + `cb1-bridge-priced.json` (0.0614) |
| the sweep scope now, of the $25.00 cap | **17.442059** | the ledger (5,213 lines) |
| left under the cap | **7.557941** | derived here |
| the OpenAI balance, an ESTIMATE | 29.77 | derived here: 52.66 (the 09-27 dashboard) − 6.467161 (part 1) − 5.45283 (CB-10) − 3.3678 (cell 1) − 7.607099 (cells 2–6) |

- **Why `gpt-4-turbo`, `gpt-4o-2024-05-13` and the bridge ran about 7 % over their priced figures.** The 5 synchronous
  items are the first 5 sent in kit order (`on-01` … `on-05`), and `on-01` is the set's longest page (72,446 tokens on
  cl100k_base). Their mean prompt is about 23,300 tokens against the set's mean of about 12,000, so the full-price
  subsample costs about twice what a projection at the mean assumes (derived here from the rows' `x_prompt_tokens`).
  Each stayed well inside its gate worst case ($6.5278, $3.2639, $0.0980). The o-series came in under their priced
  figures: they were priced at twice the six-way rows' output per item for a reasoning model, and reasoned less.
- **Nothing else spent OpenAI money today.** Every copy of the OpenAI ledger on the laptop (the shared checkout and every
  worktree) was read at about 15:50Z: no line dated 2026-10-01 but cell 1's 39, before these cells.
- **What the cap now holds** (COI-SCHEDULE §7): $7.557941 left. The o-series top-ups are about $5.02 at part 1's
  measured rate (about $14.35 priced, and the gate's worst case for one o1 six-way rep is about $11.12, so the gate
  CUTs o1's reps under $25), plus the probes (at most about $4.20). That is ask A3 (ii), the cap.

---

## 4 · Cell 6: the bridge

### 4.1 Its census (offline)

`run_openai.py` refuses task a without `receipts/census/<id>.task_a.json`, and the bridge had none (CB1-STAGED §3:
"made by `sweep_plan.py` once the bridge id is in its SWEEP/ENCODING/CONTEXT"). It was made by part 1's method
(`cb1-bridge-priced.json`): the kit's own `sweep_plan.py`, unedited (`8e795b51…`), imported from a `git archive` copy of
this lane at `a33822b1` in the lane scratch, with the bridge appended to its SWEEP, ENCODING (`o200k_base`) and CONTEXT
(128,000 from `receipts/model-pages/gpt-4o-mini.md`, sha `20d4047a…` = the receipt's), then `main()`
(`receipts/cb1-part2/bridge_census.py`). It made no request and read no key. Its one network read was tiktoken 0.14.0's
`o200k_base` and `cl100k_base` encoding files, fetched into the scratch cache; they are public files, and tiktoken checks
them against its built-in hashes. Before anything was used, the run had to reproduce the committed method
(`bridge-census.json`, `ok: true`):

- the 24 committed cells of `receipts/sweep-plan.json`, field for field: **24 of 24 equal**;
- the six committed task_a censuses, field for field (`made` aside): **6 of 6 equal**;
- the bridge's four plan cells against `cb1-bridge-priced.json`'s: **equal on every field the receipt keeps.** The
  receipt left one field out, `overlong_ids_tokens`; the run's is the empty list on all four, as `refused_overlong` 0
  says. (The first run, 15:59:17Z, flagged exactly that missing field. The script was corrected to compare on the
  receipt's own keys and re-run at 15:59:59Z; a census bills nothing.)
- the bridge's census against the receipt's `task_a_census_summary`: **equal** (max page 72,118 tokens, fit limit
  127,744, 0 pages overlong, reasoning budget 0).

The census was then copied into the kit (`receipts/census/gpt-4o-mini-2024-07-18.task_a.json`, sha256
`91460312e42af098…`, made 16:00:00Z), and the bridge's dry run read 63 rendered, 0 refused, task_a@8k 36 of 36.

### 4.2 Its cell

Gated GO at 16:00:16Z; the unit started at 16:00:21Z; the first row (`on-01`) is stamped 16:00:24Z; the sync pass
answered 5 of 5 right ($0.017410, TTFT median 0.94 s). The Batch (58 lines, worst $0.0735) was created at 16:00:32Z and
went `in_progress` at 16:00:35Z. It read 0 of 58 done, failed 0, no errors, at every poll from 16:00:36Z to 17:46:38Z,
then 49 at 17:51:37Z, 56 at 18:02:42Z, and `completed` (58/58, failed 0) at 18:04:12Z by its own stamp. It was ingested
and scored at 18:06:59Z: **strict 62 of 63, task_a@8k 35 of 36, $0.065515.** Nothing was re-asked while it waited: a
slow Batch is waited on, and a failed, expired or cancelled one is the lead's call (CB1-STAGED §8).

---

## 5 · Findings and refusals

1. **Refusals: none.** No context refusal (each census refuses 0 pages), no provider refusal, no content filter, no
   failed call, no truncated row, in 5 × 63 rows. Nothing was re-run.
2. **The bridge's Batch took 2 h 04 min** (§4.2) against 2.4 to 23.4 minutes for its four siblings and 0.3 to 56.8 for
   part 1's 14. It sat at 0 of 58 for 106 minutes with no error. A plan that needs a cell inside a window should not
   count on the Batch tier's median.
3. **The `collect_sweep.sh` trap still stands, and now covers more lines** (FIRST-MEASURE §5.1).
   `receipts/sweep-cells.txt` gained five task_a lines here (six with cell 1's). In a fresh worktree `raw/` is absent,
   so `collect_sweep.sh` would re-ingest part 1's 14 batches and these six, writing their spend into the ledger a second
   time and re-writing their committed rows. In this worktree cells 2–6's raw files exist, so their five ingests skip, but part 1's 14 batches
   and cell 1's (whose answers live in the cell-1 worktree and the archive, not here) double-ingest: 856 lines,
   $6.316217, and 5 failed rows in cell 1's file. In a fresh worktree all 20 do: 1,146 lines, $11.900559, taking
   the sweep scope to $29.342618, past the cap (AUDIT-PR225 I-3, corrected at landing). Every cell here was collected alone by `cell-collect.sh`. The rep
   driver's PR is where the schedule makes `collect_sweep.sh` safe.
4. **The egress ledger is still owed** (part 1's owed item 5; FIRST-MEASURE §5.3; the lead's call). These cells sent set
   `a`, all 63 items each, to api.openai.com: synchronously from 15:56:29Z to 16:00:30Z, and by Batch upload from
   15:57:00Z to 16:00:32Z. KIT.lock.json's `sets.a.exposure` says the set was public before its first egress, so the
   egress is no contamination event; PREREG §1.2 still says the ledger "records every egress of every set".
5. **`prereg_sha` is not on the rows** (FIRST-MEASURE §5.4): the A-23 runner does not write it. This lane records
   `withheld-2026-09-29` in every cell log and here. A runner change is its own amendment, so it is listed, not done.
6. **The series does not read `sweep/` yet** (part 1's owed item 3). These rows enter `series.jsonl` only with that
   change and the `cells.py` 0.1 placement (D-20260927-016), the series PR in the build lane.
7. **The balance stays an ESTIMATE** ($29.77) until an operator reads the dashboard (ask A3 (i)).
8. **A receipt gap, closed here.** The replay re-stamps every row at collect, so a committed rows file never carries a
   cell's first row time. Cell 1's lane read it before its replay. `cell.sh` now copies the sync pass's own rows aside
   and prints `FIRST ROW` in each cell log; the copies are archived with the raw answers.

---

## 6 · Receipts

| what | where (under `bench/cost-of-intelligence-2026-09-23/openai-reading-0/`) |
|---|---|
| rows / reports | `sweep/<id>.a.jsonl`, `sweep/<id>.a.report.json` for the five ids |
| Batch | `batch/sweep/<id>.a.{input.jsonl,manifest.json,batch.json,output.jsonl}` for the five ids |
| ledger | `receipts/spend.jsonl` (+315 lines: 5 × (5 + 58); 5,213 lines, `9105f698…`) |
| cell list | `receipts/sweep-cells.txt` (+5 lines, `<id> a 5 batch`) |
| the bridge's census | `receipts/census/gpt-4o-mini-2024-07-18.task_a.json`; `receipts/cb1-part2/bridge_census.py` + `bridge-census.json` |
| the lane's receipts | `receipts/cb1-part2/`: `gate_b.py`, `gate-cell{2..6}.txt`, `cell.sh`, `cell-collect.sh`, `cell-<id>-a.log` (5; the OS and every sha at each start, `FIRST ROW`, every RC), `dry-<id>.a.first3.txt` (5), `closeout_cells.py` + `closeout-cells2-6.json`, `os-stamp-cells2-6.json`, and a copy of this report |
| raw answers + sync passes | `/workshop/bench-archive/coi-cb1p2-cells2-6-raw-2026-10-01/` (`SHA256SUMS`, 325 files) |
| lane scratch | `/tmp/claude-withheld-2026-10-14/scratchpad/coi-today/cells/` |
| commits | `a1228df3` (cells 2–5, the census; pushed 17:39:12Z) and the cell-6 commit, on `bench/coi-cb1-part2-b`; PR #225 |

---

## 7 · The audit this PR needs before it merges (R-3, R-4)

One fresh, read-only audit agent, carrying FIRST-MEASURE §8's ATTACKS, widened to five cells:

- **(a)** Re-score from the archived raw answers in a scratch copy: re-run each cell's replay there and diff each rows
  file byte for byte, `stamp` aside (the replay re-stamps).
- **(b)** Plant faults in scratch copies of a rows file and show that `closeout_cell1.py` and `v2score.score_pass` catch
  each one: a tampered `prompt_sha256`, two swapped rows, a dropped row, and a flipped `generated` letter on a
  task_a@8k member (the a8k count in `closeout_cells.py` must move).
- **(c)** Recount the ledger: 5 + 58 lines a cell, each Batch `custom_id` once, each line's `usd` re-priced from its
  `usage` at its tier's row, summing to each cell's subtotal and to the scope's $17.442059.
- **(d)** Run `collect_sweep.sh` against a scratch copy of this worktree with `oai` stubbed, to show which of the 20
  batch lines double-ingest (§5.3).
- **(e)** Re-make the bridge's census from a fresh `git archive` copy with `bridge_census.py`, and show that a planted
  one-token change to a committed census, or to one of `sweep-plan.json`'s 24 cells, turns its `ok` false.
- **(f)** A privacy grep of every committed file: no key, account id, card ID or local offset. The one address in the
  Batch inputs and the dry runs is the kit's own public article text (the same sha16, `1c295b8f…`, as in
  `bench/jev-2026-09-21/kit/articles.json`), and the `sk-`-shaped strings are the articles' `#card-…-ask-…` anchors.
