CB-WP-0022 T05/T06/T07: the register, and what its first run found
Some checks failed
ci / check (push) Has been cancelled

T05. tools/design.py, make design, and the register in GroundRules.md --
14 rows, no new file, because ADR-0012 D2 made §Underdetermined the
register rather than building one beside it.

Backfill was the test and it caught two things the ADR did not have.

First, a `role` column. The first report alarmed on U2 and was wrong to:
U2's scenario is green BECAUSE the provisional default it documents is
implemented, which says nothing about whether ground-game agrees. GR-E01's
was a counterexample that went green. Same colour, opposite meaning -- a
register that cannot tell them apart either alarms constantly or never.
Only a green counterexample alarms. Folded back into GameDesign §1.3.

Second, it contradicted the survey. CB-RES-0007 said "six of the ten
already have provisional scenarios." Measured -- grep -lE "\bU<n>\b" over
scenarios/ground -- exactly ONE U-item names itself. Five provisional
scenarios exist and four probably encode U-item defaults, but the mapping
is not written down, so it is not checkable. Same defect class as the
wrong premises, found inside the survey that proposed the fix. Now a
reported debt: open, lacking a reproduction: 9, target 0.

design.py carries the control design-baseline.py never had, asserted
directly: a row citing a nonexistent file must not count as reproduced,
using the exact path 2da19a4 deleted -- which the old tool called green.
design-baseline.py is marked superseded rather than deleted; it is the
evidence for how a wrong number got into a survey.

T06. The report is a FILE in ground-game under GROUND-WP-0002, committed
there, with a hub message that only points at it. It asks for no ruling:
it carries GR-E01's withdrawal, our reproduction debt, and two notes that
are explicitly not findings.

And it had to acknowledge something nobody anticipated. GROUND-WP-0002 is
finished -- all ten U-items were RULED 2026-08-03, every one confirmed as
the default we simulate, plus five of six provisional scenarios. The
survey said "0 of 10 ruled" two days later and this register was built
saying `reported`. That is the unread-inbox failure running in the
opposite direction: they answered and we did not collect it. The
instrument's first run surfaced it. They are `ruled`, not `applied` --
lifting the now-settled provisional flags is owed and is not done, and
make design shows them open until it is.

T07. evidence/CB-EV-0021. Two of six catches in this pass came from
execution rather than process (the role distinction from building it, the
ten uncollected rulings from running it), which is InnerLoop §Design
goal's prediction holding.

make self-tests, facts-check, loop-lint: clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-05 15:22:33 +02:00
parent 5092684de5
commit 561facce43
7 changed files with 665 additions and 117 deletions

View file

