clay-borg/scenarios/ground/gr-e01-threshold-reachable-2p.yaml
tegwick 2da19a49b7 CB-WP-0021 T01/T02/T05: the engine plays its own data — AM-7 blocks
ADR-0011 decided it: vendor the CSV with a checked digest, read it with
a ~50-line reader, and let the hashes move.

The declaration's constraint was measured against the WRONG BUDGET. It
said a CSV crate costs 21,613 against AM-4a's 3,798 of headroom, '5.7x
over, settled by measurement'. But setup and problem_priorities are
cfg(scenarios) and are not in the shipped runtime at all, so AM-4a never
sees them. Against AM-4b, csv costs 17,651 against 19,742 -- it FITS,
with 2,091 to spare. It is refused anyway, on proportion: 89% of the
budget's remaining capacity to read 20 rows. The revisit condition is
stated (nested quoting, embedded newlines, multiple dialects).

GR-S01 now deals Surface + hidden 1..=k as ruled, with edition values and
suits. Measured: 6/9/12 available against thresholds 5/7/9 -- the game is
winnable at every seat count, which is what the maintainer could not do.
gd0001 is INVERTED, not deleted, and now also asserts the 6/9/12 so a
deal that is reachable for the wrong reason still fails.

Blast radius was scenario expectations, exactly as the ADR predicted: no
scenario pinned a hash and no bundle is committed. Six scenarios and two
unit tests updated, each with a note. gr-e01-threshold-unreachable-2p is
RENAMED to -reachable- and rewritten as the non-provisional import check
ground-game asked for by name. gr-e03's setup was restructured, not just
renumbered: with values 2,2,2 its personal-edge test would have tied
three ways and asserted nothing.

BLOCKING: AM-7 fails at median 0.845 against its 0.9 floor. Isolated
across three runs -- 3 problems + stand-in 0.97, 3 problems + edition
0.909, 4 problems + edition 0.845. State is BOUNDED (proven: identical
after 5k and 100k events), so this is not the unbounded-growth defect
AM-7 exists to catch; it is a bigger working set streaming a long log.
Whether AM-7's floor is still right for a larger aggregate is a spec
question and lowering it requires an ADR, so it is not being tuned here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 00:47:56 +02:00

66 lines
2.1 KiB
YAML

scenario: ground/gr-e01-threshold-reachable-2p
description: >
GR-E01's threshold against the EDITION's Problem values, at the
2-player boundary — the tightest band. Rewritten from
`gr-e01-threshold-unreachable-2p` on ground-game's ruling of
2026-08-04, which called the old gap "not a design gap" and asked for
"a non-provisional import/fixture check: for every seat band,
sum(point_value of dealt Problems) >= threshold".
The old scenario recorded a real defect: the engine dealt Surface +
(N-1) hidden, worth 3/6/10 against thresholds of 5/7/9, and a
maintainer could not win a 3-player game. GR-S01 was then ruled as
Surface + hidden 1..=k, giving 6/9/12. It is renamed rather than
deleted, because the record of why the numbers changed is worth more
than a clean directory.
At 2p the deal is Surface(Repair,2) + hidden 1(Clarify,2) +
hidden 2(Boundary,2) = 6 against a threshold of 5. Reachable, and
ground-game kept it unforgiving on purpose: any TWO Problems sum to 4,
so success needs a full clear.
covers: [GR-E01, GR-E02, GR-O01]
provisional: false
seed: 42
setup:
players: 2
preset: standard-2p
patch:
"round": 5
"mode": SharedGround
# A full clear: all three dealt Problems claimed. Anything less than
# all three cannot reach 5, which is the point of the band.
"problems.1.claimed_by": 0
"problems.2.claimed_by": 1
"problems.2.face_up": true
"problems.3.claimed_by": 0
"problems.3.face_up": true
commands:
- actor: P1
cmd: select_action
args: { action: GROUND }
- actor: P2
cmd: select_action
args: { action: GROUND }
- actor: SYSTEM
cmd: reveal
- actor: P1
cmd: choose_ground_mode
args: { mode: GR }
- actor: P2
cmd: choose_ground_mode
args: { mode: GR }
- actor: SYSTEM
cmd: resolve
- actor: SYSTEM
cmd: end_round
expect:
events:
- kind: GameEnded
state:
# 2 + 2 + 2 = 6, the maximum a 2-player game can score, against 5.
"outcome.total": 6
"outcome.threshold": 5
"outcome.group_success": true
"round": 5
"step": End
rejects: []