Compare commits

..

No commits in common. "4e80a657424b8de5c184071e48bd45d06662098a" and "7a43de3f2adbc85d3c55df6d268c086b4960f5a1" have entirely different histories.

5 changed files with 1 additions and 148 deletions

View file

@ -28,9 +28,6 @@
| 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 |
@ -138,17 +135,3 @@
| 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 |

View file

@ -1,113 +0,0 @@
# 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.

View file

@ -3,7 +3,6 @@ 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
@ -92,7 +91,6 @@ 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).
@ -133,7 +131,6 @@ 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:
@ -157,7 +154,6 @@ 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
@ -179,7 +175,6 @@ 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`.

View file

@ -3,7 +3,6 @@ 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
@ -91,7 +90,6 @@ 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`.
@ -149,7 +147,6 @@ 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
@ -174,7 +171,6 @@ 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:
@ -199,7 +195,6 @@ state_hub_task_id: "a2e85810-e949-4ea0-81fc-36b912af326c"
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.
@ -224,7 +219,6 @@ 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
@ -241,7 +235,6 @@ 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
@ -263,10 +256,9 @@ Include the two sharpened findings this pass has already produced:
## Task: evidence
```task
id: CB-WP-0022-T07
id: CB-WP-0022-T06B
status: todo
priority: high
state_hub_task_id: "4fb77911-486d-4d9e-a53d-c4e486c74ce2"
```
`evidence/CB-EV-0020-*.md`.

View file

@ -3,7 +3,6 @@ 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
@ -46,7 +45,6 @@ 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`,
@ -103,7 +101,6 @@ 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
@ -127,7 +124,6 @@ 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.