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
|
|
@ -401,6 +401,9 @@ fn problem_svg(out: &mut String, priority: u32, p: &ProblemView, x: i32) {
|
||||||
out,
|
out,
|
||||||
"<g data-drop=\"problem-{priority}\"><rect x=\"{x}\" y=\"10\" width=\"120\" height=\"78\" rx=\"8\" \
|
"<g data-drop=\"problem-{priority}\"><rect x=\"{x}\" y=\"10\" width=\"120\" height=\"78\" rx=\"8\" \
|
||||||
fill=\"{fill}\" stroke=\"#5a6b7a\"/>\
|
fill=\"{fill}\" stroke=\"#5a6b7a\"/>\
|
||||||
|
<circle cx=\"{bx}\" cy=\"24\" r=\"11\" fill=\"#1b1e26\" stroke=\"#5a6b7a\"/>\
|
||||||
|
<text x=\"{bx}\" y=\"29\" fill=\"#9cf\" font-size=\"13\" text-anchor=\"middle\">\
|
||||||
|
{priority}</text>\
|
||||||
<text x=\"{tx}\" y=\"36\" fill=\"#dde\" font-size=\"13\">{label}</text>\
|
<text x=\"{tx}\" y=\"36\" fill=\"#dde\" font-size=\"13\">{label}</text>\
|
||||||
<text x=\"{tx}\" y=\"56\" fill=\"#89a\" font-size=\"11\">{name}</text>\
|
<text x=\"{tx}\" y=\"56\" fill=\"#89a\" font-size=\"11\">{name}</text>\
|
||||||
<text x=\"{tx}\" y=\"74\" fill=\"#fc9\" font-size=\"11\">{sub}</text></g>",
|
<text x=\"{tx}\" y=\"74\" fill=\"#fc9\" font-size=\"11\">{sub}</text></g>",
|
||||||
|
|
@ -410,6 +413,14 @@ fn problem_svg(out: &mut String, priority: u32, p: &ProblemView, x: i32) {
|
||||||
// not remove the only identifier the player had.
|
// not remove the only identifier the player had.
|
||||||
name = esc(&problem_title(priority).unwrap_or_else(|| format!("priority {priority}"))),
|
name = esc(&problem_title(priority).unwrap_or_else(|| format!("priority {priority}"))),
|
||||||
tx = x + 10,
|
tx = x + 10,
|
||||||
|
// CB-WP-0045: the number, on the card.
|
||||||
|
//
|
||||||
|
// Every move label says "Problem 7" and nothing on the table said
|
||||||
|
// which card that was. In the old row the 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 — visible exactly when it was least useful.
|
||||||
|
bx = x + 104,
|
||||||
label = esc(&label),
|
label = esc(&label),
|
||||||
sub = esc(&sub),
|
sub = esc(&sub),
|
||||||
);
|
);
|
||||||
|
|
@ -941,6 +952,21 @@ fn player_card(out: &mut String, id: PlayerId, p: &PlayerView, view: &GroundView
|
||||||
//
|
//
|
||||||
// The `support` line is the one the maintainer reported: it read
|
// The `support` line is the one the maintainer reported: it read
|
||||||
// `support AcceptBond`, which names the answer and not the person.
|
// `support AcceptBond`, which names the answer and not the person.
|
||||||
|
// CB-WP-0045: **what this DARVO stage will do**, in the edition's own
|
||||||
|
// words. `DARVO.csv` carries `mandatory_effect` per stage; we vendored
|
||||||
|
// it for tripwires and never showed it, so the page said "DARVO
|
||||||
|
// Reverse" and left the player to guess. Reported as *"the GROUND and
|
||||||
|
// DARVO logic is far from self explanatory"*.
|
||||||
|
if p.darvo != games_ground::DarvoStage::Off {
|
||||||
|
if let Some(text) = darvo_stage_text(p.darvo) {
|
||||||
|
let _ = write!(
|
||||||
|
out,
|
||||||
|
"<details><summary>what {:?} does</summary>{}</details>",
|
||||||
|
p.darvo,
|
||||||
|
esc(&text)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
if let Some(m) = view.ground_modes.get(&id) {
|
if let Some(m) = view.ground_modes.get(&id) {
|
||||||
let _ = write!(
|
let _ = write!(
|
||||||
out,
|
out,
|
||||||
|
|
@ -1432,6 +1458,38 @@ fn support_words(r: &games_ground::SupportResponse, who: Option<PlayerId>) -> St
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The edition's own words for what a DARVO stage does (CB-WP-0045).
|
||||||
|
///
|
||||||
|
/// From `DARVO.csv`'s `mandatory_effect`. **Not our paraphrase**: the game
|
||||||
|
/// says what its stages do and ADR-0015's discipline is to use that.
|
||||||
|
fn darvo_stage_text(stage: games_ground::DarvoStage) -> Option<String> {
|
||||||
|
use games_ground::DarvoStage;
|
||||||
|
let want = match stage {
|
||||||
|
DarvoStage::Off => return None,
|
||||||
|
DarvoStage::Deny => "DENY",
|
||||||
|
DarvoStage::Attack => "ATTACK",
|
||||||
|
DarvoStage::Reverse => "REVERSE",
|
||||||
|
};
|
||||||
|
games_ground::edition::darvo_stages()
|
||||||
|
.ok()?
|
||||||
|
.into_iter()
|
||||||
|
.find(|s| s.stage == want)
|
||||||
|
.map(|s| s.mandatory_effect)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The GROUND card's own account of its three modes (CB-WP-0045).
|
||||||
|
///
|
||||||
|
/// Shown where the mode is chosen. The card explains GR, OU and ND in one
|
||||||
|
/// passage; by the Reveal step the action card is no longer on screen, so
|
||||||
|
/// the explanation has to travel to the decision.
|
||||||
|
fn ground_modes_text() -> Option<String> {
|
||||||
|
games_ground::edition::actions()
|
||||||
|
.ok()?
|
||||||
|
.into_iter()
|
||||||
|
.find(|c| c.id.to_uppercase().contains("GROUND"))
|
||||||
|
.map(|c| c.rules_text)
|
||||||
|
}
|
||||||
|
|
||||||
/// A GROUND sub-choice, in words, naming whoever it touches.
|
/// A GROUND sub-choice, in words, naming whoever it touches.
|
||||||
fn ground_choice_label(c: &games_ground::GroundChoice) -> String {
|
fn ground_choice_label(c: &games_ground::GroundChoice) -> String {
|
||||||
use games_ground::GroundChoice as G;
|
use games_ground::GroundChoice as G;
|
||||||
|
|
@ -1605,6 +1663,23 @@ fn move_section(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// CB-WP-0045: when a GROUND mode is on offer, the card's own
|
||||||
|
// account of the three modes travels with the decision. By the
|
||||||
|
// Reveal step the action card has left the screen, so the player
|
||||||
|
// was choosing GR / OU / ND from three names alone.
|
||||||
|
if legal
|
||||||
|
.iter()
|
||||||
|
.any(|c| matches!(c, games_ground::GroundCommand::ChooseGroundMode { .. }))
|
||||||
|
{
|
||||||
|
if let Some(text) = ground_modes_text() {
|
||||||
|
let _ = write!(
|
||||||
|
s,
|
||||||
|
"<details class=\"card\" open><summary>what the GROUND modes do\
|
||||||
|
</summary>{}</details>",
|
||||||
|
esc(&text)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
s.push_str("</div><div class=\"row\">");
|
s.push_str("</div><div class=\"row\">");
|
||||||
for (i, c) in legal.iter().enumerate() {
|
for (i, c) in legal.iter().enumerate() {
|
||||||
let spatial = seat.is_some_and(|seat| crate::input::affordance(c, seat).is_some());
|
let spatial = seat.is_some_and(|seat| crate::input::affordance(c, seat).is_some());
|
||||||
|
|
|
||||||
|
|
@ -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).
|
/// **A Problem is drawn where its Stress lands** (CB-WP-0043).
|
||||||
///
|
///
|
||||||
/// H2 scopes End-of-Round Stress, so a row across the middle — true
|
/// H2 scopes End-of-Round Stress, so a row across the middle — true
|
||||||
|
|
|
||||||
158
trials/2026-08-08-1818-2.yaml
Normal file
158
trials/2026-08-08-1818-2.yaml
Normal file
|
|
@ -0,0 +1,158 @@
|
||||||
|
scenario: ground/cb-play-session
|
||||||
|
description: recorded by cb-play (CB-WP-0008 T02)
|
||||||
|
covers: []
|
||||||
|
provisional: false
|
||||||
|
provisional_owner: ''
|
||||||
|
provisional_raised: ''
|
||||||
|
ruled: ''
|
||||||
|
ruled_by: ''
|
||||||
|
ruled_note: ''
|
||||||
|
encodes_u_item: ''
|
||||||
|
seed: 2
|
||||||
|
setup:
|
||||||
|
players: 3
|
||||||
|
preset: standard-3p
|
||||||
|
patch: {}
|
||||||
|
commands:
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 2
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 1
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 1
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 2
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 3
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 2
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SUPPORT
|
||||||
|
target: P2
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P2
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P2
|
||||||
|
cmd: respond_to_support
|
||||||
|
args:
|
||||||
|
response: accept_bond
|
||||||
|
- actor: P3
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 3
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 4
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 4
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SUPPORT
|
||||||
|
target: P3
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 4
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P3
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P3
|
||||||
|
cmd: respond_to_support
|
||||||
|
args:
|
||||||
|
response: accept_bond
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
expect:
|
||||||
|
events: []
|
||||||
|
state: {}
|
||||||
|
rejects: []
|
||||||
|
state_hash: ff50bedd79bef9ac80f3481d56a3b50b1f3cdef7d265b831ca17cdadbdf49e86
|
||||||
187
trials/2026-08-08-1818-3.yaml
Normal file
187
trials/2026-08-08-1818-3.yaml
Normal file
|
|
@ -0,0 +1,187 @@
|
||||||
|
scenario: ground/cb-play-session
|
||||||
|
description: recorded by cb-play (CB-WP-0008 T02)
|
||||||
|
covers: []
|
||||||
|
provisional: false
|
||||||
|
provisional_owner: ''
|
||||||
|
provisional_raised: ''
|
||||||
|
ruled: ''
|
||||||
|
ruled_by: ''
|
||||||
|
ruled_note: ''
|
||||||
|
encodes_u_item: ''
|
||||||
|
seed: 3
|
||||||
|
setup:
|
||||||
|
players: 3
|
||||||
|
preset: standard-3p
|
||||||
|
patch: {}
|
||||||
|
commands:
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 2
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 2
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 2
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
choice: protect_problem
|
||||||
|
mode: OU
|
||||||
|
problem: 1
|
||||||
|
- actor: P2
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P3
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P1
|
||||||
|
cmd: choose_darvo_target
|
||||||
|
args:
|
||||||
|
problem: 1
|
||||||
|
- actor: P2
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P3
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P2
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P3
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P1
|
||||||
|
cmd: choose_darvo_target
|
||||||
|
args:
|
||||||
|
problem: 2
|
||||||
|
- actor: P2
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P3
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
expect:
|
||||||
|
events: []
|
||||||
|
state: {}
|
||||||
|
rejects: []
|
||||||
|
state_hash: 1c5d6828619d00851bfd6048082074044a7343d606df4062f11d696f05fbc988
|
||||||
19
trials/2026-08-08-1818.md
Normal file
19
trials/2026-08-08-1818.md
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Trial log
|
||||||
|
|
||||||
|
What the player said while playing, bound to the position they said it at
|
||||||
|
(CB-WP-0027, ADR-0014). The recording beside this file is the position;
|
||||||
|
`state_hash` is what reaches it.
|
||||||
|
|
||||||
|
**These are raw notes and they stay here.** Nothing in this file travels to
|
||||||
|
`ground-game` (ADR-0014 D4) — a note reaches them only by being promoted to a
|
||||||
|
register finding, by a human, with the wording chosen then.
|
||||||
|
|
||||||
|
<!-- trial-log:begin -->
|
||||||
|
|
||||||
|
| n | game | after | round | step | state_hash | comment |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 1 | 1 | 36 | 5 | after the end | 73661a4ab998 | Ok, that seemed more interesting and we lost. I am not sure how ground actually works. lets try again. |
|
||||||
|
| 2 | 2 | 35 | 5 | after the end | ff50bedd79be | We did it this time. |
|
||||||
|
| 3 | 3 | 44 | 5 | after the end | 1c5d6828619d | The GROUND and DARVO logic is far from self explanatory. That needs to be improved. |
|
||||||
|
|
||||||
|
<!-- trial-log:end -->
|
||||||
160
trials/2026-08-08-1818.yaml
Normal file
160
trials/2026-08-08-1818.yaml
Normal file
|
|
@ -0,0 +1,160 @@
|
||||||
|
scenario: ground/cb-play-session
|
||||||
|
description: recorded by cb-play (CB-WP-0008 T02)
|
||||||
|
covers: []
|
||||||
|
provisional: false
|
||||||
|
provisional_owner: ''
|
||||||
|
provisional_raised: ''
|
||||||
|
ruled: ''
|
||||||
|
ruled_by: ''
|
||||||
|
ruled_note: ''
|
||||||
|
encodes_u_item: ''
|
||||||
|
seed: 1
|
||||||
|
setup:
|
||||||
|
players: 3
|
||||||
|
preset: standard-3p
|
||||||
|
patch: {}
|
||||||
|
commands:
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 2
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 1
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 1
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 4
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 3
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 3
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P2
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P3
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 2
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SUPPORT
|
||||||
|
target: P1
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 2
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: respond_to_support
|
||||||
|
args:
|
||||||
|
response: accept_bond
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 3
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: GROUND
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P2
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: P3
|
||||||
|
cmd: choose_ground_mode
|
||||||
|
args:
|
||||||
|
mode: GR
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
expect:
|
||||||
|
events: []
|
||||||
|
state: {}
|
||||||
|
rejects: []
|
||||||
|
state_hash: 73661a4ab99852cd098bed5fd34ad08b6999195a8b0fe0f8a0f695e5cac1c1b4
|
||||||
102
workplans/CB-WP-0045-the-table-names-what-it-shows.md
Normal file
102
workplans/CB-WP-0045-the-table-names-what-it-shows.md
Normal file
|
|
@ -0,0 +1,102 @@
|
||||||
|
---
|
||||||
|
id: CB-WP-0045
|
||||||
|
kind: product
|
||||||
|
title: "The table names what it shows"
|
||||||
|
status: done
|
||||||
|
---
|
||||||
|
|
||||||
|
# Purpose
|
||||||
|
|
||||||
|
```
|
||||||
|
structural tier S (rendering only -- no rule, no dependency, no budget,
|
||||||
|
no artifact contract moved)
|
||||||
|
declared tier S
|
||||||
|
```
|
||||||
|
|
||||||
|
First declaration after [ADR-0021](../decisions/ADR-0021-the-chaos-roll-is-retired.md)
|
||||||
|
retired the chaos roll.
|
||||||
|
|
||||||
|
## The reports
|
||||||
|
|
||||||
|
Three sessions, `make trials` (notes now bind per game — ADR-0019 holds:
|
||||||
|
`g1+0`, `g2+35`, `g3+44`):
|
||||||
|
|
||||||
|
> *"Ok, that seemed more interesting and we lost."* / *"We did it this
|
||||||
|
> time."* — 2026-08-08 1818
|
||||||
|
|
||||||
|
The H2 dynamics land. Two things do not:
|
||||||
|
|
||||||
|
> *"The GROUND and DARVO logic is far from self explanatory. That needs to
|
||||||
|
> be improved."* — 2026-08-08 1818
|
||||||
|
|
||||||
|
> *"As the cards are now located differently on the table i cant tell which
|
||||||
|
> is problem 1, which 2 and so on."*
|
||||||
|
|
||||||
|
## The numbering defect [CB-WP-0043] caused
|
||||||
|
|
||||||
|
Every move label says **"Problem 7"**. The number was rendered on the card
|
||||||
|
only as a **fallback for a missing title** — so it appeared exactly when
|
||||||
|
it carried least information, and was absent whenever the card was
|
||||||
|
identifiable enough to be worth pointing at.
|
||||||
|
|
||||||
|
That was survivable while Problems sat in one ordered row: **position was
|
||||||
|
the number**. [CB-WP-0043](CB-WP-0043-a-problem-sits-where-its-stress-lands.md)
|
||||||
|
scattered them by scope, deleted the row, and took the implicit index with
|
||||||
|
it — without anything going red, because no test named the number.
|
||||||
|
|
||||||
|
**A rendering change removed a fact the page had been carrying
|
||||||
|
positionally.** Not the ADR-0018 family (nothing computes the wrong
|
||||||
|
subject); the nearer relative is CB-WP-0024 — a fact held by presentation
|
||||||
|
alone does not survive the presentation changing.
|
||||||
|
|
||||||
|
## The legibility defect: vendored and never shown
|
||||||
|
|
||||||
|
`DARVO.csv` carries `mandatory_effect` per stage. `Actions.csv` carries
|
||||||
|
`rules_text` for the three GROUND modes. **Both were vendored, both were
|
||||||
|
used only as tripwires, and neither ever reached the player.** The seat
|
||||||
|
panel said `DARVO Reverse`; the move buttons offered `GR` / `OU` / `ND`.
|
||||||
|
|
||||||
|
**F18's shape once more**: the edition's own words were present in the
|
||||||
|
repo and could not fire. The player was asked to choose between three
|
||||||
|
modes at the point where the action card has already left the screen.
|
||||||
|
|
||||||
|
## Task: put the number and the words on the table
|
||||||
|
|
||||||
|
```task
|
||||||
|
id: CB-WP-0045-T01
|
||||||
|
status: done
|
||||||
|
priority: high
|
||||||
|
```
|
||||||
|
|
||||||
|
**Controls:**
|
||||||
|
|
||||||
|
- **every Problem on the table shows its number** — asserted over
|
||||||
|
`view.problems.keys()`, so a card that renders without one goes red
|
||||||
|
whatever the fixture holds;
|
||||||
|
- **the explanation is the edition's sentence, not our paraphrase** —
|
||||||
|
the DARVO test re-reads `DARVO.csv` and asserts a prefix of
|
||||||
|
`mandatory_effect` appears verbatim (ADR-0015);
|
||||||
|
- **the GROUND modes explain themselves where they are chosen** — present
|
||||||
|
when `ChooseGroundMode` is legal, and **absent when it is not**. An
|
||||||
|
always-on wall of rules is how a player stops reading them, so the
|
||||||
|
negative half is asserted too;
|
||||||
|
- both explanations are `<details>`, so the account can be closed.
|
||||||
|
|
||||||
|
**Done 2026-08-08.** 78 tests pass; `make all` green; verified against a
|
||||||
|
live `make ground VARIANT=h2` page — badges `1 2 3 4 …` and the header
|
||||||
|
reading `rules h2-scoped-problem-stress`.
|
||||||
|
|
||||||
|
## Not done here
|
||||||
|
|
||||||
|
- **Nothing explains what a *scope does*.** H2 is the variation under
|
||||||
|
study, the marker now says *whose* Problem it is and where it sits — and
|
||||||
|
no text on the page says that a scoped Problem presses only the owner's
|
||||||
|
bond network. The player can see the placement and still not know the
|
||||||
|
rule it encodes. This is the largest remaining gap and it is a
|
||||||
|
`ground-game` question first: the scope rule is ours (Variant), not the
|
||||||
|
edition's, so there is no vendored sentence to render.
|
||||||
|
- **The trial log header does not record the variant.** A note from an H2
|
||||||
|
session and a note from a baseline session are indistinguishable in the
|
||||||
|
log, which is a real problem now that both are being played.
|
||||||
|
- **The `<details>` are closed-by-default for DARVO, open for GROUND.**
|
||||||
|
Chosen, not measured; whether a player opens the closed one is untested.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue