From 99f9532f556f46d84fc236a4b4bf4b586d5b4e01 Mon Sep 17 00:00:00 2001 From: Davide Cappellini Date: Tue, 22 Sep 2026 08:08:43 +0200 Subject: [PATCH] Melee vs 1v1 racks: mechanism built, but NO gun-level payoff - do not split The user's plan was separate melee and 1v1 racks. The mechanism is built and committed (TR_RACK_=both|1v1|melee|off, mode from server truth). This job produced the missing evidence: each candidate gun forced ALONE in BOTH modes, one frozen binary, env-only arms, exact two-sided permutation tests. 1v1 vs the real DrussGT (6 arms x 5 runs x 7 rounds): Pattern 10.80% 292 dmg/run 11/35 round wins KNN 5.58% 128 1/35 Linear 2.99% 59 0/35 Circular 2.89% 60 0/35 WallBounce 2.72% 57 0/35 GuessFactor 2.14% 38 0/35 -> every arm differs from Pattern at p=0.0079 (the 5v5 floor). Per-gun damage span 7.7x. In 1v1 the gun matters ENORMOUSLY. Melee (+DrussGT, RandomMover, WaveSurfer, OscillatorBot; enemyCount 4): WallBounce 25.79% 643 dmg/run 7/25 Linear 24.88% 624 7/25 GuessFactor 24.48% 613 4/25 Pattern 24.39% 599 5/25 Circular 25.88% 596 5/25 KNN 23.87% 539 3/25 -> NO arm beats Pattern with significance (p=0.42-0.96, fully overlapping). WallBounce's nominal +7.3% is p=0.42. Per-gun damage span only 1.19x. THE FINDING: in 1v1 the gun matters enormously (7.7x spread); in melee it barely matters (1.19x). Melee is won by movement, survival and placement, not by which gun you carry - every candidate lands in the same ~24-26% band. So a separate melee rack has NO gun-level payoff and DefaultRackMembership stays Pattern-only. The mechanism remains available if it is ever wanted. Honest caveats: the melee comparison is UNDER-POWERED at 5 runs (detecting the ~44-damage WallBounce-Pattern gap would need ~2.5-3x the runs), so "no significant difference" is NOT "no difference"; the only candidate worth re-testing is WallBounce in melee, and it must not be shipped on this evidence. SHIM LIMITATION FOUND, worth recording: run_bridge_battle.sh captures with `--subject DrussGT`, and the shim DROPS every tick once the subject dies - losing 5-20% of ModularBot's shots in melee. The campaign was re-run with `--subject ModularBot` so ModularBot's events are complete (fires match gun_stats realShots exactly). Any future melee evidence through this shim must do the same or it will silently under-count. Adds docs/melee_vs_1v1_racks.md. No repository source changed. --- docs/melee_vs_1v1_racks.md | 54 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 docs/melee_vs_1v1_racks.md diff --git a/docs/melee_vs_1v1_racks.md b/docs/melee_vs_1v1_racks.md new file mode 100644 index 0000000..c2e6ede --- /dev/null +++ b/docs/melee_vs_1v1_racks.md @@ -0,0 +1,54 @@ +# Separate melee and 1v1 racks: the mechanism is built, the payoff is NOT there + +The user's plan: *"separate racks for melee and 1v1, so the bot switches from those based on the +situation, and we can put the guns we want in one or both racks."* + +**The mechanism is built and committed** (`TR_RACK_=both|1v1|melee|off`, mode from server truth +`getEnemyCount() == 1`). **The measured verdict is: do not populate it differently. Keep Pattern for +both modes.** No split has a gun-level payoff. + +## 1v1 — ModularBot vs the real DrussGT (6 arms × 5 runs × 7 rounds) + +| arm | real % | **damage/run** | round wins | +|---|---:|---:|---:| +| **Pattern** | **10.80** | **292** | **11/35** | +| KNN | 5.58 | 128 | 1/35 | +| Linear | 2.99 | 59 | 0/35 | +| Circular | 2.89 | 60 | 0/35 | +| WallBounce | 2.72 | 57 | 0/35 | +| GuessFactor | 2.14 | 38 | 0/35 | + +Every arm differs from Pattern at **p = 0.0079** (the 5v5 permutation floor). Per-gun damage span: +**7.7×**. + +## Melee — +DrussGT, RandomMover, WaveSurfer, OscillatorBot (enemyCount 4) + +| arm | real % | **damage/run** | round wins | +|---|---:|---:|---:| +| WallBounce | 25.79 | 643 | 7/25 | +| Linear | 24.88 | 624 | 7/25 | +| GuessFactor | 24.48 | 613 | 4/25 | +| **Pattern** | 24.39 | **599** | 5/25 | +| Circular | 25.88 | 596 | 5/25 | +| KNN | 23.87 | 539 | 3/25 | + +**No arm beats Pattern with significance** (p = 0.42–0.96, fully overlapping per-run ranges). +WallBounce's nominal +7.3% damage is p=0.42 — not a result. Per-gun damage span: **1.19×**. + +## The finding + +**In 1v1 the gun matters enormously (7.7× spread); in melee it barely matters (1.19×).** Melee is won +by movement, survival and placement, not by which gun you carry — every candidate lands in the same +~24–26% band. So a separate melee rack has no gun-level payoff, and `DefaultRackMembership` stays +Pattern-only. + +Caveats, stated honestly: +- The melee comparison is **underpowered** at 5 runs: detecting the observed ~44 damage WallBounce–Pattern + gap would need ~2.5–3× the runs. **"No significant difference" is not "no difference."** If this is + ever revisited, the only candidate worth re-testing is WallBounce in melee + (`TR_RACK_PATTERN=1v1 TR_RACK_WALLBOUNCE=melee`, all else `off`) — but do not ship it on this evidence. +- **Shim limitation found:** `run_bridge_battle.sh` captures with `--subject DrussGT`, and the shim + DROPS every tick once the subject dies — losing 5–20% of ModularBot's shots in melee. The melee + campaign was re-run with `--subject ModularBot` so ModularBot's own events are complete (fires match + `gun_stats` realShots exactly). Any future melee evidence through this shim must use + `--subject ModularBot`, or it will silently under-count.