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.