T03: InnerLoop v1.7 plus loop-lint's own-cost check. Six passes under-reported themselves by 30-45%, never once high, and the rule lived only in evidence files having been re-derived three times. The READING is load bearing, not the boundary: CB-WP-0018 T04 applied 're-run the instrument at the moment of quoting' alone and its figure was correct. So the operative instruction is re-run when you quote, and loop-lint fails an evidence file naming its own workplan beside a dollar amount without marking it provisional. It binds forward from this pass. The check fires on seven historical files which ARE the evidence for the rule; making them comply would edit the record to remove the thing it proves -- the same category error as a live fact: tag on a dated measurement, which this pass also hit. Lifecycle, at the maintainer's instruction: ready -> active -> done, where ready means declared and not started. loop-lint fails a workplan that has started 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 caught it: it stripped the leading status: assuming frontmatter, which silently dropped a real task once the frontmatter said ready or active. Both new checks then fired on this pass's own artifacts and both were right to. T04: CB-EV-0017. The new meta budget's first reading is a breach it caused -- 27% against the 20% line, because this pass cost $31.18 against product passes averaging ~$21. Reported rather than exempted: ADR-0006 D2 covers the instrument repairs but not the rule-writing, and the honest reading is that this should have been two passes. CB-WP-0018 settled at $36.53/95 against $28.08/82 last reported, 30% higher. Seven for seven. make all exits 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9 KiB
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-gameowes 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 unreachableis most likely an artifact of a stand-in worth 6 points against a real dataset worth 12. Blocked on GROUND-WP-0002 T01. python3as 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.