H2's ATTACK dynamics, and a construction hazard found while measuring them
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:
tegwick 2026-08-08 16:56:27 +02:00
parent d3c2dc1375
commit 47e7941057
7 changed files with 409 additions and 4 deletions

View file

@ -96,7 +96,57 @@ the best evidence in this file: **the scoping is what saves it**, not any
other difference between the packages. Their optional A/B was worth
running.
## 5. What this does not say
## 5. ATTACK — affordable under H2, still not profitable
Added after the first report, because the H2 panel measured wins, variance
and DARVO and **not ATTACK selection**, which is F17's actual question.
`attack-value`'s rank-75 policy — *attack when convenient* — SHARED
GROUND, wins with attacks and DARVO arms in brackets:
| seats | baseline | H1 | H2 |
|---|---|---|---|
| 2p | 132 (604 atk, 81 arms) | 66 (180, 59) | **65 (248, 102)** |
| 3p | 165 (592, 125) | **0** (0, 0) | **112 (250, 52)** |
| 4p | 190 (923, 218) | **0** (0, 0) | **173 (626, 165)** |
| 6p | 200 (389, 31) | **0** (0, 0) | **199 (299, 45)** |
**The shape is the finding.** Under H1 a seat that sometimes attacks loses
everything at 3p and above. Under H2 it wins **112 / 173 / 199** — against
greedy's 120 / 175 / 199 — *while* attacking and arming DARVO.
> **H2 makes occasional ATTACK affordable. It does not make it pay.**
rank-75 never beats greedy in any cell; at best it draws level (199 vs 199
at 6p). And **rank-95 — always attack — still wins 0 everywhere**, in all
three variants, so the *"not always-attack-optimal"* property 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, or whether ATTACK should actually reward, is
ground-game's judgement.
## 6. A construction hazard, found while measuring this
`GroundState::with_variant()` exists because H2 assigns Problem owners at
setup and `state.variant = v` leaves them unassigned — **scoped pressure
then 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.rs` 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 are 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. That is worth knowing before the next variant.
## 7. What this does not say
- **No felt-play.** H2's central claim is about *motivation* — a bonded
pair caring about each other's card — and §3 says as much. 200-game