H2's ATTACK dynamics, and a construction hazard found while measuring them
Some checks failed
ci / check (push) Failing after 3s
Some checks failed
ci / check (push) Failing after 3s
The H2 panel measured wins, variance and DARVO but not ATTACK selection — which is F17's actual question. attack-value now runs H2 too. The shape is the finding. Under H1 a seat that sometimes attacks loses everything at 3p and above. Under H2 rank-75 wins 112/173/199 against greedy's 120/175/199, while attacking and arming DARVO. So H2 makes occasional ATTACK affordable — it does not make it pay. rank-75 never beats greedy in any cell, and rank-95 (always attack) still wins 0 everywhere in all three variants, so "not always-attack-optimal" holds. F17 therefore stands: ATTACK earns its place in no mode. What changed is that choosing it is no longer catastrophic. Whether affordable is what the design wants is ground-game's judgement. And a hazard: with_variant() exists because H2 assigns Problem owners at setup and `state.variant = v` leaves them unassigned, so scoped pressure ticks nobody and H2 measures as INERT. Three call sites had the bare write, including cb-play's driver. No published figure is affected, and that was checked rather than assumed: h2-panel used the builder, and the two harnesses with the bare write had only ever run baseline and H1, neither of which has a setup step; the driver has never played H2. All three fixed, and a_bare_variant_write_leaves_h2_inert now states the difference so a regression is caught by a named test rather than by a reader wondering why H2 did nothing. The builder was not enough — the field is public, so the old form still compiles. Worth knowing before the next variant. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
d3c2dc1375
commit
47e7941057
7 changed files with 409 additions and 4 deletions
|
|
@ -120,7 +120,8 @@ fn sweep(
|
|||
st.mode = mode;
|
||||
// CB-WP-0038 T03: the SAME instrument measures both rule sets in
|
||||
// the same run. Two harnesses would compare harnesses.
|
||||
st.variant = variant;
|
||||
// `with_variant`, never a field write (see regulation.rs).
|
||||
let st = st.with_variant(variant);
|
||||
let mut ps = mk(players);
|
||||
// CB-WP-0038 T03: a game the engine REFUSES is not a game the
|
||||
// table lost, and `else { continue }` made the two identical.
|
||||
|
|
@ -211,6 +212,10 @@ fn main() {
|
|||
"H1 h1-problem-stress",
|
||||
games_ground::Variant::H1ProblemStress,
|
||||
),
|
||||
(
|
||||
"H2 h2-scoped-problem-stress",
|
||||
games_ground::Variant::H2ScopedProblemStress,
|
||||
),
|
||||
] {
|
||||
println!("================ {vlabel} ================\n");
|
||||
for (label, mode) in [
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue