# The cost of intelligence, reading 0.1: the Claude `--effort low` cells (CB-2)

*Calls made 2026-09-27T08:21:55Z → 2026-09-27T09:10:15Z (UTC) by `run_cb2.py`. It drives
`anthropic-reading-0/run_anthropic.py` unchanged (sha256 `2ca74176…`) through Claude Code CLI 2.1.282. That is the
runner committed at `6b73f291` that wrote reading 0's last Claude rows (preflight 2026-09-23T21:11:52Z). PREREG-S0
§2.2 and §10 cite `29605396…` as the R-21 runner instead; no commit ever held that version, and the gap is recorded
as `protocol.json` finding W-2. The tables below are printed by `python3 run_cb2.py report` from the row files (the
same figures are in `cb2-results.json`). Every other figure in the text names the file it was read from. PREREG-S0.md
was read at sha256 `withheld-2026-09-29`, the sha in `PREREG-S0.md.sha256` (also `prereg_sha` in `cb2-results.json`). The
raw streams, one per call, are under `raw/` (gitignored by the kit's `.gitignore`, like reading 0's), with a copy
archived at `/workshop/bench-archive/coi-cb2-raw-2026-09-27/` (`SHA256SUMS` inside).*

**What was measured.** The six-way (task_c: 108 dinner lines, *which of six guests said this*) at `--effort low` on
`claude-opus-4-7`, `claude-opus-5` and `claude-fable-5-1`, three reps each. The prompts, option order and letter
parse are the Jev bench's own. **Strict** is parser v2 (`parse_v2.py`, scored through `series/v2score.py` the same
way the series scores every row), out of the 108 items. Dollars are the CLI's `total_cost_usd`, a list-price
estimate (**API-equivalent, not money paid**; the calls rode an operator's subscription). Beside it is a derived direct-API
figure (`series/money.py`: input minus the fitted CLI scaffold, times the list price, plus output times the list
price).

**Why these are reading 0.1 cells, filed here.** PREREG-S0 §9.2 added `--effort low` on these three ids to reading
0's list so that F-closed's utility-posture rows would exist (§2.3, §4.4). Reading 0 closed at 2026-09-25T12:00Z
(§9.1) before they ran, and "a cell measured after a close belongs to the next reading". So they are reading 0.1,
and the 3-rep rule for sampled rows binds (§4.1: "score = the mean, per-item correctness = the mean over reps").

The placement follows R-13's "the kit keeps one directory per reading" (`PLAN-v2.md:326`). This is the first reading
0.1 directory in the kit: `LEAD-TODO.md:43-47` plans a `laptop-reading-0.1/`, but no such directory exists yet. The
rows never go in `anthropic-reading-0/rows/`, because `series/cells.py:149-150, 187-188` would read a
`claude-opus-4-7+effort-low.c.p1` file there as a reading-0 cell, and reading 0's series is frozen.

## How the calls were made

* **The instrument is reading 0's.** `run_cb2.py` imports `../anthropic-reading-0/run_anthropic.py` and refuses to
  run unless the file's sha256 is `2ca7417623849b124e9dcd5bcd2b4cc8ad290c30fe27eb1e8f53c25584ab7b5b`. It calls that
  runner's functions in the order its own `reading()` used to make reading 0's `--effort low` rows (`at(m, "low")`):
  first `effort_probe(m, "low")`, then `run_task(m, "c", pass, claude_once, ROWS, effort="low")`.
* **What the driver re-points.** Only the output paths (to this directory) and the clean working directory
  (`CLAUDE_CLEAN_DIR`, the runner's own knob). It also imports the Jev harness (`run.py`, `run_addenda.py`, `kit/`)
  from this work tree rather than the stale shared `~/estate` checkout; each of the five files' sha256 is checked
  against reading 0's preflight. The runner's `run` subcommand has no `--effort` option, and none was added.
* **The argv, and its receipt.** Every one of this run's 977 `--effort low` calls (972 six-way items, 1 dry-run item,
  4 effort probes; `raw/**/*.meta.json`, `argv_without_prompt`) used
  `claude -p --model <id> --effort low --tools '' --setting-sources '' --strict-mcp-config --no-session-persistence --system-prompt '' --output-format stream-json --verbose '<user prompt>'`.
  The 4 canaries used the same line without `--effort`, which is the runner's canary form. Every call ran with the
  prompt on argv, from an empty directory outside any git work tree, in a scrubbed environment (HOME, PATH, USER,
  LANG, TERM).
* **Why that argv matches reading 0's effort rows.** The receipt is code identity. `git diff 2cd9bb79 6b73f291 --
  …/anthropic-reading-0/run_anthropic.py` compares `ccfe8d77`, the runner at the 17:40:58Z preflight that wrote
  reading 0's low rows, with `2ca74176`; no hunk touches `argv_for`. The diff is R-21's `ENV_EXTRA`, the refusal
  parsing and `variant`. Reading 0's raw metas are in no worktree or archive; the one compared by eye before the run
  (`raw/claude-sonnet-5+effort-low/c.p1/b6bb8767e2b6bab7.meta.json`) was read, read-only, from the stale shared
  `/workshop/estate` checkout.
* **R-21 on every call:** `CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK=1` (`env_extra` in each raw `.meta.json`;
  `x_refusal_fallback_disabled` on each row). A safety-classifier refusal comes back from the requested model and is
  scored wrong as *refused (classifier)*. It is never re-sent to another model.
* **The served-model check on every call** (the runner's `served_mismatch`). The `modelUsage` key, its canonical
  model and the served snapshot must each be the requested id, or the call is not a row. A model is stopped when
  such calls pass 5 % of its calls (floor 20).
* **The stops.** The runner's five-hour utilization stop (0.85), its seven-day stop (0.95) and its leak guard ran as
  they are. The failed-call rule is CB-2's, and a failed call is never a row:
  * an overload (the runner's `error` kind) is re-asked by the runner, 30 s apart, and after 3 failed calls in a row
    that id stops;
  * a rate-limit reply stops the runner at once; the driver re-asks that pass once after 30 s, reusing every item
    already landed;
  * a second rate-limit stops the run, because the subscription is shared with the orchestrating session.
* **Order:** pass-major (rep 1 of all three ids, then rep 2, then rep 3), one call at a time. Before an id's first
  pass in a process, it gets the canary (the no-leak receipt: "What is the name of the dog …? … UNKNOWN") and a
  one-letter probe at `--effort low`.
* **The dry runs, before the launch.** First, the whole driver path on the runner's fake transport: every id and
  rep, 3 items each, no call, written to scratch. That pass printed to the terminal only and left no committed
  receipt. Then one live item end to end on `claude-opus-4-7`: the canary, the effort probe, and item
  `c-darwin-01-dessert-01` with its served-model check. That row is
  `receipts/dryrun/claude-opus-4-7+effort-low.c.p1.jsonl` (a dry run is never a cell), and it is where `run.log`
  begins (its first line is the 08:21:53Z preflight).

## Results (printed by `python3 run_cb2.py report`; the same figures are in `cb2-results.json`)

| id | rep | strict /108 | lenient /108 | format failures | refused (classifier) | served by other | failed calls | CLI total_cost_usd | cache-read tokens | cache-write tokens | derived direct-API $ | thinking items | wall min |
|---|---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
| claude-opus-4-7 | p1 | 99 | 99 | 0 | 0 | 0 | 0 | $0.5194 | 0 | 0 | $0.2027 | 0 | 4.5 |
| claude-opus-4-7 | p2 | 101 | 101 | 0 | 0 | 0 | 0 | $0.5194 | 0 | 0 | $0.2027 | 0 | 3.9 |
| claude-opus-4-7 | p3 | 100 | 100 | 0 | 0 | 0 | 0 | $0.5194 | 0 | 0 | $0.2027 | 0 | 3.9 |
| claude-opus-5 | p1 | 98 | 98 | 0 | 0 | 0 | 0 | $0.9589 | 0 | 94,045 | $0.2066 | 5 | 6.5 |
| claude-opus-5 | p2 | 99 | 99 | 0 | 0 | 0 | 0 | $0.0663 | 94,045 | 0 | $0.2074 | 4 | 6.2 |
| claude-opus-5 | p3 | 98 | 98 | 0 | 0 | 0 | 0 | $0.0619 | 94,045 | 0 | $0.2030 | 5 | 6.1 |
| claude-fable-5-1 | p1 | 81 | 102 | 26 | 0 | 0 | 0 | $2.0499 | 0 | 94,585 | $0.5344 | 1 | 5.5 |
| claude-fable-5-1 | p2 | 78 | 100 | 29 | 0 | 0 | 0 | $0.1729 | 94,585 | 0 | $0.5255 | 0 | 5.2 |
| claude-fable-5-1 | p3 | 80 | 101 | 26 | 0 | 0 | 0 | $0.1764 | 94,585 | 0 | $0.5290 | 0 | 6.0 |

| id | reps with a rate | strict mean /108 | 95 % interval (4.1) | default row (reading 0, 1 rep) | default strict | Δ points | paired Δ 95 % (4.2) | McNemar p (low better / default better) | within 5 (the held prediction) | lenient mean | default lenient | refused total |
|---|--:|--:|--:|---|--:|--:|--:|--:|---|--:|--:|--:|
| claude-opus-4-7 | 3 | 100.00 | 95.3–104.2 | `anthropic-reading-0/rows/claude-opus-4-7.c.p1.jsonl` | 97 | +3.00 | -1.01 to +7.00 (0 inside) | 0.2891 (6 / 2) | yes | 100.00 | 97 | 0 |
| claude-opus-5 | 3 | 98.33 | 93.7–102.9 | `anthropic-reading-0/rows/claude-opus-5.c.p1.jsonl` | 98 | +0.33 | +0.00 to +1.04 (0 at the edge) | 1.0000 (1 / 0) | yes | 98.33 | 98 | 0 |
| claude-fable-5-1 | 3 | 79.67 | 72.0–87.5 | `anthropic-reading-0/rows/claude-fable-5-1+fallback-off.c.p1.jsonl` | 95 | -15.33 | -23.66 to -7.40 (0 excluded) | 0.0015 (4 / 20) | NO | 101.00 | 100 | 0 (refuses 0: yes) |

| id | row | parseable / scored | parse share | first 20 in kit order | §2.3 test (any 20 items) | full-pass proxy (A-05) | first-20 proxy | A-05 (1) reading |
|---|---|--:|--:|--:|---|---|---|---|
| claude-opus-4-7 | low p1 | 108 / 108 | 100.0 % | 20 / 20 | pass | pass | pass | pass |
| claude-opus-4-7 | low p2 | 108 / 108 | 100.0 % | 20 / 20 | pass | pass | pass | pass |
| claude-opus-4-7 | low p3 | 108 / 108 | 100.0 % | 20 / 20 | pass | pass | pass | pass |
| claude-opus-4-7 | default | 108 / 108 | 100.0 % | 20 / 20 | pass | pass | pass | pass |
| claude-opus-5 | low p1 | 108 / 108 | 100.0 % | 20 / 20 | pass | pass | pass | pass |
| claude-opus-5 | low p2 | 108 / 108 | 100.0 % | 20 / 20 | pass | pass | pass | pass |
| claude-opus-5 | low p3 | 108 / 108 | 100.0 % | 20 / 20 | pass | pass | pass | pass |
| claude-opus-5 | default | 108 / 108 | 100.0 % | 20 / 20 | pass | pass | pass | pass |
| claude-fable-5-1 | low p1 | 82 / 108 | 75.9 % | 18 / 20 | undetermined | fail | fail | fail |
| claude-fable-5-1 | low p2 | 79 / 108 | 73.1 % | 18 / 20 | undetermined | fail | fail | fail |
| claude-fable-5-1 | low p3 | 82 / 108 | 75.9 % | 18 / 20 | undetermined | fail | fail | fail |
| claude-fable-5-1 | default | 102 / 108 | 94.4 % | 19 / 20 | undetermined | fail | pass | fail |

| id | under §2.3's opening rule (read as A-05 (1)) | under §2.3's Claude clause and §4.4 (as `series/posture.py` reads it) | same row? | strict of the low row (mean of 3) | strict of the default row (1 rep) | ruling |
|---|---|---|---|--:|--:|---|
| claude-opus-4-7 | the --effort low row | the --effort low row (CHANGED) | yes | 100.00 | 97 | pending: the lead's |
| claude-opus-5 | the --effort low row | the --effort low row (CHANGED) | yes | 98.33 | 98 | pending: the lead's |
| claude-fable-5-1 | the default row ("else its default"; the default also fails A-05's full-pass proxy, so A-05's no-setting-passes clause applies: it is the highest-parse setting, a stand-in marked provisional) | the --effort low row (CHANGED) | no | 79.67 | 95 | pending: the lead's |

| id | rep | items paired | default: items that thought | default: thinking tokens | mean thinking, default | mean thinking, low | items with LESS | items with MORE | items equal | verdict (reading 0's rule) |
|---|---|--:|--:|--:|--:|--:|--:|--:|--:|---|
| claude-opus-4-7 | p1 | 108 | 1 | 76 | 0.704 | 0.000 | 1 | 0 | 107 | CHANGED the thinking spend |
| claude-opus-4-7 | p2 | 108 | 1 | 76 | 0.704 | 0.000 | 1 | 0 | 107 | CHANGED the thinking spend |
| claude-opus-4-7 | p3 | 108 | 1 | 76 | 0.704 | 0.000 | 1 | 0 | 107 | CHANGED the thinking spend |
| claude-opus-5 | p1 | 108 | 28 | 4575 | 42.361 | 3.343 | 28 | 0 | 80 | CHANGED the thinking spend |
| claude-opus-5 | p2 | 108 | 28 | 4575 | 42.361 | 3.657 | 28 | 0 | 80 | CHANGED the thinking spend |
| claude-opus-5 | p3 | 108 | 28 | 4575 | 42.361 | 2.037 | 28 | 0 | 80 | CHANGED the thinking spend |
| claude-fable-5-1 | p1 | 108 | 24 | 4985 | 46.157 | 1.287 | 24 | 0 | 84 | CHANGED the thinking spend |
| claude-fable-5-1 | p2 | 108 | 24 | 4985 | 46.157 | 0.000 | 24 | 0 | 84 | CHANGED the thinking spend |
| claude-fable-5-1 | p3 | 108 | 24 | 4985 | 46.157 | 0.000 | 24 | 0 | 84 | CHANGED the thinking spend |

| calls | n | CLI total_cost_usd | cache-read tokens | cache-write tokens |
|---|--:|--:|--:|--:|
| six-way items (rows/) | 972 | $5.0443 | 377,260 | 188,630 |
| other: canary 4, dry-run item 1, effort-probe 4 (non-item raw streams read: 8 of 8) | 9 | $0.0305 | 0 | 0 |
| all | 981 | $5.0748 | 377,260 | 188,630 |

*4.1 interval: bootstrap over per-item means across 3 reps (clusters (16), 10000 resamples, seed 20260923; PREREG-S0 4.1).*

*4.2 paired change: paired bootstrap, low rep-mean per item minus the default row's 0/1 (clusters (16), 10000 resamples, seed 20260923; PREREG-S0 4.2); exact McNemar p on the items where the two differ.*

*PREREG-S0.md read at sha256 `withheld-2026-09-29` (matches `PREREG-S0.md.sha256`).*

*How to read the columns:*

* **Strict** is the registered score (PREREG-S0 §4.1): `correct_strict ÷ 108`, and only `clean` and `letter+name`
  replies can score.
* **Lenient** reads a letter stated later in the reply. It is printed beside strict and is never a verdict or part
  of a ratio.
* **Format failures** are replies in any other parser-v2 class; every one here is `late_letter`.
* **Parse share** is §2.3's parseable answers (`format_class ∈ {clean, letter+name}`) over the scored items.
  *§2.3 test (any 20 items)* is `series/posture.py`'s `probe_test`, and the proxies are its `proxy_passes`. The
  *A-05 (1) reading* is the test's pass or fail, or, when it is undetermined, the full-pass proxy that A-05 (1)
  registers.
* **CLI total_cost_usd** is the CLI's own list-price estimate, and the prompt cache prices it:
  * opus-5 and fable-5-1 write the whole prompt to the cache on rep 1 (billed at the cache-write rate) and read it on
    reps 2 and 3 (billed at a fraction of the input rate);
  * opus-4-7 never caches here;
  * so compare the CLI figure only rep for rep.
* **Derived direct-API $** counts every input token at 1x, minus the scaffold fitted here on CB-2's own rows
  (intercepts in `cb2-results.json`, `scaffold_fit`). The series recomputes it when a reader for this directory
  exists: `series/lanes.py` fits each base model over all of its rows, so its figure may differ by a fraction of a
  cent.
* **Prices** per million tokens in/out: opus-4-7 $5/$25, opus-5 $5/$25, fable-5-1 $10/$50
  (`anthropic-reading-0/receipts/model-facts.json`).
* **Wall minutes** are from each pass's report (`started` → `ended`).

**Totals** (the last table; `spend.jsonl` for dollars, the committed rows and the 8 canary and probe raw streams for
tokens):

* **Calls:** 981, made one at a time: 972 six-way items, 4 canaries, 4 effort probes and 1 dry-run item.
* **Outcomes:** 0 failed calls, 0 served by another model, 0 classifier refusals. No re-ask, no model stop, no run
  stop.
* **CLI `total_cost_usd`: $5.0748 in all** (API-equivalent, not money paid), with **377,260 cache-read and 188,630
  cache-write tokens**:
  * the 972 items: $5.0443, with all of those cache tokens;
  * the 9 other calls: $0.0305, with 0 cache tokens.
* **Utilization:** across the rows, five-hour utilization read 0.13 to 0.40 (the stop is 0.85) and seven-day
  utilization 0.25 to 0.32 (each row's `x_utilization`).

## The held prediction, checked

*CB-2's prediction (COI-GAPS-AND-PLAN v2 §4), held before the run: each low row within 5 points of its default row;
fable-5-1 low refuses 0.*

The change against the default row is read in §4.2's registered form. That is the paired bootstrap of the per-item
low rep-means against the default row's 0/1, by the 16 dinner clusters, with 10,000 resamples at seed 20260923, and
the exact McNemar p beside it. §4.1 applies: "a finding only when the paired interval of the change excludes 0".

* **claude-opus-4-7: holds.** Strict mean 100.00 over 3 reps against the default row's 97: +3.00, paired 95 %
  −1.01 to +7.00, McNemar p 0.2891 (low better on 6 items, default on 2). That is "no detectable change at n = 108".
* **claude-opus-5: holds.** 98.33 against 98: +0.33, paired 95 % +0.00 to +1.04 (0 at the edge), McNemar p 1.0000
  (1 / 0).
* **claude-fable-5-1: fails on the registered score.** 79.67 against 95: −15.33, paired 95 % −23.66 to −7.40
  (excludes 0), McNemar p 0.0015 (low better on 4 items, default on 20). **Its refusal half holds: 0 classifier
  refusals in 324 calls.**
* **Why fable-5-1 falls: format, not recognition.** At `--effort low`, fable-5-1 stops thinking (24 of 108 items
  thought at the default; 1, 0 and 0 at low). It writes its reasoning in the visible reply instead and states the
  letter after it. 26, 29 and 26 of its 108 replies per rep are `late_letter`, a format failure, which parser v2
  scores wrong (PREREG-S0 §3.2, §6). On the lenient read it is level with its default (mean 101.00 against 100).
  Three of the p1 replies, from `rows/claude-fable-5-1+effort-low.c.p1.jsonl`:
  * `c-einstein-01-dessert-02` (label einstein; lenient einstein): *"The line addresses Ibn Sina and Carl, mentions
    "final equation" and "language of mathematics," seeking underlying harmony — Einstein's unified field theory …"*
  * `c-darwin-01-starter-01` (label darwin; lenient darwin): *"The speaker addresses Socrates and Hypatia, so it's
    not them. "I have read of the ancient world in my studies" — the phrasing ("I should like") suggests a 19th-…"*
  * `c-darwin-01-main-02` (label darwin; lenient ibn_sina): *""In my travels" — Darwin (Beagle voyage) or Ibn Sina
    (traveled widely). …"*

  The default row thinks first and then answers with a bare letter (102 `clean`, 6 `late_letter`). The rule does
  not change and nothing is re-scored: the strict figure stands as registered.

## Which row is each id's utility-posture row: two readings, a pending ruling for the lead

PREREG-S0 holds two clauses that name an id's utility-posture row, and for fable-5-1 they name different rows. This
section quotes both, verbatim with their locations, prints the parse shares they turn on, and sets the two readings
side by side. It gives no verdict. **The choice is a pending ruling for the lead.**

**§2.3, the opening rule** (`PREREG-S0.md:92`):

> A model enters THE RATIO at its **utility posture**: the lowest reasoning setting it accepts that yields a parseable answer (`format_class ∈ {clean, letter+name}`) on ≥ 95 % of 20 dry-run items (App. B (15)), else its default.

**§2.3, the Claude clause** (`PREREG-S0.md:92`, the same paragraph):

> **Which Claude row is the utility-posture row, registered:** the `--effort low` row when the CLI accepted the flag and the verdict rule says CHANGED (at 21:0xZ: sonnet-5, opus-4-8, opus-5-5); the CLI-default row when the flag is refused or the verdict is NO clear change (haiku-4-5: 610 vs 588 mean thinking tokens, "NO clear change") — the two rows are then the same posture in effect and the default row is the one on file; and, until an id's `--effort low` row has landed, its default row stands in, labelled `posture: default (provisional)`, and every ratio it enters prints "provisional".

**§4.4, F-closed** (`PREREG-S0.md:281`):

> **F-closed** (the headline denominator): every id of each closed vendor **we can call** — OpenAI by key; Anthropic through the sealed CLI at reading 0 (⧖-6 (a), R-17; no Anthropic key is held) and by a metered key from reading 1 (⧖-6 (b)) — released or created within the 180 days before the reading's close, read on the set **at its utility posture (2.3): one row per id, the row 2.3 names; the id's other posture rows are R-11's panel and never F-closed members** …

> **Which Claude row that is, registered (2.3):** the `--effort low` row where the verdict rule says CHANGED — at 21:0xZ sonnet-5 (96/108 v1, against 102/108 at the CLI default), opus-4-8 (97, against 101), opus-5-5 (103, against 104); the CLI-default row where the flag is refused or the verdict is NO clear change (haiku, not a member); and, until the `--effort low` cells for opus-4-7, opus-5 and fable-5-1 land (9.2), their default rows stand in labelled `posture: default (provisional)` and F-closed's cross-fit prints "provisional".

**A-05 (1), how §2.3's parse test is read against a scored pass** (`PREREG-S0.md:514`):

> (1) **§2.3's utility posture is read against the scored pass** — a setting *passes* when at most 1 item is unparseable, *fails* when fewer than 19 in 20 can parse, and an *undetermined* setting is settled by the **full-pass proxy** (the pass's own parse share ≥ 95 %, the rate §2.3's "19 of 20" names); where no setting passes, a tag with no reasoning control uses its one setting and any other tag takes its highest-parse setting as a stand-in marked provisional.

**§3.2 and §6, how a format loss scores** (`PREREG-S0.md:147, 322`). §3.2: "`correct_strict` =
`format_class ∈ {clean, letter+name}` and `choice_strict == label` (**the headline**). `correct_lenient` … printed
beside, labelled, **never in a ratio**." §6's row: "`word_letter`, `late_letter`, `name_only`, … | a format
failure: the model answered, not in the contract | **wrong** (counted in `format_failures`)".

**The series code's reading. This is a code comment, not an amendment** (`series/posture.py:15-16`):

> Claude: the row §2.3's Claude clause registers (protocol.json `claude_registered_utility_rows`): the rule names
> the row, so the probe does not choose it; its parse share prints beside it as information.

None of the file's ten amendments (A-00 … A-05, A-09 … A-12) rules which of §2.3's two clauses wins when they
disagree, or rules on a Claude row whose strict loss is all `late_letter`. The nearest texts:

* **A-00** (`PREREG-S0.md:498`) rules falcon:180b's `late_letter` replies "a format failure", on a reading 0.1 row.
* **A-12 (5)** (`PREREG-S0.md:516`) is about an OpenAI completions row with no reasoning control. It says "its one
  setting is its utility posture (2.3), and the 95 %-parse rule applies as to any row"; it names no Claude row.

**The parse shares they turn on** (the third results table above):

* **opus-4-7 and opus-5:** every low rep and each default row parses 108 of 108 (100 %), so both tests pass.
* **fable-5-1, low:** parses 82, 79 and 82 of 108 (75.9 %, 73.1 %, 75.9 %), with 18 of the first 20 on every rep.
  `probe_test` reads that as undetermined, and both proxies fail it.
* **fable-5-1, default** (`claude-fable-5-1+fallback-off.c.p1`): parses 102 of 108 (94.4 %), with 19 of the first
  20. That is undetermined, fails the full-pass proxy A-05 registers, and passes the first-20 proxy.

**The two readings, side by side** (the fourth results table above):

| id | under §2.3's opening rule (read as A-05 (1)) | under §2.3's Claude clause and §4.4 (as `series/posture.py` reads it) | same row? | strict of the low row (mean of 3) | strict of the default row (1 rep) | ruling |
|---|---|---|---|--:|--:|---|
| claude-opus-4-7 | the --effort low row | the --effort low row (CHANGED) | yes | 100.00 | 97 | pending: the lead's |
| claude-opus-5 | the --effort low row | the --effort low row (CHANGED) | yes | 98.33 | 98 | pending: the lead's |
| claude-fable-5-1 | the default row ("else its default"; the default also fails A-05's full-pass proxy, so A-05's no-setting-passes clause applies: it is the highest-parse setting, a stand-in marked provisional) | the --effort low row (CHANGED) | no | 79.67 | 95 | pending: the lead's |

* **Under §2.3's opening rule, read as A-05 (1):** opus-4-7's and opus-5's low rows pass the parse test, so each is
  the utility-posture row. fable-5-1's low row fails it on every rep, so "else its default" names the default row.
  The default row also misses A-05's full-pass proxy (94.4 %). So A-05's "where no setting passes" clause applies,
  and it takes the highest-parse setting, the default, as a stand-in marked provisional.
* **Under §2.3's Claude clause and §4.4, as `series/posture.py` reads it:** the verdict rule says CHANGED on every
  rep of all three ids (the fifth results table), so the low row is the utility-posture row for all three. For
  fable-5-1 that is the 79.67 row, where the provisional default stand-in scored 95.
* **What is the same:** opus-4-7 and opus-5 get the same row under both readings; only fable-5-1 differs. Either
  way, no reading-0 row moves, and reading 0's own ratio stays provisional (COI-GAPS-AND-PLAN v2 §4, CB-2: "Reading
  0's ratio stays provisional forever (PREREG §9.1, R-13)").

**opus-4-7's CHANGED rests on one item.** Its default row thought on 1 item of 108: `c-sagan-01-main-02`, 76
thinking tokens (`anthropic-reading-0/rows/claude-opus-4-7.c.p1.jsonl`), a mean of 0.704 tokens. At low it thought
on none (mean 0.000). The rule, "more than twice as many items thought less than thought more AND the mean fell below
80 % of the default's", reads 1 less, 0 more and 0.000 < 0.8 × 0.704 = 0.563 as CHANGED. It has no minimum item
count, no minimum token count and no interval. Under both readings opus-4-7's row is the low row (100.00 over 3
reps). A NO-clear-change verdict would name the default row (97 over 1 rep); the paired change between the two is
+3.00, 95 % −1.01 to +7.00.

## Other things that differ from reading 0's Claude rows

* **The account.** Every call rode `withheld-2026-10-14` (org `withheld-2026-10-14`, subscription `max`; `claude auth status` in
  the clean environment, `receipts/auth-status.2026-09-27T082251Z.json`). That is not reading 0's account 3
  (`withheld-2026-10-14`, org `withheld-2026-10-14`, `postures.json`). This endpoint needs its own `postures.json` row (A-08);
  its `endpoint_training_posture` is unknown until an operator reads the account's model-improvement setting. The canary's
  tokens in rose by +5 to +6 in the CLI's added context: opus-4-7 538 (532 on 2026-09-23), opus-5 474 (468), and
  fable-5-1 479 (473 and 474).
* **The CLI version:** 2.1.282. Reading 0's `--effort low` rows ran on 2.1.280 and its R-21 rows on 2.1.281. The
  effort probe accepted `--effort low` on all three ids (`receipts/effort-probes.jsonl`). The refusal switch was
  proven on 2.1.281 (`anthropic-reading-0/receipts/refusal-proof.json`) and was not re-proven on 2.1.282. No refusal
  occurred to exercise it; every row records `x_refusal_fallback_disabled: true`, and the served-model check saw no
  fallback on any call.
* **The default rows these are compared with** ran on 2026-09-23 with one rep each. opus-4-7's and opus-5's ran with
  the refusal fallback ON (before R-21); fable-5-1's is its R-21 re-read with the fallback OFF. The §4.1 interval
  covers the low rows' mean only; the §4.2 paired interval is the registered form for the change.
* **Sampling:** the model's default temperature (the CLI exposes none). The CLI caps no output (`decide()` asks for
  8 tokens).

## Owed (not done here)

* **The series does not read this directory yet.** `series/lanes.py` reads `anthropic-reading-0/rows/` only, and
  `merge_reps` merges reps for reading-0 cells only. Before these rows enter `series.jsonl` they need a reader for
  `anthropic-reading-0.1/` that labels them reading 0.1 and averages the three reps (§4.1), landed with its own
  amendment and shas.
* **`protocol.json` still marks the three ids as default-row stand-ins.** `protocol.json:3888`
  (`claude_registered_utility_rows.default_row_stands_in_provisional`) lists opus-4-7, opus-5 and fable-5-1. Given
  that, `series/posture.py`'s `_claude_pick` (`:144-170`) returns the default row even when a low row is present, and
  a headline is never chosen across readings (`posture.py:31`). So a reading-0.1 group made only of these low rows
  gets no headline until an amendment moves the ids to `effort_low_verdict_CHANGED`, or the lead rules otherwise
  (the ruling above).
* **`series/lane_status.py` will show reading 0's Anthropic lane IN PROGRESS indefinitely.** `lane_status.py:20`
  counts §9.2's registered cells for `anthropic-reading-0`, and three of them
  (`claude-{opus-4-7,opus-5,fable-5-1}+effort-low.c.p1`, already listed as outstanding in `A05-NOTES.md`'s lane-state
  line) will never land in `anthropic-reading-0/rows/`. It needs a close record for the three reading-0 cells that
  closed unmeasured (§9.1).
* **A `postures.json` row** for the account above (A-08).

## Files

* **`run_cb2.py`: the driver.** The run used the blob committed at `1a58ecbd` (sha256 `93982bc3…`, as both
  preflights record). Since then the module docstring was corrected and the `report` command extended (the cache
  columns and totals, the §4.1 and §4.2 intervals, the parse test, the two readings, the thinking verdict with
  reading 0's own `refused` filter). Every line between the docstring and the report section, and `main()`, is
  byte-identical to that blob; no calling code changed.
* **`rows/<id>+effort-low.c.p<rep>.jsonl` + `.report.json`:** one row per item (the harness's row plus the runner's
  `x_*` receipts), 9 files of 108.
* **`receipts/`:**
  * `preflight.*.json`: the runner's own receipt, plus the driver's sha, the work tree's HEAD, and a note that the
    runner's `estate_head` field is a read of the stale shared checkout;
  * `canary.jsonl`: 4 canaries, all `UNKNOWN`, tools `[]`, mcp `[]`;
  * `effort-probes.jsonl`: 4 probes, all accepted;
  * `auth-status.*.json`: the account receipt;
  * `dryrun/`: the one live dry-run item (never a cell).
* **Ledger and outputs:** `spend.jsonl` (every call's API-equivalent dollars), `run.log` (the live dry run, then the
  whole run) and `cb2-results.json` (the report). No `failures.jsonl`, `mismatches.jsonl`, `model-stops.jsonl` or
  `stops.jsonl` exists, because nothing failed, mismatched or stopped.
* **`raw/`** (gitignored, 12 MB): every call's stream and `.meta.json`, on this work tree's disk until the merge,
  and archived at `/workshop/bench-archive/coi-cb2-raw-2026-09-27/` (`SHA256SUMS` inside).
