clay-borg/evidence/CB-EV-0017-budgets.md
tegwick 69c1658d20
Some checks failed
ci / check (push) Has been cancelled
CB-WP-0019 T03/T04: the cost rule written down, and the lifecycle
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>
2026-08-03 19:25:18 +02:00

9 KiB
Raw Blame History

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 expiringmeta_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: readyactivedone, 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 (U1U10) plus SOLVE's legality, now registered as GROUND-WP-0002 after four days unread.
  • The engine has never loaded ground-game's edition dataGR-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.