# CB-EV-0017 — budgets that ask a question, and the first one to fail CB-WP-0019 T04. Measured 2026-08-03 at `0b6f7c5`+. Pass kind `meta`, tier **M** (structural M; chaos **d8 = 5**, no override — the first roll at the new rate). Declaration 2 of chaos window 2. --- ## 1. Two budgets that had never asked different questions AM-4a and AM-4b both measured `-p games-ground --edges normal` while claiming to bound different things. AM-4b was blind to **28 crates and 408,237 lines — more source than its own 350,000 target.** | | the question | scope | proc-macros | reading | |---|---|---|---|---:| | **AM-4a** | what does a game **ship**? | one package, no default features | excluded | 157,202 / 161,000 | | **AM-4b** | what does a contributor **acquire**? | workspace, dev edges | **counted** | **725,258 / 745,000** | **The proc-macro treatments are opposite on purpose**, and that is the rule ADR-0008 D2 left open. A proc-macro never reaches a shipped binary, so counting it in *"what a game ships"* was false. But it **is** fetched, compiled and unaudited on a contributor's machine, and ADR-0007 D3's acquisition rule counts what the build causes to be fetched. *"It does not ship"* is no answer to *"we downloaded it."* **When the two rules disagree, the question each budget asks decides.** Measured share: **109,585 lines, 15.1%**, against AM-4a's 36.2%. ADR-0008 D2 refused to correct AM-4b by borrowing that ratio, on the grounds that *"correcting a second instrument on the strength of the first one's ratio is the error this change exists to fix."* It would have been wrong by more than a factor of two. **A decision that cost a pass of delay and was right.** The target moved to fit the measurement — 745,000, the same ~2.7% margin ADR-0008 D3 gave AM-4a — and the code it measures did not change at all, which is the mechanical test for a correction rather than a retarget. ## 2. Three of this project's own controls fired on this pass None of them was the pass's subject. All three fired on changes made while doing something else. | control | what it caught | cost | |---|---|---| | `mutation-check --self-test` | AM-4b's mutation find-string went stale the moment the target moved | **build-free** | | DFD (`facts-check`) | `facts.toml` still carrying 317,021 / 350,000 | one command | | `loop-lint` loadability | `InnerLoop.md` crossed 400 lines **three times** | three splits | The first is the one worth noting. CB-WP-0015 added that check *after* AM-4a's mutation had rotted unnoticed for two passes, on the argument that the expensive half of the check needed a build but the cheap half did not. This is its second catch and the first that cost nothing. **And the loadability breaches were fixed structurally, three times, without raising the limit** — the arithmetic, the cost basis, two review case studies, the retargeting case and the inherited-number cases all moved to `InnerLoopReference.md`. That precedent has now held five times. ## 3. What the meta budget is for — and its first reading is a breach The maintainer set the rule: *most spend on the task at hand, some on control, review and improving the process.* **80/20.** META-25 had a threshold and **no stated purpose**, which is why the number had been argued three separate times. The purpose is now written first and `make status` prints it above the figure. **The ratio and the window are a pair, and that was the substantive finding.** One meta pass among `n` at parity cost reads `1/n`: 33% over three, **20% over five**. So 80/20 is *one pass in five at normal cost* — a five-pass window. The same 20% over the old trailing three would have silently also demanded the meta pass be half-price, which does not make meta work rarer, only rushed. The self-test now enforces `META_SOFT_PCT == 100 / TRAILING_PASSES`; moving one without the other goes red. The phase setting is **declared, argued and expiring** — `meta_phase` in `gates.toml`, reverting on `review_by` unless re-argued, and refused by `--self-test` if it has no reason or no expiry. A threshold anyone may move is not a threshold. ### The breach, reported rather than exempted **`meta budget [OVER] 27% over the last 5 passes (soft 20%)`.** The pass that wrote the rule is the first to fail it, and the failure is real rather than an artifact: **CB-WP-0019 cost $31.18 (provisional, and seven for seven says it will settle higher) against product passes averaging ~$21**, so it is over on both counts — one pass in five, *and* at parity. It did four instrument repairs and two rule changes, which is more than one pass's worth of meta work. *The "provisional" in that sentence was put there by `loop-lint`'s own new check, which fired on this file for quoting this pass's cost. It was right to: the figure is provisional, and saying so is both compliant and more truthful than the bare number was.* ADR-0006 D2 exempts *"repairing the instrument that reports a breach"*, and most of this pass qualifies — AM-4b, the proc-macro decision, and the meta budget itself are all instrument repair. **The exemption is not claimed as cover for the whole pass.** T03 and T05's rule-writing are not repairs of a breached instrument, and the honest reading is that this pass should have been two. **No product work was displaced**, because the product side is blocked on a human check and on a ground-game ruling (§5). ## 4. The self-quoting rule, written down at last Six passes, six under-reports, **never by less than 30%, never once high**. The table is in `InnerLoopReference.md` §Quoting a cost. **Which of the two causes is load bearing?** The task asked; the answer is **the reading, not the boundary.** CB-WP-0018 T04 applied *re-run the instrument at the moment of quoting* alone and its figure was correct. The boundary rule only tells you when "late enough" has arrived. So the operative instruction is: **re-run the instrument when you quote it.** `loop-lint` now fails an evidence file that names its own workplan beside a dollar amount without marking it provisional. **It binds forward, from this pass.** The check fires on seven historical files — and those files *are the evidence for the rule*. Making them comply would mean editing the record to remove the thing it proves, which is the same category error as putting a live `fact:` tag on a dated measurement (both appear in this pass; both were fixed by marking rather than rewriting). ## 5. Workplan lifecycle, and a bug my own control caught At the maintainer's instruction: **`ready` → `active` → `done`**, where `ready` means *declared and not started*. The status now answers *"is anyone on this?"* rather than only *"is it finished?"*. `loop-lint` fails a workplan that has started work and still says `ready`, one that is `active` with everything closed, and one that is `done` with an open task. **The first version of that check was wrong, and its own self-test found it.** It stripped the leading `status:` match assuming it was the frontmatter — which silently dropped a real task the moment the frontmatter said `ready` or `active`, because those do not match the task vocabulary. It worked only on the old `todo`/`done` files. It now parses the ` ```task ` blocks. Also fixed: **`cancel` is a closed outcome.** CB-WP-0005 read `5/8` and CB-WP-0007 read `2/6` in every status run since the day they closed, because only `done` counted. Two permanently-wrong numbers teach the reader to skip the column. ## 6. Cost | pass | kind | responses | cost | $/response | |---|---|---|---|---| | **CB-WP-0018** | product | 95 | **$36.53** | 0.385 | | CB-WP-0019 | meta | *provisional — not quoted, per §4* | | | Read by re-running `make status` at the moment of writing, which is the rule this pass wrote. CB-WP-0018 was last reported at $28.08/82 and has settled at **$36.53/95** — 30% higher, and **seven for seven**. ## 7. Open - **The AM-4 family is closed.** Four defects across five passes — the shipped proc-macro count, AM-4b's scope, AM-4b's share, AM-4a's stale mutation — none found by looking for them. **Where a fifth would be:** AM-4c is a diagnostic nobody reads, and `own source` (11,799 lines) has no instrument at all. - **What five passes of "owed" cost.** The two numbers here were carried as open items in four consecutive evidence files. Carrying was *cheap* and it was also *not doing the work*: measuring both took one command each, before this declaration. The honest reading is that "owed" became a place to put things rather than a queue. - **INTENT stage 1: the human check**, now on perceptual questions only. - **`ground-game` owes ten rulings** (U1–U10) plus SOLVE's legality, now registered as GROUND-WP-0002 after four days unread. - **The engine has never loaded ground-game's edition data** — `GR-E01 unreachable` is most likely an artifact of a stand-in worth 6 points against a real dataset worth 12. Blocked on GROUND-WP-0002 T01. - **`python3` as a toolchain dependency was never argued.** - **AM-4a cannot survive stage 2** — 1,741,979 against 161,000. - **ADR-0007 D3 and D5 remain unratified**; ADR-0010 rests on D5. - **Chaos: 2 of 12 in window 2**, no override yet at d8.