GR-E03 and GR-E04 played to the end — F14 closed, and the reason they were
Some checks failed
ci / check (push) Failing after 4s

unplayed was ours

Tier S (a fix and a measurement inside a boundary; chaos d8=4 from
CB-WP-0029's roll, no override).

cb-play built EVERY game with ScoringMode::SharedGround and passed an
empty patch. The mode was settable in scenarios and not from the driver,
so two of the three shipped modes were unreachable from the only way
anyone actually plays. F14 sat open for a week because nobody could reach
the thing it was about.

--mode added. All three now play out and give DIFFERENT WINNERS FROM
IDENTICAL PLAY: shared -> all four seats (mastery 4), common -> P3 alone
(top personal scorer), coalitions -> P1+P2 (best Bond network, 4>3>2).
Same 37 commands, three answers.

AND THEY ANSWER F17'S OPEN QUESTION. I had flagged that ATTACK might earn
its place where Blame costs personal score. It does not, in any mode:

  SHARED GROUND     132/165/190/200 -> identical      free but pointless
  COMMON PROBLEM     59/52/48/44    -> 59/52/48/34    a cost at six seats
  BONDED COALITIONS 131/134/132/116 -> 59/52/48/34    roughly halved

The coalitions row has a mechanism and the data confirms it unprompted.
GR-A07 flips a Bond to a Rivalry on Attack, and GR-E04 scores Bond
NETWORKS -- so attacking destroys the thing that scores. And the attacking
numbers in E04 are IDENTICAL to E03's, which is exactly what that
predicts: break every Bond and each seat is a coalition of one, so GR-E04
degenerates into GR-E03. That check was not designed; it fell out.

F14 -> applied. F17 strengthened and no longer bounded to co-op: ATTACK
has no mode in which it helps, and one where it actively destroys your
score.

Still framed as a question rather than a verdict. DARVO is the pattern the
game is about not falling into, so a self-destructive ATTACK may be the
design. What ground-game has to decide is whether the namesake mechanic
being unreachable in competent play -- in all three modes -- is intended.

make all: exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-07 10:38:27 +02:00
parent f4eeddd726
commit 302fc95c97
6 changed files with 145 additions and 49 deletions

View file

@ -39,6 +39,14 @@ pub struct Config {
/// Where the trial log goes (CB-WP-0027). Without it the note channel
/// refuses rather than dropping what the player wrote.
pub trial: Option<std::path::PathBuf>,
/// GR-E02..E04: which scoring mode to play.
///
/// **The driver could not choose one until now**, which is a large
/// part of why GR-E03 and GR-E04 had never been played to the end
/// (F14). `setup` builds SharedGround and `run_game` passed an empty
/// patch, so two of the three shipped modes were unreachable from the
/// only way anyone actually plays.
pub mode: games_ground::ScoringMode,
}
impl Default for Config {
@ -52,6 +60,7 @@ impl Default for Config {
record: None,
serve: None,
trial: None,
mode: games_ground::ScoringMode::SharedGround,
}
}
}
@ -332,7 +341,10 @@ fn run_game<'a, R: BufRead + 'a, W: Write + 'a>(
preset: format!("standard-{}p", config.players),
patch: Default::default(),
};
let initial = <GroundState as cb_game_runtime::ScenarioGame>::setup(&setup, config.seed)?;
let mut initial = <GroundState as cb_game_runtime::ScenarioGame>::setup(&setup, config.seed)?;
// GR-E02..E04. Set before the hash is taken, so a recorded session
// replays in the mode it was played in.
initial.mode = config.mode;
let initial_json = serde_json::to_value(&initial).map_err(|e| e.to_string())?;
let initial_hash = cb_events::state_hash_hex(&initial);