From ff03e81591fc28efa16cf5f7bb00a4d0f5d47590 Mon Sep 17 00:00:00 2001 From: Davide Cappellini Date: Sat, 26 Sep 2026 02:21:09 +0200 Subject: [PATCH] movement final: pre-register the ship criterion before the confirmation battles --- docs/movement_campaign.md | 32 ++++++++++++++++++++++++++ tools/ab/arms_movement_final.txt | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 tools/ab/arms_movement_final.txt diff --git a/docs/movement_campaign.md b/docs/movement_campaign.md index db423b1..fdf2042 100644 --- a/docs/movement_campaign.md +++ b/docs/movement_campaign.md @@ -1164,3 +1164,35 @@ the default flip is a separate, explicit decision and was NOT made here. |---|---|---:|---|---| | `/tmp/ab/j119_b3` | `1256357` | 270 (0 failed; 1 excluded: Ascendant/strafe r1) | strafe, tfil, fast_flip, slow_flip, wide_spread, narrow | nothing beats strafe; wide_spread +0.11 NS (p=0.55) | | `/tmp/ab/j119_b4` | `1256357` | 270 (0 failed, 0 excluded) | strafe, tfil, bullet_strong, field_strong, field_off, wall_tight | nothing beats strafe; field_strong and field_off detectably WORSE | + +--- + +## Final confirmation + SHIP — PRE-REGISTRATION + +> **PRE-REGISTERED BEFORE THE BATTLES (this section is committed, and its commit +> is the frozen binary's source, before the first battle is launched).** Session +> `/tmp/ab/j120_final`. Arms file `tools/ab/arms_movement_final.txt`, panel +> `tools/ab/panel_movement.txt` (frozen), **3 arms × 15 opponents × 5 runs × 3 +> rounds = 225 battles**, conc 6, `--reference tfil`. + +**THE PRE-REGISTERED SHIP CRITERION (fixed before fighting).** Ship the flip of +`TR_MOVEMENT`'s default from `tfil` to `strafe` **only if**, on this frozen +panel and this one frozen binary, `strafe` beats `tfil` head-to-head on the +PRIMARY metric *round wins/run* with **both**: + +1. the **95% CI on Δwins/run excluding 0**; **and** +2. the **cross-opponent sign test favouring `strafe`** (p < 0.05). + +This is stricter than the campaign's §1 rule 2 (which would let a survival win +carry a damage-neutral arm): the ship decision requires the *win* metric itself +to clear both bars. If it does not pass, **do not ship** — say so and stop; that +is a fully successful outcome. This batch uses **5 runs/arm (vs 3 in every +previous batch)** for higher power; `wide_spread` (the only positive point +estimate from Batches 3–4, +0.11/run, NS) rides along as the single challenger. + +**Pre-registered prediction (before the battles):** `strafe` passes both bars +and ships; `wide_spread` ties `strafe` (no separable win); `tfil` is not +preferred by any primary metric. A wrong prediction is recorded as wrong. + +**Outcome:** pending — filled in below after the session. + diff --git a/tools/ab/arms_movement_final.txt b/tools/ab/arms_movement_final.txt new file mode 100644 index 0000000..77b449f --- /dev/null +++ b/tools/ab/arms_movement_final.txt @@ -0,0 +1,39 @@ +# ───────────────────────────────────────────────────────────────────────────── +# arms_movement_final.txt — FINAL CONFIRMATION of the movement champion, run at +# HIGHER POWER than any previous batch (5 runs/arm vs 3), on the FROZEN panel +# tools/ab/panel_movement.txt. +# +# Prior data this batch is built on (docs/movement_campaign.md §3–§5, Batches +# 3+4 consolidated, MEASURED on the frozen panel across four independent +# sessions, ~900 battles): +# * `TR_MOVEMENT=strafe` (current defaults) BEATS the shipped `tfil` on round +# wins in EVERY session: +0.38/+0.33 (B1), +0.58/+0.47 (B2), and 53.0% vs +# 42.2% (B3), 52.6% vs 38.5% (B4) — all 95% CIs excluding 0, sign test +# favouring strafe. +# * It wins by SURVIVAL: incoming hit rate ~12% vs tfil's ~18%, ~50 less +# damage taken/run, NO detectable damage cost. +# * 8 further arms (reversal timing, spread/reach, heat-field strength, wall +# margin/curvature) were swept in Batches 3–4: NOTHING beats `strafe`. +# `wide_spread` is the only positive point estimate (+0.11 wins/run, NS, +# p=0.55, MDE 0.56) — a TIE, carried here as the single challenger. +# +# SHIP CRITERION (pre-registered in docs/movement_campaign.md before the +# battles): ship only if `strafe` beats `tfil` head-to-head with the 95% CI on +# wins/run EXCLUDING 0 AND the cross-opponent sign test FAVOURING `strafe`. +# +# REFERENCE is `tfil` — every delta below is (arm − tfil), opponent by opponent. +# +# Format: name | ENV=value ENV=value | label +# ───────────────────────────────────────────────────────────────────────────── + +# 1. THE CHAMPION under confirmation — current strafe defaults. +strafe | TR_MOVEMENT=strafe | champion — current strafe defaults (candidate to ship) + +# 2. THE ARM TO BEAT — the currently shipped default, explicitly selected. +# (The explicit `TR_MOVEMENT=tfil` matters: it also proves the override path +# stays reachable after any default flip.) +tfil | TR_MOVEMENT=tfil | shipped baseline — explicit tfil override + +# 3. THE ONLY CHALLENGER with a positive wins point estimate from Batches 3–4 +# (+0.11/run, damage-neutral, not distinguishable — expected to tie). +wide_spread | TR_MOVEMENT=strafe TR_STRAFE_SPREAD=2 TR_STRAFE_REACH=216 | Batches 3–4 positive-point challenger (±2 tiles, 216px)