clay-borg/evidence/CB-EV-0032-h2-measured.md
tegwick 47e7941057
Some checks failed
ci / check (push) Failing after 3s
H2's ATTACK dynamics, and a construction hazard found while measuring them
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>
2026-08-08 16:56:27 +02:00

173 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CB-EV-0032 — H2 measured
CB-WP-0042 T05. Tier M. Closed 2026-08-08. **The first pass declared after
the chaos roll was retired** (ADR-0021), so there is no roll to record.
**Delivered:** H2 implemented from `rules_delta.yaml`, measured against
**ground-game's own §3 criteria** — read from their design note, not
reused from H1 — and a control that isolates the mechanism.
---
## 1. Their criteria, answered
| # | criterion | verdict |
|---|---|---|
| 1 | greedy SHARED 34p **well above H1's 0** | **met, strongly** |
| 2 | Stress variance above baseline *and* H1-greedy | **met at 2p/4p/6p, marginally missed at 3p** |
| 3 | DARVO non-zero for a policy that **still sometimes wins** | **met** — and this was H1's clearest failure |
| 4 | bond cards show elevated SOLVE rate vs personal | **not met, and this panel cannot test it** (§3) |
| 5 | control: force all scopes global → H1-like collapse | **met, decisively** |
## 2. The numbers
SHARED GROUND, 200 games per cell. `spread` is the mean maxmin final
Stress across seats — their criterion 2.
**greedy**
| seats | baseline won / spread | H1 won / spread | H2 won / spread |
|---|---|---|---|
| 2p | 132 / 0.05 | 68 / 0.34 | **87 / 0.47** |
| 3p | 165 / 1.57 | **0** / 0.00 | **120** / 1.50 |
| 4p | 190 / 1.83 | **0** / 0.00 | **175** / 2.40 |
| 6p | 200 / 1.55 | **0** / 0.00 | **199** / 2.02 |
**reactive** — DARVO arms in brackets
| seats | H1 won (arms) | H2 won (arms) |
|---|---|---|
| 2p | 66 (363) | 61 (346) |
| 3p | **0** (600) | **13** (499) |
| 4p | **0** (800) | **13** (470) |
| 6p | **0** (1200) | **57** (565) |
**Criterion 1 is met with room.** H2 restores 73% of baseline wins at 3p
and 92% at 4p, where H1 destroyed them entirely.
**Criterion 3 is the one that matters most.** Under H1 the unregulated
seat armed DARVO constantly and **never won**; under H2 it arms and wins
13/13/57. *"Non-zero for some policy that still sometimes wins"* is
exactly the shape H1 could not produce.
**Criterion 2, honestly.** H2's spread beats baseline at 2p, 4p and 6p and
**misses at 3p — 1.50 against 1.57**. It beats H1-greedy everywhere, and
**H1-greedy's spread is 0.00 at 3p+**: a flat tax on every seat creates no
variance at all, which is the clearest statement of why scoping was the
right correction.
## 3. Criterion 4 — the number is lower, and the number cannot mean what
the criterion asks
Claim rate by scope, H2, greedy:
| seats | global | personal | bond |
|---|---|---|---|
| 2p | 70.5% | 54.5% | — (no bond card, as designed) |
| 3p | 85.5% | 80.2% | **60.0%** |
| 4p | 99.0% | 98.5% | **87.5%** |
| 6p | 100% | 95.3% | 99.5% |
**Bond is lower than personal at 3p and 4p — the opposite direction.**
**And this panel cannot test the hypothesis.** The claim is that a shared
tick makes a Bond network *jointly motivated* to clear that card.
**No policy here models another seat, or knows what a scope is.** Greedy
picks SOLVE on suit availability. So the bond rate is driven by which
cards happen to be matchable, not by incentive — the mechanism the
criterion is about could not have shown up.
**This was stated in the workplan before the run**, not discovered in the
numbers. The honest report is: **criterion 4 is untested, and the
incidental figure points the wrong way.** A table can answer it; this
cannot.
## 4. Criterion 5 — the control isolates the mechanism
Force every scope to `global` and change nothing else:
| seats | H2 scoped | H2, all scopes global |
|---|---:|---:|
| 3p | **120** | **0** |
| 4p | **175** | **0** |
**H1's collapse returns exactly.** That is a strong causal statement and
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. 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
aggregates measure dynamics, not motivation
([`Taxonomy.md`](../specs/Taxonomy.md) §4).
- **The panel is still greedy-family**, as CB-EV-0031 said of itself.
Criterion 3 asks for "some policy that still sometimes wins" and we have
two, both derived from the same ranking.
- **These are single-sample figures.** CB-REV-0003 #10 found the 2p arm
counts varying 354366 across seed windows; nothing here has been
re-derived on a second sample, and the `won` columns should be read as
approximate.
- **No re-review.** CB-WP-0038's tier-L review found twelve fatal defects
across three rounds, all in the instrument. This pass reuses that
instrument.
## Open after this pass
- **Criterion 4 needs a policy that models other seats**, or a table.
- **A second seed window**, to separate the invariant figures from the
sample-specific ones as CB-EV-0031 §1 now does.
- **The 3p variance miss** (1.50 vs 1.57) is within what a second sample
might move; it is reported as a miss because that is what this sample
says.