Three reports from the 2026-08-08 sessions. H2 lands ("that seemed more
interesting"), two legibility gaps do not.
The number was only a FALLBACK for a missing title, so it showed exactly
when it was least useful. That was survivable while Problems sat in one
ordered row -- position WAS the number. CB-WP-0043 scattered them by
scope and took the implicit index with it, with nothing going red because
no test named the number.
DARVO.csv's mandatory_effect and Actions.csv's GROUND rules_text were
both vendored, both used only as tripwires, and neither ever reached the
player -- F18's shape again. The modes now explain themselves at the
point of choice, and NOT when no mode is on offer.
Tests assert the edition's own words verbatim (ADR-0015), the number over
every key in view.problems, and both halves of the mode explanation.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
d9b88d3140
commit
fd76db4f71
7 changed files with 809 additions and 0 deletions
|
|
@ -697,6 +697,114 @@ mod gamelog {
|
|||
}
|
||||
}
|
||||
|
||||
/// **The number is on the card** (CB-WP-0045).
|
||||
///
|
||||
/// Every move label says "Problem 7"; nothing on the table said which
|
||||
/// card that was. In the old row, position was a hint — once
|
||||
/// Problems are placed by scope the row is gone and the hint with it.
|
||||
/// The number was only ever a fallback for a missing title, so it
|
||||
/// appeared exactly when it was least useful.
|
||||
#[test]
|
||||
fn every_problem_card_shows_its_number() {
|
||||
let v = crate::testfix::view(Some(PlayerId(0)));
|
||||
let text = crate::text_of(&crate::doc::document(
|
||||
&v,
|
||||
&[],
|
||||
"/c",
|
||||
Some(PlayerId(0)),
|
||||
false,
|
||||
));
|
||||
for key in v.problems.keys() {
|
||||
assert!(
|
||||
text.contains(&format!("{key}")),
|
||||
"Problem {key} is on the table with no number, and the move \
|
||||
labels call it by one"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// **The game's own words for a DARVO stage** (CB-WP-0045).
|
||||
///
|
||||
/// Reported as *"the GROUND and DARVO logic is far from self
|
||||
/// explanatory"*. `DARVO.csv` carries `mandatory_effect` per stage —
|
||||
/// vendored for tripwires and never shown, so the page said "DARVO
|
||||
/// Reverse" and left the player to guess. F18's shape again: the data
|
||||
/// was present and could not fire.
|
||||
#[test]
|
||||
fn a_darvo_stage_says_what_it_does() {
|
||||
let v = crate::testfix::view(Some(PlayerId(0)));
|
||||
let text = crate::text_of(&crate::doc::document(
|
||||
&v,
|
||||
&[],
|
||||
"/c",
|
||||
Some(PlayerId(0)),
|
||||
false,
|
||||
));
|
||||
// The fixture has a seat at Reverse.
|
||||
assert!(
|
||||
text.contains("what Reverse does"),
|
||||
"a seat in a DARVO stage does not say what the stage does"
|
||||
);
|
||||
// And it is the EDITION's sentence, not a paraphrase of ours.
|
||||
let edition = games_ground::edition::darvo_stages()
|
||||
.expect("DARVO.csv")
|
||||
.into_iter()
|
||||
.find(|s| s.stage == "REVERSE")
|
||||
.expect("REVERSE");
|
||||
let head: String = edition.mandatory_effect.chars().take(40).collect();
|
||||
assert!(
|
||||
text.contains(&head),
|
||||
"the stage text is not the edition's own words: {head:?}"
|
||||
);
|
||||
}
|
||||
|
||||
/// **The GROUND modes explain themselves at the decision** (CB-WP-0045).
|
||||
///
|
||||
/// By the Reveal step the action card has left the screen, so the
|
||||
/// player was choosing GR / OU / ND from three names alone.
|
||||
#[test]
|
||||
fn the_ground_modes_explain_themselves_where_they_are_chosen() {
|
||||
use games_ground::{GroundCommand, GroundMode};
|
||||
let v = crate::testfix::view(Some(PlayerId(0)));
|
||||
let legal = vec![GroundCommand::ChooseGroundMode {
|
||||
mode: GroundMode::Gr,
|
||||
choice: None,
|
||||
}];
|
||||
let with = crate::text_of(&document_with_log(
|
||||
&v,
|
||||
&legal,
|
||||
crate::TEST_ENDPOINTS,
|
||||
Some(PlayerId(0)),
|
||||
false,
|
||||
Account::of(&[]),
|
||||
&[],
|
||||
));
|
||||
assert!(
|
||||
with.contains("what the GROUND modes do"),
|
||||
"the mode choice is offered with no account of the modes"
|
||||
);
|
||||
assert!(
|
||||
with.contains("Ground & Restate"),
|
||||
"the explanation is not the card's own text"
|
||||
);
|
||||
|
||||
// Absent when no mode is on offer — an always-on wall of rules is
|
||||
// how a player stops reading them.
|
||||
let without = crate::text_of(&document_with_log(
|
||||
&v,
|
||||
&[],
|
||||
crate::TEST_ENDPOINTS,
|
||||
Some(PlayerId(0)),
|
||||
false,
|
||||
Account::of(&[]),
|
||||
&[],
|
||||
));
|
||||
assert!(
|
||||
!without.contains("what the GROUND modes do"),
|
||||
"the mode explanation shows when no mode is being chosen"
|
||||
);
|
||||
}
|
||||
|
||||
/// **A Problem is drawn where its Stress lands** (CB-WP-0043).
|
||||
///
|
||||
/// H2 scopes End-of-Round Stress, so a row across the middle — true
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue