diff --git a/docs/movement_campaign.md b/docs/movement_campaign.md index 48f7bf4..db423b1 100644 --- a/docs/movement_campaign.md +++ b/docs/movement_campaign.md @@ -845,7 +845,109 @@ the MDE). If an arm DOES beat `strafe`, the most likely is `fast_flip`, via survival. I record this as a falsifiable claim; a wrong prediction is recorded as wrong. -*Results appended below after the session.* +### Outcome — Batch 3 + +**Direct answer: NOTHING beats the current `strafe` on round wins.** The session +ran 270 battles (**0 failed, 0 never started**) and excluded **1 run** on +liveness grounds (`Ascendant/strafe` run1: owner attribution ambiguous), so +`strafe` has 44 valid runs and every other arm 45. The strafe-over-`tfil` effect +replicates a THIRD time: in this session `tfil` wins **42.2%** of its rounds vs +`strafe`'s **53.0%**. + +#### Pooled dashboard (valid runs, explanation only — NOT the verdict) + +| arm | runs | dmg/run | dmg taken/run | wins/run | round wins | win rate | incoming hit rate | mean distance | +|---|---:|---:|---:|---:|---:|---:|---:|---:| +| `strafe` (REF) | 44 | 112.3 | 154.7 | 1.59 | 70/132 | 53.0% | 13.14% | 434 | +| `tfil` | 45 | 113.9 | 197.9 | 1.27 | 57/135 | 42.2% | 18.10% | 383 | +| `fast_flip` | 45 | 105.6 | 176.6 | 1.44 | 65/135 | 48.1% | 15.19% | 421 | +| `slow_flip` | 45 | 101.8 | 147.0 | 1.38 | 62/135 | 45.9% | 12.80% | 428 | +| `wide_spread` | 45 | 111.4 | 160.0 | 1.67 | 75/135 | 55.6% | 13.11% | 425 | +| `narrow` | 45 | 104.6 | 175.1 | 1.40 | 63/135 | 46.7% | 14.57% | 429 | + +#### Per-opponent Δwins/run (arm − `strafe`) + +| opponent | style | `tfil` | `fast_flip` | `slow_flip` | `wide_spread` | `narrow` | +|---|---|---:|---:|---:|---:|---:| +| DrussGT | dodger | +1.33 | +1.00 | +0.00 | +1.00 | +0.67 | +| Diamond | dodger | +0.33 | +0.33 | +0.00 | +0.00 | +0.00 | +| Dookious | dodger | -1.00 | +0.33 | +0.00 | +1.33 | +0.33 | +| GresSuffurd | dodger | -1.33 | -0.67 | -0.67 | -0.33 | -1.33 | +| CassiusClay | dodger | -0.33 | -0.67 | +0.67 | -0.33 | -0.33 | +| RetroGirl | pattern | -1.33 | -1.00 | -0.67 | +0.00 | -0.67 | +| TripHammer | pattern | -1.00 | -1.00 | -1.00 | -0.33 | -1.00 | +| Coriantumr | pattern | -1.00 | -1.33 | -1.33 | -2.00 | -1.67 | +| WallAvoider | wallfollower | +0.67 | +0.00 | +0.33 | +0.33 | +0.00 | +| HawkOnFire | cornercamper | -0.67 | +0.00 | +0.00 | +0.33 | +0.00 | +| SpinBot | spinner | +0.00 | +0.00 | +0.00 | +0.00 | +0.00 | +| DiamondStealer | rammer | +0.33 | +0.67 | -1.00 | +1.00 | +1.00 | +| BlitzBat | brawler | -0.33 | +0.33 | +0.33 | +0.00 | +0.00 | +| YersiniaPestis | aggressive | +0.00 | +0.33 | +0.00 | +0.33 | +0.67 | +| Ascendant | aggressive | +0.00 | +0.00 | +0.67 | +0.33 | +0.00 | + +#### Cross-opponent aggregation (the verdict layer, verbatim) + +| arm | metric | mean Δ | spread (SD) | SE | 95% CI | sign test (wins/n) | p(sign) | p(sign-flip) | Wilcoxon p | MDE | +|---|---|---:|---:|---:|---|---:|---:|---:|---:|---:| +| `tfil` | damage | +2.66 | 28.32 | 7.31 | [-13.02, +18.35] | 6/15 | 0.6072 | 0.7092 | 0.8871 | 20.49 | +| `tfil` | wins | -0.29 | 0.78 | 0.20 | [-0.72, +0.14] | 4/12 | 0.3877 | 0.2056 | 0.1952 | 0.56 | +| `tfil` | damage_taken | +41.18 | 36.79 | 9.50 | [+20.81, +61.56] | 14/15 | 0.0009766 | 0.001221 | 0.003445 | 26.61 | +| `tfil` | hit_rate | +6.00 | 4.74 | 1.22 | [+3.37, +8.62] | 14/15 | 0.0009766 | 0.0004883 | 0.001966 | 3.43 | +| `tfil` | dist | -49.26 | 47.09 | 12.16 | [-75.33, -23.18] | 1/15 | 0.0009766 | 0.00116 | 0.003445 | 34.06 | +| `fast_flip` | damage | -5.61 | 25.59 | 6.61 | [-19.79, +8.56] | 5/15 | 0.3018 | 0.4282 | 0.5137 | 18.51 | +| `fast_flip` | wins | -0.11 | 0.67 | 0.17 | [-0.48, +0.26] | 6/11 | 1 | 0.6152 | 0.5627 | 0.49 | +| `fast_flip` | damage_taken | +19.90 | 26.12 | 6.74 | [+5.43, +34.36] | 11/15 | 0.1185 | 0.01245 | 0.02143 | 18.89 | +| `fast_flip` | hit_rate | +2.12 | 2.18 | 0.56 | [+0.91, +3.33] | 12/15 | 0.03516 | 0.002563 | 0.004932 | 1.57 | +| `fast_flip` | dist | -11.02 | 32.34 | 8.35 | [-28.93, +6.89] | 5/15 | 0.3018 | 0.2111 | 0.222 | 23.40 | +| `slow_flip` | damage | -9.41 | 20.87 | 5.39 | [-20.97, +2.15] | 5/15 | 0.3018 | 0.09509 | 0.09384 | 15.10 | +| `slow_flip` | wins | -0.18 | 0.62 | 0.16 | [-0.52, +0.16] | 4/9 | 1 | 0.3477 | 0.342 | 0.45 | +| `slow_flip` | damage_taken | -9.69 | 37.56 | 9.70 | [-30.49, +11.11] | 6/15 | 0.6072 | 0.3287 | 0.3203 | 27.17 | +| `slow_flip` | hit_rate | -1.64 | 3.61 | 0.93 | [-3.64, +0.36] | 6/15 | 0.6072 | 0.1024 | 0.1055 | 2.61 | +| `slow_flip` | dist | -4.73 | 20.40 | 5.27 | [-16.03, +6.57] | 6/15 | 0.6072 | 0.384 | 0.4432 | 14.76 | +| `wide_spread` | damage | +0.19 | 19.58 | 5.06 | [-10.66, +11.03] | 8/15 | 1 | 0.9717 | 0.7548 | 14.17 | +| `wide_spread` | wins | +0.11 | 0.77 | 0.20 | [-0.32, +0.54] | 7/11 | 0.5488 | 0.6738 | 0.3273 | 0.56 | +| `wide_spread` | damage_taken | +3.30 | 28.79 | 7.43 | [-12.65, +19.24] | 10/15 | 0.3018 | 0.6722 | 0.5895 | 20.82 | +| `wide_spread` | hit_rate | -0.02 | 2.52 | 0.65 | [-1.42, +1.38] | 6/15 | 0.6072 | 0.9786 | 0.6701 | 1.82 | +| `wide_spread` | dist | -7.33 | 22.89 | 5.91 | [-20.01, +5.35] | 5/15 | 0.3018 | 0.2528 | 0.1055 | 16.56 | +| `narrow` | damage | -6.59 | 22.84 | 5.90 | [-19.24, +6.06] | 5/15 | 0.3018 | 0.2835 | 0.3203 | 16.52 | +| `narrow` | wins | -0.16 | 0.74 | 0.19 | [-0.57, +0.26] | 4/9 | 1 | 0.5039 | 0.5139 | 0.54 | +| `narrow` | damage_taken | +18.44 | 30.99 | 8.00 | [+1.28, +35.60] | 9/15 | 0.6072 | 0.03699 | 0.05708 | 22.41 | +| `narrow` | hit_rate | +1.09 | 2.19 | 0.56 | [-0.12, +2.30] | 10/15 | 0.3018 | 0.07574 | 0.1055 | 1.58 | +| `narrow` | dist | -3.54 | 20.03 | 5.17 | [-14.64, +7.55] | 6/15 | 0.6072 | 0.4975 | 0.4777 | 14.49 | + +#### The pre-registered verdict (verbatim) + +| rank | arm | Δwins/run | Δdmg/run | sign test wins | sign test dmg | verdict (strict) | verdict (substantive) | +|---:|---|---:|---:|---|---|---|---| +| 1 | `wide_spread` | +0.11 | +0.2 | 7/11 p=0.5488 | 8/15 p=1 | **not distinguishable** | **not distinguishable** | +| 2 | `fast_flip` | -0.11 | -5.6 | 6/11 p=1 | 5/15 p=0.3018 | **not distinguishable** | **not distinguishable** | +| 3 | `narrow` | -0.16 | -6.6 | 4/9 p=1 | 5/15 p=0.3018 | **not distinguishable** | **not distinguishable** | +| 4 | `slow_flip` | -0.18 | -9.4 | 4/9 p=1 | 5/15 p=0.3018 | **not distinguishable** | **not distinguishable** | +| 5 | `tfil` | -0.29 | +2.7 | 4/12 p=0.3877 | 6/15 p=0.6072 | **not distinguishable** | **not distinguishable** | + +Reference `strafe`: 112.3 dmg/run, 1.59 wins/run, 13.14% incoming, 434 px. +Highest wins delta: `wide_spread` (+0.11 wins/run, +0.2 dmg/run) — strict: **not distinguishable**, substantive: **not distinguishable**. + +#### Reading + +* `wide_spread` (SPREAD=2, REACH=216) is the ONLY arm with a **positive** point + estimate on wins (+0.11/run) and it is damage-neutral (+0.2). It is **not + distinguishable**: positive on 7 of 11 decisive opponents, p = 0.55, MDE 0.56 + — the observed effect is ~5× smaller than the design's detection threshold. +* `fast_flip` is the one arm with a **detectable survival cost**: incoming hit + rate +2.12 pp (12/15, p = 0.035), +19.9 damage taken/run (sign-flip + p = 0.012), and it wins −0.11/run. Faster reversals do NOT dodge better here. +* `slow_flip` dodges marginally better (−1.64 pp, NS) and wins −0.18/run; the + two dwell extremes do not bracket a win at all. +* **The pre-registered prediction was partly WRONG and is recorded as wrong:** + (a) `fast_flip` was predicted to LOWER the hit rate — it RAISED it + (+2.12 pp); (b) `slow_flip` was predicted to RAISE it — it lowered it + (−1.64 pp, NS). Predictions (c) "neither extreme beats `strafe` on wins" and + (d) "spread/reach do not separate" were **correct**. +* Net: the reversal/dwell axis is a REAL mechanism knob — `fast_flip` + demonstrably hurts dodging (MDE 1.57 pp, observed 2.12 pp) — but it does not + convert into a round-win improvement over the current dwell, and the picker + hedge geometry does not separate. --- @@ -894,4 +996,171 @@ defaults 20/30/10) and the default path is proven byte-identical by `common_libs/tests/test_tfil_commit_env.nim` (30 checks). STRAFE's own heat knobs were already env-overridable, which is what this batch sweeps. -*Results appended below after the session.* +### Outcome — Batch 4 + +**Direct answer: NOTHING beats the current `strafe` on round wins — and the +batch says something stronger: two arms are DETECTABLY WORSE.** 270 battles +(**0 failed, 0 never started, 0 excluded**). The strafe-over-`tfil` effect +replicates a fourth time: `tfil` wins **38.5%** of its rounds vs `strafe`'s +**52.6%** (Δwins −0.42 [-0.66, −0.19], 1/11 decisive, p = 0.0117). + +#### Pooled dashboard (valid runs, explanation only — NOT the verdict) + +| arm | runs | dmg/run | dmg taken/run | wins/run | round wins | win rate | incoming hit rate | mean distance | +|---|---:|---:|---:|---:|---:|---:|---:|---:| +| `strafe` (REF) | 45 | 103.5 | 157.1 | 1.58 | 71/135 | 52.6% | 13.16% | 435 | +| `tfil` | 45 | 110.7 | 194.6 | 1.16 | 52/135 | 38.5% | 17.03% | 394 | +| `bullet_strong` | 45 | 107.3 | 160.9 | 1.42 | 64/135 | 47.4% | 12.63% | 430 | +| `field_strong` | 45 | 110.5 | 171.3 | 1.29 | 58/135 | 43.0% | 13.82% | 432 | +| `field_off` | 45 | 92.7 | 142.3 | 1.11 | 50/135 | 37.0% | 12.65% | 462 | +| `wall_tight` | 45 | 103.4 | 149.5 | 1.38 | 62/135 | 45.9% | 12.81% | 444 | + +#### Per-opponent Δwins/run (arm − `strafe`) + +| opponent | style | `tfil` | `bullet_strong` | `field_strong` | `field_off` | `wall_tight` | +|---|---|---:|---:|---:|---:|---:| +| DrussGT | dodger | +0.00 | -0.33 | -1.33 | -1.33 | -1.33 | +| Diamond | dodger | -0.67 | -0.33 | -0.67 | -0.33 | -0.33 | +| Dookious | dodger | +0.00 | +1.00 | -0.33 | +0.00 | -0.67 | +| GresSuffurd | dodger | +0.33 | -0.67 | -0.33 | -1.33 | -0.67 | +| CassiusClay | dodger | -1.00 | -0.33 | -0.67 | -0.33 | +0.00 | +| RetroGirl | pattern | -1.00 | -1.67 | -0.33 | -2.00 | +0.00 | +| TripHammer | pattern | -0.67 | +0.67 | +0.67 | -0.67 | +0.67 | +| Coriantumr | pattern | -0.33 | -0.33 | +0.33 | -0.33 | +1.33 | +| WallAvoider | wallfollower | +0.00 | -0.33 | -0.33 | +0.00 | -0.33 | +| HawkOnFire | cornercamper | -0.67 | +0.67 | -0.67 | -0.33 | -0.67 | +| SpinBot | spinner | +0.00 | +0.00 | +0.00 | +0.00 | +0.00 | +| DiamondStealer | rammer | -0.33 | -0.67 | -0.33 | -0.33 | -1.00 | +| BlitzBat | brawler | -1.00 | +0.00 | +0.00 | -0.33 | +0.33 | +| YersiniaPestis | aggressive | -0.33 | +0.67 | +0.00 | +1.00 | +0.33 | +| Ascendant | aggressive | -0.67 | -0.67 | -0.33 | -0.67 | -0.67 | + +#### Cross-opponent aggregation (the verdict layer, verbatim) + +| arm | metric | mean Δ | spread (SD) | SE | 95% CI | sign test (wins/n) | p(sign) | p(sign-flip) | Wilcoxon p | MDE | +|---|---|---:|---:|---:|---|---:|---:|---:|---:|---:| +| `tfil` | damage | +7.28 | 13.50 | 3.49 | [-0.19, +14.76] | 10/15 | 0.3018 | 0.05011 | 0.03817 | 9.77 | +| `tfil` | wins | -0.42 | 0.43 | 0.11 | [-0.66, -0.19] | 1/11 | 0.01172 | 0.004883 | 0.01108 | 0.31 | +| `tfil` | damage_taken | +37.57 | 26.58 | 6.86 | [+22.84, +52.29] | 14/15 | 0.0009766 | 0.0001221 | 0.0008919 | 19.23 | +| `tfil` | hit_rate | +5.82 | 5.18 | 1.34 | [+2.96, +8.69] | 15/15 | 6.104e-05 | 6.104e-05 | 0.0007265 | 3.74 | +| `tfil` | dist | -41.25 | 33.73 | 8.71 | [-59.93, -22.57] | 2/15 | 0.007385 | 0.0004272 | 0.001966 | 24.40 | +| `bullet_strong` | damage | +3.85 | 11.82 | 3.05 | [-2.69, +10.40] | 11/15 | 0.1185 | 0.2264 | 0.222 | 8.55 | +| `bullet_strong` | wins | -0.16 | 0.69 | 0.18 | [-0.54, +0.23] | 4/13 | 0.2668 | 0.4736 | 0.5518 | 0.50 | +| `bullet_strong` | damage_taken | +3.84 | 37.00 | 9.55 | [-16.66, +24.33] | 7/15 | 1 | 0.6882 | 0.7548 | 26.76 | +| `bullet_strong` | hit_rate | -0.02 | 2.67 | 0.69 | [-1.50, +1.46] | 7/15 | 1 | 0.9787 | 0.8871 | 1.93 | +| `bullet_strong` | dist | -4.84 | 23.47 | 6.06 | [-17.84, +8.16] | 7/15 | 1 | 0.4423 | 0.6293 | 16.98 | +| `field_strong` | damage | +7.09 | 17.16 | 4.43 | [-2.41, +16.59] | 10/15 | 0.3018 | 0.1321 | 0.1475 | 12.41 | +| `field_strong` | wins | -0.29 | 0.47 | 0.12 | [-0.55, -0.03] | 2/12 | 0.03857 | 0.04688 | 0.0403 | 0.34 | +| `field_strong` | damage_taken | +14.27 | 26.24 | 6.78 | [-0.27, +28.80] | 10/15 | 0.3018 | 0.05359 | 0.05708 | 18.98 | +| `field_strong` | hit_rate | +1.72 | 2.74 | 0.71 | [+0.20, +3.23] | 11/15 | 0.1185 | 0.02704 | 0.02487 | 1.98 | +| `field_strong` | dist | -3.02 | 21.65 | 5.59 | [-15.01, +8.97] | 8/15 | 1 | 0.5974 | 0.8871 | 15.66 | +| `field_off` | damage | -10.76 | 14.02 | 3.62 | [-18.52, -2.99] | 3/15 | 0.03516 | 0.006714 | 0.01149 | 10.14 | +| `field_off` | wins | -0.47 | 0.70 | 0.18 | [-0.85, -0.08] | 1/12 | 0.006348 | 0.02783 | 0.02037 | 0.51 | +| `field_off` | damage_taken | -14.73 | 34.01 | 8.78 | [-33.57, +4.11] | 5/15 | 0.3018 | 0.1121 | 0.1055 | 24.60 | +| `field_off` | hit_rate | -0.52 | 2.65 | 0.68 | [-1.99, +0.95] | 6/15 | 0.6072 | 0.4832 | 0.5509 | 1.92 | +| `field_off` | dist | +27.24 | 21.37 | 5.52 | [+15.40, +39.07] | 14/15 | 0.0009766 | 0.0001831 | 0.001092 | 15.46 | +| `wall_tight` | damage | -0.09 | 26.39 | 6.81 | [-14.71, +14.52] | 8/15 | 1 | 0.9894 | 0.9773 | 19.09 | +| `wall_tight` | wins | -0.20 | 0.69 | 0.18 | [-0.58, +0.18] | 4/12 | 0.3877 | 0.3345 | 0.208 | 0.50 | +| `wall_tight` | damage_taken | -7.56 | 31.64 | 8.17 | [-25.08, +9.96] | 8/15 | 1 | 0.3915 | 0.3787 | 22.89 | +| `wall_tight` | hit_rate | +0.25 | 3.07 | 0.79 | [-1.45, +1.94] | 6/15 | 0.6072 | 0.7711 | 0.9321 | 2.22 | +| `wall_tight` | dist | +8.70 | 23.18 | 5.98 | [-4.14, +21.53] | 10/15 | 0.3018 | 0.1666 | 0.182 | 16.76 | + +#### The pre-registered verdict (verbatim) + +| rank | arm | Δwins/run | Δdmg/run | sign test wins | sign test dmg | verdict (strict) | verdict (substantive) | +|---:|---|---:|---:|---|---|---|---| +| 1 | `bullet_strong` | -0.16 | +3.9 | 4/13 p=0.2668 | 11/15 p=0.1185 | **not distinguishable** | **not distinguishable** | +| 2 | `wall_tight` | -0.20 | -0.1 | 4/12 p=0.3877 | 8/15 p=1 | **not distinguishable** | **not distinguishable** | +| 3 | `field_strong` | -0.29 | +7.1 | 2/12 p=0.03857 | 10/15 p=0.3018 | **not distinguishable** | **WORSE** | +| 4 | `tfil` | -0.42 | +7.3 | 1/11 p=0.01172 | 10/15 p=0.3018 | **not distinguishable** | **WORSE** | +| 5 | `field_off` | -0.47 | -10.8 | 1/12 p=0.006348 | 3/15 p=0.03516 | **WORSE** | **not distinguishable** | + +Reference `strafe`: 103.5 dmg/run, 1.58 wins/run, 13.16% incoming, 435 px. +Highest wins delta: `bullet_strong` (−0.16 wins/run, +3.9 dmg/run) — strict: **not distinguishable**, substantive: **not distinguishable**. + +#### Reading + +* **The current strafe retune is load-bearing, in both directions.** Weakening + the corridor/wall treatment is not free and strengthening it back to the + shipped shape is not free either: + * `field_strong` (corridor 20, wall 30/10 = the SHIPPED saturated shape) is + **WORSE** on wins: Δ −0.29 [-0.55, −0.03], positive on only 2/12 decisive + opponents, p = 0.039; incoming hit rate +1.72 pp. + * `field_off` (no corridors, no wall heat) is **WORSE** on wins, Δ −0.47 + [-0.85, −0.08], p = 0.0063, **and** loses damage (Δ −10.8, p = 0.035): + killing the wall logic costs ~10 dmg/run for nothing. +* `bullet_strong` (core 30 > the 25 danger-replan threshold) and `wall_tight` + (tighter/faster wings) are indistinguishable from `strafe`, and both + nominally negative on wins. +* **The pre-registered prediction was largely CORRECT, one part wrong:** + (a) `field_strong` worse — correct (detectably, Δwins p = 0.039); + (b) `field_off` "wash or slightly worse" — correct in direction but WRONG in + size: it is detectably worse, not a wash; (c) `bullet_strong` wash-or-worse — + correct; (d) `wall_tight` no separation — correct. +* **Mechanism note (the campaign's standing lesson, again):** `field_off` has + the BEST incoming hit rate of the batch (12.65% vs `strafe`'s 13.16%) yet the + WORST round-win rate (37.0%). Dodging better is not winning more — without the + corridor/wall gradient the picker drifts to a mean 462 px and trades damage + (−10.8) for avoidance it does not cash in. + +--- + +## Batch 3+4 — consolidated direct answer and the ranked shortlist (appended AFTER the results) + +**MEASURED — direct answer: NOTHING beats the current `strafe` on round wins.** +Across the 12 arm-vs-`strafe` comparisons of Batches 3–4 (8 non-reference arms, +270+270 battles on the frozen panel), **zero** arms beat `strafe` beyond the +MDE. The only positive point estimate is `wide_spread` at **+0.11 wins/run** +(95% CI [−0.32, +0.54], 7/11 decisive, p = 0.55, MDE 0.56) — i.e. the observed +effect is ~5× smaller than the design can detect, so it is a TIE, not a win. +Two arms are **detectably worse** (`field_strong` Δwins −0.29, p = 0.039; +`field_off` Δwins −0.47, p = 0.0063 and Δdmg −10.8, p = 0.035). Meanwhile the +strafe-over-`tfil` effect replicated in BOTH sessions a 3rd and 4th time +(53.0% vs 42.2% and 52.6% vs 38.5% round-win rate), so the reference is stable. + +**MEASURED — the shape of the result.** The response surface is FLAT around the +current defaults on every tested axis: reversal dwell (2–8 / 12–40 / 6–20), +picker hedge (spread/reach), bullet core/aura strength, corridor/wall strength, +and wall-wing geometry. The one mechanism signal is that a SHORT dwell +(`fast_flip`) **hurts** dodging (incoming +2.12 pp, sign test 12/15 p = 0.035) — +the opposite of the naive "more reversals = harder to hit" story — and a +LONG/short hedge both win nominally fewer rounds. Removing the wall/corridor +gradient dodges slightly better but wins far less (`field_off`: best hit rate +12.65%, worst win rate 37.0%). This is a clean negative for "find a better arm +by turning the existing knobs", and a positive for "the current retune is a +local optimum of this design space". + +**Ranked shortlist for the final confirmation test (MEASURED/INFERRED):** + +1. **`strafe` — current defaults** (`TR_MOVEMENT=strafe`). The measured champion. + Confirm it head-to-head against `tfil` in one more independent session for the + eventual ship decision. (MEASURED: it beats `tfil` by +0.42 wins/run, 95% CI + [−0.66, −0.19] from `tfil`'s perspective, 1/11 decisive, in Batch 4.) +2. **`wide_spread`** (`TR_STRAFE_SPREAD=2 TR_STRAFE_REACH=216`). The ONLY arm of + the 8 with a positive wins point estimate (+0.11, damage-neutral). It is + currently a TIE, and resolving +0.11 would need far more than one batch + (MDE 0.56 at n=15); include it as the single challenger in the confirmation + session and expect a tie. (INFERRED: worth one look because it is the only + arm on the correct side of zero.) +3. **`strafe_notilt`** (`TR_STRAFE_RANGE_TOL=999999`, from Batches 1–2). Ties + `strafe` on wins and removes the range-tuning surface; the recommended SHIP + candidate if the default is ever flipped (per §5 item 4). Not re-tested here. + +**Drop (do not carry into the confirmation test):** `fast_flip` (detectably +worse dodging), `slow_flip`, `narrow` (negative, NS), `bullet_strong`, +`wall_tight` (negative, NS), `field_strong`, `field_off` (detectably worse), and +the Batch-2 range arms `tilt_600` / `tilt_250` (no separation). + +**Recommendation (INFERRED):** by the §6 stop rule — a batch's best arm cannot +beat `strafe` beyond the MDE — the movement hunt is **closed**: `TR_MOVEMENT=strafe` +at its current defaults is the measured optimum of this design space, and the +next stage is the **gun** (the owner's mandate). If a shipping decision is taken, +the candidate is `strafe` (optionally `strafe_notilt` to drop the range knob); +the default flip is a separate, explicit decision and was NOT made here. + +### Session log addition + +| session | commit | battles | arms | verdict | +|---|---|---:|---|---| +| `/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 |