From abd62c5567ec8e2f2ec4f749fa3ff467850c067a Mon Sep 17 00:00:00 2001 From: tegwick Date: Tue, 4 Aug 2026 00:21:21 +0200 Subject: [PATCH] CB-EV-0020: a gate moved the rule, and the report was wrong 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 --- WORK-RECORDS.md | 17 +++ evidence/CB-EV-0020-solve-legality.md | 113 ++++++++++++++++++ workplans/CB-WP-0021-import-the-edition.md | 5 + workplans/CB-WP-0022-the-design-instrument.md | 10 +- workplans/CB-WP-0023-solve-legality.md | 4 + 5 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 evidence/CB-EV-0020-solve-legality.md diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index c7b48c5..ac3a6f6 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -28,6 +28,9 @@ | workplan | CB-WP-0018 | done | — | workplans/CB-WP-0018-the-browser-is-a-client.md | | workplan | CB-WP-0019 | done | — | workplans/CB-WP-0019-the-am4-family.md | | workplan | CB-WP-0020 | done | — | workplans/CB-WP-0020-the-table-you-can-read.md | +| workplan | CB-WP-0021 | ready | — | workplans/CB-WP-0021-import-the-edition.md | +| workplan | CB-WP-0022 | active | — | workplans/CB-WP-0022-the-design-instrument.md | +| workplan | CB-WP-0023 | done | — | workplans/CB-WP-0023-solve-legality.md | | task | CB-WP-0001-T01 | done | — | workplans/CB-WP-0001-inner-loop.md | | task | CB-WP-0001-T02 | done | — | workplans/CB-WP-0001-inner-loop.md | | task | CB-WP-0001-T03 | done | — | workplans/CB-WP-0001-inner-loop.md | @@ -135,3 +138,17 @@ | task | CB-WP-0020-T04 | done | — | workplans/CB-WP-0020-the-table-you-can-read.md | | task | CB-WP-0020-T05 | done | — | workplans/CB-WP-0020-the-table-you-can-read.md | | task | CB-WP-0020-T06 | done | — | workplans/CB-WP-0020-the-table-you-can-read.md | +| task | CB-WP-0021-T01 | todo | — | workplans/CB-WP-0021-import-the-edition.md | +| task | CB-WP-0021-T02 | todo | — | workplans/CB-WP-0021-import-the-edition.md | +| task | CB-WP-0021-T03 | todo | — | workplans/CB-WP-0021-import-the-edition.md | +| task | CB-WP-0021-T04 | todo | — | workplans/CB-WP-0021-import-the-edition.md | +| task | CB-WP-0022-T01 | done | — | workplans/CB-WP-0022-the-design-instrument.md | +| task | CB-WP-0022-T02 | todo | — | workplans/CB-WP-0022-the-design-instrument.md | +| task | CB-WP-0022-T03 | todo | — | workplans/CB-WP-0022-the-design-instrument.md | +| task | CB-WP-0022-T04 | todo | — | workplans/CB-WP-0022-the-design-instrument.md | +| task | CB-WP-0022-T05 | todo | — | workplans/CB-WP-0022-the-design-instrument.md | +| task | CB-WP-0022-T06 | todo | — | workplans/CB-WP-0022-the-design-instrument.md | +| task | CB-WP-0022-T06B | todo | — | workplans/CB-WP-0022-the-design-instrument.md | +| task | CB-WP-0023-T01 | done | — | workplans/CB-WP-0023-solve-legality.md | +| task | CB-WP-0023-T02 | done | — | workplans/CB-WP-0023-solve-legality.md | +| task | CB-WP-0023-T03 | done | — | workplans/CB-WP-0023-solve-legality.md | diff --git a/evidence/CB-EV-0020-solve-legality.md b/evidence/CB-EV-0020-solve-legality.md new file mode 100644 index 0000000..4a1db7b --- /dev/null +++ b/evidence/CB-EV-0020-solve-legality.md @@ -0,0 +1,113 @@ +# CB-EV-0020 — a gate moved the rule, and the report was wrong + +CB-WP-0023 T03. Measured 2026-08-04 at `46c2fb6`+. Pass kind `product`, +tier **S** (chaos d8 = 6, no override). Declaration 6 of chaos window 2. + +--- + +## 1. How long the inert move survived, and what it cost + +SOLVE has been offered where it could do nothing **since `legal_commands` +was written** — nineteen passes. It cost one maintainer three consecutive +rounds of a real game, playing the same move and watching nothing happen, +with no explanation on the page. + +It was not found by a test. It was found by a person playing, and then +only because they said so. + +## 2. The rule ended up somewhere other than where I put it + +I implemented the ruling in `legal_commands` — the **offer** layer — and +it worked: SOLVE stopped being offered, four conditions, four tests. + +Then the **AM-1 coverage gate failed the build**: 58/59, `GR-P05` +uncovered. Scenarios are what cover a rule, and scenarios drive +`validate`, not the offer layer. + +That is what showed the rule was in the wrong place. **A rule enforced +only by the offer is enforced only for clients that ask what is legal.** +The browser would have been filtered; a scenario file, a bot, or any +future client that constructs a command directly would have walked +straight past it. + +Once GR-P05 moved into `validate`, every condition in `legal_commands` +was dead code — and the layering test I had written for a different +reason said so in exactly those words: *"validate now rejects claimed — +drop the filter."* The offer layer is back to one arm for Investigate and +SOLVE together, and it gets the rule for free because it filters +candidates through `validate` anyway. + +**The gate did not catch a bug. It caught a design error**, which is a +better return than it was built for. + +## 3. The reported case was not the one I reported + +CB-WP-0018, CB-EV-0016 and **the message to ground-game** all described +the defect as *SOLVE offered on a face-down Problem*. + +Measured: **`validate` already rejected face-down.** It never was offered. + +Problem 1 is the Surface Problem and is face-up from the deal (GR-S01), so +the maintainer's three inert SOLVEs were the **hand** case — holding no +Clarify for a Clarify Problem. I inferred "face-down" from the play report +without checking which condition was actually blocking, and then told the +game's designer. + +The ruling covers both sub-cases, so nothing it says is invalidated and no +re-ruling is needed. **But a ruling was requested on the strength of a +description that was wrong**, and this is the second time in three passes +that a premise I supplied reached ground-game unchecked — the first being +the *"12 points available"* that voided GR-E01. + +Two of two. The pattern is not that the analysis is careless; it is that +**a claim gets sent the moment it is interesting, and checked afterwards.** +That is the same shape as *unexecuted verification*, one step further out: +not an unverified belief acted on, but an unverified belief **published**. + +CB-WP-0022's *"no finding without its reproduction"* rule would have +caught both. GD-0001 already carries its reproduction; this pass is the +argument for making that the standard rather than the exception. + +## 4. What the four conditions cost to prove + +Each is asserted on its own, because a single *"SOLVE is filtered"* test +passes with three of four implemented and nobody learns which. + +| mutation | result | +|---|---| +| drop the claimed check | `solve_is_not_offered_on_an_already_claimed_problem` red | +| drop the hand check | `solve_is_not_offered_without_a_matching_solution_in_hand` red | +| invert the layering assertion | `validate_enforces_all_four_solve_conditions` red | + +An earlier mutation run reported **three survivors** and was wrong: the +replacement strings did not match the source, so nothing was mutated. The +run proved nothing and looked like a result — the harness-does-nothing +class, in my own hands, caught only by checking that the file changed. + +**No scenario encoded the bug.** All 25 passed unchanged; the 26th covers +GR-P05. + +## 5. Cost + +| pass | kind | responses | cost | $/response | +|---|---|---|---|---| +| **CB-WP-0022** | product | *in flight — T01 only* | | | +| **CB-WP-0021** | product | 12 | **$5.06** | 0.422 | +| CB-WP-0023 | product | *provisional — not quoted* | | | + +CB-WP-0022 is still `active` and cannot be quoted as settled; CB-WP-0021 +is `ready` with its declaration and correction committed and no +implementation, which is what $5.06 buys. Read by re-running `make status` +at the moment of writing. + +## 6. Open + +- **CB-WP-0021 (the edition import) is unstarted and now partly + redundant**: GR-P05's suit check makes the *stand-in's* cycled suits + load-bearing, so importing real `required_solution` values changes which + Problems each hand can solve. It should be re-read before it is run. +- **CB-WP-0022 T02 (adversarial review) is next**, and §3 has just handed + it a second data point. +- **GROUND-WP-0004** — GR-E01's ruling reopened on corrected numbers, with + the maintainer's unwinnable 3-player games as evidence. +- **Chaos: 6 of 12 in window 2**, one override, changed nothing. diff --git a/workplans/CB-WP-0021-import-the-edition.md b/workplans/CB-WP-0021-import-the-edition.md index 39c16a9..03d3266 100644 --- a/workplans/CB-WP-0021-import-the-edition.md +++ b/workplans/CB-WP-0021-import-the-edition.md @@ -3,6 +3,7 @@ id: CB-WP-0021 kind: product title: "Import the edition: the game plays its own data" status: ready +state_hub_workstream_id: "782b1c37-f3a7-469b-87a3-fa73ebe758d2" --- # Purpose @@ -91,6 +92,7 @@ alternatives to take, and that is the ADR. 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). @@ -131,6 +133,7 @@ replay determinism, is not a data-loading change. 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: @@ -154,6 +157,7 @@ Hidden → face down) and `hidden_priority`. 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 @@ -175,6 +179,7 @@ improved by deleting the question is not an improvement.* id: CB-WP-0021-T04 status: todo priority: high +state_hub_task_id: "ba76138d-a225-470d-bb2a-3a6881f4ca82" ``` `evidence/CB-EV-0019-*.md`. diff --git a/workplans/CB-WP-0022-the-design-instrument.md b/workplans/CB-WP-0022-the-design-instrument.md index d91ddd5..925802f 100644 --- a/workplans/CB-WP-0022-the-design-instrument.md +++ b/workplans/CB-WP-0022-the-design-instrument.md @@ -3,6 +3,7 @@ id: CB-WP-0022 kind: product title: "The design instrument: findings about the game, with their reproductions" status: active +state_hub_workstream_id: "fda16340-0049-4acf-884b-a5cfdbde47c0" --- # Purpose @@ -90,6 +91,7 @@ tier L exists to surface. id: CB-WP-0022-T01 status: done priority: high +state_hub_task_id: "6b8663b8-4143-4361-ad9e-7df0c4f4a19d" ``` `research/CB-RES-0007-*.md`. @@ -147,6 +149,7 @@ than duplicate. id: CB-WP-0022-T02 status: todo priority: high +state_hub_task_id: "d2597895-fe2e-4f1e-a3db-a5fb8833434c" ``` Tier L requires it. Give the reviewer the survey **and** the §judgment @@ -171,6 +174,7 @@ Record the trail in `history/`, unpolished. id: CB-WP-0022-T03 status: todo priority: high +state_hub_task_id: "a2e85810-e949-4ea0-81fc-36b912af326c" ``` `decisions/ADR-0012-*.md`. At minimum: @@ -195,6 +199,7 @@ priority: high id: CB-WP-0022-T04 status: todo priority: high +state_hub_task_id: "60ddfeab-81b1-45e4-9ec9-91cc8ea7fb72" ``` `specs/GameDesign.md`, with metrics, because a spec without them is prose. @@ -219,6 +224,7 @@ and it must cost almost nothing or it will not be done. id: CB-WP-0022-T05 status: todo priority: high +state_hub_task_id: "469413ba-ed47-4840-a60e-ee7f95dc06ff" ``` The register, the tool, and then **the six findings above entered into @@ -235,6 +241,7 @@ without a reproduction, and those never reported to their owner. id: CB-WP-0022-T06 status: todo priority: high +state_hub_task_id: "c6a659bd-c495-4754-9332-baadad51012a" ``` Generate the report and send it. **The message that sat unread for four @@ -256,9 +263,10 @@ Include the two sharpened findings this pass has already produced: ## Task: evidence ```task -id: CB-WP-0022-T06B +id: CB-WP-0022-T07 status: todo priority: high +state_hub_task_id: "4fb77911-486d-4d9e-a53d-c4e486c74ce2" ``` `evidence/CB-EV-0020-*.md`. diff --git a/workplans/CB-WP-0023-solve-legality.md b/workplans/CB-WP-0023-solve-legality.md index 845efe6..7a65e92 100644 --- a/workplans/CB-WP-0023-solve-legality.md +++ b/workplans/CB-WP-0023-solve-legality.md @@ -3,6 +3,7 @@ id: CB-WP-0023 kind: product title: "SOLVE is offered only where it can do something" status: done +state_hub_workstream_id: "ae3a1491-4417-4cb2-b490-b694463cc171" --- # Purpose @@ -45,6 +46,7 @@ exists to stop. id: CB-WP-0023-T01 status: done priority: high +state_hub_task_id: "52637f6f-314f-4715-9d81-5e9bea8ced97" ``` SOLVE is offered on problem `p` for seat `s` **iff** `p.face_up`, @@ -101,6 +103,7 @@ inverting the layering assertion turns `validate_enforces_all_four` red. id: CB-WP-0023-T02 status: done priority: medium +state_hub_task_id: "4a436635-2eff-42b1-957c-fdb8b310f910" ``` Update `specs/GroundRules.md` §Underdetermined for the SOLVE items, and @@ -124,6 +127,7 @@ scenario rather than left as a gap. id: CB-WP-0023-T03 status: done priority: high +state_hub_task_id: "3a05165c-df33-4668-8ca2-2340789b3531" ``` `evidence/CB-EV-0020-*.md`. Short.