@ -2,7 +2,7 @@
id: CB-WP-0022
kind: product
title: "The design instrument: findings about the game, with their reproductions"
status: active
status: done
state_hub_workstream_id: "fda16340-0049-4acf-884b-a5cfdbde47c0"
---
@ -36,8 +36,8 @@ has produced, as a by-product of being rigorous:
| ten underdetermined rules points (U1U10) | formalizing the dataset into testable rules |
| SOLVE offered on a face-down Problem, always inert | a human dragging it three rounds running |
| GR-A13 "wasted SOLVE" on a claimed Problem | a scenario that had to pick a default |
| GR-E01 unreachable below 5 seats | arithmetic over the deal count |
| six provisional scenario defaults | scenarios that could not be written without deciding something |
| ~~GR-E01 unreachable below 5 seats~~ | arithmetic over the deal count**withdrawn 2026-08-05, it was wrong (C1)** |
| ~~six provisional scenario defaults~~ | **five, and double-counted with GR-E01 (C3)** — they are reproductions, not a finding |
| GR-E03 / GR-E04 never played to the end | nobody noticed for nineteen passes |
Every one was found by *building the simulator*, not by playing. That is
@ -79,19 +79,19 @@ The maintainer asked whether this should extend to *"a meta about the
clay-borg engine evolution itself."*
**My answer is no, and it should be argued rather than accepted.** That
register already exists and is load-bearing: `evidence/CB-EV-*` records
what each pass found, `decisions/ADR-*` records what was decided and what
was rejected, `gates.toml` records what every control has caught and what
would retire it, and workplans record what was attempted. Nineteen passes
of engine evolution are already captured, with dates, costs and
falsifiers.
register already exists and is load-bearing: `evidence/CB-EV-*`,
`decisions/ADR-*`, `gates.toml` and the workplans capture nineteen passes
with dates, costs and falsifiers. A second register for the same subject
would be ceremony. The asymmetry is the point: engine evolution has a home
and game design does not.
**Building a second register for the same subject would be ceremony**, and
this project has a standing rule that a gate must cash out. The asymmetry
is the point: engine evolution has a home and game design does not.
If the adversarial review disagrees, that is exactly the kind of thing
tier L exists to surface.
> **Settled by [ADR-0012](../decisions/ADR-0012-the-design-instrument.md)
> D7: no register — but the argument above did not survive.** C5 found the
> "third thing" the maintainer meant is visible in
> `specs/InnerLoopReference.md` and `history/`'s retrospectives, **neither
> of which this inventory names.** Conclusion narrowed, not settled: if
> InnerLoopReference keeps absorbing material that is neither a decision
> nor a finding, revisit.
## Task: survey how this is done elsewhere, and what we already have
@ -128,28 +128,21 @@ and whether a ruling can *close* a finding mechanically.
[CB-RES-0007](../research/CB-RES-0007-design-instrument.md), with a
runnable baseline (`tools/design-baseline.py`).
**The baseline is us, and it is measured**: 6 findings across **11 files**
with no index, **2 of 6 (33%) with a runnable reproduction**, and U1U10
raised 2026-07-30, first *read* 2026-08-03 — **4 days**, 0 of 10 ruled.
**Its numbers were withdrawn by T02 and must not be quoted from here.**
The survey reported *6 findings, 2/6 = 33% reproduced, 11 files, 4 days*.
C2 showed the instrument counted itself and its reproduction check never
stat'd the file; C3 showed *"six provisional defaults"* is five and GR-E01
was double-counted; T05's backfill contradicted *"six of the ten have
provisional scenarios"* — **one** does. What survives is direction: many
files, no index, 0 of 10 ruled. The first honest figures are T05's.
**The uncomfortable number is stated up front rather than left for the
review to find: the reproduction rule would reject four of our six
existing findings.** The survey answers it — none of the four is
expensive to reproduce, so the 33% is evidence that nobody was ever asked
for one, not that the rule is unaffordable.
**Magic corrected an assumption this pass was about to build on.** I
expected a ruling to be the authoritative resolution. It is not: rulings
are *"reminder information with no actual weight or rules meaning"*, and
the authoritative fix folds into the **Oracle** card text. **A finding
closes when the source changes, not when an annotation is added** — so
the register must be a queue that empties, not an archive that grows.
That is now a constraint on T03's lifecycle.
Model checkers supplied the reproduction rule independently (a
counterexample trace *is* the finding), and W3C's *implementation-defined*
mark is the one piece of machinery we already have and must reuse rather
than duplicate.
**Magic corrected an assumption this pass was about to build on.** Rulings
are *"reminder information with no actual weight or rules meaning"*; the
authoritative fix folds into the **Oracle** card text. **A finding closes
when the source changes, not when an annotation is added** — the register
is a queue that empties. Model checkers supplied the reproduction rule
independently, and W3C's *implementation-defined* mark is machinery we
already have and must reuse rather than duplicate.
## Task: adversarial review
@ -169,12 +162,9 @@ above, and require an attempt at:
third thing;
- **that "carries its reproduction" is affordable** — if half the real
findings cannot be reproduced cheaply, the rule will be quietly dropped
and the register becomes a suggestion box anyway. *(Since this task was
written the answer has hardened: two findings reached ground-game on
wrong premises, and ground-game has itself ruled that reproductions are
required. The reviewer should now press the opposite way — whether the
rule is **sufficient**, given both bad premises would have shipped a
passing test alongside a wrong description.)*
and the register becomes a suggestion box anyway. *(Hardened before the review ran: two findings had already reached
ground-game on wrong premises, so the reviewer was told to press whether
the rule is **sufficient**, not whether it is affordable.)*
- **that a register is needed at all**, rather than one more section in
`GroundRules.md §Underdetermined`, which already exists and already
works.
@ -194,24 +184,14 @@ had falsified it four days earlier, while the author — who wrote that
commit — quoted the dead number twice.
**Seven challenges: four conceded, two conceded in part, one answered.**
- **C1 lands hardest and changed the design.** The rule's showcase finding
was false and had *passed* the rule, so existence is not the missing
property — **shape** and **falsifiability** are. It also **caught a
defect in flight**: T06's payload, `todo`, still named the dead number.
Both folded in above.
- **C2 withdrew the baseline's precision.** `design-baseline.py` counts
itself, its reproduction check never stats the file, and `Makefile:127`
runs only `--self-test`. Direction stands; **33% is not a measured rate.**
- **C3**: "six provisional defaults" is five; GR-E01 is double-counted.
- **C4**: `§Underdetermined` was never evaluated as a candidate and already
delivers four of five benchmarks. **T03's burden flips: argue extension,
not replacement.**
- **C5**: the engine-evolution "third thing" is visible in
`specs/InnerLoopReference.md` and `history/`'s retrospectives, neither of
which my inventory named. Narrowed, not settled.
- **Survived**: the rule's *affordability*, and reuse of the provisional
machinery — both with stated falsifiers.
**C1 changed the design** — the rule's showcase finding was false and had
*passed* the rule, so existence is not what was missing — and **caught a
defect in flight**, T06's payload still naming the dead number. C2
withdrew the baseline's precision, C3 its arithmetic, C4 flipped T03's
burden toward extending `§Underdetermined`, C5 corrected the redundancy
inventory. Survived: affordability, and reuse of the provisional
machinery. Full account:
[CB-EV-0021](../evidence/CB-EV-0021-the-design-instrument.md) §1§3.
## Task: decide
@ -284,56 +264,40 @@ Candidate measures, to be argued not adopted:
**ground-game has ruled on what a finding must carry** (GROUND-WP-0004
T02, 2026-08-04), and it is stricter than this pass proposed. Adopt it:
> 1. Arithmetic findings must ship a **runnable reproduction** *and* a
> **row-level deal table** listing Surface and each hidden priority
> separately — **never only "sum of file" or "deal depth N"**.
> 2. ground-game rulings that depend on arithmetic **should cite** that
> reproduction id or path, so a later reader can re-run it.
> Arithmetic findings ship a **runnable reproduction** *and* a
> **row-level deal table** — never only "sum of file" or "deal depth N";
> and ground-game's arithmetic rulings cite that reproduction by path.
The second half is theirs to keep. The first is ours, and it is a direct
consequence of both premises we got wrong: *"12 in the file"* was a sum
without a deal table, and *"offered on a face-down Problem"* was a
condition named without checking which one actually fired.
The second half is theirs to keep. **So the reproduction rule gains a
shape requirement, not just an existence one** — a finding that ships a
passing test but describes the wrong quantity is still a bad finding,
which is exactly what happened twice.
**So the reproduction rule gains a shape requirement, not just an
existence one.** A finding that ships a passing test but describes the
wrong quantity is still a bad finding — which is exactly what happened
twice. The spec must say what a reproduction has to *show*, not only that
one exists.
Also specify the **trial protocol**: a trial game is a `--record`ed
session plus an observation log, so *"we played it and X happened"* is
replayable rather than remembered. It must cost almost nothing or it will
not be done.
Also specify the **trial protocol**, which is the part with no precedent
here: a trial game is a `--record`ed session plus an observation log, so
*"we played it and X happened"* is replayable rather than remembered. The
engine already records sessions as scenarios; a trial is that plus notes,
and it must cost almost nothing or it will not be done.
**Done 2026-08-05.** [specs/GameDesign.md](../specs/GameDesign.md) v1.0.
**It is not a register, and says so in its second line** — ADR-0012 D2 put
that in `§Underdetermined`.
**Done 2026-08-05.** [specs/GameDesign.md](../specs/GameDesign.md) v1.0 —
not a register (ADR-0012 D2 put that in `§Underdetermined`).
**§1.2 is written against evidence rather than principle**: a finding must
print the rows behind any number it claims, and the spec carries the table
of what shipped instead — a sum, a green scenario, and a condition named
without checking which one fired. *"12" was arithmetically defensible and
still wrong about the game.*
print the rows behind any number it claims. *"12" was arithmetically
defensible and still wrong about the game.* **§1.3's target is `0`
reproductions gone green while open** — what GR-E01 would have tripped
four days before a human caught it. **No baseline rate is quoted.**
**§1.3's target is `0` reproductions gone green while open** — what GR-E01
would have tripped four days before a human caught it. **No baseline rate
is quoted**; the first honest denominator is T05's backfill.
**The trial protocol costs one flag.** `cb-play --record` already writes a
finished game as a scenario, so a trial is that plus a sibling `.md` in
the player's own words. An observation is a **note** until it has a
reproduction — the maintainer's *"I felt it was too easy but then we
lost"* is the case it is shaped around, and forcing that into a schema at
the moment of observation would lose it.
**The trial protocol costs one flag**: `cb-play --record` plus a sibling
`.md` in the player's own words. An observation is a **note** until it has
a reproduction — *"I felt it was too easy but then we lost"* is the case
it is shaped around, and a schema at the moment of observation would lose
it.
## Task: build it, and backfill what is already known
```task
id: CB-WP-0022-T05
status: todo
status: done
priority: high
state_hub_task_id: "469413ba-ed47-4840-a60e-ee7f95dc06ff"
```
@ -346,44 +310,63 @@ designing it is the point of doing it in this order.
`make design` (or equivalent) must report: open findings by kind, those
without a reproduction, and those never reported to their owner.
**Done 2026-08-05.** `tools/design.py`, `make design`, and the register in
[`GroundRules.md`](../specs/GroundRules.md) — **14 rows, no new file.**
Backfill was the test. The taxonomy held (five kinds, no sixth), and it
**produced a `role` column ADR-0012 does not have**: the first report
alarmed on U2, wrongly — a green *default* is expected, a green
*counterexample* is the alarm. Folded into GameDesign §1.3. It also
contradicted the survey: **one** U-item names itself in a scenario, not
six. Detail and figures:
[CB-EV-0021](../evidence/CB-EV-0021-the-design-instrument.md) §4, §6.
## Task: report to ground-game, mechanically
```task
id: CB-WP-0022-T06
status: todo
status: done
priority: high
state_hub_task_id: "c6a659bd-c495-4754-9332-baadad51012a"
```
Generate the report and send it. **The message that sat unread for four
days is the baseline to beat**, and the failure was not the message — it
was that nothing pointed at it and nothing tracked whether it was
answered.
So the report must land somewhere that persists: a file in `ground-game`
under its own workplan, not only an inbox entry. GROUND-WP-0002 already
holds the ten U-items; this should extend it rather than duplicate it.
days is the baseline to beat** — the failure was not the message, it was
that nothing pointed at it. So the report lands as a file in `ground-game`
under its own workplan, extending GROUND-WP-0002 rather than duplicating
it.
Include the findings this pass has sharpened:
- **SOLVE's legality** against a face-down Problem or an unmatchable suit —
and note that the case we *reported* was not the case that fired
(CB-WP-0023 T01).
- ~~**GR-E01 vs GR-S01** — 4/6/9 against 5/7/9, no dataset reconciles
them~~ — **withdrawn 2026-08-05, before sending.** The adversarial
review (C1) found `2da19a4` had already measured **6/9/12 against
5/7/9**: the dataset reconciles them and the scenario is now
`-reachable-`. Sending this would have been the **fourth** wrong premise
to reach `ground-game`, and the only one caught before transmission.
**Report the withdrawal, not the finding** — GROUND-WP-0002 holds the
original, and a claim retracted silently is how the first three
survived.
- ~~**GR-E01 vs GR-S01** — 4/6/9 against 5/7/9~~ — **withdrawn
2026-08-05, before sending.** C1 found `2da19a4` had measured **6/9/12**:
the dataset reconciles them. It would have been the **fourth** wrong
premise to reach `ground-game` and is the only one caught before
transmission. **Report the withdrawal** — a claim retracted silently is
how the first three survived.
**Done 2026-08-05.**
[`ground-game/workplans/GROUND-WP-0002-clay-borg-report-260805.md`](../../ground-game/workplans/GROUND-WP-0002-clay-borg-report-260805.md),
committed there, with a hub message that only *points at* the file.
**The report asks for no ruling.** It carries GR-E01's withdrawal, our own
reproduction debt, and two notes that are explicitly not findings.
**And it acknowledged something the pass did not expect.**
GROUND-WP-0002 is `finished`: **all ten U-items were ruled 2026-08-03**,
every one confirmed as the default we simulate. CB-RES-0007 said *"0 of 10
ruled"* two days later. **The unread-inbox failure running in the opposite
direction** — they answered and we did not collect it. The instrument's
first run surfaced it.
## Task: evidence
```task
id: CB-WP-0022-T07
status: todo
status: done
priority: high
state_hub_task_id: "4fb77911-486d-4d9e-a53d-c4e486c74ce2"
```
@ -398,3 +381,18 @@ this one moves rather than collides.)*
full-weight L pass and CB-WP-0012's deleted its own structural trigger.
- **The engine-evolution question**, as the review left it.
- **Quote CB-WP-0021's cost by re-running the instrument.**
**Done 2026-08-05.**
[CB-EV-0021](../evidence/CB-EV-0021-the-design-instrument.md).
**Backfill did change the design** — and the honest answer to *"be
suspicious if all six fit"* is that only **five** were entered (one was a
double-count), so fitting them is close to circular. The taxonomy's real
test is the seventh finding.
**Tier L's cost against what it caught**: four of six catches came only
from the separate reviewer, and **two came from execution rather than
process** — the `role` distinction from building it, the ten uncollected
rulings from running it. That is InnerLoop §Design goal's prediction
holding, and an argument against front-loading more review rather than
less.