The AM-1 coverage gate failed the build on GR-P05 being uncovered, which is what showed the rule was in the offer layer rather than in validate. A rule enforced only by the offer is enforced only for clients that ask what is legal. The gate did not catch a bug, it caught a design error. And the reported case was not the one reported. CB-WP-0018, CB-EV-0016 and the message to ground-game all described SOLVE offered on a face-down Problem; validate already rejected face-down, so it never was. Problem 1 is the Surface Problem, face-up from the deal, so the three inert SOLVEs were the HAND case. The ruling covers both so nothing is invalidated, but a ruling was requested on a wrong description -- the second time in three passes that a premise reached ground-game unchecked, after the '12 points available' that voided GR-E01. Two of two. The pattern is not careless analysis; it is that a claim gets SENT the moment it is interesting and checked afterwards. Unexecuted verification, one step further out: not a belief acted on, but a belief published. CB-WP-0022's reproduction rule would have caught both. An earlier mutation run reported three survivors and was wrong -- the replacement strings did not match, so nothing was mutated. It proved nothing and looked like a result. Also renames CB-WP-0022-T06B to T07; the hub flagged it as an unregistered species. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7.4 KiB
| id | kind | title | status | state_hub_workstream_id |
|---|---|---|---|---|
| CB-WP-0021 | product | Import the edition: the game plays its own data | ready | 782b1c37-f3a7-469b-87a3-fa73ebe758d2 |
Purpose
structural tier M (adds or refuses an external dependency, and changes
how a game is set up — a canonical interface)
chaos d8 = 7 → no override
declared tier M
Declaration 4 of chaos window 2.
The engine has been playing a stand-in
games/ground/src/lib.rs builds Problems with value: priority and suits
cycled by index. editions/ground-darvo-r0/Problems.csv has carried the
real thing since 2026-07-31, and GROUND-WP-0002 T01 ruled it
authoritative on 2026-08-03:
| problems/scenario | values | total | suits | |
|---|---|---|---|---|
Problems.csv |
5 | 2, 2, 2, 3, 3 | 12 | required_solution per problem |
| the stand-in | 3 | 1, 2, 3 | 6 | cycled by index |
CORRECTION, before any code: the import does not fix GR-E01
This declaration opened by claiming it would, and the data says otherwise. The claim was "ordinary against 12, unreachable against 6 — it was never a rules gap." Measured across all four scenarios:
GR-S01 deals 2 / 3 / 4 problems by player count, not all five. So the points actually in play are never 12:
| players | dealt | available | GR-E01 threshold | |
|---|---|---|---|---|
| 2 | 2 | 4 | 5 | unreachable |
| 3–4 | 3 | 6 | 7 | unreachable |
| 5–6 | 4 | 9 | 9 | reachable, exactly |
Identical in shape to the stand-in, which gave 3 / 6 / 10 against the same
5 / 7 / 9. So GR-E01 unreachable below 5 seats is a real property of
the game, not an artifact of the stand-in, and
gr-e01-threshold-unreachable-2p is asserting something true.
The error was mine and it was the cheap kind to make: 12 points exist in the file, so I assumed 12 points are in play. One command over the CSV settled it, and it was not run until after the declaration was committed — the characteristic error of this project, in the pass that followed a ruling obtained because of it.
CB-EV-0018 is corrected too. It said the 0 scores were "confirmed
as the stand-in's doing, not a scoring bug." Overstated: the zero came
from no Problem being claimed at all, and the threshold gap is
independent of which dataset is loaded.
What this changes. The import is still right — the suits, values and visibility are authoritative and the engine should stop inventing them. But it resolves nothing about GR-E01, and T03 must send ground-game a sharper question rather than a retirement: either GR-S01's deal count is wrong or GR-E01's thresholds are, and no dataset can reconcile them.
The constraint, measured before declaring
AM-4a has 3,798 lines of headroom. A CSV crate costs, marginally against the shipped graph:
| crate | lines |
|---|---|
csv |
14,291 |
csv-core |
3,360 |
ryu |
3,962 |
| marginal total | 21,613 |
5.7× the available headroom. itoa, memchr, serde and
serde_core are already present and cost nothing; the parser itself is
what does not fit.
So the shipped runtime cannot gain a CSV parser, and that is settled by measurement rather than by preference. What remains is which of the alternatives to take, and that is the ADR.
Task: decide how the data reaches the game
id: CB-WP-0021-T01
status: todo
priority: high
state_hub_task_id: "68e4fe63-eec6-4fb8-a84f-32c7edee19af"
Write decisions/ADR-0011-*.md (tier M: survey and decision in one).
Three questions, and the third is the one that bites.
(a) Where does the data live? ground-game is a separate repository.
Depending on a sibling checkout makes the build depend on a path that may
not exist; vendoring a copy makes clay-borg carry content it does not own.
Whichever is chosen must say how a copy is known to be current, because a
silently stale copy is worse than no copy.
(b) How is it parsed, given a CSV parser does not fit? Candidates, and each needs its marginal cost stated rather than assumed:
- hand-rolled reader in
games/ground— small, but it is a parser we then own, andproblem_textcontains commas; - bake it: a dev-time step converts the CSV into a generated Rust module or compact literal, so the shipped runtime parses nothing. Then the generated artifact must be proven to match its source, which is the DFD class this repo already has machinery for;
- load nothing at runtime and treat the data as scenario input.
(c) What does this do to determinism? Problem values and required
suits become part of GroundState, which is hashed (K7). Every recorded
state hash changes. Before writing code, establish what actually pins a
hash today — make sim runs 25 scenarios, replay-test re-executes
bundles, and AM-7's probe asserts per-segment hashes. Say which of those
break, and whether any of them are supposed to be stable across a
content change.
This is the reason the ADR exists. A content import that quietly invalidates every recorded hash, in a project whose central invariant is replay determinism, is not a data-loading change.
Task: import it, and let the thresholds mean something
id: CB-WP-0021-T02
status: todo
priority: high
state_hub_task_id: "28c3ff2c-16ae-47b5-9474-10e754936c60"
Replace the stand-in. setup must build Problems from the edition data:
point_value, required_solution, visibility (Surface → face up,
Hidden → face down) and hidden_priority.
Controls:
- The stand-in must become unreachable. A test that the fixture
constants no longer appear — a
value: prioritythat survives beside real data is a fallback nobody will notice until the numbers look odd again. - A scenario must be able to reach GR-E01's threshold at 2 players, which is the specific thing that was impossible. Assert the arithmetic, not just that a game runs.
- The 5-problem shape must survive: the stand-in dealt 3, and code that assumed 3 will not announce itself.
Task: retire the rules gap that was never one
id: CB-WP-0021-T03
status: todo
priority: medium
state_hub_task_id: "ff3bd923-9066-49ce-aadd-a3552e4964ff"
gr-e01-threshold-unreachable-2p is tagged provisional: true with
provisional_owner: ground-game, and its description says group success
"is unreachable at 2, 3 and 4 players". If T02 lands, that scenario is
asserting a property of the stand-in, not of the game.
Retire or rewrite it, and say which of the six provisional items this
resolves, so GROUND-WP-0002 T03 shrinks rather than being left to
rediscover it. Message ground-game with the outcome — the last such
message sat unread for four days because nothing pointed at it.
Do not quietly delete a failing-in-fact scenario. CB-EV-0005: a score improved by deleting the question is not an improvement.
Task: evidence
id: CB-WP-0021-T04
status: todo
priority: high
state_hub_task_id: "ba76138d-a225-470d-bb2a-3a6881f4ca82"
evidence/CB-EV-0019-*.md.
- What the import cost, against the 3,798 lines that were available.
- What broke, especially hashes, and whether the blast radius was predicted in T01 or discovered in T02. If it was discovered, say so — that is the ADR having missed something.
- Whether the endings now mean anything: play one and report the score against the threshold.
- Quote CB-WP-0020's cost by re-running the instrument.
- Chaos: 4 of 12 in window 2.