Discharge ground-game's engine ask 2 at every seat band
Some checks failed
ci / check (push) Failing after 4s

RULED GROUND-WP-0004 (2026-08-03) asked for gr-e01 to be reinstated as an
import check: sum(point_value dealt) >= threshold FOR EVERY SEAT BAND.
Only the 2p half was done — gr-e01-threshold-reachable-2p covers the
tightest band, and a check at one band tests one value of the variable
that moves, which is the shape GameDesign §1.4 refuses.

every_seat_band_can_reach_its_threshold covers 2/3/4/5/6 and reports a
row-level table with Surface separated from each hidden priority, which
is engine ask 3 and §1.2's ruled shape — "12 in the file" is the wrong
premise that clause was written for.

Result matches ground-game's authoritative table: 6/9/12 available
against thresholds 5/7/9.

Mutation-proven, and the mutation is the original defect: count Surface as
one of the hidden slots and it fails with "2p: available 4 < threshold 5"
— the withdrawn 4/6/9 undercount, reproduced.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-07 23:50:58 +02:00
parent 54e2886bb9
commit d98580fb4c

View file

@ -586,6 +586,75 @@ mod card_text_tests {
println!("{report}");
}
/// **The import check ground-game's final ruling asked for**, at
/// every seat band (`RULED GROUND-WP-0004`, 2026-08-03, engine ask 2):
///
/// > rewrite `gr-e01-threshold-unreachable-2p` / invert `gd0001` as
/// > an **import check**: sum(point_value dealt) >= threshold for
/// > every seat band.
///
/// **Only the 2p half was done.** `gr-e01-threshold-reachable-2p`
/// covers the tightest band, and the ruling said *every* band. The
/// bands are where the deal depth changes (`k` = 2 / 3 / 4), so a
/// check at one of them tests one value of the variable that moves —
/// which is the shape GameDesign §1.4 exists to refuse.
///
/// **Reported as a row-level table, never a sum** (§1.2, and
/// ground-game's engine ask 3): Surface separated from each hidden
/// priority, because *"12 in the file"* is the wrong premise this
/// clause was written for.
#[test]
fn every_seat_band_can_reach_its_threshold() {
// GR-E01 dataset 0.1, mirroring `GroundState::threshold`.
let threshold = |players: u8| -> u32 {
match players {
0..=2 => 5,
3..=4 => 7,
_ => 9,
}
};
let mut table = String::from("\nseats | k | Surface | hidden | available | threshold\n");
for players in [2u8, 3, 4, 5, 6] {
let k = hidden_depth(players).expect("seat band");
let dealt = deal("SCN_01", players).expect("deal");
let surface: u32 = dealt
.iter()
.filter(|p| p.surface)
.map(|p| u32::from(p.value))
.sum();
let hidden: Vec<String> = dealt
.iter()
.filter(|p| !p.surface)
.map(|p| format!("{}:{}", p.priority, p.value))
.collect();
let hidden_total: u32 = dealt
.iter()
.filter(|p| !p.surface)
.map(|p| u32::from(p.value))
.sum();
let available = surface + hidden_total;
table.push_str(&format!(
"{players:>5} | {k} | {surface:>7} | {} | {available:>9} | {}\n",
hidden.join(" "),
threshold(players),
));
assert!(
available >= threshold(players),
"{players}p: available {available} < threshold {}; \
GR-E01 is unreachable at this band{table}",
threshold(players),
);
// Surface is never one of the hidden slots — the exact
// undercount that produced the withdrawn 4/6/9.
assert_eq!(
hidden.len(),
usize::from(k),
"{players}p: expected {k} hidden Problems beside Surface{table}"
);
}
println!("{table}");
}
/// **F24** (CB-WP-0037 T01). The draw pile is a Rust literal.
///
/// `solution_deck()` builds 6 of each suit from an array and never