T08 iter 3: GROUND modes, INVESTIGATE, SOLVE

Fills in resolution steps 1, 4 and 6 (GR-R06):

- GR-R05 mode choice: a player who revealed GROUND picks GR/OU/ND after
  Reveal. Resolution refuses to start while any revealed GROUND lacks a
  mode, and only that player may choose it.
- GR-A10 GROUND-GR: self -2 Stress and Freedom readied.
- GR-A01 INVESTIGATE: reveal the chosen hidden non-Denied Problem, then
  draw one Solution; the draw still happens when nothing is revealable.
- GR-A02 SOLVE: spend a Solution of the Problem's suit and claim it; a
  later resolver the same round spends nothing, per Lead order.
- GR-A13 tightened: INVESTIGATE must target a hidden Problem, SOLVE a
  face-up non-Denied one. Previously any existing Problem was accepted.

Deck exhaustion (U4) reshuffles the discard, seeded from the game seed
and round so validate stays a pure function of state. The resulting
order travels inside DeckReshuffled, so replay never re-derives it.

Still pending, each because it needs its own decision command rather
than a default: GROUND-OU and GROUND-ND three-way choices (GR-A11/A12)
and the DARVO stage machine (GR-D02..D07). No scenario claims coverage
of them.

Filler picks in existing scenarios moved from GROUND to INVESTIGATE:
GROUND now has a real Stress effect, which was polluting the Support
and Attack assertions.

11 scenarios pass, 34 rules covered; 17 tests, fmt/clippy green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-07-31 02:23:09 +02:00
parent b58a9139aa
commit 27b7fe4329
10 changed files with 417 additions and 13 deletions

View file

@ -0,0 +1,43 @@
scenario: ground/gr-a01-investigate
description: >
INVESTIGATE reveals the chosen hidden Problem and draws one Solution
(GR-A01). Selecting an already face-up Problem is rejected (GR-A13).
covers: [GR-A01, GR-S01]
provisional: false
seed: 42
setup:
players: 3
preset: standard-3p
patch:
"lead": 0
commands:
- actor: P1
cmd: select_action
args: { action: INVESTIGATE, problem: 2 }
# GR-A13: Problem 1 is the Surface Problem, already face up.
- actor: P2
cmd: select_action
args: { action: INVESTIGATE, problem: 1 }
- actor: P2
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: P3
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
- actor: SYSTEM
cmd: resolve
expect:
events:
- kind: ProblemRevealed
problem: 2
- kind: SolutionDrawn
player: 0
state:
"problems.2.face_up": true
"problems.3.face_up": true
# GR-S02 dealt two; INVESTIGATE drew a third. The suit is the
# golden value for seed 42 under the GR-S04 shuffle.
"players.0.hand.2.suit": Change
rejects: [1]

View file

@ -0,0 +1,43 @@
scenario: ground/gr-a02-solve
description: >
SOLVE discards a Solution of the Problem's suit and claims it
(GR-A02). A second solver of the same Problem the same round spends
nothing, because an earlier resolver in Lead order already claimed it.
covers: [GR-A02, GR-R07, GR-O04]
provisional: false
seed: 42
setup:
players: 3
preset: standard-3p
patch:
"lead": 0
"players.0.hand": [{ suit: Clarify }]
"players.1.hand": [{ suit: Clarify }]
commands:
- actor: P1
cmd: select_action
args: { action: SOLVE, problem: 1 }
- actor: P2
cmd: select_action
args: { action: SOLVE, problem: 1 }
- actor: P3
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
- actor: SYSTEM
cmd: resolve
expect:
events:
- kind: SolutionDiscarded
player: 0
- kind: ProblemClaimed
problem: 1
by: 0
state:
# Problem 1 is the Clarify Surface Problem (GR-S01).
"problems.1.claimed_by": 0
"players.0.hand": []
# GR-A02: P2 resolved second, so its Solution is not spent.
"players.1.hand": [{ suit: Clarify }]
rejects: []

View file

@ -24,7 +24,7 @@ commands:
args: { action: SUPPORT, target: P3 }
- actor: P3
cmd: select_action
args: { action: GROUND }
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
- actor: SYSTEM

View file

@ -17,10 +17,10 @@ commands:
args: { action: ATTACK, target: P2 }
- actor: P2
cmd: select_action
args: { action: GROUND }
args: { action: INVESTIGATE, problem: 3 }
- actor: P3
cmd: select_action
args: { action: GROUND }
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
- actor: SYSTEM

View file

@ -22,7 +22,7 @@ commands:
args: { action: ATTACK, target: P3 }
- actor: P3
cmd: select_action
args: { action: GROUND }
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
- actor: SYSTEM

View file

@ -0,0 +1,55 @@
scenario: ground/gr-a10-ground-gr
description: >
GROUND—GR (Ground & Restate): the mode is chosen after Reveal
(GR-R05), and on resolution the player takes 2 Stress and readies
their Freedom token (GR-A10, GR-F04). Resolution refuses to start
while any revealed GROUND still lacks a mode.
covers: [GR-R05, GR-A10]
provisional: false
seed: 42
setup:
players: 3
preset: standard-3p
patch:
"lead": 0
"players.0.stress": 5
"players.0.freedom_ready": false
commands:
- actor: P1
cmd: select_action
args: { action: GROUND }
- actor: P2
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: P3
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
# GR-R05: no mode chosen yet, so resolution is refused.
- actor: SYSTEM
cmd: resolve
# GR-R05: only a player who revealed GROUND may choose a mode.
- actor: P2
cmd: choose_ground_mode
args: { mode: GR }
- actor: P1
cmd: choose_ground_mode
args: { mode: GR }
- actor: SYSTEM
cmd: resolve
expect:
events:
- kind: GroundModeChosen
player: 0
mode: Gr
- kind: StressSet
player: 0
stress: 3
- kind: FreedomReadied
player: 0
state:
"players.0.stress": 3
"players.0.freedom_ready": true
"step": Resolve
rejects: [4, 5]

View file

@ -18,10 +18,10 @@ commands:
args: { action: ATTACK, target: P2 }
- actor: P2
cmd: select_action
args: { action: GROUND }
args: { action: ATTACK, target: P3 }
- actor: P3
cmd: select_action
args: { action: GROUND }
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
- actor: SYSTEM

View file

@ -21,7 +21,7 @@ commands:
# GR-R02: one selection per player per round.
- actor: P1
cmd: select_action
args: { action: GROUND }
args: { action: INVESTIGATE, problem: 3 }
expect:
events:
- kind: ActionSelected

View file

@ -20,7 +20,7 @@ commands:
args: { action: SUPPORT, target: P3 }
- actor: P3
cmd: select_action
args: { action: GROUND }
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
- actor: SYSTEM