185 lines
9 KiB
Markdown
185 lines
9 KiB
Markdown
|
|
# 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.
|