# ─────────────────────────────────────────────────────────────────────────────
# arms_gun_b1.txt — BATCH 1 of the GUN campaign: does ANY rack gun or gun
# configuration beat the shipped `Pattern` across the frozen panel?
#
# Format:  name | ENV=value ENV=value | label
#
# ONE frozen binary (tournament_run.sh builds it from `git archive HEAD`); every
# arm below differs ONLY by its env dict. No per-arm rebuild.
#
# MOVEMENT IS PINNED IN EVERY ARM (`TR_MOVEMENT=strafe`). Reason (hard rule):
# a parallel job (j120) is shipping a movement-default flip during this run, so
# the default engine may change underneath us. Pinning the engine in EVERY arm
# removes movement as a confound, makes all arms share one movement, and keeps
# the comparison a pure GUN comparison. Because every arm declares TR_MOVEMENT,
# the analyzer's liveness rule (a token must appear verbatim in the bot's own
# raw-env report) is also satisfied for every arm.
#
# Prior data this batch is built on (taken as given; NOT re-derived):
#   * shipped rack = `onlyPattern` (Pattern id 5, all others off); chosen
#     because the selector measured NEGATIVE value at every rack size tested
#     (docs/selector_negative_value.md, docs/gun_rack_analysis.md).
#   * per-gun single-gun hit rate vs DrussGT: Pattern ~10.8%, KNN 5.6%,
#     Linear 3.0%, Circular 2.9%, WallBounce 2.7%, GF 2.1%.
#   * BitBrain == Pattern when idle (30 runs/arm 97/210 vs 97/210 wins) and is
#     NEUTRAL across 32 legacy opponents (-3.6 dmg/run, docs/gauntlet_bitbrain_vs_pattern.md).
#     Its learned-gain config was worse on DrussGT ONLY.
#   * lead AMPLITUDE is a dead axis (full gain sweep run, nothing beats Pattern);
#     lead INFORMATION is the open one.
#
# The question this batch answers: is `onlyPattern` CONFIRMED across 15 opponents
# (rather than merely assumed from a DrussGT-heavy history), or does some gun /
# small rack beat it on damage-per-run AND round wins?
# ─────────────────────────────────────────────────────────────────────────────

# 1. REFERENCE. The shipped `onlyPattern` rack, movement pinned. No gun env at
#    all, so this is what the shipped bot's gun does.
pattern | TR_MOVEMENT=strafe | shipped onlyPattern rack (REFERENCE)

# 2. BitBrain-only rack: the learned-gain corrector on Pattern's lead. This is
#    the exact config the owner most likely ran (gains 1.0..2.0, decay memory);
#    the 32-opponent gauntlet had it as a wash, so this is a PANEL replication at
#    the new (movement-pinned) standard. BitBrain computes Pattern's prediction
#    internally, so Pattern does not need to be in the rack.
bitbrain | TR_MOVEMENT=strafe TR_RACK_PATTERN=off TR_RACK_BITBRAIN=both TR_BITBRAIN_GAINS=1.0,1.25,1.5,2.0 TR_BITBRAIN_MEM=decay | BitBrain-only, learned gain (gains 1.0..2.0, decay)

# 3. TMHorizon-only rack: the horizon Tsetlin corrector on Pattern's lead. Its
#    own design docs PREDICT it loses (needs ~80% side accuracy to break even;
#    achievable ~60%). Never measured across the panel. This arm closes that.
tmhorizon | TR_MOVEMENT=strafe TR_RACK_PATTERN=off TR_RACK_TMHORIZON=both | TMHorizon-only rack

# 4. KNN-only rack: the best non-Pattern single gun by the old DrussGT hit-rate
#    table (5.6% vs Pattern 10.8%) and NEVER measured across the panel. Included
#    to close "the second-best single gun was never panel-tested".
knn | TR_MOVEMENT=strafe TR_RACK_PATTERN=off TR_RACK_KNN=both | KNN-only rack

# 5. TWO-GUN RACK, SELECTOR ON: Pattern (default both) + KNN. The selector was
#    measured NEGATIVE with 16 guns and a rolling hit-rate; this re-tests it at
#    a SMALL rack under the new panel standard, because the movement campaign
#    overturned two earlier single-opponent conclusions. If KNN ever wins a
#    matchup, the selector can hedge into it.
rack_pk | TR_MOVEMENT=strafe TR_RACK_KNN=both | Pattern + KNN, selector ON

# 6. TWO-GUN RACK, SELECTOR ON: Pattern (default both) + TMHorizon. Same
#    selector question against a CORRECTOR family (TMHorizon = Pattern +/- a
#    learned few-degree shift) instead of a different-family gun (KNN).
rack_pt | TR_MOVEMENT=strafe TR_RACK_TMHORIZON=both | Pattern + TMHorizon, selector ON
