Occams · adr
status: decided 2026-09-13 — adopted by the author the day it was drafted, before M12.5 opened; `audit` is exhaustive and per fill, both engines return the entries the auditor refused as `missed` and open no position on them, and every survey cell and baseline counts them by name; the verdict-side census landed with M12.6 the same day: `EraDecomposition` carries the winner cell's missed entries by name (M12.10 closed)

The fill audit is exhaustive, and an unobtainable fill is a missed trade

M5.5 made the engine audit every fill it books: three refusals adapted to daily equities — the overnight gap, the opening auction, the halt — per strategy family, default-deny (M5.7). The principle is right and stays. Its implementation has two properties the first survey exposed, both in occams/costs/auditors.py::audit.

1. The audit is a sample. audit(family, fills, actions, *, sample=500) checks fills[:sample]. The engines build fills in sorted(bars_by_name) order, so the sample is the first five hundred fills of the alphabetically first names. Whether a run is refused is therefore a property of the alphabet:

Across the grid: 2,284 cells refused by the halt auditor and 3,598 with a refused baseline, from 331 flat bars (ADR-0042), chosen by sort order.

2. The refusal is of the whole run. One unobtainable fill among thousands refuses the cell. That is the right contract for the fixture the auditor was built against — a strategy whose rule books fills no order could produce — and the wrong one for a source defect on one bar of one name in a pooled universe of eighty-three. A mechanism's measurability should not depend on whether C's 1996 is inside the first five hundred fills of the alphabet.

Decision (adopted 2026-09-13)

  1. The audit is exhaustive. Every fill the engine books is audited; sample is removed. The audit is three predicates per fill over trades the engine has already computed; its cost is linear and small against the simulation that produced them.
  2. An unobtainable fill is a missed trade. The position is not opened: the engine drops the trade whose entry fill an auditor refuses, records it — name, bar, the auditor's sentence — as missed on the run, and continues. Unobtainable is no longer raised for a fill the engine can name; UnauditedFamily still is (a family with no auditor cannot be measured: default-deny stays).
  3. The missed count travels with the trade count. A survey cell, a baseline and a verdict's evidence carry missed beside trades, per name and per bar, so a reader can see what the data did not let the strategy do. It is a diagnostic on the run, not a field of the Measurement contract the guards read.

The controls do not move: make null still refuses and make signal still accepts (S3, S10) — neither fixture has a flat bar or a gapped limit — and a change that moved either stops everything else (CLAUDE.md).

Consequences

Considered options