CB-WP-0023: SOLVE is legal only where it can do something
Some checks failed
ci / check (push) Failing after 4s

Implements ground-game's ruling of 2026-08-03. make all exits 0, 26
scenarios, rule coverage 59/59, and no scenario encoded the bug.

The rule ended up somewhere other than where I put it, and a gate moved
it. It went into legal_commands first; the AM-1 coverage gate then
demanded a scenario for the new GR-P05, and scenarios drive validate, not
the offer layer. A rule enforced only by the offer is enforced only for
clients that ask what is legal -- the browser would be filtered and a
scenario file would walk straight past it. Once GR-P05 moved into
validate, every condition in legal_commands was dead code, and the
layering test said so in those words.

And the reported case was not the one I reported. CB-WP-0018 and the
message to ground-game described SOLVE offered on a FACE-DOWN Problem.
Measured: validate already rejected face-down, so it never was offered.
Problem 1 is the Surface Problem, face-up from the deal -- the
maintainer's three inert SOLVEs were the HAND case, holding no Clarify
for a Clarify Problem. The ruling covers both so nothing is invalidated,
but the record was wrong.

Four conditions asserted separately, because one 'SOLVE is filtered' test
would pass with three of four implemented.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-04 00:18:40 +02:00
parent 46c2fb652e
commit 6487d33f27
7 changed files with 321 additions and 16 deletions

View file

@ -2,7 +2,7 @@
id: CB-WP-0023
kind: product
title: "SOLVE is offered only where it can do something"
status: active
status: done
---
# Purpose
@ -43,7 +43,7 @@ exists to stop.
```task
id: CB-WP-0023-T01
status: todo
status: done
priority: high
```
@ -66,11 +66,40 @@ next reader will add a round comparison that does nothing.
encoded the old behaviour — in which case the scenario was encoding a
bug and must be updated with a note, not quietly edited.
**Done 2026-08-04.** `make all` exits 0, 26 scenarios, rule coverage
**59/59**. **No scenario encoded the bug** — all 25 passed unchanged.
**The rule ended up somewhere other than where I put it, and a gate moved
it.** It went into `legal_commands` first. The AM-1 coverage gate then
demanded a scenario for the new GR-P05 — and scenarios drive `validate`,
not the offer layer. That is what showed the rule belonged in `validate`:
**a rule enforced only by the offer is enforced only for clients that ask
what is legal.** The browser would have been filtered and a scenario file
would have walked straight past it.
Once GR-P05 moved into `validate`, every condition in `legal_commands`
was dead code, and my own layering test said so in those words
(*"validate now rejects claimed — drop the filter"*). The offer layer is
back to one arm for Investigate and SOLVE together.
**And the reported case was not the one I reported.** CB-WP-0018 and the
message to ground-game described SOLVE offered on a **face-down** Problem.
Measured: `validate` already rejected face-down, so it never was offered.
Problem 1 is the Surface Problem and is face-up from the deal — the
maintainer's three inert SOLVEs were the **hand** case, holding no Clarify
for a Clarify Problem. The ruling covers both, so nothing is invalidated,
but the record was wrong and is corrected here.
Four conditions, each asserted separately, because one "SOLVE is filtered"
test would pass with three of four implemented. Mutations: dropping the
claimed filter and dropping the hand filter each turn their own test red;
inverting the layering assertion turns `validate_enforces_all_four` red.
## Task: retire what the ruling settles
```task
id: CB-WP-0023-T02
status: todo
status: done
priority: medium
```
@ -81,11 +110,19 @@ code but not in the spec leaves the next reader with two sources.**
Report to `ground-game` that the ruling is implemented — closing the loop
is the part that has failed twice.
**Done 2026-08-04.** `specs/GroundRules.md` gains **GR-P05** stating the
rule and recording that the bluff reading is dead, and
`scenarios/ground/gr-p05-solve-legality.yaml` covers it — P1 refused for
holding no Clarify, P2 admitted and claiming. The prior-round-claim half
is asserted in the unit test instead, because reaching a second round
costs a dozen commands to test one rejection, and that is said in the
scenario rather than left as a gap.
## Task: evidence
```task
id: CB-WP-0023-T03
status: todo
status: done
priority: high
```