Evidence & tools
Inspect one fight or run a thousand. The lab uses the same rules as Play, with seeded rolls that you can reproduce.
Follow a fight
Step through a seeded battle. Inspect each roll and each broken part.
Open Battle ↗Look for patterns
Compare rosters across many games and inspect the results.
Open Batch ↗Test a change
Edit part and equipment values, validate them, and export the catalog.
Open Tuner ↗The stats guide explains how to read the results. The kit builder and melee guide describes the current prototype. Reports below describe the rules and catalog at their recorded dates. They do not establish balance for the new melee system. Simulator design notes ↗



Tuning register and batch notes
The register comes first. It lists every finding that needs a change, with evidence, levers and status. The dated notes below it are the batches, newest first.
Tuning register
Tuning register
The running list of everything the simulator has told us that demands a number, rule, AI, model or map change. One row per finding. Batch notes (below on this page, and in docs/tuning/) carry the raw output; this table carries the agenda.
How a row moves: a batch surfaces a finding → it gets a row here with its evidence → a sweep or a decision resolves it → the catalog, rulebook or engine changes → the next batch re-baselines and the row is marked resolved with the number that changed. Rows are never deleted; resolved ones stay as history.
Kind says what has to change: number (a value in data/*.json), rule (rulebook text and engine), AI (the bot, not the game), model (the power model's exchange rates), map (hand-crafted terrain), decision (needs a call from the design lead before anything moves).
| # | Finding | Evidence (batch, 1000–2000 games unless noted) | Levers | Kind | Status | Tracked |
|---|---|---|---|---|---|---|
| T1 | Backup Fire fires on nearly every attack. With the Vex–Ilse bond on both rosters it adds ~10 free shots per game and doubled wipes. | Melee batch: 9,690 backup shots / 1,000 games; wipes 11% → 23%; rifle fires 13.5k → 17.1k | Require partner within 2 hexes (like the [+]); add heat to the backup shot; make it cost the partner's next Quick | decision | resolved 2026-09-05: Prepare (E4) required for every reaction but Overwatch; 9,690 → 1,489 backup shots per 1,000 games on the old catalog, 922 after the lethality pass | TASK-018 |
| T2 | Melee is 1% of damage even with F11 in place. The AI rarely chooses to close through fire. | Melee batch: 358 melee attacks, 181 charges, 25 knockdowns; blade 117 fires | AI aggression knob and a brawler policy first; only then judge strike numbers | AI | resolved 2026-09-05: aggression knob; melee 1% → 10% of damage at aggression 1 (16% at 1.0 vs 0.75), 2,915 attacks and 1,339 charges per 1,000 games. The bot was the problem; strike numbers stand (2026-09-05-aggression.md) |
TASK-001, TASK-007 |
| T3 | Grapples don't convert. The lighter mech breaks free before the heavier one throws. | 43 successful grapples, 3 throws | Allow Throw in the same activation as a successful Grapple; raise class bonus to 0/2/4; make Break a contest at 1[−] | rule | open | TASK-019 |
| T4 | Range decides open ground. Twelve-hex cannon and ten-hex missiles win when nobody must close. | Open field with positional AI: B 80%; Quarry pulls it to 66–70%. Cannon range 12 / 10 / 8: light roster 25% / 40% / 47% at default bots, 34% / 37% / 40% at best-response aggression | Hand-crafted maps with broken sightlines (the intended fix); cannon range 12 → 10; missile range 10 → 8 | map, number | resolved 2026-09-05: cannon range 12 → 10 (light roster 23% → 39% at default bots); Foundry map with 12% long sightlines against Quarry's 48%, where the standard rosters read 54/46 and 50/50 (2026-09-05-loads-and-range.md, 2026-09-05-foundry.md) |
TASK-002, TASK-022, TASK-026 |
| T5 | Missile rack is the most efficient part in the catalog by a wide margin. | Power model: +163% over the backs median (24.8 offense at weight 8, more than a Rifle arm); second-highest damage and kills on Quarry | Weight 8 → 11; Pen 2 → 1; drop Indirect; or Shots 2 → 1 with 2d6 | number | open | TASK-002 |
| T6 | Heavy armor walls out light weapons. Rifles and autocannons glance off Armor 8 half the time; the Bastion survived 99% of open-field games. | Baseline: Bastion 99% survival, 9 dmg/game taken; autocannon 49% glance | Heavy core armor 8 → 7; Pen +1 on rifle; or make glance 2/3 damage instead of half | number, rule | resolved 2026-09-06: heavy chassis Armor 8 → 7 and Durability 17 → 18 (2026-09-06-bastion-and-batch-speed.md). At 1,000 games the Bastion survives 75.5% instead of 86%, the rifle gets Full damage one roll in three instead of one in six, the light roster reads 45.7% (was 48.7%, inside noise). Pen +1 and crit margin 3 were measured and rejected (they cost the light roster more); Armor 6 is the next notch (63%). The bot now takes Aimed Shots at a soft band when its core shot bounces. Earlier: measured 2026-09-05 at glance ½ vs ¾: against the Bastion the autocannon glances 82% of the time and the rifle 72%; light weapons do 58% of their dice against Armor 8 at ½ (79% at ¾) while the cannon does 75% against Armor 6. Bastion survival in duels 90–94% at ½ vs 80–82% at ¾; roster win rate unmoved by armor 8 → 6 either way (range decides, T4/T18). Glance stays ½ by decision; if the wall needs softening it is Pen or armor, not glance. Kill Team comparison (docs/research/2026-09-05-kill-team-2024-weapons-and-armor.md): their lasgun keeps 36% of its damage into a 2+ save, our rifle keeps 58% into Armor 8; the fix there is anti-armor access on every roster, not a softer wall. Rifle Pen 2 → 4 takes Courier vs Bastion from 39% to 47% and moves the roster game not at all (range, T4) |
TASK-002, IDEA-005 |
| T7 | Lethality vs the round cap. Games run to round 7 and end on points; kills per game 0.6–1.6. | Baseline 93% at cap; terrain batch 95% at cap, wipes 11%; melee batch wipes 23% (mostly Backup Fire) | Decide T1 first; then round cap 7 → 8, or +1 damage die on Heavy/Cannon, or zone points 1 → 2 to make points the intended decider | number, decision | resolved 2026-09-05: target set at about half of games ending in a wipe; Durability × 0.69 across the catalog (two steps: × 0.73, then Medium core 12, Heavy core 17, Heavy legs 11). Glance ¾ was part of the first step and reverted the same day by decision; at glance ½ wipes read 47%, first kill round 3.8 → 3.0, 67% of games still reach round 7 (2026-09-05-lethality.md) |
TASK-002, TASK-020 |
| T8 | Light chassis and light legs read as the best value per weight, while lights die fastest in open-field batches. | Power model: Light +33%, Light legs +44%; baseline Courier 2% survival; Quarry Courier 57% survival | Either the Evasion/Speed exchange rates are high, or cover is what lights needed. Sweep evasion 11 → 9/13 on Quarry | model, number | open | TASK-017 |
| T9 | Shield arm is undervalued by the model. | Power model: −39%; batches show the Bastion's survival is real | Teach the model hit-share: value a part's effective HP by its size share of incoming fire | model | open | TASK-017 |
| T10 | Cannon is the least efficient weapon per weight yet decides the most games. | Power model 2.40 P/wt (−23%); 500–560 kills per 1,000 games, top or second every batch. A cannon Medium beats the heavy roster 54/46; a Bastion with a Rifle instead drops B from 75% to 57% | Model gap: price range uptime against the other side's ranges, and "one hit that finishes a core" under a round cap. Consider a burst-damage term | model | open as a model gap only; at the Quarry equilibrium (L 1.0 / H 1.0, both sides) Pen 3 reads 49.5% and Range 7 50.3% against 50.3% as is, so the Cannon is texture, not balance (2026-09-06-order-and-sides.md) |
TASK-017 |
| T11 | Pulse arm is a dud. | 32–48% hit, 0.4–0.6 dmg/shot, 24–80 kills per 1,000 games; heat dealt never mattered against Reactor 11 | Pen 0 → 1; onHitHeat 1d3 → 1d6; or give it Lock On on hit | number | open | TASK-002 |
| T12 | Stress is very common. | Melee batch: 3,001 stress rolls / 1,000 games, 465 meltdowns | Check whether the AI runs hotter than a player would before touching the table; then Meltdown 1 → natural 1 only on a second roll | AI, number | open | TASK-001 |
| T13 | No falls happen on Quarry. The ledges are away from the fights. | Melee batch: 94 pushes, 0 falls. Foundry: 361 pushes, 0 falls; its level-2 core is ringed by level 1, so a push lands one level down | Put a real two-level edge next to a zone on the next map | map | resolved 2026-09-06: Causeway (data/maps/causeway.json, 2026-09-06-bot-leftovers-and-causeway.md), a level-2 spine with sheer sides under the centre zone; 8 falls per 183 pushes in the light-vs-heavy batch, 48 per 387 (one in eight) in the mirror |
TASK-014, TASK-026 |
| T14 | Positional AI is 100× slower. | 80–130 games/s vs 10k | Cache sight per activation; prune candidate hexes | perf | resolved 2026-09-06: 7.2 → 64 games/s with identical event logs (heap frontiers, array cells, index-based distance field, memoised fields; 2026-09-06-bastion-and-batch-speed.md). Sight caching is the next lever if sweeps need it |
TASK-015 |
| T15 | Cannon crit on half its hits. | Baseline: 53% of cannon hits were crits at Armor + 3 | Crit margin 3 → 4 | rule | resolved 2026-09-05: margin 4; cannon crits 37%, win rates unchanged | TASK-003 |
| T16 | Autocannon dominated the open field. | Baseline: 63% hit, 2,209 kills / 2,000 games | None needed | number | resolved by terrain: six-hex range keeps it out of most Quarry engagements (211 kills / 1,000) | — |
| T17 | Two Fires as Quick actions made Barrage pointless. | Found by reading the AI's action choice | Fire once per activation | rule | resolved 2026-09-05 (E4) | TASK-003 |
| T18 | The heavy roster wins three games in four. Lethality rose on both sides, but Courier/Foreman/Reaver dies faster than Bastion/Foreman/Courier. | Lethality batch: B 75.3%, kills per game A 0.8 vs B 2.1, Bastion 94.7% survival. Decomposed 2026-09-05: mirror 46/54 (side worth ~4 points); heavy armor 8 → 6 no effect; a cannon Medium beats the heavy roster 54/46; a Rifle Bastion drops B to 57%; A at aggression 1 → 44% | Cannon range 12 → 10 (T4, TASK-022); judge at best-response aggression (TASK-021); the residual 57/43 is spent weight 143 vs 129 | number, AI | open; cause found: the Cannon's range and the default bot, not the heavy chassis (2026-09-05-aggression.md) |
TASK-002, TASK-021, TASK-022 |
| T19 | Disengage strikes vanished with Prepare. The bot almost never Prepares while adjacent, so walking out of a brawl is free again. | Lethality batch: disengage 1, riposte 0 (32 disengage strikes before Prepare); still 0 at aggression 1 | Teach the bot to Prepare when adjacent to a hostile that will want to leave; or make Disengage the one reaction that needs no Prepare | AI, rule | resolved 2026-09-06 (AI): the bot predicts a leaving neighbour with the neighbour's own policy and swaps the weaker of its two Quick attacks for Prepare; disengage 0 → 47 per 300 games at best response on Quarry, light roster 45.7% → 48.3% (2026-09-06-bot-leftovers-and-causeway.md) |
TASK-001 |
| T20 | Balance verdicts depend on the bot's aggression. The same kits and rosters read very differently at 0.5 and 1.0. | Reaver vs Foreman 27% → 57% and vs Bastion 31% → 49% at aggression 1; light roster 3% → 44% as A's aggression goes 0 → 1; each side's best response is A 1.0, B 0.75 (A 34%) | Judge every balance row at best-response aggression; consider raising the tuning default from 0.5 | AI, decision | resolved 2026-09-06 (TASK-021): verdicts come from pnpm sim grid (every aggression pair, both sides, read at the equilibrium); the CLI's default aggression is 1.0 both sides, the bench's Play tab stays 0.5 |
TASK-021 |
| T21 | A heavy is a mandatory pick. Design goal (Locked 2026-09-05): light and medium frames with light weapons must sit inside 45–55% against heavy rosters at best-response aggression. | Light roster 23% at default bots, 34% at best response (A 1.0 / B 0.75). Levers measured: cannon range 12 → 10 (+15 points default, +3 best response), 12 → 8 (+22 / +6); AP on the rifle (+8 in the Courier–Bastion duel, 0 in the roster game); heavy armor 8 → 6 (0); zone points 1 → 3 and kill points 3 → 1 (0; a kiting light roster holds 2.1 zones to the heavy roster's 6.7). The heavy roster also spends 143 of the 145 cap to the light roster's 129 | Cannon range 12 → 10 (TASK-022) with ammunition loads (IDEA-005) so the spare 16 weight becomes anti-armor; a second map with broken sightlines (T4); judge at best response (TASK-021) | number, rule, map | holds 2026-09-06 on Quarry (50.3%) and Causeway (52.8%); at match level 43.7% on the I1 rotation Quarry, Causeway, Foundry, just under the band, judged from both sides at the aggression grid's equilibrium after T30 and T33; Foundry stays out of band (T32). Earlier reading: target set, causes known; after cannon range 10, AP loads, Overdrive, the hunt and focus-fire bot changes and the walking-distance fix (BUG-002) the light roster reads: Quarry 35% standard / 50% with AP at default bots, 44% either way at best response; Foundry 54% / 63% at default, 50% / 55% at best response (2026-09-05-loads-and-range.md, 2026-09-05-foundry.md). In the band on Foundry and on Quarry with AP at default; Quarry best response one point short. At match level (best of three across both maps with a Bastion on the light roster's bench): 45% with Quarry first, 55% with Foundry first, 34% without a sideboard (2026-09-06-best-of-three.md) |
TASK-020, TASK-021, TASK-022, TASK-026, IDEA-005, IDEA-006, FEAT-004 |
| T22 | Armor-piercing on burst weapons is a wash. At Pen 3 with 1d3+1 the AP autocannon does 2.0 expected damage per hit against Armor 8, the same as the standard round, so the bot never fires it. | Reaver +AP vs Bastion: 882 standard Fires, AP effectively 0; Courier +AP fires AP 2,727 times to 7 standard | Autocannon AP as fewer, harder rounds (Shots 2, Pen 3, 1d6) or Pen 4; leave rifle and cannon AP alone | number | resolved 2026-09-05: Pen 3 → 4; the bot fires it (880 AP to 32 standard vs a Bastion), Reaver +AP vs Bastion 33% → 36% | TASK-002 |
| T23 | The first Lance arm melted its own reactor. Heat 3 plus an Overdrive of +3 on a Medium reactor of 6 meant every hot shot was a stress roll. | Lantern vs Foreman 29%, 55 meltdowns per 300 games | Heat 2, Overdrive +2, Range 8, 2d6+2 | number | resolved 2026-09-06: retuned; Lantern vs Foreman 57%, meltdowns 16 (2026-09-06-catalog-expansion.md) |
TASK-008 |
| T24 | A heavy without a wall gets shot apart on open ground. The Drayman (Workhorse chassis, Armor 7, no shield) survives 27% of Quarry games and its roster wins 24% there, then wins 61% on Foundry. | Catalog expansion batches, 300 games per map | This is the Kessler philosophy working as intended; watch whether the Workhorse needs Armor 8 or a cheaper bulwark option once more rosters exist | number, map | open | TASK-002, TASK-008 |
| T25 | The power model reads the new parts through its old biases. Sprint legs +106% and Scout head +50% per weight (evasion and speed overpriced, T8); Ram arm −32% and Rotary cannon −26% (melee uptime and burst underpriced, T10). | Power table after the expansion | Calibrate before trusting any of these (T17); duel the Sprint legs and Ram arm directly | model | open | TASK-017 |
| T26 | Bots overheated two and a half times a game. 745 stress rolls and 126 meltdowns per 300 games at best response on Quarry. | Stress causes per roll (100 games, 233 rolls): 45 charges at the cap, 29 Backup Fire at the cap, 69 single-Quick shots over the cap, 90 from on-hit Heat and recoil (2026-09-06-bot-leftovers-and-causeway.md) |
Bot: no Charge over cap; with one Quick, a cooler weapon or Vent unless the shot kills; Backup Fire declined over cap (E6: reactions are optional) | AI | resolved 2026-09-06: stress rolls 745 → 388, meltdowns 126 → 72, light roster 45.7% → 48.3% (inside noise) | TASK-001 |
| T27 | Shots miss more than half the time. At the Play tab's default bots 45% of ranged shots hit and 43% of firing activations hit nothing; the rulebook's stated target (C) is about 70% against a baseline target. | 300-game shot log (2026-09-06-hit-rate.md): 79% of shots are at long range (−1), the evasive die (moved 3+) is on for most targets, Lights sit at Evasion 14; net dice ≤ −1 on 79% of shots; Light targets 30%, Medium 54%, Heavy 73% |
rules.longRangeDice 1 → 0 (hit 53%), rules.evasiveMove 3 → 5 or off (50–52%), chassis Evasion −1/−2 (49–54%); long 0 + evasive off reads 63% hits and 58% wipes |
rule, number, decision | resolved 2026-09-06: long range adds no die, the evasive die needs a Boost or a 5-hex move (F1, F2); with Cannon range 10 → 8 and Light/Medium Evasion +1 as compensation. Rifle hits 49% → 60.5%, light roster 43.6% at best response (44% at default bots, was 36%), wipes 45.5%; Foundry now reads 66% for the light roster (map split for the sideboard). The Cannon is the weapon that misses most now (39%, T10) | TASK-029 |
| T28 | A melee weapon is the best swing in the catalog and the rarest. The Blade arm hits 83% for 6.0 damage per Fire but fires 428 times in 400 best-response games (35 in 500 at default bots); closing costs a volley and pays one strike. | 2026-09-06-melee-weapons.md: melee 17.7% of damage, Reaver 0.59 kills per game, 51% survival |
Blade Shots 1 → 2 (10.0 per Fire, Reaver 0.89 kills, roster 49 → 53.5%, wipes 41 → 48%); 3d6 Pen 4 (7.4); or a Kill Team-style fight sequence where both sides roll and alternate strike or parry (TASK-031) | number, rule, decision | open; recommendation: Shots 2 now, fight sequence as the decision | TASK-031 |
| T29 | Weight and size did nothing in melee. Class decided knockdown and the Grapple bonus; Weight and Speed decided nothing in a brawl. | Design ask 2026-09-06 (TASK-031) | Nimble and Mass (F11.1), Charge dice cap at half Speed (F11.3), push only by an equal or heavier mech (F11.3), Grapple bonus by Weight (F11.5), fall damage by Weight (H3) | rule | resolved 2026-09-06: all five in but fight order (needs the fight sequence). Light kick hit 65% → 70%, heavy unchanged; melee share 16% → 16%, roster balance unmoved (2026-09-06-melee-weapons.md). Texture, not share: the share lever is still Shots 2 or the fight sequence |
TASK-031 |
| T30 | Roster list order is worth up to eighteen points. The harness deploys and activates mechs in list order; the rules let the player choose both. A Bastion listed first (front, central, first to act) is what the heavy mirror reads as a side A edge on every map. | Heavy mirror on flat: Bastion first 56%, Courier first 38%; light mirror 49%; light roster vs heavy roster 43% / 34% / 38% by A order, 52% when B lists the Bastion last (2026-09-06-balance-review.md) |
Bot: choose deployment slots (heavy front, lights flanks) and activation order (act with the mech that gains most, hold the Bastion) so verdicts stop depending on list order; re-baseline every open row after | AI | resolved 2026-09-06: the bot deploys by front rank and leads with the mech whose turn is worth most (chooseNext); the same permutations now read 51.0% / 51.0% and 47.2% / 47.1% / 47.2% (2026-09-06-order-and-sides.md) |
TASK-021 |
| T31 | The heavy roster's best response moved to aggression 1.0. At mutual best response on Quarry the light roster wins 34%, eleven under the band; Foundry 64%, Causeway 54%; the Bo3 with sideboards over three maps reads 41%. | Aggression sweeps 400 games per cell and a 300-match Bo3 (2026-09-06-balance-review.md) |
Judge at mutual best response (TASK-021); Quarry is the outlier map (T4); Cannon (T10) | decision | resolved 2026-09-06 by re-reading after T30 and T33 from both sides at the 3×3 aggression grid's equilibrium: Quarry 50.3% (L 1.0 / H 1.0), Causeway 52.8% (L 1.0 / H 0.5), Foundry 68–78% in every cell; Bo3 with sideboards 46.2% mean of both orientations. The goal holds except on Foundry (T32) (2026-09-06-order-and-sides.md) |
TASK-021, TASK-027 |
| T32 | Foundry is a zone race the heavy roster cannot enter. The heavy roster scores 0.1 zone points a game there to the light roster's 3.0, the Bastion survives 88% of games, and 93% of games reach round 7. | 1,000 games at best response (2026-09-06-balance-review.md) |
Map: zones the Bastion (Speed 2) can reach; or the bot holds a zone with the Bastion and hunts with the rest | map, decision | resolved 2026-09-06 by decision (TASK-027): Foundry stays as built and is the map where the Bastion sits on the bench; the I1 rotation opens on Quarry and puts Foundry third, and the best of three on that rotation reads 47.0% / 40.3% for the light roster (as A / as B). Earlier: re-read 2026-09-06 both sides at L 1.0 / H 1.0: 70.5%; zone points 0 → 61.5%, Bastion Speed 3 → 63.2%, so neither zones nor speed alone closes it. Either a zone the wall can hold, or Foundry is the map where the Bastion sits on the bench (the sideboard absorbs it: 48–56% in the Bo3) (2026-09-06-order-and-sides.md) |
TASK-027 |
| T33 | Side A and side B were not mirror images. Side B deployed on the same rows as A instead of the mirror rows, and both sides broke ties between equal hexes toward the same corner of the map; a heavy mirror on Foundry read 64% for A and 58% for A on the point-reflected map, so the edge was the harness. | Mirrors on flat, Quarry, Foundry, Causeway and their reflections, 1,000 games (2026-09-06-order-and-sides.md) |
Mirror deployment rows and the position tie-break for side B; add --both-sides so a verdict is the mean of both orientations |
AI | resolved 2026-09-06: Foundry heavy mirror 64.4% → 49.7%, open field 51.4%; every verdict from here is read with --both-sides |
TASK-021 |
| T34 | Cannon turns often produce no body damage. Foundry cannon hit rate 34.6%; 66.0% of Fires remove no body durability. | 1,000 both-orientation Foundry games; exact Cannon vs Courier hit 40% clear, 17.6% hard cover. Gunnery +1 lowers empty ranged Fires 38.2→33.1% (2026-09-09-balance-audit.md) | Compare Cannon Acc −1→0, heavy-weapon movement penalty, or general Gunnery +1; measure empty actions and re-equilibrate after tuning | number, rule, decision | open; measured on cloned catalogs only, no live tuning change | TASK-071 |
| T35 | Heavy engagement starts late and a durable mech can contribute nothing. Bastion Speed 2 stacks heavy chassis and heavy legs penalties. | Foundry first resolved proactive attack mean round 3.00, first damage 4.49 among successful games; 23.7% never deal body damage. Speed 3 moves conditional first damage to 3.78 but never-damage is 25.6% (2026-09-09-balance-audit.md) | Heavy legs Speed −1→0; deployment distance; map routes; mobility critical cliff; test heavy melee builds and never-contributes rate | number, map, decision | open; Speed 3 is a candidate, not an approved complete fix | TASK-072 |
| T36 | Causeway has a large side-associated effect with identical rosters. | Raw side A 70.0% at 500 seeds, confirmed 69.8% at 1,000 fresh seeds; other mirrors 48.8–53.4%. Both-side identical-roster pooling hides this (2026-09-09-balance-audit.md) | Isolate terrain/deployment geometry, side-ID tie-breaking, paths and target order; retain raw side rates and paired controls | AI, map | open; block Causeway kit-balance verdicts until understood | TASK-073 |
| T37 | Foundry bot movement can leave a healthy Reaver without an attack all game. | 51.3% of baseline Reaver appearances have no proactive resolved attack; seed 12000 trace shows a surviving Reaver oscillating on its own side with no Fire events (2026-09-09-balance-audit.md) | Inspect position scoring, safe routes, range/LOS forecasts and inactive Overwatch; regression before changing melee damage | AI | open; concrete trace retained, not evidence for a Blade damage buff | TASK-074 |
2026-09-09 isolated attack findings
The following rows use controlled engine attack checks, not bot policy or match win rates. See 2026-09-09-isolated-attacks.md. No live values changed.
| ID | Finding | Evidence | Candidate lever | Kind | Status | Task |
|---|---|---|---|---|---|---|
| T38 | Splitting the raw damage budget reduces empty attacks but weakens finishing. | Six fresh-target/cover cells: Cannon 1×3d6→3×1d6 empty Fires 61.3→32.5%, mean damage 3.66→3.88, fresh kills 3.76→1.36%; Rifle 1×2d6→2×1d6 empty 52.7→35.8%. 960,000 isolated trials | Test burst profiles with preserved raw damage; compare a concentrated mode for part destruction; decide Aimed Shot eligibility | rule, number, decision | implemented 2026-09-09 demo: all ranged profiles split, ranged Accuracy +2; holdout empty Fires 41.5→24.2% across seven base guns. Fresh kill rate 1.19→0.78%; see burst-prototype report | TASK-071, TASK-075, TASK-079 |
| T39 | Independent arms expose strictly better bodies at the same weight. | Utility beats Conduit on armor/durability/capacity; Impact beats Braced on armor/durability; Braced beats Field on capacity, at equal weight/size/handling. Foreman Impact swap keeps weight 48 and lowers incoming part-destruction 15.9→14.7% | Give manufacturers distinct capacity, handling, armor or weight tradeoffs that do not depend on default held equipment | number, decision | resolved 2026-09-09 demo: Conduit capacity 5→7, Braced 8→10, Field durability 7→9; repeatable detector reports zero confirmed numeric dominances | TASK-076, TASK-081 |
| T40 | Some AP profiles fail their anti-armor role. | Flak AP vs braced Bastion/hard: damage 3.08→2.31 and empty Fires 7.9→15.1%; Cannon AP six-cell mean 3.66→3.48 for +3 weight, with only 3.21→3.33 gain in that heavy/braced cell | Retain larger AP damage floor, change shots/Pen or reduce load weight; preserve limited HE distinction; test rounded glances explicitly | number, decision | implemented 2026-09-09 demo: Flak AP retains 1d3+1; Cannon AP uses 3×1d6. Load weight remains the cost; holdout AP outcomes recorded in burst-prototype report | TASK-078 |
| T41 | Sato cannot activate Deadeye with any other current catalog pilot. | D3 requires another same-faction or same-specialty pilot; Sato alone is Ninesuns/Marksman and roster pilots are unique. Ruko/Marrow do share Hollow | Add compatible pilots, make signature abilities unconditional, or change synergy requirement; audit all six identities | rule, catalog, decision | open; lab corrected to normal aimed penalty, no game rule change | TASK-077 |
| T42 | High opening ranged output fits small fast bodies; stock heavy slowness is partly assembly. | 368,880 legal candidate evaluations across overlapping arm policies; sampled Light Lance OD 5.90 damage at weight 26/Speed 7; Medium Lance OD+Rotary Full 10.61 at weight 50/Speed 6/Heat 8. Bastion Light legs fit and raise Speed 2→4 but part-destruction risk 10.4→13.8% | Compare weight/Heat/pilot scarcity and sustained output before buffing heavy offense; test concrete leg swaps before universal movement changes | number, decision | open; best observed screened opening programs, not global or whole-game dominance | TASK-071, TASK-072 |
Burst prototype follow-up — 2026-09-09
| ID | Finding | Evidence | Candidate lever | Kind | Status | Task |
|---|---|---|---|---|---|---|
| T43 | Whole-volley aimed Core fire is a concentrated lethality hotspot. | Current Bastion→Foreman median 2 Full aimed actions clear / 3 hard, vs 4 / 6 ordinary Fire+Vent. 81.5% kill by third aimed action clear; 73.6% hard. 2,000 persistent-state trials/cell (2026-09-09-burst-prototype.md) |
Human-test static aim against movement, withdrawal, targeted arms/legs and objective costs before altering targeting or critical rules | rule, decision | open; implemented compatibility rule, high-priority human playtest | TASK-082 |
| T44 | Distributed chip damage delays attrition while focused fire removes mechs earlier. | Scripted passive 3v3: current clear first kill median 5 focused / 12 distributed shooter activations; by6 kill 76.4% / 7.5%. Hard distributed no kill by18 49.5% | Compare actual first-death timing, post-death activations and objectives; preserve no-kill censoring. Avoid another blanket raw-damage reduction | number, observation | measured controlled exposure; competitive causal effect remains unmeasured | TASK-080, TASK-082 |
| T45 | The legacy power scalar cannot establish balance for independent parts and burst/aimed combat. | Omits arm capacity/handling, inconsistent resolved-arm weight denominator, old melee uptime and initiative value; body detector and multi-outcome attack distributions expose what it hides (2026-09-09-body-part-audit.md) |
Reject clear stat dominance, compare per-context distributions and complete-build survival/cost, then calibrate exchange rates from real playtests | model | legacy Tuner labeled uncalibrated; repeatable measured workflow implemented, scalar calibration still open | TASK-017, TASK-081 |
2026-09-09 qualification of earlier rows
T6/T11 remain relevant as play-experience concerns, but their old survival and shot-share measurements are historical. In the current Foundry baseline, Bastion survives 95.1% while receiving only 6.4% of ranged Fires. Core Armor 7→6 alone barely changes empty-fire frequency. Pulse's normal 1d3 rounds lose much of their body damage to rounded glances; its Heat effect must be counted separately. See the new audit before choosing an armor lever (TASK-071/TASK-072).
T28's old “Shots 2 now” proposal is superseded by the implemented interactive melee exchange. Upfront opportunities, targeted strikes and responsive parries now determine melee output. Its balance still needs review, including the bot inactivity in T37; do not apply the old single-strike buff as if the exchange had not shipped.
Full-game attrition diagnostic — 2026-09-09
These are current-catalog bot results. They do not measure human play. See the complete-game report and the separate controlled distributions.
| ID | Finding | Evidence | Candidate lever | Kind | Status | Task |
|---|---|---|---|---|---|---|
| T46 | First casualties often have not yet made a proactive attack on Flat. | First victim had no proactive attack in 304/1,000 Flat games, versus 157 Quarry, 17 Foundry and 30 Causeway. All first victims had started an activation. Courier is 55.1–90.0% of first victims across maps, with two of six fielded units | Inspect approach exposure, bot targeting and action choices; compare human games before changing Courier durability | AI, map, observation | open; proactive excludes reactions and support, so this is not a no-contribution count | TASK-082, TASK-084 |
| T47 | Low wipe frequency can hide one-sided wipes. | Foundry wipes in 272/1,000 games; 211 of those wipes leave all three winners alive. First-kill side wins 78.2–81.3% across maps; disadvantaged teams win 18.7–22.0% after a 2v3 persists to a later activation | Compare exposure, recovery and objective pressure in human play; resolve Foundry bot movement before using this as a lethality tuning target | observation, AI | open; winner association is not a causal first-kill effect | TASK-074, TASK-082, TASK-084 |
T36 remains open: the current-catalog Causeway heavy mirror wins 79.8% on raw Side A across 500 fresh seeds at equal 0.75 aggression. This is a new diagnostic, not a paired estimate of the catalog change. T37 also remains open. Wipe rates vary widely across sampled bot policies: Flat 50–93%, Quarry 36.5–86%, Foundry 15–47.5%, Causeway 31.5–89.5%. Do not tune damage from one pooled bot wipe rate.
Enraged experiment — 2026-09-09
| ID | Finding | Evidence | Candidate lever | Kind | Status | Task |
|---|---|---|---|---|---|---|
| T48 | Enraged helps retaliation more consistently than comeback wins. | Current-engine paired primary games, 1,000 pairs/map: Quarry retaliation before another own loss 66.4→78.4%, but first-loss-side wins 26.9→26.8% and wipes 52.7→66.7%. Foundry first-loss-side wins 21.5→26.0%; Flat 20.5→17.5%, Causeway 22.9→22.4%, with uncertainty intervals including no change on those latter maps. All first-death prefixes match. See Enraged report | Human-test whether the short offensive response improves agency and whether reciprocal Enraged causes excessive exchanges. Separate movement and reroll effects before any stronger version | rule, observation | Historical temporary-rule comparison; permanent offensive E9 subsequently adopted in TASK-089. No universal comeback claim | TASK-085, TASK-086 |
Permanent Enraged duration comparison — 2026-09-09
| ID | Finding | Evidence | Candidate lever | Kind | Status | Task |
|---|---|---|---|---|---|---|
| T49 | Permanent Enraged improves sampled comeback rates but also increases wipes. | 1,000 matched temporary/permanent pairs per primary map: first-loss wins Flat 18.4→24.8%, Quarry 24.8→27.0%, Foundry 26.3→29.6%, Causeway 21.3→26.0%. Paired intervals exclude zero except Quarry. Wipes rise by 3.6, 7.5, 11.4 and 4.5 points respectively. See duration report | Compare human recovery choices and increased lethality; track permanent bonuses used at equal or greater surviving-unit counts. Assess duration separately from strength and trigger changes | rule, observation | Permanent offensive duration adopted for new games in TASK-089; fixed-policy bot effects are not a human balance verdict | TASK-087, TASK-086 |
Defensive Enraged comparison — 2026-09-09
| ID | Finding | Evidence | Candidate lever | Kind | Status | Task |
|---|---|---|---|---|---|---|
| T50 | Replacing permanent offense with defense reduces wipes but does not improve sampled recovery. | 1,000 paired games/map: wipes fall 7.2–11.9 points. First-loss wins Foundry 29.7→24.9% and Causeway 27.6→20.5%, with intervals below zero; Flat/Quarry uncertain. Post-first-death no-body-damage Fires rise 5.8–7.4 points. See defensive report | Keep optional; human-test recovery and action satisfaction. A later damage-reduction candidate could preserve successful hits; it remains untested | rule, observation | Defensive variant not selected; permanent offensive is the new-game default (TASK-089). Map/bot limits remain | TASK-088, TASK-086 |
Map structural symmetry correction — 2026-09-09
| ID | Finding | Evidence | Candidate lever | Kind | Status | Task |
|---|---|---|---|---|---|---|
| T51 | The authored maps needed exact rotational terrain, deployment and objective symmetry. | All four 32×20 maps now pass structural checks. In the completed 4,608-game paired mirror diagnostic, pooled physical-A payoff changed old→fixed from 52.2→51.8% on Quarry, 51.4→50.1% on Foundry and 53.5→49.1% on Causeway. Fixed pooled first-side payoff was 40.4%, 45.4% and 40.1%. Family strata remain large: Causeway armored physical-A changed 77.3→43.8% and first-side 50.8→23.4%; Quarry mixed changed 51.6→60.2% and 46.9→33.6%. Pooled diagnostic; all 18 map/family cells | Keep the structural repair; investigate family and activation-order effects separately from physical map ends | map, observation | resolved structurally 2026-09-09; pooled physical-end measurements are near 50%, but pooling hides large family responses and first-side timing remains open. Historical map results remain historical | TASK-091, TASK-090 |
| T52 | Goal routing discarded unreachable-path information and center-only objective goals missed passable scoring footprints. | Foundry traces reproduce healthy Jump units choosing an inescapable roof; Quarry has blocked zone centers with reachable scoring flowers. Full-panel controls move melee payoff baseline 47.0% → goalpath 26.7% → zonegoals 31.0% → safeapproach 83.7% [81.6, 85.6]. Safeapproach chooses reachable ground in the mechanism trace. Roof mechanism; paired reachability comparison | Preserve full passable zone footprints and distinguish unreachable from absent goals in the optional controller; rerun rule candidates with one common corrected controller | AI | Defect and optional correction mechanism proved; 83.7% exposes hidden controller distortion, not human melee balance. Optional capability is not the gameplay default; corrected study completed with no accepted combat replacement | TASK-090 |
| T53 | Hard equipment Weight does not price pilots, free Lock On actions or all team support, and six sampled rosters do not define each strategy's ceiling. | Pilot choice costs no Weight; the mobile roster supplies three free Lock Ons. A controlled clear shot rises 70→86.7% conditional on a lock, while the full-panel nofreelock control changes access/action economy and family results without changing unsupported weapon stats. The audit covers 5,940 ranged situations, 90 melee matchups and only six concrete rosters; mobile spends 99/145 team Weight but has only six personal-cap Weight free. Power-budget audit; wide results |
Measure marginal pilot, support and action-access value with matched swaps; add rosters that activate real ability synergies before revising prices or declaring strategy diversity | model, decision | open; finite-roster and unpriced-utility limits documented, with no pricing resolution yet | TASK-090, TASK-017 |
Cautious ranged policy coverage — 2026-09-09
| ID | Finding | Evidence | Candidate lever | Kind | Status | Task |
|---|---|---|---|---|---|---|
| T54 | The original aggression grid excludes demonstrated cautious ranged counterplay. | Read-only Foreman/Reaver open-board probe: aggression 0/.25 chooses separation 8/6; .5/.75/1 chooses 4/2/1, allowing the healthy enemy to Move adjacent in the latter three. No games or RNG draws. Position threat uses current enemy locations and legacy attack values, not enemy Move plus the full interactive exchange. See policy limits | Expand prospective stress grid to 0/.25/.5/.75/1. Inspect predicted melee threat before treating fixed-policy melee dominance as a catalog defect | AI, methodology | Coverage defect confirmed and 64,000-game policy/combinations test completed; no live combat change or broad balance certification | TASK-090 |
| T55 | The pool-minus-one result does not cover the cheaper dual-Spike melee loadout. | The six-roster game study fields dual Blades only. In the isolated adjacent-exchange audit, dual Spike weighs 44 versus dual Blade 46, retains two more opportunities, and under pool −1 kills sampled stock opponents 62.6% versus Blade's 46.3%. The ordering holds in every sampled target mixture. These are 153,600 dependent exchange trials, not game win rates. Melee loadout audit | Test legal Spike-bearing rosters and other melee packages in full games before making a catalog-wide claim; retain per-weapon pool and weight differences | number, model, observation | open scope risk; isolated evidence does not identify an optimal loadout or resolve Spike pricing | TASK-090, TASK-017 |
| T56 | Melee balance depends strongly on policy choice; the promising combination retains unresolved first-side sensitivity. | On the same fresh seeds, baseline melee payoff is85.6% at .75/.75 and53.0% across the equally pooled five-level grid. At control-selected policies it is75.3%, versus66.4% pool−1,69.1% accuracy+2 and53.5% both. Causeway added absolute first-side bias is9.4/10.6/13.1pp, above the5pp review margin. Policy diagnostic; selection decision | Explain activation-order sensitivity and improve threat evaluation before choosing a new rules candidate; retain the combination as a scoped future possibility | methodology, AI, observation | Study complete with no finalist advancement; selected-training five-pair results do not prove full-panel failure or certify strategic balance. Final600000 seeds untouched | TASK-090 |
| T57 | The owner selected +2 printed Accuracy for every ranged weapon, with melee unchanged. | Immutable catalog diff: Missile rack 2→4, Rifle 3→5, Autocannon 2→4, Cannon 1→3, Pulse 3→5, Flak 3→5, Rotary 1→3 and Lance 3→5; no other catalog field differs. The earlier candidate reduced empty proactive Fires in sampled bot games but also changed lethality and first-side observations. Adoption record and exact audit | Re-baseline reliability, early deaths, wipes and matchup/map effects under the complete live rules; human-test whether attacks feel reliably consequential | number, decision | adopted 2026-09-09 by owner decision; all melee stats and rules unchanged. This is not a statistical balance certification and does not alter the completed study verdict | TASK-092, TASK-090 |
| T58 | Legacy climb caps, climbing Heat and fall punishment made vertical access depend on leg type and could create one-way roof routes. | Current H3 decision replaces that model: ordinary movement pays terrain entry + absolute elevation change; working Jump legs waive the elevation surcharge in both directions; drops have no damage, Prone or movement-ending effect. The earlier roof diagnosis used old movement semantics. Adoption record | Observe route choice, roof access, high-ground uptime, objective timing and Jump-leg value; preserve legacy behavior only for existing saves | rule, decision | adopted 2026-09-09 for new games; no new balance simulation, and old movement evidence does not predict the combined live rules | TASK-092, TASK-030, TASK-068 |
| T59 | Accuracy +2 improves fixed-policy reliability, while the paid-movement bundle shifts roster outcomes and raises lethality. | Across the fixed factorial, empty proactive Fires change pre/accuracy-only/movement-only/current from 14.7/9.8/14.3/9.1%. Melee payoff changes 44.2/43.3/84.2/77.3%. Wipe termination changes 70.8/77.0/81.5/86.9%. The movement main effect on melee payoff is +37.0 points [34.8, 39.8]. Post-adoption report | Retain adopted rules for now. Measure current-policy counterplay, per-map contact and scoring, then test strongest legal packages before further global tuning | observation, methodology | open measurement limit; eight shared seed blocks and transferred policies do not establish current equilibrium or human balance. No live change follows | TASK-093, TASK-017 |
| T60 | The post-adoption profiles do not meet the price-acceptance policy and initiative checks. | The fixed profile is not a current aggression-grid equilibrium. The transferred profile has 20 old trained cells and 40 .75/.75 fallbacks. Fresh current mirrors give physical Side A 49.2% and first-side payoff 45.3%; map first-side payoff ranges from 38.5% to 54.2%. Post-adoption report | Require both sides at the aggression grid's equilibrium and an even mirror before price acceptance. Add bounded human counterplay checks | methodology, observation | open prerequisite; exact rotational geometry does not establish first-activation fairness. Human evidence does not replace the equilibrium and mirror checks | TASK-093, TASK-017 |
| T61 | Expected damage and printed stat points do not provide a universal part or weapon price. | The exact audit retains 1,440 ranged rows, 120 melee budgets and 9,216 passive firing sequences. Accuracy saturates, Pen depends on Armor, Piloting crosses pool and first-spend thresholds, and −1 Heat shows no demonstrated kill gain. Jump creates map-specific access and carries defensive costs. Marginal audit | Price a role and meaningful drawback. Test the strongest legal package, breakpoint neighbors and delivery costs with the attack payload | model, methodology | pricing method documented; future item prices remain unconfirmed until complete-game equilibrium, mirrors and human checks pass | TASK-093, TASK-017 |
| T62 | Cooling Tender targetability changes fixed-policy bot behavior. | Mirrors of faction rosters, 192 games per condition: wipes off 72.9167%, aura-only 71.875%, targetable 46.875%. Targetable games average 5.3229 aircraft attacks and 1.46875 aircraft losses. Physical Side A payoff is 54.1667%; pooled roster payoff is 50% by construction. Content prototype report | Test human choices to attack or ignore aircraft. Check current aggression equilibrium and mirrors before tuning aircraft price or stats | observation, methodology | open measurement limit; promising prototype with no balance certification. No live balance change follows | TASK-093, TASK-017 |
Content balance reassessment — 2026-09-12
| ID | Finding | Evidence | Candidate lever | Kind | Status | Task |
|---|---|---|---|---|---|---|
| T63 | New ranged packages have distinct reliability, Armor and Heat costs. | Cold range-4 Fire against Courier: Light Bowgun has 5.9% zero-damage attacks versus Rifle 13.1%. Standard Bow matches Rifle damage and adds one Range, but costs four more Weight and a second hand. Near Cap, Cannon, Beam Lance, Heavy Bowgun and Bow Overdrive trigger an attacker stress check in every matching trial. Content balance report | Keep ranged Accuracy +2. Test sustained Heat, cooling access, repeated attack choices and complete package costs before changing Bow or other ranged profiles | observation, methodology | open role and cost checks; no live change or global weapon rank. Qualified 2026-09-14, still open by the TASK-107 study: no ranged package was a study factor, so nothing in the study prices a Bow role or ranks a ranged weapon. The study's only ranged evidence is the repeated panel, 256 blocks, screen.json.isolates.report.json, and it is about Core Durability, not about the packages. Two of its 27 ranged cells ever reach the 16-activation horizon: rifle ordinary Fire against the Bastion at 7.42% and heavy bowgun disarm against the Courier at 0.39%. Core +2 raises the rifle cell to 10.16% and Core +4 raises it to 16.02%, a rise of 8.6 pp. The confirmed candidate tn10 leaves whole-game wipes and part disables flat, so it does not change ranged lethality either (balance experiment results) |
TASK-099, TASK-017, TASK-107 |
| T64 | Hammer and guarded melee forms need specific role checks. | On the common Medium/Ruko body, Great Sword survival payoff versus Hammer is 65.72% [63.09, 68.36]. Charge Blade guard versus Axe or Discharge is 63.57% [61.62, 65.62]. The full exchange matrix retains mutual survival, strikes, parries and Heat. Content balance report | Check opportunities, parry cost, Armor matchup and delivery before a blanket damage increase. Keep each form and shield package separate | observation, number | confirmed as a role gap and partly answered 2026-09-14, still open. Isolates, exchange panel, 256 blocks, screen.json.isolates.report.json: the Hammer is 13th of 15 packages on damage dealt at 1.879 and last of 15 on net kill differential at −0.189 under control. hammer2 moves it to 9th at 2.958 and 10th at −0.033, still below the midpoint. On its 30 changed exchange cells the Hammer deals +1.006 more body damage, dies 7.85 pp less often and its opponent dies 6.71 pp more often, with rescaled 256-block intervals excluding zero on usable offensive dice, +0.271 [+0.240, +0.302], and on own survival, +2.20 pp [+0.81, +3.61]. The guarded-form question was unanswered here: guard-lance:standard, gunlance:lance and charge-blade:blade were one fixture profile, so the 15-package ranking held 13 distinct profiles. It is answered on the rules side 2026-09-15: the three identical packages are now distinct under F11.9 to F11.14, adopted for identity with provisional numbers (T73, adoption note). The Hammer role gap stays open. hammer2 was never confirmed in whole games; see T70 (balance experiment results) |
TASK-099, TASK-017, TASK-107, TASK-111 |
| T65 | The light Idris melee bundle leaves the common Medium opponent very few accepted strikes. | Same-weapon sensitivity: Dual Blades 88.18% [86.23, 90.04], Great Sword 96.00% [94.43, 97.36], Guard Lance 88.67% [86.72, 90.53] survival payoff. The light build spends first in every exchange; its opponent averages 0.002–0.018 accepted strikes. Content balance report | Prioritize the common melee TN test. Retain defender choices, successful opportunities, actual first spender, accepted incoming strikes, parries and mutual survival | observation, methodology | the prioritized test ran 2026-09-14; the row stays open. The common melee TN test ran and confirmed at TN 10; see T69. The sensitivity panel, 256 blocks, screen.json.isolates.report.json, shows every toggle softens this matchup. Mutual survival is 14.91% under control and rises +16.15 pp [+14.39, +17.97] at tn12, +14.00 pp [+12.43, +15.63] at tn11, +10.22 pp [+8.40, +12.04] at tn10 and +11.20 pp [+9.31, +13.15] with the Piloting pool off. pilot-pool-off is the only place the Piloting pool bites, because it needs Piloting 2 or more and only Idris Kade has it. The class panel closes the light-versus-heavy death gap of 22.8 pp by killing Heavies less: heavy-defender deaths fall 31.77% to 21.88% at tn10 while light-defender deaths rise 8.98% to 18.49%. Still no causal Piloting-only effect. TN 10 became the live melee threshold on 2026-09-15; see T69 (balance experiment results) |
TASK-097, TASK-017, TASK-107 |
| T66 | Default-form bot policy and missing Momentum melee support limit different claims. | The weapon isolate preselects forms and separately proves the paid Quick transition. The whole-game bot uses default forms. Separately, BUG-017 records that promised Momentum behavior is absent from interactive Fight and Charge. Content balance report | Add form-choice policy coverage before pricing alternate-form access. Resolve Momentum's melee application design and regression separately | AI, bug, methodology | open; form-choice policy coverage now exists and was measured 2026-09-14, and the Momentum limit stands. A paid-form bot policy now exists and fires: form changes rise 0 to 0.357 per game [+0.351, +0.364] inside the combination at confirmation, 16 blocks, confirmation.json.confirmation.report.json, and 0 to 0.368 [+0.340, +0.394] in the opening, 8 blocks, screen.json.opening.report.json. It did not price access: the transformers roster is the only roster with form-capable weapons, it never changed form in 10,752 control and tn10 games, and it sets the floor of the primary metric in every arm, gaining only 1.39 pp with paid forms on. Melee Momentum fired in no whole game of any phase. It fired in one isolate cell and in the pilot panel, 117 dice in 12,288 games, with every payoff interval covering zero. BUG-017 is unchanged (balance experiment results) |
TASK-104, BUG-017, TASK-107 |
| T67 | Whole-game results depend on assembly, delivery, policy and opening turns. | Targetable sampled-opponent payoff: new ranged 67.76%, heavy-anchor 64.27%, mobile 60.26%, common-Medium melee 29.66%, default transformers 20.99%. New ranged versus mobile is 47.66% [41.67, 53.39] overall but 21.88% on Foundry. Legacy Causeway mirror First Side is 18.75% [6.25, 32.81]. Wipes off/aura-only/targetable are 51.15/51.05/46.28%. Content balance report | Keep Accuracy +2 and targetable aircraft. Diagnose starting-player/map/policy sensitivity before prices; test complete melee delivery builds and human attack-or-ignore choices | observation, methodology | confirmed and sharpened 2026-09-14, still open. Confirmation, 16 blocks, 16,128 games, confirmation.json.confirmation.report.json: the seven-roster spread is 57.99 pp under control, against 50.00 pp for the same rosters at the screen, which ran on 2 blocks at 8 games per cell. The screen figure was never a stable baseline and must not be quoted as one. Roster means move by more than the spread statistic's own noise bias between the two designs: light-duelists 65.97% to 73.96%, new-ranged 67.36% to 59.98%, mobile 58.33% to 52.86%, heavy-anchor 59.72% to 65.45%. No roster mean anywhere in the study carries an interval. Policy basis is the dominant sensitivity: screen, opening and confirmation used transferred, transferred and own-trained policies, and the map-level First Side result reverses between them; see T71. Assembly matters only through the Light Duelists refits, Team Weight 97 to 96 to 95; see T72 (balance experiment results) |
TASK-103, TASK-106, TASK-097, TASK-017, TASK-107 |
| T68 | Yutani is a follow-up priority among the sampled fixed-policy pilot packages. | Selected Mika/Tavi/Vex scores 67.19% [61.46, 72.92] versus the original control and beats all five distinct sampled opponents. The original mirror has 61.46% First-Side payoff. Each pair has only 16 holdout seed blocks. Content balance report | Preserve faction and pilot choice. Resolve BUG-017 and improve ability-use coverage, then compare matched Yutani pilot-stat and Pace/Momentum/Scramble variants to separate tempo, accuracy and control | observation, methodology | the matched comparison ran 2026-09-14 and lands on Pace, follow-up still open. Pilot panel, 8 blocks, 12,288 games, one fixed opponent at fixed aggression 0.5, selected.json.pilots.report.json: every Yutani subset containing the Pace pilot is indistinguishable from the full trio on payoff, and every subset without him is clearly below it. Removing all three abilities costs Yutani −0.188 [−0.281, −0.094] in the control arm and −0.188 [−0.344, −0.042] in the selected arm, with proactive attacks −1.698 [−2.375, −0.979]. B&B, the other Pace trio, reads −0.135 [−0.250, −0.031] and −0.115 [−0.198, −0.042]. Removing Scramble alone or Momentum alone costs nothing detectable. Pace has no proc counter at all, so this rests on proactive attacks, not on an ability count; Deadeye is null too. FSU's stat result, −0.198 [−0.333, −0.083], is confounded by the only live Bond on the board. 52 of the 128 contexts are byte-identical to another context, leaving 76 distinct game sets and 4,992 re-simulated games; 8 of the 64 pilot-configuration cells duplicate another cell across factions, because pilot Initiative never reaches combat. Still no causal bonus effect, no certified faction tier and no live stat change. Instrument Pace, Deadeye and ranged Momentum before the next pilot test (balance experiment results) |
TASK-105, BUG-017, TASK-017, TASK-107, TASK-108 |
TASK-107 balance experiment — 2026-09-14
| ID | Finding | Evidence | Candidate lever | Kind | Status | Task |
|---|---|---|---|---|---|---|
| T69 | A common melee opportunity target number of 10 evens the roster field, and it does it through defence, not lethality. | Confirmation, 16 blocks, 16,128 games, seeds 230000–230015, own-trained policies, out/balance-experiment/study-01/confirmation.json.confirmation.report.json. Roster payoff spread −9.64 pp [−14.41, −3.99], excluding zero in the smaller-is-better direction; 57.99 pp under control against 48.35 pp under tn10, both bare point estimates with no interval on the level. The screen predicted −8.33 pp on 2 blocks. The compression is a reordering: light-duelists falls 7.73 pp from the top, new-ranged rises 7.81 pp to become the new top, transformers rises 3.47 pp from the floor. No per-roster interval exists. Mechanism: parries +3.029 [+2.696, +3.389], shield parries +0.435 [+0.358, +0.511], melee starts +0.262 [+0.180, +0.346], heat added −0.357 [−0.565, −0.153]; wipes, part disables and First Side all flat. Isolates, 256 blocks, screen.json.isolates.report.json: no exchange lethality interval excludes zero, and the class panel closes the 22.8 pp light-versus-heavy death gap by killing Heavies less. Balance experiment results |
Send tn10 to the separate playable-default decision. Carry the caveat that it does not make closing distance more lethal, so it does not by itself meet that design goal |
rule, decision | resolved 2026-09-15: adopted as the playable default (F11.1). meleeOpportunityTarget undefined, the opponent's Evasion, → 10; confirmation spread 57.99 → 48.35 pp, a paired −9.64 pp [−14.41, −3.99]. Confirmed on the preregistered metric and on fresh seeds. Declared bot grid only; no human-counterplay or optimal-play claim. The adoption carries the caveat that it evens the field through defence and reordering, not through melee lethality. Legacy pair re-baselined 2026-09-15, Causeway 52.3 → 50.3 at (0.75, 0.5), Quarry 47.0 at (0.75, 0.75), Foundry no equilibrium either way (adoption note). Those two numbers, Causeway 50.3 and Quarry 47.0, are under the old alternating activation order; the initiative-era re-baseline of the same pair is in T71 |
TASK-107 |
| T70 | The screen-selected combination did not confirm, and its screen sign flipped. | Confirmation, 16 blocks, 16,128 games, confirmation.json.confirmation.report.json. tn11+hammer2+blade-cap4+core-plus2@paid-forms gives paired spread +2.17 pp [−1.48, +5.82]: the interval includes zero and the point estimate is in the wrong direction. Its screen estimate was −1.74 pp [−1.74, +1.39] on 2 blocks, with the point estimate sitting on its own lower endpoint. Its secondary effects are large and real: wipes −9.02 pp [−10.75, −7.18], no-death +1.90 pp [+1.41, +2.36], proactive attacks +1.862 [+1.738, +1.998], rounds +0.180 [+0.143, +0.217], heat added +4.613 [+4.370, +4.852], first death later by +0.300 rounds [+0.270, +0.330], form changes 0 to 0.357 [+0.351, +0.364]. Its largest roster move, heavy-anchor −10.85 pp, is interior and invisible to the spread metric. It also worsens turn order: First Side +1.79 pp [+0.24, +3.16] overall and +4.80 pp [+3.18, +6.36] on Causeway, with three 64-to-0 mirror sweeps. Re-evaluated at confirmation resolution it would fail the screen's own mirror guard, 0.500 against control's 0.375 on a 10 pp allowance. Confirmation carries no interaction result, and tn10 is not a component of this bundle, so no factor inside it can be credited or blamed. Balance experiment results |
Do not adopt the combination. If fewer wipes and longer games are wanted, test Core +2 standalone in a confirmation-grade design. Confirm Hammer +1 die alone if Hammer viability is a goal | decision | closed as a candidate 2026-09-14: the combination fails the preregistered metric and is not sent to the adoption decision. The component questions stay open under T64 and T72 | TASK-107 |
| T71 | Turn order is a roster-by-map effect concentrated in mirrors, not a map constant. | Opening diagnostic, 8 blocks, 6,912 games, screen.json.opening.report.json; confirmation, 16 blocks, confirmation.json.confirmation.report.json; levels and intervals from the First Side supplements first-side-supplement.json and first-side-supplement-confirmation.json, which sit outside the frozen source closure and did not influence selection. Opening control first-mover share by map, 288 games each: Quarry 58.68 pp [53.1, 64.9], Foundry 44.10 pp [39.6, 48.6], Causeway 39.24 pp [31.6, 47.2], all excluding even. On confirmation's fresh blocks with trained policies those map effects vanish: 49.9 pp [47.9, 52.1], 48.0 pp [45.4, 50.8], 52.2 pp [49.7, 54.6], all covering even. Pooled over mirrors only, Quarry first-mover and Foundry second-mover persist attenuated, 64.3 to 54.9 pp and 44.2 to 42.9 pp; Causeway does not replicate, 35.7 to 48.2 pp. Cells replicate across both designs: light-duelists on Quarry gives the first mover 0.88 in both, heavy-anchor on Causeway is strongly second-mover in both. The screen's own mirror guard was uninformative: control's maximum was 0.50, the metric's ceiling, with six of 21 cells swept 8 to 0 and all six at zero physical bias. Balance experiment results |
Run a follow-up mirror study with at least 64 games per cell and intervals on the level. Replace the ceiling-bound mirror guard with a First Side share and an interval. A design lever such as the second player choosing the deployment side in mirrors is an owner decision, not a study result | AI, map, decision | resolved 2026-09-15: adopted as the playable default (E2). Continuous alternation from deployment → a weight-based Initiative roll, d20 plus pilot Initiative (D1) minus Weight divided by 10 rounded down, rolled once at game start, both sides mixed in one descending order held all game. Follow-up mirror study on the legacy pair and a light melee mirror, TASK-110, commit 3943cae, n=1000 and n=500: the nine mirror cells move from a 40.9 to 69.5 band under alternate to 49.1 to 54.3 under initiative. The legacy pair stays in band at the grid equilibrium, both sides: Quarry 47.0 → 53.3 at (0.75, 0.75), Causeway 50.3 → 49.5 at (0.75, 0.5), Foundry no equilibrium either way. Legacy pair re-baselined 2026-09-15 under both adoptions, dirty tree at 6f63dbe: Quarry 52.2 at (0.75, 0.75), Causeway 49.7 at (0.75, 0.5), Foundry no equilibrium; the weapon skills and the d6 tie-break move the pair by nothing outside noise, because the kits carry no skill weapons. The price is the pile-on, and the rule states it: sweeps 0 → about half a round per game in the legacy mirrors and about a quarter in the light melee mirror; runs of three 0.01 to 0.66 → about one per game. The adopted rule breaks its last tie with a d6, where the experiment used side A. alternate-opener moves fairness rather than fixing it and is rejected; initiative-round is not adopted. Declared bot grid only; no human-counterplay claim (adoption note, turn order experiment) |
TASK-106, TASK-107, TASK-110 |
| T72 | The Duelist arm Capacity axis is inert in the isolates and untested in whole games. | Isolates, 256 blocks, screen.json.isolates.report.json: blade-cap4 and blade-cap5 are bit-identical to control in every one of their 327 cells, 240 exchange plus 6 sensitivity plus 36 class plus 45 repeated, on every metric, because every isolate fixture build already fits inside Capacity 4. The inertness propagates through the factorial, so the 16-cell mechanical cube holds only 8 distinct profiles in that phase. Whole game, screen, 2 blocks, screen.json.screen.report.json: blade-cap4 scores 50.69 pp and blade-cap5 50.00 pp against control's 50.00 pp. Assembly is the only place Capacity acts: only the Light Duelists roster needed refits, Team Weight 97 to 96 to 95, support arms only, active weapon-source Handling unchanged at 1, frontiers.json SHA-256 49c53693c3d86848f6e66de607e71b7228e291bbff113a033625f661cb61d99b. The legal-only supplement is descriptive. Balance experiment results |
Drop Capacity from the next study unless a fixture that actually exercises it exists. Build that fixture first if the axis matters | methodology | open as a design-of-experiment gap, inconclusive as a balance question. No evidence in either direction | TASK-107, TASK-108 |
| T73 | Weapon skills give the three identical lance packages distinct behaviour and help the guard lance roster; they do not rescue the transforming roster, whose losses are the melee approach and the light duelist build. | 48 grids and 12 mirrors on the weapon-skills worktree at 3943cae, rule weaponSkills off and on, three maps, both-sides at the aggression grid's equilibrium, 600 games per grid cell. Guard lance roster, flag off to flag on: legacy light Quarry 19.0 to 33.2 and Causeway 62.8 to 68.8; legacy heavy Causeway 94.5 to 98.8, Foundry 96.2 to 99.5 and Quarry 89.5 to 93.7; new ranged Causeway 57.0 to 59.3 and Quarry 8.0 to 11.3. Transforming roster, flag off to flag on: legacy heavy Causeway 93.2 to 92.8 and Foundry 95.2 to 96.0, new ranged Causeway 51.3 to 50.2, legacy light Causeway 44.2 to 41.5; against light duelists Causeway 0.0 to 4.8, Foundry 0.0 to 3.3 and Quarry 0.3 to 7.8. Both melee rosters still lose: against light duelists flag on, new-melee 1.7 to 4.2 and transformers 3.3 to 7.8; against new ranged on Quarry flag on, transformers 5.5 and new-melee 11.3. Mirrors at n 1000 with --both-sides read 50.0 or 49.9 by construction, and mean rounds move by at most 0.30. Diagnostic history against courier,foreman,reaver on Quarry, both-sides: flag off 71.0, first flag-on 36.2, bot form fix 64.0, revert 68.0, Shelling gate 68.7; gunlance survival 7.0 parked in Shell form and 73.7 after, charge blade 59.3 with the spend form persisting and 66.3 after the revert, switch axe 13 to 17 throughout. Weapon skills measurement |
Adopt the five skills as identity, not as a balance fix. Then take the light duelist build, which is the reordering T69 found, and the melee approach problem | rule | resolved 2026-09-15: adopted for identity, numbers provisional (F11.9 to F11.14). One Charge track per mech, plus Phial Discharge, Amp, Shelling and Wyvern's Fire, Extracts and Counter; weaponSkills false → true, and the charge-blade discharge mode leaves data/parts.json. The number that moved is the count of distinct exchange packages: 13 → 15, because guard-lance:standard, gunlance:lance and charge-blade:blade no longer print one profile (T64). Counter adds +3 to +14 points for the guard lance roster, and the transforming roster goes from about 0 to 3 to 8 against light duelists and is otherwise flat. The adoption closes neither loss: both melee rosters still lose to light duelists at 1 to 4 percent and to new ranged on Quarry at 5 to 11. F11.13 Extracts is unmeasured, because no roster fields the Relay insect glaive. Next balance targets are the light duelist build and the melee approach (adoption note) |
TASK-111, TASK-107 |
Reading order for a newcomer
- This table.
power-model.mdfor what the per-part number means and where it is known to be wrong.- The dated batch notes, newest first, for the raw output behind each row.
Conventions
- Every batch note records the exact
pnpm sim batchcommand and seed so anyone can rerun it. - Numbers change only with a batch that shows why, and the row here says which number moved.
- Findings that turn out to be the bot's fault get AI and wait for the aggression knob; we do not tune the game to the bot.
Power model v0
Power model v0
One number per part, pilot and mech, so parts in different slots can be compared on one yardstick and outliers show up before a batch is run. It lives in engine/power.ts, is shown in the bench's Tuner (columns O, D, U, P, P/wt, Δ) and Bench (per mech and per team), and in pnpm sim catalog and pnpm sim build.
Unit: damage-equivalent per game. Everything is expressed as "how much enemy damage this is worth over seven rounds".
Formula
Power = Offense + Defense + Utility. The balance yardstick is Power ÷ Weight; within a slot, parts should sit within about ±25% of the slot median unless a deliberate niche justifies the gap.
Offense (weapons only). Expected damage of one Fire against a reference mix of cores, using the same hit and penetration math as the AI (expectedDamage), times two uptime factors, times seven activations.
- Reference targets: Light (Armor 4, Evasion 11), Medium (6, 9), Heavy (8, 7); attacker accuracy +1; optimal range; no cover.
- Range uptime:
0.55 + 0.045 × Range, capped at 1. Range 6 → 0.82, 8 → 0.91, 10+ → 1.0. Melee gets a flat 0.45 (the simulator shows brawlers rarely get there). - Heat sustain:
1 / (1 + Heat / 6). Heat 0 → 1.0, 1 → 0.86, 3 → 0.67. - Tags: Indirect ×1.1, Heavy ×0.9. Heat dealt to the target (Pulse) counts 0.4 per expected point.
Defense. Effective hit points: durability divided by the share of a reference shot (Pen 2) that gets through this armor, where a glance halves damage (F5). Armor 4 → 1.09× durability, Armor 6 → 1.33×, Armor 8 → 1.71×, Armor 9 → 1.71×. The core counts fully; every other part counts 75%, because the mech dies when the core does and a sink only helps while hits land on it.
Utility. Stat points and abilities converted with an exchange table (per point, per game): Evasion 1.75, Speed 1.5, Sensors 0.3, E-Def 0.5, Reactor 1.0, head Accuracy 2.0, cap bonus 0.15, Jump 2, Guard 3, free Lock On 2, Smoke 2. Pilots: Gunnery 2.0, Piloting 1.75, Systems 0.8, Initiative 0.5, any Additional Ability 3.0, a bond 1.5.
Current readings
pnpm sim catalog prints the full table. Readings at the v0 numbers (2026-09-05):
| Slot | Median P/wt | Flagged (beyond ±25%) |
|---|---|---|
| Chassis | 4.85 | Light +33% |
| Heads | 1.65 | none |
| Arms | 3.11 | Shield −39% |
| Legs | 1.23 | Light legs +44% |
| Backs | 1.41 | Missile rack +163% |
- Missile rack is the loudest signal: offense 24.8 per game at weight 8, more than a Rifle arm (19.6 at weight 7), with range 10 and Indirect. The Quarry batch agrees: second-highest damage and kills. First tuning candidate.
- Cannon is the least efficient weapon per weight (2.40) while deciding the most games in batches. The model prices its Pen 4 and range 12 but not "one big hit that finishes a core", which the round cap makes valuable. Model gap, not necessarily a rule problem.
- Rifle is the most efficient weapon arm (3.83, +23%). Matches its role as the damage carrier in the terrain batch.
- Shield (−39%) is undervalued: its value is the hits it draws by being Size 5, and the defense term only counts 75% of its effective hit points. Expect this to move when the model learns about hit share.
- Light chassis and Light legs score high per weight because Evasion and Speed are priced at 1.75 and 1.5 per point; the simulator says lights die by round 3 anyway. Either the exchange rates are high or the AI's focus fire is the problem. The sweep will tell.
- Blade (3.43) still rates well at a 0.45 melee uptime that the simulator does not support (about 2% of activations). Waiting on the melee system (F11).
How to use it
- Change a number in the Tuner. Watch P and Δ move on that row before running anything.
- Keep every part within the ±25% band unless it is a deliberate niche (a pure shield, a pure sensor mast). Niches should be flagged in the catalog note, not left to be rediscovered.
- When the model and the simulator disagree, believe the simulator and fix the model: adjust an exchange rate or an uptime curve in
engine/power.ts, note why here.
What it does not know
Positioning, line of sight, who focuses whom, part destruction cascades (an arm that dies takes its weapon with it), pilot ability specifics (all abilities are worth a flat 3), roster synergies, and the round cap's effect on lethality. It is a first-order filter, not a verdict.
Calibration plan
Once sim sweep exists: vary one part's stat across a range, batch each value on the Quarry map, regress win-rate change against the model's predicted power change, and re-fit the exchange rates so a point of Power buys the same win probability whether it comes from armor, evasion or a weapon. Tracked as TASK-017.
Study-01 balance experiment evidence archive
Study-01 balance experiment evidence archive
The archive retains the portable metadata of the TASK-107 balance experiment. The repository excludes the extracted files.
The archive is docs/tuning/evidence-study-01.tar.gz. Its index is docs/tuning/evidence-study-01-index.json.
What the archive holds
The archive holds 59 files at 342,070,366 bytes.
It archives byte for byte every manifest, sidecar, receipt, phase seal, policy artifact, selection artifact, report, frontier output, supplement script, supplement output, and the packager itself.
Archive members drop the directory part of the original path. Each index entry records path for the original location and member for the location inside the archive. Every member sits under study-01/.
The index does not restate or recompute the canonical paths and hashes that sit inside the sealed files. Those stay as they were written.
What the archive excludes, and why
The archive excludes 28 raw replay shards at 2,400,567,157 bytes. Every excluded file has the suffix .jsonl.gz.
Raw replay logs exceed 2 GB compressed. They stay local under out/balance-experiment/study-01/, which is outside version control.
Each excluded shard keeps an index row. That row records the original path, the byte count, the SHA-256, and the receipt path.
The index also records one skipped directory, out/balance-experiment/study-01/selection-proof-cache. It was unfinished and never used.
Metadata alone cannot independently validate full phases without the raw replay logs. The index states this in its own note field. Read a hash-only check as proof that the metadata is intact, not as proof that a phase reproduces.
Verify the archive
Extract the archive from the repository root:
tar -xzf docs/tuning/evidence-study-01.tar.gz
This command recreates study-01/ with the original base names.
Verify the archive before extraction:
shasum -a 256 docs/tuning/evidence-study-01.tar.gz
The result must equal 1d45964a100b19ce354a2cfa6ba1c7d8fc9e976e400c190af1333a92d236c13f from the index. The index records the archive at 8,389,134 bytes.
The two verify recipes the index publishes
The first recipe checks every archived file against the index. Run it from the directory that holds the extracted study-01/:
jq -r '.files[] | select(.included) | "\(.sha256) \(.member)"' docs/tuning/evidence-study-01-index.json | shasum -a 256 -c -
The second recipe checks every excluded raw shard against the index. Run it from the repository root, and only where the raw replay logs are preserved:
jq -r '.files[] | select(.included | not) | "\(.sha256) \(.path)"' docs/tuning/evidence-study-01-index.json | shasum -a 256 -c -
Provenance of the archive itself
The packager is out/balance-experiment/study-01/package-evidence.py, SHA-256 d0127ce436dab9f7ce8464b5d3bee168f13dc4303dc24b3b30435d2fc8bb8bdc. The packager is archived with the evidence.
The command that produced both the archive and the index:
python3 out/balance-experiment/study-01/package-evidence.py --study-dir out/balance-experiment/study-01 --out-tar docs/tuning/evidence-study-01.tar.gz --out-index docs/tuning/evidence-study-01-index.json
The index records five packager checks. Classification, complete inventory, dry run against the real inventory, deterministic tarball, and refusal to overwrite all passed.
The study report that reads this evidence is 2026-09-12-balance-experiment-results.md.
Tuning evidence archive
Tuning evidence archive
The archive retains 751 raw evidence files from the 2026-09-09 studies. The repository excludes the extracted files.
Extract the archive from the repository root before you rerun an analysis script:
tar -xzf docs/tuning/evidence-2026-09-09.tar.gz
This command recreates each original path under docs/tuning/evidence/. Historical reports keep links to those paths.
The index at docs/tuning/evidence-archive-index.json records the archive SHA-256, byte count, and every archived file. Each file entry records its original path, byte count, and SHA-256.
Verify the archive before extraction:
shasum -a 256 docs/tuning/evidence-2026-09-09.tar.gz
The result must equal 075a5d53f34d5f7bffc304ebe2c5f4ad6da16d2732ec35d71017ce8cfcea1c10 from the index.
Verify every extracted file from the repository root:
jq -r '.files[] | "\(.sha256) \(.path)"' docs/tuning/evidence-archive-index.json | shasum -a 256 -c -
Weapon skills measurement — 2026-09-15
Weapon skills measurement — 2026-09-15
What was tested
TASK-111 asks whether a named skill per weapon gives the three identical lance packages a distinct identity. The simulator gained an opt-in rule weaponSkills. The rule text is the proposal in the weapon skills design note. The runs used the weapon-skills worktree on commit 3943cae. The flag defaults to false. No rulebook text, no GDD text and no catalog value changed.
The flag turns on one Charge track per mech, F11.9, and five named skills.
- F11.10 Phial Discharge, on the Capacitor charge blade.
- F11.11 Amp, on the Breaker switch axe.
- F11.12 Shelling and Wyvern's Fire, on the Breach gunlance.
- F11.13 Extracts, on the Relay insect glaive.
- F11.14 Counter, on the Bulwark guard lance.
The measurement forced two refinements to the rules. A Charge-spending form change is free, and it is part of the strike. A spend form entered that way reverts when the exchange ends.
The measurement forced two corrections to the bot. The gunlance no longer parks in Shell form. The bot uses Shelling only when no exchange is possible.
Rosters
Every roster is an inline build list. The two melee rosters play side A. The four opponents play side B. The shell variables below name them in the commands further down.
TRANSFORMERS='medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:vex:gunlance:-,medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:ilse:switch-axe:-,medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:ruko:charge-blade:-'
NEW_MELEE='medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:vex:dual-knife:dual-knife,medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:ilse:greatblade:-,medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:ruko:guard-lance:-'
LEGACY_LIGHT='medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:vex:rifle:shield,medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:ilse:cannon:-,medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:ruko:blade:shield'
LEGACY_HEAVY='light:sensor-head:rifle-arm:pulse-arm:light-legs:sensor-mast:vex:-:-,medium:standard-head:autocannon-arm:rifle-arm:standard-legs:missile-rack:ilse:-:-,heavy:armored-head:cannon-arm:shield-arm:heavy-legs:reactor-booster:ruko:-:-'
NEW_RANGED='medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:vex:light-bowgun:shield,medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:ilse:bow:-,medium:standard-head:autocannon-arm:autocannon-arm:standard-legs:bare-back:ruko:heavy-bowgun:-'
LIGHT_DUELISTS='light:targeting-head:blade-arm:blade-arm:sprint-legs:bare-back:vex:dual-knife:dual-knife,light:targeting-head:blade-arm:blade-arm:sprint-legs:bare-back:ilse:greatblade:-,light:targeting-head:blade-arm:blade-arm:sprint-legs:bare-back:ruko:hammer:-'
These are the study inline builds. LEGACY_LIGHT and LEGACY_HEAVY are not the courier,foreman,reaver and bastion,foreman,courier kits.
No roster fields the Relay insect glaive. F11.13 Extracts is therefore unmeasured.
Results
The tables below come from a machine pass over the 60 JSON files the runs wrote. One file holds one cell.
Job 1 is 48 grid runs. Each grid sweeps aggression 0.5, 0.75 and 1.0 on both sides, at the default grid n of 600 games per cell. A grid always plays both sides, so every win rate is a both-sides mean. "A Win % at eq" is side A's win rate at the equilibrium the CLI reported. A blank cell means the grid reported no equilibrium. The Δ column subtracts the flag-off win rate from the flag-on win rate at the first equilibrium of each. It is blank when either condition has no equilibrium.
Job 2 is 12 mirror runs at n 1000 with --both-sides. Both sides field the same roster, so 50 percent is true by construction. The mirrors serve one purpose. They show that the flag breaks no self-symmetry, and that mean rounds barely move.
================================================================================================================================================================
JOB 1: GRID EQUILIBRIUM ANALYSES (48 runs)
================================================================================================================================================================
A B Map Flag Equilibria (agg_A,agg_B) A Win % at eq Δ (on-off)%
----------------------------------------------------------------------------------------------------------------------------------------------------------------
new-melee legacy-heavy causeway off (1.00,0.50) 94.5 +4.3
on (1.00,0.50) 98.8
new-melee legacy-heavy foundry off (0.50,0.50); (0.75,0.50) 96.2; 96.2 +3.3
on (0.75,0.50) 99.5
new-melee legacy-heavy quarry off (1.00,0.50) 89.5 +4.2
on (0.75,0.50) 93.7
new-melee legacy-light causeway off (0.75,0.50) 62.8 +6.0
on (1.00,0.50) 68.8
new-melee legacy-light foundry off
on
new-melee legacy-light quarry off (0.75,0.50) 19.0 +14.2
on (1.00,0.50) 33.2
new-melee light-duelists causeway off (0.50,0.75); (0.75,0.75); (1.00,0.75) 1.5; 1.5; 1.5 +0.3
on (0.75,1.00) 1.8
new-melee light-duelists foundry off (0.50,0.75) 1.2 +0.5
on (0.75,0.75) 1.7
new-melee light-duelists quarry off (0.50,0.75) 1.5 +2.7
on (1.00,0.75) 4.2
new-melee new-ranged causeway off (0.75,0.50) 57.0 +2.3
on (0.75,0.50) 59.3
new-melee new-ranged foundry off
on (1.00,0.50) 63.5
new-melee new-ranged quarry off (0.75,0.50) 8.0 +3.3
on (0.75,0.50) 11.3
transformers legacy-heavy causeway off (1.00,0.50) 93.2 -0.3
on (1.00,0.50) 92.8
transformers legacy-heavy foundry off (0.50,0.50) 95.2 +0.8
on (0.50,0.50) 96.0
transformers legacy-heavy quarry off (0.75,0.50) 87.0
on
transformers legacy-light causeway off (0.75,0.50) 44.2 -2.7
on (0.75,0.50) 41.5
transformers legacy-light foundry off
on
transformers legacy-light quarry off (0.75,0.50) 13.8
on
transformers light-duelists causeway off (0.50,1.00); (0.75,1.00); (1.00,1.00) 0.0; 0.0; 0.0 +4.8
on (1.00,1.00) 4.8
transformers light-duelists foundry off (0.50,1.00); (0.75,1.00); (1.00,1.00) 0.0; 0.0; 0.0 +3.3
on (0.50,1.00) 3.3
transformers light-duelists quarry off (0.50,0.75); (0.50,1.00); (1.00,0.75); (1.00,1.00) 0.3; 0.3; 0.3; 0.3 +7.5
on (0.50,0.75) 7.8
transformers new-ranged causeway off (0.75,0.50) 51.3 -1.2
on (0.75,0.50) 50.2
transformers new-ranged foundry off
on
transformers new-ranged quarry off (0.75,0.50); (1.00,0.50) 4.5; 4.5 +1.0
on (0.75,0.50) 5.5
==============================================================================================================
JOB 2: MIRROR BATCHES (12 runs, --both-sides flag, mean win rate from both orientations)
==============================================================================================================
Roster Map Flag A Win % Mean Rounds
--------------------------------------------------------------------------------------------------------------
new-melee causeway off 50.0 6.23
on 50.0 5.93
new-melee foundry off 50.0 5.45
on 50.0 5.53
new-melee quarry off 50.0 7.00
on 50.0 6.93
transformers causeway off 50.0 6.02
on 50.0 5.92
transformers foundry off 50.0 5.33
on 50.0 5.33
transformers quarry off 49.9 6.99
on 49.9 6.98
Diagnostic history
Five conditions ran on the way to the tables above. Each one is the transformers roster against the courier,foreman,reaver kit, on Quarry, both-sides.
| Condition | Transformers win |
|---|---|
| Flag off | 71.0% |
| Flag on, first build | 36.2% |
| After the bot form fix | 64.0% |
| After the revert | 68.0% |
| After the Shelling gate | 68.7% |
Per-mech survival tells the same story. The gunlance fell to 7.0 percent survival when it parked in Shell form, and it returned to 73.7 percent. The charge blade read 59.3 percent with the spend form persisting, and 66.3 percent after the revert. The switch axe read 13 to 17 percent in every condition. It is the roster's designated casualty.
The reading
The abilities work as mechanics. They cost nothing when the flag is off.
Counter is a clear gain for the guard lance roster. It adds +3 to +14 points against every opponent the roster can fight.
The transforming roster is flat against the teams it already beat. Against light duelists it goes from about 0 to 3 to 8.
Both melee rosters still lose in the same two places. They lose to light duelists at 1 to 4 percent. They lose to new ranged on Quarry at 5 to 11 percent.
The transforming roster's weakness is not the identity of its weapons. The weakness is the melee approach problem and the light duelist build.
Caveats
The bot policy for the skills is a first heuristic. A better policy moves every number in these tables.
Amp is idle. The switch axe dies first in every condition.
The +1 Amp die cannot apply to a form entered by the free change. F11.1 rolls the pool before the strike is declared.
Every number here is provisional. The owner adopted the skills for identity on 2026-09-15, and the numbers stay provisional.
Exact commands
Forty-eight grids and twelve mirrors ran. The pattern and one full example of each follow. The roster variables are the ones defined above.
# 48 grids: two melee rosters as A, four opponents as B, three maps, flag off and flag on
pnpm sim grid --a "$A" --b "$B" --map <quarry|causeway|foundry> [--rule weaponSkills=true] --json <out>.json
pnpm sim grid --a "$TRANSFORMERS" --b "$LEGACY_LIGHT" --map quarry --rule weaponSkills=true --json grid-transformers-legacy-light-quarry-on.json
# 12 mirrors: two melee rosters, three maps, flag off and flag on
pnpm sim batch --a "$ROSTER" --b "$ROSTER" --both-sides --map <quarry|causeway|foundry> -n 1000 [--rule weaponSkills=true] --json <out>.json
pnpm sim batch --a "$TRANSFORMERS" --b "$TRANSFORMERS" --both-sides --map quarry -n 1000 --json mirror-transformers-quarry-off.json
Register
Register row T73 carries this finding. It is resolved 2026-09-15, as adopted for identity with provisional numbers. See the adoption note.
Turn order experiment — 2026-09-15
Turn order experiment — 2026-09-15
What was tested
TASK-110 asks whether E2 is the right turn order. The simulator gained an opt-in rule activationOrder with four values. All four ran on the same rosters, the same maps and the same seeds.
alternateis today's E2 and the default. The first placer opens. The players alternate one mech at a time. A side with no mechs left yields the rest. The next round opens with the opponent of the last activation.alternate-openeris E2, except the round opener alternates strictly. The side that opened the last round does not open the next one.initiativegives every mech one d20, plus its pilot Initiative from D1, minus its Weight divided by 10 and rounded down. The roll happens once per game. Mechs act in descending total. Ties go to the lighter mech, then to the higher pilot Initiative, then to side A.initiative-rounduses the same roll and the same tie-breaks. It rerolls at the start of every round.
The runs used an uncommitted tree on commit 3943cae. At the time of the runs only alternate was a rule, and the other three values were experiments. The owner adopted initiative on 2026-09-15, so E2 now carries it; alternate-opener and initiative-round remain experiments.
The tables below come from a machine-captured rerun. They passed the consistency checks the capture carries. They replace the first report's tables, which were scrambled in several rows.
Legacy pair grids
Side A is the light roster courier,foreman,reaver. Side B is the heavy roster bastion,foreman,courier. Each cell is a pnpm sim grid run at the default grid n. "Equilibrium" is the aggression pair the CLI reported, written as A over B. "A win" is A's win rate at that equilibrium. Where a grid found no equilibrium, the table gives the range over the grid instead. "First mover" is the win rate of the side that took the first activation. "Sweeps" counts rounds per game in which one side took three activations before the other took any. "Runs of three" counts rounds per game in which one side took three consecutive activations anywhere in the round.
| Rule | Map | Equilibrium | A win | First mover | Sweeps/game | Runs of three/game |
|---|---|---|---|---|---|---|
alternate |
Quarry | 0.75 / 0.75 | 47.0% | 49.7% | 0 | 0.145 |
alternate |
Causeway | 0.75 / 0.5 | 50.3% | 32.0% | 0 | 0.272 |
alternate |
Foundry | none | 48.7%–61.8% | — | — | — |
alternate-opener |
Quarry | 0.75 / 0.75 | 47.8% | 44.8% | 0 | 0.085 |
alternate-opener |
Causeway | 0.75 / 0.5 | 42.5% | 67.5% | 0 | 0.168 |
alternate-opener |
Foundry | 1 / 1 | 60.8% | 47.2% | 0 | 0.073 |
initiative |
Quarry | 0.75 / 0.75 | 53.3% | 50.8% | 0.538 | 1.037 |
initiative |
Causeway | 0.75 / 0.5 | 49.5% | 45.0% | 0.518 | 1.130 |
initiative |
Foundry | none | 50.2%–62.5% | — | — | — |
initiative-round |
Quarry | none | 43.5%–59.5% | — | — | — |
initiative-round |
Causeway | 0.75 / 0.5 | 45.7% | 49.8% | 0.528 | 1.178 |
initiative-round |
Foundry | none | 54.2%–67.7% | — | — | — |
Mirrors
Each cell is a pnpm sim batch run with --first-side A. The two legacy mirrors ran at n=1000. The light melee mirror ran at n=500. Both sides field the same roster, so A's win rate is the whole first-mover advantage under the two alternating rules. Under the two initiative rules --first-side has no effect, because the dice decide who opens. There the "A win" and "First mover" columns separate. "Rounds" is the mean game length.
Legacy Light is courier,foreman,reaver. Legacy Heavy is bastion,foreman,courier. Light melee is three light:targeting-head:blade-arm:blade-arm:sprint-legs:bare-back builds.
| Mirror | Map | Rule | A win | First mover | Sweeps/game | Runs of three/game | Rounds |
|---|---|---|---|---|---|---|---|
| Legacy Light | Quarry | alternate |
49.6% | 49.6% | 0 | 0.072 | 5.1 |
| Legacy Light | Quarry | alternate-opener |
46.8% | 46.8% | 0 | 0.051 | 5.0 |
| Legacy Light | Quarry | initiative |
51.3% | 55.3% | 0.496 | 0.919 | 5.1 |
| Legacy Light | Quarry | initiative-round |
48.9% | 49.7% | 0.385 | 0.895 | 5.1 |
| Legacy Light | Causeway | alternate |
52.6% | 52.6% | 0 | 0.093 | 5.2 |
| Legacy Light | Causeway | alternate-opener |
49.6% | 49.6% | 0 | 0.095 | 5.3 |
| Legacy Light | Causeway | initiative |
50.1% | 46.5% | 0.364 | 0.876 | 5.0 |
| Legacy Light | Causeway | initiative-round |
50.1% | 48.5% | 0.400 | 0.960 | 5.2 |
| Legacy Light | Foundry | alternate |
46.8% | 46.8% | 0 | 0.105 | 5.5 |
| Legacy Light | Foundry | alternate-opener |
39.0% | 39.0% | 0 | 0.030 | 5.2 |
| Legacy Light | Foundry | initiative |
52.0% | 57.0% | 0.370 | 0.930 | 5.3 |
| Legacy Light | Foundry | initiative-round |
51.2% | 53.2% | 0.373 | 0.940 | 5.3 |
| Legacy Heavy | Quarry | alternate |
69.5% | 69.5% | 0 | 0.055 | 6.7 |
| Legacy Heavy | Quarry | alternate-opener |
51.0% | 51.0% | 0 | 0.057 | 6.5 |
| Legacy Heavy | Quarry | initiative |
49.1% | 61.4% | 0.492 | 0.935 | 6.3 |
| Legacy Heavy | Quarry | initiative-round |
48.1% | 58.8% | 0.392 | 0.908 | 6.4 |
| Legacy Heavy | Causeway | alternate |
40.9% | 40.9% | 0 | 0.657 | 6.6 |
| Legacy Heavy | Causeway | alternate-opener |
62.8% | 62.8% | 0 | 0.157 | 6.6 |
| Legacy Heavy | Causeway | initiative |
51.9% | 36.6% | 0.549 | 1.266 | 6.6 |
| Legacy Heavy | Causeway | initiative-round |
50.3% | 46.5% | 0.553 | 1.242 | 6.6 |
| Legacy Heavy | Foundry | alternate |
59.8% | 59.8% | 0 | 0.026 | 6.9 |
| Legacy Heavy | Foundry | alternate-opener |
47.3% | 47.3% | 0 | 0.235 | 6.7 |
| Legacy Heavy | Foundry | initiative |
54.3% | 57.4% | 0.473 | 1.018 | 6.8 |
| Legacy Heavy | Foundry | initiative-round |
50.4% | 47.1% | 0.534 | 1.146 | 6.8 |
| Light melee | Quarry | alternate |
44.4% | 44.4% | 0 | 0.014 | 3.0 |
| Light melee | Quarry | alternate-opener |
49.8% | 49.8% | 0 | 0.012 | 3.2 |
| Light melee | Quarry | initiative |
50.8% | 50.4% | 0.214 | 0.556 | 3.0 |
| Light melee | Quarry | initiative-round |
50.4% | 49.6% | 0.258 | 0.632 | 3.1 |
| Light melee | Causeway | alternate |
61.4% | 61.4% | 0 | 0.026 | 3.2 |
| Light melee | Causeway | alternate-opener |
55.6% | 55.6% | 0 | 0.010 | 3.1 |
| Light melee | Causeway | initiative |
49.8% | 43.8% | 0.256 | 0.614 | 3.2 |
| Light melee | Causeway | initiative-round |
47.8% | 50.6% | 0.254 | 0.672 | 3.2 |
| Light melee | Foundry | alternate |
57.6% | 57.6% | 0 | 0.010 | 3.1 |
| Light melee | Foundry | alternate-opener |
52.2% | 52.2% | 0 | 0.010 | 3.2 |
| Light melee | Foundry | initiative |
53.0% | 49.4% | 0.246 | 0.638 | 3.3 |
| Light melee | Foundry | initiative-round |
52.2% | 50.2% | 0.234 | 0.632 | 3.4 |
Under alternate and alternate-opener the sweep count is 0 by construction. Both sides hold a living mech at every round start, so the first two activations of a round are always on opposite sides. engine/activation-order.test.ts proves it. Runs of three is therefore the metric that separates the two alternating rules.
The reading
Today's rule swings mirrors by up to 20 points. The heavy mirror reads 69.5% for side A on Quarry, 40.9% on Causeway and 59.8% on Foundry. The light melee mirror reads 61.4% on Causeway. The turn order decides those cells, not the rosters.
alternate-opener does not fix fairness. It moves it. The heavy mirror on Causeway goes to 62.8%, and the legacy light mirror on Foundry reads 39.0%.
initiative and initiative-round read even in all nine mirror cells, from 47.8% to 54.3%. They cost about half a sweep round per game in the two legacy mirrors and about a quarter in the light melee mirror. They cost about one run of three per game, against 0.01 to 0.66 today.
In the light-versus-heavy pair initiative reads 53.3% on Quarry and 49.5% on Causeway. Today's rule reads 47.0% and 50.3% on the same two maps.
Caveats
The "light melee" mirror is not the study roster. The study roster's weapons were not expressible on the CLI. The run used three light:targeting-head:blade-arm:blade-arm:sprint-legs:bare-back builds instead.
Both initiative rules break their last tie toward side A. That is a fixed bias, not a die.
The light melee mirror ran at n=500 and the two legacy mirrors at n=1000. The grids ran at the default grid n. Differences under about 3 points are noise, and more than that in the light melee cells.
Exact commands
Twelve grids and 36 mirrors ran. The pattern and one full example of each follow.
# 12 grids: the legacy pair, each map, each rule value
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map <quarry|causeway|foundry> --rule activationOrder=<alternate|alternate-opener|initiative|initiative-round>
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map quarry --rule activationOrder=alternate
# 36 mirrors: three rosters, each map, each rule value; n=1000 for the legacy rosters, n=500 for light melee
pnpm sim batch --a <roster> --b <roster> --map <map> -n <1000|500> --first-side A --rule activationOrder=<value>
pnpm sim batch --a courier,foreman,reaver --b courier,foreman,reaver --map quarry -n 1000 --first-side A --rule activationOrder=alternate
# the three mirror rosters
# courier,foreman,reaver
# bastion,foreman,courier
# three of light:targeting-head:blade-arm:blade-arm:sprint-legs:bare-back:<vex|ilse|ruko>
Open recommendation
Initiative buys evenness and sells alternation. Three points follow for the owner.
initiative rolls once per game. Its last tie-break is side A, so an adopted rule needs a die there instead.
The pile-on is real. Runs of three rise to about one per game, from 0.01 to 0.66 today. An adopted rule must state that one side can take three turns in a row.
The hybrid is untested. Roll initiative, the winner activates first, then alternate. That keeps the first mover on a die and holds alternation, so it drops the pile-on. It is the candidate to measure next.
Register
Register row T71 is resolved 2026-09-15. The owner adopted initiative as E2. See the adoption note.
Weapon skills adoption — 2026-09-15
Weapon skills adoption — 2026-09-15
Owner decision
New games use one Charge track per mech and five named weapon skills (F11.9 to F11.14).
- F11.9 Charge. One track per mech, 0 to 3. It persists through activations, rounds and exchanges. It is not Heat.
- F11.10 Phial Discharge, on the Capacitor charge blade. Blade form stores Charge. Axe form spends all of it for +1 Pen and +1d6 damage per Charge.
- F11.11 Amp, on the Breaker switch axe. Axe form stores Charge. Sword form gets +1 Melee die while Charge is 1 or more, and a strike spends 1 Charge for +2 damage.
- F11.12 Shelling and Wyvern's Fire, on the Breach gunlance. Shelling is a Quick action at range 1 to 2 that always penetrates for 2d6 and never crits. Each parry in Lance form adds 1 Charge. At 3 Charge, Wyvern's Fire is a Full action at range 1 to 2, Pen 6, 3d6.
- F11.13 Extracts, on the Relay insect glaive. Each Drone form hit harvests an extract from the location it strikes.
- F11.14 Counter, on the Bulwark guard lance. A parry that cancels a strike makes one free strike at the attacker.
A form change that spends Charge is free, and it is part of declaring the strike. The transformation is the attack. That form lasts for the exchange, then the weapon reverts at no action cost. Every other form change still costs the Quick action of E4 (E4, F11.9).
The Discharge axe form of the Capacitor charge blade is removed. The rule text is the weapon skills design note, moved into the rulebook as F11.9 to F11.14. The engine default weaponSkills moves from false to true.
The adoption is for identity, not for balance. Every number in these rules is provisional.
Why identity
Three of the fifteen exchange packages of the TASK-107 study were one fixture profile. guard-lance:standard, gunlance:lance and charge-blade:blade all print Guard, 2 Melee dice, Parry cost 1, Accuracy 2, Pen 3, 2d6 damage and Heat 0. They returned role-matched identical results against every other opponent and against each other, on all 29 metrics. Their mirror cells agreed as well: all three read initiator death 0.070 against defender death 0.035. The exchange round robin therefore held 13 distinct melee profiles, not 15, and any ranking that listed them separately triple-counted one profile. That is the finding this adoption answers (register T64).
Evidence
The evidence is the weapon skills measurement. Every number below is copied from that note. The runs used the weapon-skills worktree on commit 3943cae.
Grid equilibria
Job 1 is 48 grid runs, at the default grid n of 600 games per cell. Each grid sweeps aggression 0.5, 0.75 and 1.0 on both sides, and a grid always plays every cell from both sides of the board, so every win rate is a both-sides mean read at the grid's equilibrium. A blank cell means the grid reported no equilibrium. Δ subtracts the flag-off win rate from the flag-on win rate at the first equilibrium of each, and it is blank when either condition has no equilibrium.
| A | B | Map | Off: equilibria | Off: A win | On: equilibria | On: A win | Δ |
|---|---|---|---|---|---|---|---|
| new-melee | legacy-heavy | causeway | (1.00,0.50) | 94.5 | (1.00,0.50) | 98.8 | +4.3 |
| new-melee | legacy-heavy | foundry | (0.50,0.50); (0.75,0.50) | 96.2; 96.2 | (0.75,0.50) | 99.5 | +3.3 |
| new-melee | legacy-heavy | quarry | (1.00,0.50) | 89.5 | (0.75,0.50) | 93.7 | +4.2 |
| new-melee | legacy-light | causeway | (0.75,0.50) | 62.8 | (1.00,0.50) | 68.8 | +6.0 |
| new-melee | legacy-light | foundry | — | — | — | — | — |
| new-melee | legacy-light | quarry | (0.75,0.50) | 19.0 | (1.00,0.50) | 33.2 | +14.2 |
| new-melee | light-duelists | causeway | (0.50,0.75); (0.75,0.75); (1.00,0.75) | 1.5; 1.5; 1.5 | (0.75,1.00) | 1.8 | +0.3 |
| new-melee | light-duelists | foundry | (0.50,0.75) | 1.2 | (0.75,0.75) | 1.7 | +0.5 |
| new-melee | light-duelists | quarry | (0.50,0.75) | 1.5 | (1.00,0.75) | 4.2 | +2.7 |
| new-melee | new-ranged | causeway | (0.75,0.50) | 57.0 | (0.75,0.50) | 59.3 | +2.3 |
| new-melee | new-ranged | foundry | — | — | (1.00,0.50) | 63.5 | — |
| new-melee | new-ranged | quarry | (0.75,0.50) | 8.0 | (0.75,0.50) | 11.3 | +3.3 |
| transformers | legacy-heavy | causeway | (1.00,0.50) | 93.2 | (1.00,0.50) | 92.8 | −0.3 |
| transformers | legacy-heavy | foundry | (0.50,0.50) | 95.2 | (0.50,0.50) | 96.0 | +0.8 |
| transformers | legacy-heavy | quarry | (0.75,0.50) | 87.0 | — | — | — |
| transformers | legacy-light | causeway | (0.75,0.50) | 44.2 | (0.75,0.50) | 41.5 | −2.7 |
| transformers | legacy-light | foundry | — | — | — | — | — |
| transformers | legacy-light | quarry | (0.75,0.50) | 13.8 | — | — | — |
| transformers | light-duelists | causeway | (0.50,1.00); (0.75,1.00); (1.00,1.00) | 0.0; 0.0; 0.0 | (1.00,1.00) | 4.8 | +4.8 |
| transformers | light-duelists | foundry | (0.50,1.00); (0.75,1.00); (1.00,1.00) | 0.0; 0.0; 0.0 | (0.50,1.00) | 3.3 | +3.3 |
| transformers | light-duelists | quarry | (0.50,0.75); (0.50,1.00); (1.00,0.75); (1.00,1.00) | 0.3; 0.3; 0.3; 0.3 | (0.50,0.75) | 7.8 | +7.5 |
| transformers | new-ranged | causeway | (0.75,0.50) | 51.3 | (0.75,0.50) | 50.2 | −1.2 |
| transformers | new-ranged | foundry | — | — | — | — | — |
| transformers | new-ranged | quarry | (0.75,0.50); (1.00,0.50) | 4.5; 4.5 | (0.75,0.50) | 5.5 | +1.0 |
new-melee is the guard lance roster. transformers is the gunlance, switch axe and charge blade roster. Every roster is an inline build list; the measurement prints each one.
Mirrors
Job 2 is 12 mirror runs at n=1000 with --both-sides. Both sides field the same roster, so 50 percent is true by construction. The mirrors show that the flag breaks no self-symmetry, and that mean rounds barely move.
| Roster | Map | Flag | A win | Mean rounds |
|---|---|---|---|---|
| new-melee | causeway | off | 50.0 | 6.23 |
| new-melee | causeway | on | 50.0 | 5.93 |
| new-melee | foundry | off | 50.0 | 5.45 |
| new-melee | foundry | on | 50.0 | 5.53 |
| new-melee | quarry | off | 50.0 | 7.00 |
| new-melee | quarry | on | 50.0 | 6.93 |
| transformers | causeway | off | 50.0 | 6.02 |
| transformers | causeway | on | 50.0 | 5.92 |
| transformers | foundry | off | 50.0 | 5.33 |
| transformers | foundry | on | 50.0 | 5.33 |
| transformers | quarry | off | 49.9 | 6.99 |
| transformers | quarry | on | 49.9 | 6.98 |
Diagnostic history
Five conditions ran on the way to the tables above. Each one is the transformers roster against the courier,foreman,reaver kit, on Quarry, both-sides.
| Condition | Transformers win |
|---|---|
| Flag off | 71.0% |
| Flag on, first build | 36.2% |
| After the bot form fix | 64.0% |
| After the revert | 68.0% |
| After the Shelling gate | 68.7% |
The measurement forced two rule refinements, and the rulebook carries both. A Charge-spending form change is free and is part of the strike. A spend form entered that way reverts when the exchange ends. Under E3 a Full action uses both Quick actions, so a paid form change forfeits the melee exchange of that activation, and the spend forms were unreachable at a profit without the refinement. The gunlance fell to 7.0 percent survival when the bot parked it in Shell form, and returned to 73.7 percent. The charge blade read 59.3 percent survival with the spend form persisting, and 66.3 percent after the revert.
The reading
The abilities work as mechanics. They cost nothing when the flag is off.
Counter is a clear gain for the guard lance roster. It adds +3 to +14 points against every opponent the roster can fight.
The transforming roster is flat against the teams it already beat. Against light duelists it goes from about 0 to 3 to 8.
Both melee rosters still lose in the same two places. They lose to light duelists at 1 to 4 percent. They lose to new ranged on Quarry at 5 to 11 percent.
The transforming roster's weakness is not the identity of its weapons. The weakness is the melee approach problem and the light duelist build. Those two are the next balance targets. The light duelist build is also the reordering that T69 found.
Exact commands
Forty-eight grids and twelve mirrors ran. The pattern and one full example of each follow. The roster variables are the inline build lists in the measurement.
# 48 grids: two melee rosters as A, four opponents as B, three maps, flag off and flag on
pnpm sim grid --a "$A" --b "$B" --map <quarry|causeway|foundry> [--rule weaponSkills=true] --json <out>.json
pnpm sim grid --a "$TRANSFORMERS" --b "$LEGACY_LIGHT" --map quarry --rule weaponSkills=true --json grid-transformers-legacy-light-quarry-on.json
# 12 mirrors: two melee rosters, three maps, flag off and flag on
pnpm sim batch --a "$ROSTER" --b "$ROSTER" --both-sides --map <quarry|causeway|foundry> -n 1000 [--rule weaponSkills=true] --json <out>.json
pnpm sim batch --a "$TRANSFORMERS" --b "$TRANSFORMERS" --both-sides --map quarry -n 1000 --json mirror-transformers-quarry-off.json
Legacy pair re-baseline
The legacy tuning pair was re-baselined under the adopted defaults, with Initiative and the weapon skills both live. A is the light roster courier,foreman,reaver. B is the heavy roster bastion,foreman,courier. Read from both sides at the grid equilibrium, on the dirty tree at commit 6f63dbe, it gives Quarry 52.2% at A 0.75 / B 0.75, Causeway 49.7% at A 0.75 / B 0.5, and no equilibrium on Foundry over a 44.2% to 55.0% range. The same grids under Initiative with the weapon skills off read 53.3% and 49.5% and no equilibrium. The skills move the legacy pair by nothing outside noise, because the kits carry no skill weapons. The full table is in the initiative adoption note.
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map <quarry|causeway|foundry>
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map quarry
Caveats
The adoption is for identity. It is not a balance fix. The measurement does not close either loss. Both melee rosters still lose to light duelists and to new ranged on Quarry.
F11.13 Extracts is unmeasured. No roster in the measurement fields the Relay insect glaive.
Amp is idle in the data. The switch axe reads 13 to 17 percent survival in every condition. It is the roster's designated casualty, so F11.11 rarely fires.
The +1 Amp die cannot apply to a form entered by the free change. F11.1 rolls the pool before the strike is declared. A check at each strike is the alternative, and it is not adopted.
The bot policy for the skills is a first heuristic. A better policy moves every number in these tables.
Removing the Discharge form changes the role and the price of the Capacitor charge blade. Its Weight of 10 is unchanged.
Every number in F11.9 to F11.14 is provisional. The Pen, the damage dice, the Heat, the cap of 3 and the extract values all wait for a confirmation-grade run.
Register
Row T73 is resolved 2026-09-15 with this adoption, as adopted for identity with provisional numbers. Row T64 gains the clause that the three identical packages are now distinct under F11.9 to F11.14.
Melee opportunity target number 10 adoption — 2026-09-15
Melee opportunity target number 10 adoption — 2026-09-15
Owner decision
New games use a common melee opportunity target number (F11.1).
- Before: an opportunity die succeeded on a total at least equal to the current Evasion of the opponent.
- After: the target number is 10, plus the current Evasion of the opponent, minus its Evasion from C7.
The subtracted quantity is the C7 Evasion of the opponent: its undamaged standing value from chassis, legs and Piloting. A fresh, standing opponent therefore has a target number of 10. Every modifier that changes current Evasion moves the target number. Prone and a destroyed Legs part are examples. The Bastion of the rulebook's worked example has Evasion 6 from C7: standing and undamaged its target number is 10, and Prone it is 7.
In engine terms the threshold is 10 + (current Evasion − C7 Evasion), and the engine default meleeOpportunityTarget moves from undefined to 10.
The shield threshold of 8 is unchanged (F11.6). No pool count, parry cost, Charge rule, weapon profile or catalog value changes in this adoption.
This is the tn10 condition of the TASK-107 balance study. It is the only candidate that confirmed.
Evidence
The evidence is the confirmation phase of study 01. Every number below comes from the balance experiment results and its report file out/balance-experiment/study-01/confirmation.json.confirmation.report.json.
Confirmation ran three conditions on 16 fresh seed blocks, seeds 230000 through 230015. Each condition played 5,376 games, for 16,128 rows. Each condition covers 84 matchup cells at 64 games each. Each arm used its own trained aggression policy. The preregistered metric is roster payoff spread: the maximum minus the minimum of the seven roster means. Smaller is more even.
| Condition | Spread | Paired difference from control | ci95 | Blocks |
|---|---|---|---|---|
control |
57.99 pp | 0.00 pp | [0.00, 0.00] | 16 |
tn10 |
48.35 pp | −9.64 pp | [−14.41, −3.99] | 16 |
The interval excludes zero in the smaller-is-better direction. The screen predicted −8.33 pp. Confirmation gives −9.64 pp on fresh seeds and its own trained policy. Direction and size both replicate.
Roster means. Each mean is the roster's payoff share over six distinct opponents and three maps, mirrors excluded. Each column sums to 350.00 pp.
| Roster | Control | tn10 |
Change |
|---|---|---|---|
| legacy | 52.60 pp | 53.13 pp | +0.52 pp |
| new-ranged | 59.98 pp | 67.80 pp | +7.81 pp |
| new-melee | 29.17 pp | 30.47 pp | +1.30 pp |
| transformers | 15.97 pp | 19.44 pp | +3.47 pp |
| mobile | 52.86 pp | 50.95 pp | −1.91 pp |
| heavy-anchor | 65.45 pp | 61.98 pp | −3.47 pp |
| light-duelists | 73.96 pp | 66.23 pp | −7.73 pp |
No per-roster interval exists. The confirmation report holds no roster block. These means and their changes are point estimates. The finest paired intervals in the file are the 84 matchup cells.
tn10 compresses by reordering, not by a uniform squeeze. The floor rises 3.47 pp. The ceiling falls 7.73 pp, and new-ranged replaces light-duelists as the top roster at 67.80 pp.
Exact command
The confirmation shard command, as the results document quotes it:
pnpm exec tsx cli/balance-experiment.ts run --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json' --phase confirmation --shard 0 --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json.confirmation.0.jsonl.gz'
Shards 1 to 3 repeat that command with --shard 1, --shard 2 and --shard 3. The seal and report commands for the phase are in the balance experiment results.
Legacy pair re-baseline
The study ran on its own seven rosters. The legacy tuning pair is separate, so it was re-baselined under the adopted default. A is the light roster courier,foreman,reaver. B is the heavy roster bastion,foreman,courier. Each map ran twice: once under the adopted default of 10, and once with --rule meleeOpportunityTarget=null for the pre-adoption threshold. Both runs used the default n. The tree was dirty at commit e26d8ee.
Each number is A's win rate at the equilibrium the CLI printed.
| Map | Default 10 | Equilibrium | meleeOpportunityTarget=null |
Equilibrium |
|---|---|---|---|---|
| Quarry | 47.0% | A 0.75 / B 0.75 | no equilibrium | — |
| Causeway | 50.3% | A 0.75 / B 0.5 | 52.3% | A 0.75 / B 0.5 |
| Foundry | no equilibrium | — | no equilibrium | — |
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map quarry
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map quarry --rule meleeOpportunityTarget=null
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map causeway
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map causeway --rule meleeOpportunityTarget=null
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map foundry
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map foundry --rule meleeOpportunityTarget=null
Within the resolution of this run the legacy pair is unchanged in band. Causeway moves 2 pp toward the heavy roster. Quarry gains an equilibrium that the old threshold lacked. Foundry has no equilibrium under either setting, so it gives no verdict.
Caveats
The change evens the field through defence and reordering, not through melee lethality. Parries rise +3.029 per game [+2.696, +3.389], shield parries +0.435 [+0.358, +0.511], melee starts +0.262 [+0.180, +0.346], and heat added falls −0.357 [−0.565, −0.153]. Wipes and part disables are flat. In the isolates, 256 blocks, no exchange lethality interval excludes zero, and the class panel closes the 22.8 pp light-versus-heavy death gap by killing Heavies less. tn10 does not make closing distance more lethal. It does not by itself meet that design goal.
The bot's melee valuation does not model the target number. The protocol states this limit: the attack valuation is a legacy single-profile approximation, and it does not model the common-TN or Piloting-pool toggles. The complete exchange applies both toggles, but the bot chooses its attacks without them. Every result above therefore rests on a declared bot grid. It carries no human-counterplay or optimal-play claim. This limit is tracked under TASK-108.
Register
Row T69 is resolved 2026-09-15 with this adoption.
Initiative activation order adoption — 2026-09-15
Initiative activation order adoption — 2026-09-15
Owner decision
New games use a weight-based Initiative order (E2).
- Before: alternation continued from deployment. The player who placed first took the first activation. The players then alternated one mech at a time, and the next round started with the opponent of the last activation. No die was rolled.
- After: at game start, after deployment, every mech rolls
d20, adds its pilot's Initiative (D1), and subtracts its Weight divided by 10, rounded down. Mechs activate in descending order of that total. Both sides are mixed in one order. The order stays the same every round. A destroyed mech leaves the order.
Ties go to the lighter mech, then to the higher pilot Initiative. Each mech that is still tied rolls a d6, and the higher roll activates first. Reroll a tied d6. The experiment broke its last tie toward side A. The adopted rule uses a die there, because A1 requires a visible die.
One side can activate several mechs in a row. The rule says so. This is part of the design.
The adoption gives pilot Initiative (D1) its first job in combat. It returns the initiative die that A1 lists. H8 no longer carries deployment order into the first activation.
This is the initiative condition of the TASK-110 turn-order experiment. alternate-opener and initiative-round are not adopted.
This decision replaces the continuous alternation adopted on 2026-09-08 (TASK-036).
Evidence
The evidence is the turn order experiment. Every number below is copied from that note. The runs used an uncommitted tree on commit 3943cae.
Mirrors
Both sides field the same roster, so an even reading is the test. Under alternate side A is always the first mover, so A's win rate is the whole first-mover advantage. Under initiative the dice decide who opens, so "A win" and "First mover" separate. The two legacy mirrors ran at n=1000 and the light melee mirror at n=500.
| Mirror | Map | Rule | A win | First mover | Sweeps/game | Runs of three/game | Rounds |
|---|---|---|---|---|---|---|---|
| Legacy Light | Quarry | alternate |
49.6% | 49.6% | 0 | 0.072 | 5.1 |
| Legacy Light | Quarry | initiative |
51.3% | 55.3% | 0.496 | 0.919 | 5.1 |
| Legacy Light | Causeway | alternate |
52.6% | 52.6% | 0 | 0.093 | 5.2 |
| Legacy Light | Causeway | initiative |
50.1% | 46.5% | 0.364 | 0.876 | 5.0 |
| Legacy Light | Foundry | alternate |
46.8% | 46.8% | 0 | 0.105 | 5.5 |
| Legacy Light | Foundry | initiative |
52.0% | 57.0% | 0.370 | 0.930 | 5.3 |
| Legacy Heavy | Quarry | alternate |
69.5% | 69.5% | 0 | 0.055 | 6.7 |
| Legacy Heavy | Quarry | initiative |
49.1% | 61.4% | 0.492 | 0.935 | 6.3 |
| Legacy Heavy | Causeway | alternate |
40.9% | 40.9% | 0 | 0.657 | 6.6 |
| Legacy Heavy | Causeway | initiative |
51.9% | 36.6% | 0.549 | 1.266 | 6.6 |
| Legacy Heavy | Foundry | alternate |
59.8% | 59.8% | 0 | 0.026 | 6.9 |
| Legacy Heavy | Foundry | initiative |
54.3% | 57.4% | 0.473 | 1.018 | 6.8 |
| Light melee | Quarry | alternate |
44.4% | 44.4% | 0 | 0.014 | 3.0 |
| Light melee | Quarry | initiative |
50.8% | 50.4% | 0.214 | 0.556 | 3.0 |
| Light melee | Causeway | alternate |
61.4% | 61.4% | 0 | 0.026 | 3.2 |
| Light melee | Causeway | initiative |
49.8% | 43.8% | 0.256 | 0.614 | 3.2 |
| Light melee | Foundry | alternate |
57.6% | 57.6% | 0 | 0.010 | 3.1 |
| Light melee | Foundry | initiative |
53.0% | 49.4% | 0.246 | 0.638 | 3.3 |
Legacy Light is courier,foreman,reaver. Legacy Heavy is bastion,foreman,courier. Light melee is three light:targeting-head:blade-arm:blade-arm:sprint-legs:bare-back builds.
The nine mirror cells run from 40.9% to 69.5% under alternate. They run from 49.1% to 54.3% under initiative. The turn order decided those cells, not the rosters. The mirrors now read even.
Legacy pair grids
Side A is the light roster courier,foreman,reaver. Side B is the heavy roster bastion,foreman,courier. Each cell is a pnpm sim grid run at the default grid n. A grid plays every cell from both sides of the board, so each win rate is a both-sides mean, and it is read at the aggression pair where neither bot gains by moving its own level. Where a grid found no equilibrium the table gives the range over the grid instead.
| Rule | Map | Equilibrium | A win | First mover | Sweeps/game | Runs of three/game |
|---|---|---|---|---|---|---|
alternate |
Quarry | 0.75 / 0.75 | 47.0% | 49.7% | 0 | 0.145 |
alternate |
Causeway | 0.75 / 0.5 | 50.3% | 32.0% | 0 | 0.272 |
alternate |
Foundry | none | 48.7%–61.8% | — | — | — |
initiative |
Quarry | 0.75 / 0.75 | 53.3% | 50.8% | 0.538 | 1.037 |
initiative |
Causeway | 0.75 / 0.5 | 49.5% | 45.0% | 0.518 | 1.130 |
initiative |
Foundry | none | 50.2%–62.5% | — | — | — |
The legacy pair stays in band. Quarry moves 6.3 points toward the light roster and Causeway moves 0.8 points toward the heavy roster. Foundry has no equilibrium under either rule, so it gives no verdict.
The pile-on cost
initiative buys evenness and sells alternation. The price is stated, not hidden.
A sweep is a round in which one side takes three activations before the other takes any. A run of three is a round in which one side takes three consecutive activations anywhere in the round.
- Sweeps go from 0 to about half a round per game in the two legacy mirrors, 0.364 to 0.549, and to about a quarter in the light melee mirror, 0.214 to 0.256. In the legacy pair grids they read 0.518 and 0.538.
- Runs of three go from 0.01 to 0.66 per game to about one per game, 0.556 to 1.266 in the mirrors and 1.037 to 1.130 in the grids.
Sweeps are 0 by construction under alternate and alternate-opener. Both sides hold a living mech at every round start, so the first two activations of a round are always on opposite sides. engine/activation-order.test.ts proves it. Runs of three is therefore the metric that separated the two alternating rules.
Mean rounds barely move. The legacy mirrors read 5.0 to 6.9 rounds under both rules.
Exact commands
The experiment ran twelve grids and 36 mirrors over four rule values. The commands for the two adopted-condition rows follow. The full pattern is in the turn order experiment.
# legacy pair grids, each map, adopted rule
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map quarry --rule activationOrder=initiative
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map causeway --rule activationOrder=initiative
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map foundry --rule activationOrder=initiative
# the pre-adoption baseline on the same rosters and maps
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map quarry --rule activationOrder=alternate
# mirrors: three rosters, each map, n=1000 for the legacy rosters and n=500 for light melee
pnpm sim batch --a <roster> --b <roster> --map <map> -n <1000|500> --first-side A --rule activationOrder=initiative
pnpm sim batch --a courier,foreman,reaver --b courier,foreman,reaver --map quarry -n 1000 --first-side A --rule activationOrder=initiative
# the three mirror rosters
# courier,foreman,reaver
# bastion,foreman,courier
# three of light:targeting-head:blade-arm:blade-arm:sprint-legs:bare-back:<vex|ilse|ruko>
Legacy pair re-baseline
The turn-order experiment ran on commit 3943cae, before either adoption landed. The legacy tuning pair was re-baselined under the adopted defaults, so it now reads under Initiative and the weapon skills together. A is the light roster courier,foreman,reaver. B is the heavy roster bastion,foreman,courier. Each map ran once at the default grid n. A grid plays every cell from both sides of the board, so each win rate is a both-sides mean read at the aggression pair where neither bot gains by moving its own level. The tree was dirty at commit 6f63dbe.
| Map | Equilibrium | A win | First mover | Sweeps/game | Runs of three/game |
|---|---|---|---|---|---|
| Quarry | A 0.75 / B 0.75 | 52.2% | 51.2% | 0.56 | 1.08 |
| Causeway | A 0.75 / B 0.5 | 49.7% | 45.3% | 0.52 | 1.10 |
| Foundry | none | 44.2%–55.0% | — | — | — |
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map quarry
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map causeway
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map foundry
The same grids under initiative with the weapon skills off read 53.3% on Quarry, 49.5% on Causeway and no equilibrium on Foundry. The weapon skills and the d6 tie-break therefore move the legacy pair by nothing outside noise. The kits carry no skill weapons. Foundry has no equilibrium under either reading, so it gives no verdict.
The pile-on holds at this reading: 0.56 and 0.52 sweep rounds per game, and 1.08 and 1.10 runs of three.
Caveats
The rule the experiment measured is not exactly the rule adopted. The experiment broke its last tie toward side A. That is a fixed bias, not a die. The adopted rule rolls a d6 there. The change affects only mechs that tie on total, on Weight and on pilot Initiative.
The light melee mirror is not the study roster. The study roster's weapons were not expressible on the CLI. The run used three light:targeting-head:blade-arm:blade-arm:sprint-legs:bare-back builds instead. It also ran at n=500, against n=1000 for the two legacy mirrors.
The grids ran at the default grid n. Differences under about 3 points are noise, and more than that in the light melee cells.
The hybrid is untested. Roll initiative, let the winner activate first, then alternate. That keeps the first mover on a die and holds alternation, so it drops the pile-on. The experiment did not measure it.
Every result rests on a declared bot grid. It carries no human-counterplay or optimal-play claim.
Register
Row T71 is resolved 2026-09-15 with this adoption.
Content prototype diagnostic — 2026-09-12
Content prototype diagnostic — 2026-09-12
This note records isolated weapon checks and a fixed-policy aircraft study. It does not make a balance, equilibrium, or human-play claim.
Commands and inputs
pnpm exec tsx cli/content-prototype-check.ts 500 out/content-prototype-isolated.json
pnpm exec tsx cli/platform-study.ts 32 out/platform-study.json
pnpm sim batch --a courier,foreman,reaver --b courier,foreman,reaver --map quarry --seed 31000 -n 32 --both-sides --aggression 0.5 --platforms targetable --json out/platform-batch-mirror.json
The isolated check contains 70 rows of 500 trials. Its embedded input hash is 42360a4dbf092985bcc33eeaa86d01c8c763f4d4fac1d358e0269116d03f6d48. The platform study contains 1,152 games across 32 seed blocks, three maps, two physical sides, two roster pairings, and three aircraft conditions. Its embedded input hash is f48484fc55a3c0152c82943403a64d62837b851a58658c1820129833bcebf0d4.
The output SHA-256 hashes are 46594840fd5b1bee2ed16cc2ed3bef04f1eec1374cd86bd04a868ccaf8acfc44 for the isolated check, 7995fd0052fdd45b3d04998cabfebdf46ec8893e5b5b49279039509f2906fb8f for the platform study, and 1e1d48f0623cef7ede2e325c4f579e114af84bbcfad3556721aa5ab1d166577d for the 64-game Quarry mirror.
Isolated ranged volleys
These family means give each recorded target or form row equal weight. The legacy row combines the Rifle and Cannon controls. All attacks use a fresh legal medium body with Ruko, range 4, the standard load, and no movement, cover, abilities, Enraged, Lock On, mode preparation, or Overdrive.
| Family | Context rows | Mean damage | Zero damage | Kill | Heat after |
|---|---|---|---|---|---|
| Heavy Bowgun | 4 | 7.020 | 7.6% | 3.2% | 3.000 |
| Legacy controls | 8 | 6.444 | 3.8% | 1.8% | 2.000 |
| Light Bowgun | 4 | 5.352 | 1.7% | 0.2% | 1.000 |
| Gunlance | 4 | 5.327 | 8.0% | 1.8% | 2.000 |
| Bow | 4 | 4.936 | 5.1% | 0.6% | 1.000 |
| Insect Glaive | 4 | 1.897 | 14.7% | 0.0% | 1.000 |
The visible trade is output against Heat and reliability. Among the new ranged families, Heavy Bowgun leads this mean. The existing Cannon averages 7.950 damage; the Rifle averages 4.936, equal to the Bow standard profile in this check. Heavy Bowgun adds 3 Heat. Light Bowgun and Gunlance have nearly equal mean damage, while Light Bowgun has lower zero-damage frequency and 1 less Heat in this standard-volley context. Insect Glaive has the lowest mean and highest zero-damage frequency. These results include the aircraft row, whose Armor, Evasion, and finite Durability differ from the three mech targets.
Isolated melee first strikes
This check rolls both melee pools, then resolves only the first available attacker opportunity against Core without a parry. It is not an exchange win rate. The table shows the three highest and three lowest non-legacy family means. Each target or form row has equal weight.
| Family | Context rows | Mean damage | Zero damage | Kill | Heat after | Attack opportunities |
|---|---|---|---|---|---|---|
| Great Sword | 3 | 9.626 | 10.9% | 47.0% | 0.891 | 1.732 |
| Hammer | 3 | 8.137 | 20.7% | 31.5% | 0.793 | 1.166 |
| Charge Blade | 9 | 7.703 | 13.2% | 28.6% | 1.111 | 1.532 |
| Insect Glaive | 3 | 5.297 | 2.3% | 9.3% | 0.000 | 2.929 |
| Sword and Shield | 3 | 4.045 | 4.1% | 2.1% | 0.000 | 2.202 |
| Dual Blades | 3 | 2.978 | 0.2% | 0.3% | 0.000 | 4.787 |
High single-strike damage and opportunity count move in opposite directions in these rows. Great Sword records the highest damage and kill rate with fewer opportunities than the three low-damage rows. Dual Blades records the lowest first-strike damage and kill rate but the most opportunities and almost no zero-opportunity result. Parries, later spends, responsive choices, target selection, and delivery are absent, so this ordering must not be extended to complete exchanges or games.
Aircraft study
The faction roster changes both pilot stats and abilities relative to the original roster. The faction-versus-original rows therefore do not isolate a faction label effect. Values are per game except win, physical-side, and wipe fractions.
| Pairing | Aircraft | Roster payoff | Physical A | Wipe | Rounds | Cooling | Vents | Stress | Aircraft attacks / losses | Mech losses |
|---|---|---|---|---|---|---|---|---|---|---|
| Faction mirror | Off | 50.0% | 51.0% | 72.9% | 6.05 | 0.00 | 6.56 | 1.71 | 0.00 / 0.00 | 4.14 |
| Faction mirror | Aura only | 50.0% | 52.1% | 71.9% | 5.90 | 6.95 | 5.32 | 1.47 | 0.00 / 0.00 | 4.10 |
| Faction mirror | Targetable | 50.0% | 54.2% | 46.9% | 6.64 | 5.39 | 8.55 | 1.21 | 5.32 / 1.47 | 3.66 |
| Faction vs original | Off | 56.3% | 56.3% | 66.1% | 6.33 | 0.00 | 6.43 | 1.54 | 0.00 / 0.00 | 4.09 |
| Faction vs original | Aura only | 54.2% | 54.2% | 68.8% | 6.34 | 7.58 | 5.28 | 1.38 | 0.00 / 0.00 | 4.12 |
| Faction vs original | Targetable | 47.9% | 45.8% | 47.4% | 6.59 | 5.55 | 8.04 | 1.01 | 5.12 / 1.35 | 3.63 |
Aura-only cooling coincides with fewer vents and stress rolls in both pairings. Targetable aircraft coincide with about five aircraft attacks and 1.4 aircraft losses per game, fewer mech losses, longer games than aura-only, and substantially lower wipe frequency. The target policy diverts ordinary Fire from mechs under explicit Heat and low-Durability thresholds. That diversion can account for part of the wipe and mech-loss change; the rows do not isolate cooling, aircraft durability, or target opportunity cost.
The separate 64-game Quarry mirror gives the same roster a pooled 50.0% payoff only because each seed is counted in both roster orders. Raw physical-side results are 40.6% for Side A and 59.4% for Side B. In the three-map targetable faction mirror, physical Side A is 54.2% and Side B is 45.8%. Neither check certifies an even mirror or an aggression-grid equilibrium.
Limits and next measurement
The runs reuse seed blocks across conditions and are correlated. The AI uses aggression 0.5 and does not optimize weapon-form changes. Its aircraft targeting is a fixed conditional policy, so observed aircraft attacks are policy outcomes rather than general strategic value. The next measurement should separate aura cooling from Fire diversion with matched runs that hold aircraft target decisions constant, then repeat at a selected aggression-grid equilibrium and inspect each map and physical side before making a tuning decision.
Content balance reassessment — 2026-09-12
Content balance reassessment — 2026-09-12
Keep ranged Accuracy +2. Check Hammer's role before a damage increase, and test sustained Heat before changing Bow. The light Idris melee builds leave the common Medium opponent very few accepted strikes, so prioritize the common melee TN and defender-choice test. Same-faction pilot packages improve payoff against the familiar mixed control in most sampled cases, but they do not identify an isolated faction bonus or a faction tier list.
Keep the destroyable aircraft prototype. Its targetable form changes shooting choices and is associated with fewer wipes under the sampled policies. The upper whole-game packages show counterplay, including map-dependent reversals. Opening-turn effects still block broad price acceptance. This study changes no catalog value or playable rule, and it does not certify balance.
The next work is ordered as follows:
- TASK-106: diagnose opening-turn, map and policy sensitivity before price acceptance.
- TASK-097: compare melee difficulty and complete light/Medium delivery builds, with defender agency measures.
- TASK-104 and BUG-017: add paid form-choice policy coverage and resolve the separate missing Momentum melee behavior.
- TASK-099: test Hammer and Bow roles with their complete opportunity, Weight and Heat costs.
- TASK-105: separate pilot-stat and ability contributions in matched tests.
Ranged roles
Keep the adopted ranged Accuracy +2. The new packages provide different reliability, Armor and Heat tradeoffs. The figures below describe ordinary Fire from Heat 0 at range 4. Each cell has 512 trials. Damage is actual applied Durability loss, so finite target Durability can cap output.
| Package | Held Weight | Hands | Heat added | Courier damage | Foreman damage | Bastion damage | Courier zero damage |
|---|---|---|---|---|---|---|---|
| Rifle | 4 | 1 | 1 | 4.184 | 5.117 | 4.320 | 13.1% |
| Cannon | 8 | 1 | 3 | 6.045 | 8.562 | 8.428 | 10.0% |
| Beam Lance | 5 | 1 | 2 | 5.803 | 7.514 | 6.334 | 12.3% |
| Light Bowgun | 4 | 1 | 1 | 4.395 | 5.443 | 4.891 | 5.9% |
| Heavy Bowgun | 12 | 2 | 3 | 5.182 | 7.697 | 8.184 | 19.9% |
| Bow, standard | 8 | 2 | 1 | 4.184 | 5.117 | 4.320 | 13.1% |
| Bow, Overdrive | 8 | 2 | 4 | 8.641 | 12.162 | 10.795 | 4.3% |
Light Bowgun has fewer empty Fires than Rifle against Courier in this context. Heavy Bowgun has a more exposed reliability cost, with output that depends on Armor and load choice. These observations do not establish one best ranged family.
High-Heat attacks have a real cost near the Heat Cap. From Cap − 1, Cannon, Beam Lance, Heavy Bowgun and Bow Overdrive trigger an attacker stress check in every trial in these matching range-4 Fire contexts. Rifle, Light Bowgun and standard Bow do not. A check does not always produce an adverse stress outcome. This is a separate starting-Heat panel, not a damage penalty averaged into the cold results.
Standard Bow matches Rifle's damage profile and adds one printed Range. It occupies two hands and costs four more Weight. Overdrive is its distinct attack option. Test sustained Heat, cooling access and repeated attack choices before changing its price or standard damage. One cold attack does not resolve that tradeoff.
Cannon AP exceeds the common Braced arm's Capacity 10. The exclusion remains in the manifest. A separate package replaces only the weapon-side arm with the Capacity-11 Siege arm. It averages 6.465, 9.539 and 10.879 damage against Courier, Foreman and Bastion in the same cold range-4 Fire context. This is an arm-adjusted package comparison. It is not a causal ammunition-only effect on the common body.
All range-8, range-12, aircraft, Aimed Fire and alternate-load contexts remain separate in the archived weapon-summary.json. They are not averaged into the table above. Applied damage per Weight is recorded for inspection; it is not a universal price formula.
Melee roles and defender choices
Survival payoff gives 1 when only the subject survives, 0 when only its opponent survives, and 0.5 when both survive or both are destroyed. It is not a whole-game win rate. Each named comparison below pools both declared initiators within 256 seed blocks. The actual first spender is also recorded.
| Subject versus opponent | Subject survival payoff | 95% interval | Both survive |
|---|---|---|---|
| Great Sword versus Hammer | 65.72% | 63.09–68.36% | 32.23% |
| Dual Blades versus Great Sword | 56.05% | 54.30–57.91% | 76.17% |
| Guard Lance versus Great Sword | 59.08% | 57.23–60.94% | 76.37% |
| Blade + Shield versus Shortblade + Shield | 52.64% | 51.76–53.61% | 91.60% |
| Charge Blade guard versus Axe | 63.57% | 61.62–65.62% | 72.07% |
| Charge Blade guard versus Discharge | 63.57% | 61.62–65.62% | 72.07% |
| Switch Axe axe versus sword | 47.56% | 46.09–48.93% | 83.79% |
Hammer has a role concern against Great Sword on the common body. Great Sword averages 7.410 outgoing body damage and Hammer 3.264 in their complete exchange. Check Hammer's opportunities, parry cost, Armor matchup and delivery before applying a blanket damage increase. The guarded packages also need role checks. Their survival advantages can coexist with frequent mutual survival.
The light-build sensitivity panel changes the complete build and pilot together. It uses Light, Targeting head, two Blade arms, Sprint legs, Bare back and Idris. The opponent uses the same weapon package on the common Medium/Ruko body. Each comparison has 256 seed blocks and both declared initiators. Neither side has an active D3 ability in this one-pilot fixture.
| Weapon on light Idris build | Survival payoff versus same weapon on Medium/Ruko | 95% interval | Opponent accepted strikes per exchange |
|---|---|---|---|
| Dual Blades | 88.18% | 86.23–90.04% | 0.002 |
| Great Sword | 96.00% | 94.43–97.36% | 0.018 |
| Guard Lance | 88.67% | 86.72–90.53% | 0.002 |
The light build spends first in every sampled exchange, and the opponent rarely lands an accepted strike. This result bundles Evasion, chassis-class pool, Handling, Piloting and first-spend changes. It is not a causal estimate of Piloting alone. The adjacent isolate does not exercise movement or measure Speed's delivery advantage. Prioritize the TASK-097 common melee TN test. Retain defender choices, successful opportunities, first spender, accepted incoming strikes, parries and mutual survival in that test. A damage-only comparison would miss this loss of defender agency.
Whole-game assembly and policy interactions
The primary study completed 18,144 training games and 24,192 holdout games. It uses six rosters on Quarry, Causeway and Foundry. Each map crosses both physical orientations with explicit First Side A and B. Training uses aggression 0, 0.5 and 1 for each bot, eight seed blocks 41000–41007, and targetable Cooling Tenders. The 63 matchup/map matrices yield 46 pure grid equilibria and 17 mixed grid equilibria. The largest measured training exploitability is numerical roundoff. These are equilibria within the sampled aggression grid and fixed bot policy, not proof of optimal play.
Frozen policies then run on 32 fresh seed blocks, 51000–51031. Targetable, aura-only and aircraft-off conditions share the same choices and seeds. Mixed-policy sampling uses a separate deterministic RNG and does not consume combat dice. Aura-only and off inherit targetable-trained policies; they are not separately trained equilibria. The analysis uses 4,000 whole-seed bootstrap resamples with seed 9122028.
The legacy, new ranged, new melee and transforming rosters use identical Medium bodies and the same Vex/Ilse/Ruko slot order. Their team weights are 119, 122, 116 and 123. Mobile and heavy-anchor are separate complete-build comparisons. Heavy-anchor is not an all-Heavy roster. All six rosters have inactive D3 abilities in this pilot trio, but retain Vex–Ilse Bond access. The manifest preserves every build.
The table averages each roster's payoff against its five distinct sampled opponents with equal map weight. It excludes mirrors. Each row has 1,920 targetable holdout games but only 32 shared seed blocks. These averages describe the selected opponent set; they are not weapon-family tiers.
| Roster | Sampled-opponent payoff | 95% interval |
|---|---|---|
| Legacy | 57.06% | 54.48–59.64% |
| New ranged | 67.76% | 64.63–70.94% |
| New melee, common Medium bodies | 29.66% | 27.29–32.19% |
| Transforming weapons, default forms | 20.99% | 19.06–22.92% |
| Mobile | 60.26% | 57.92–62.71% |
| Heavy-anchor | 64.27% | 61.09–67.50% |
The complete targetable matrix reports the row roster's payoff against the column roster: win = 1, draw = 0.5, loss = 0. Each cell has 384 games across three maps and 32 seed blocks. Reverse entries are complementary. Diagonal 50% values follow algebraically from paired labels; use the separate mirror audit for physical-side and First-Side fairness.
| Row roster | Legacy | New ranged | New melee | Default transformers | Mobile | Heavy-anchor |
|---|---|---|---|---|---|---|
| Legacy | 50.00% | 36.46% | 77.99% | 84.90% | 41.67% | 44.27% |
| New ranged | 63.54% | 50.00% | 86.20% | 82.29% | 47.66% | 59.11% |
| New melee | 22.01% | 13.80% | 50.00% | 67.19% | 33.33% | 11.98% |
| Default transformers | 15.10% | 17.71% | 32.81% | 50.00% | 26.56% | 12.76% |
| Mobile | 58.33% | 52.34% | 66.67% | 73.44% | 50.00% | 50.52% |
| Heavy-anchor | 55.73% | 40.89% | 88.02% | 87.24% | 49.48% | 50.00% |
New ranged, heavy-anchor and mobile are competitive sampled packages. Map results show counterplay. New ranged versus mobile has overall payoff 47.66% [41.67, 53.39], with the map differences below. The final column is a separate mirror diagnostic. Each map cell has 128 games and 32 seed blocks.
| Map | New ranged versus mobile payoff | Legacy mirror First-Side payoff |
|---|---|---|
| Quarry | 58.59% | 46.88% |
| Causeway | 62.50% | 18.75% |
| Foundry | 21.88% | 53.13% |
One package does not win everywhere. All per-map matchup intervals remain in games-production-8x32-summary.json in the evidence folder.
The common-Medium melee roster fares poorly in full games, while light Idris is strong once adjacent in the separate isolate. This points to assembly, delivery and policy interactions. It does not support a global melee increase or reduction. Default-form results also cannot price informed transformations.
Opening-turn effects remain material. The targetable legacy mirror gives First Side 18.75% payoff on Causeway [6.25, 32.81], 46.88% on Quarry and 53.13% on Foundry. Symmetric geometry does not imply equal start-order outcomes. TASK-106 must diagnose the interaction among opening turns, policy and map before global pricing. A logical mirror's 50% payoff does not remove this warning.
The 8,064 targetable holdout games include mirrors. Wipes occur in 46.28% [43.77, 48.78]. Mean game length is 6.586 rounds [6.536, 6.633]. No death occurs in 8.37% [7.89, 8.87], and the restricted mean first-death time is 3.695 rounds [3.601, 3.786]. The eligible first-kill denominator is 7,379 games. The credited side later wins 5,334, loses 2,036 and draws nine. Another 683 games have no eligible first kill, and two have simultaneous first losses. The 72.29% first-killer/winner association is descriptive. It does not establish a causal snowball mechanism or a historical before/after change.
The most common first-death round is round 3, with 3,218 of 8,064 games. The no-death category contains 675 games. Contact and melee counts summarized by roster are shared game-level measures; they must not be attributed to that roster's own actions or damage.
| Aircraft condition | Wipe rate | Mean Heat cooled per game |
|---|---|---|
| Off | 51.15% | 0 |
| Aura-only | 51.05% | 5.098 |
| Targetable | 46.28% | 4.361 |
These conditions use matched seeds and the same targetable-trained aggression choices. Targetable wipe rate is 4.87 percentage points below off and 4.77 points below aura-only. These are descriptive paired point differences; no interval is claimed for the wipe differences. Cooling alone barely changes the pooled wipe metric here. Targetability also changes attacks, remaining cooling and opportunity costs. It does not isolate one aircraft stat. Targetable games average 1.943 aircraft attacks and 10.836 damage to aircraft. At least one aircraft is lost in 32.63% of games; this is a game fraction, not a per-aircraft loss rate. Keep the prototype and test human choices to attack or ignore aircraft before adjusting its price or stats.
The bot targets aircraft when at least two supported enemy mechs have at least two total Heat, or when aircraft Durability is at most six. On the first allied bot activation each round, it moves the Tender within Speed 6 to cover hot allies, then covered Heat, with a side-mirrored position tie break. These fixed choices limit the result. Aircraft altitude does not alter horizontal combat range.
Form and ability coverage limits
The weapon isolate measures preselected steady-state forms. It does not grant a free change during combat. A GameSession check pays one Quick action to Change Form and then uses the remaining Quick to Fire. It also proves that Change Form prevents a Full melee action in the same activation, permits it on the next activation, and preserves replay.
The current whole-game bot uses default forms. Its transforming roster therefore does not measure informed form switching or the full value of paid alternate-form access. TASK-104 must add that policy coverage before a transforming-family price verdict.
BUG-017 remains open: Momentum does not apply to the frozen interactive Fight or Charge exchange. The pilot panel records observed Momentum modifiers on Fire and aircraft attacks. It does not certify complete D3 melee support. Do not use the panel as an Ability-only faction ranking.
Pilot packages
The auxiliary panel keeps the same three common Medium bodies and equipment: Rifle + Shield, Cannon with the other hand empty, and Blade + Shield. Its original control assigns Vex, Ilse and Ruko to those slots. It trains all six pilot-to-slot assignments for each faction against that control on three maps and four physical-orientation/First-Side cells. Training uses seeds 81000–81003 and 1,440 games. A lexical pilot-ID tie break is fixed in advance. Training chooses an assignment and makes no performance claim.
The five selected faction trios and original control then play all 21 unordered pairs, including mirrors. Holdout uses fresh seeds 91000–91015 for 4,032 games. Payoff intervals use 4,000 whole-seed bootstrap resamples with seed 9122027. Each block retains its three maps and four assignment cells.
Each faction trio has D3 ability access. Pilot stats, abilities, Bonds and selected slot assignments change together. Initiative is currently inert, and First Side is assigned independently. The control fields the Vex–Ilse Bond pair; only the Free Salvage Union trio fields a faction-trio Bond pair, Ruko–Marrow. Ability and Bond counters map physical sides back to logical rosters. Deadeye and Pace uses remain null because the log does not identify their individual uses. Field Repair and Scramble event rates also depend on bot opportunity policy.
| Selected pilot package | Rifle / Cannon / Blade pilot slots | Holdout payoff versus original | 95% interval |
|---|---|---|---|
| Hauer | Bram / Anja / Ilse | 54.17% | 46.88–61.46% |
| Yutani | Mika / Tavi / Vex | 67.19% | 61.46–72.92% |
| Free Salvage Union | Marrow / Ruko / Rivet | 61.46% | 53.13–69.79% |
| Dioscuri | Idris / Sato / Dara | 62.50% | 53.13–71.35% |
| B&B | Sera / Q / Len | 60.42% | 52.08–68.75% |
Each row has 192 holdout games and 16 seed blocks. The original mirror has 61.46% First-Side payoff and 46.88% physical-A payoff. This is a material warning under the fixed 0.5 policy. Its logical-roster payoff is 50% by construction; that identity does not establish fairness.
Same-faction packages improve payoff against this familiar mixed control in most sampled cases. Their intervals overlap substantially. Yutani is the strongest sampled pilot package in this fixed-policy panel: it beats all five distinct sampled opponents. That makes it a follow-up priority, not a certified faction tier. The study has only 16 holdout blocks, selected slot assignments and material First-Side sensitivity. Stats, selected slots, abilities and Bond access change together.
Preserve the faction and pilot choice concept. Prioritize BUG-017 and better ability-use coverage before faction stat tuning. Then use TASK-105 to compare matched Yutani packages with controlled pilot-stat and Pace, Momentum and Scramble changes. Measure tempo, accuracy and control contributions without assuming that one bonus caused the current result.
The full matrix below reports row-roster payoff. Each off-diagonal value has the same 192-game design. Reverse entries are complements, and diagonal entries are algebraic. The manifest retains pairwise intervals and map strata.
| Row roster | Original | Hauer | Yutani | FSU | Dioscuri | B&B |
|---|---|---|---|---|---|---|
| Original | 50.00% | 45.83% | 32.81% | 38.54% | 37.50% | 39.58% |
| Hauer | 54.17% | 50.00% | 27.60% | 47.92% | 42.71% | 42.71% |
| Yutani | 67.19% | 72.40% | 50.00% | 60.94% | 66.67% | 62.50% |
| FSU | 61.46% | 52.08% | 39.06% | 50.00% | 53.13% | 52.60% |
| Dioscuri | 62.50% | 57.29% | 33.33% | 46.88% | 50.00% | 50.52% |
| B&B | 60.42% | 57.29% | 37.50% | 47.40% | 49.48% | 50.00% |
Across the complete 4,032-game pilot holdout, wipes occur in 13.27% of games. Mean game length is 6.940 rounds. No death occurs in 2.85% of games, and the restricted mean first-death time is 4.467 rounds. The eligible first-kill denominator has 3,849 games: the credited side later wins 2,957, loses 892 and draws 0. Another 179 games have no eligible first kill, and four have simultaneous first losses. The 76.83% first-killer/winner association is observational, not a causal snowball effect. These pooled figures describe this fixed factorial, including mirrors.
Measurement controls
The primary protocol is docs/design/2026-09-12-content-balance-protocol.md. It fixes the weapon and whole-game panels. The auxiliary protocol, docs/design/2026-09-12-pilot-content-protocol.md, was declared before pilot outcomes were read. Each manifest retains its exact command, source hashes, catalog, legal builds, seeds and protocol text. The source revision is 547b8a3c2d6c5281c9f8704c7a3195c4f7531b4b; the manifests also hash the measurement scripts that were not yet committed at that revision.
Weapon attacks use the engine's combat resolution. Melee trials complete the engine's full exchange with the existing deterministic response and parry policy. They do not estimate delivery costs, later activations or whole-game wins. The common weapon body uses Medium, Standard head, two Braced arms, Standard legs, Bare back and Ruko. Every complete package passes current build limits. Two Dual Blades occupy both hands. Shortblade is paired with a Shield. Bare Blade and Blade + Shield are separate controls.
Ranged trials use 512 shared seed blocks, 61000–61511. They keep each weapon form, load, Overdrive declaration, target, range, action and starting Heat separate. Courier, Foreman and Bastion are mech targets. Aircraft form a separate target category. Out-of-range contexts remain explicit unavailable rows. Applied damage is capped by remaining Durability. Hits, penetration outcomes, zero-damage attacks, part losses, kills, Heat and finite-load use remain distinct measures.
The melee matrix has 15 packages and 120 unordered pairs, including mirrors. Both initiator assignments remain within each of 256 seed blocks, 71000–71255. This gives 61,440 complete exchanges. A separate three-package light-build panel adds 1,536 exchanges. The complete weapon archive retains 385,536 keyed trial rows. It includes 301,056 common-body ranged trials and 21,504 trials for a separate legal Cannon AP package.
The analysis uses 4,000 whole-seed bootstrap resamples with seed 9122026. Both melee initiators stay in their seed block. Matched ranged differences are formed within seed before resampling. Every melee survival payoff and each light-build comparison has a 95% percentile interval. Ranged alternate-declaration damage, zero-damage and kill differences have intervals for cold range-4 Fire, separately for each target. Other ranged contexts and non-payoff melee metrics have descriptive means. The archive retains their raw values for later analysis. Mirror payoff and its 50–50% interval are algebraic consequences of paired labels.
Reproduction and evidence
These purpose-built measurement commands replace a generic pnpm sim batch invocation because the study needs complete exchanges, explicit First Side and keyed trial archives.
pnpm exec tsx cli/content-weapon-balance.ts --ranged-samples 512 --melee-samples 256 --out-dir out/content-balance/weapons-final --compare-with out/content-balance/weapons.json
python3 cli/analyze-content-weapons.py --manifest out/content-balance/weapons-final/weapons.json --out out/content-balance/weapon-summary.json --bootstrap 4000 --seed 9122026
pnpm exec tsx cli/content-pilot-balance.ts --train-blocks 4 --train-seed 81000 --holdout-blocks 16 --holdout-seed 91000 --out-dir out/content-balance/pilots
pnpm exec tsx cli/content-game-balance.ts --phase all --train-blocks 8 --holdout-blocks 32 --out-dir out/content-balance --run-id production-8x32
python3 cli/analyze-content-games.py --manifest out/content-balance/games-production-8x32-manifest.json --out-json out/content-balance/games-production-8x32-summary.json --out-txt out/content-balance/games-production-8x32-tables.txt --bootstrap-reps 4000 --bootstrap-seed 9122028
The final weapon harvest preserves every unchanged aggregate and per-seed hash from the initial harvest. It adds raw outcomes, hit and penetration counters, Blade + Shield, and the separately labeled Cannon AP fit. It does not extend the seed ranges or select outcomes. All 385,536 archived rows passed hash and complete-key audits. All 61,440 main melee exchanges completed. The harness checked 1,752 repeated contexts for determinism. The analysis checked seed matching, complementary directions, algebraic mirrors and aggregate agreement.
The pilot run completed all 5,472 declared games in 366.58 seconds, with 51 additional deterministic repeats. The audit verified 336 holdout pair/seed blocks of 12 games, unique keys, physical-to-logical counter mapping, summary agreement and both raw archive hashes. The selected assignments were saved before holdout. No production exception or source-freeze failure occurred.
The primary run completed its exact 42,336-game factorial in 1,495.87 seconds. The retained-row analysis checked raw hashes, keys, seed ranges, complementary logical payoffs and all 63 reconstructed training matrices. Training and holdout remain disjoint. The three panels use separate seed cohorts and separate bootstrap seeds; their executions are not pooled into one sample size or interval.
The packet does not serve raw simulation artifacts. The complete files below are repository paths under docs/tuning/evidence/2026-09-12-content-balance/. Each copy matches the source output byte for byte. Manifests retain the original output paths.
| Complete evidence file | SHA-256 |
|---|---|
weapons.json |
d9f4d67c808b8c2cab9136273233579e64954c43e1835d042880222b7d4d8ae3 |
weapons-trials.jsonl.gz |
86a7e7354b50b0b98830e518535c524dc67fd599e7b68ce85681ae37a512cdb4 |
weapon-summary.json |
0fca61bf6596f7e5febc07e77402b6645268e6c96509d801130716c7ef70dfdf |
pilot-manifest.json |
7a3ee170dab9ca3460a47599f7fe439b7aef928ee6df409dfbd05bf27e9959fa |
pilot-trials.jsonl.gz |
aa53fe458b056dbb5e5c93bcf5fd335d30cfe20918f9b1ea29db8106af219f7f |
pilot-plan.json |
ac116106a2a03554e2d156c3708818b4d8a2aed1f076e390b5fbe758b4b18bb2 |
pilot-selected-assignments.json |
4d7b7fd484a9f3409c6946c5a28f80c734494b478c0a506f21a45ab808861afe |
games-production-8x32-manifest.json |
9c9cd3d2d7ae5d77553ff696ad30d242ae456a019d9a263ab58e548d5dc323d8 |
games-production-8x32-training.jsonl.gz |
d6efc83fa3b8f1bd65ebcb377e2f3237bb0f6a359a2228ba58575aa65cb45dc7 |
games-production-8x32-holdout.jsonl.gz |
a52ef50381459c95f6f02f4ad97b9f7ed393cfbb6c4919131d1f2bfa772eaeda |
games-production-8x32-summary.json |
2663d25900bf9fe43cea932bb9ea07026df5741d444611cf55c043132347d5dd |
games-production-8x32-tables.txt |
1ed74a9edb8629aa3180c21d7fe2d26e2d0708d0be016cece776fefebb1980a6 |
The earlier content prototype report remains historical evidence. Its smaller fixed-policy panel is not substituted for this study.
TASK-107 balance experiment results
TASK-107 balance experiment results
All seven phases are complete and sealed. Execution finished on 2026-09-14.
This report separates four things. Observed results come first. Statistical uncertainty, limitations, and design recommendations follow in that order.
This study changes no playable rule, catalog value, or AI default. It adopts nothing.
The confirmed result is the common melee opportunity target number 10, called tn10. The screen-selected combination did not confirm.
Governance and provenance
The frozen protocol defines every factor, cohort, metric, and selection rule.
The study source commit is c3b4ac7.
The frozen source hash is 5267032f989a0e11cd0d3b344d4d19d75d56b56d588eaf733afcc32d0a04799b. It covers 199 source members.
The protocol hash is c5e9fd0d179bbb5f2f12d5f571aadbb4156da695e0b7c7b7354840c176ef2706.
Every sealed phase records the same frozen source hash. Every report records it again.
Revision e116261 defines the playable control.
The source closure contains engine, harness, analysis, catalog, map, package, lockfile, and TypeScript configuration inputs.
The protocol is the closure's only documentation file. Other reports and design documents are outside the governed source.
Each manifest records the exact command, source hashes, catalog hashes, seed range, and expected key digest.
It embeds exact roster and refit definitions. The manifest hash protects those definitions.
Production archives use keyed gzip JSON Lines. Their receipts retain compressed, logical, key, replay, manifest, and source hashes.
Validation rejects source drift, duplicate keys, incomplete cells, invalid builds, nonfinite state, and mismatched dependencies.
The study uses the full declared scope. The timing gate made no scope reduction.
Completed baseline training
Baseline training completed all 16,800 games. Each of four shards contains 4,200 games.
The sealed archive is out/balance-experiment/study-01/baseline.json.baseline-training.phase.json.
Its SHA-256 is 37dd6864d9f0f41d7170c972858d5f51100aec010651cd98ab81146b64afccbc.
The frozen policy artifact is out/balance-experiment/study-01/baseline.json.baseline-training.policy.json.
Its SHA-256 is 12404798de4558e4fef6f7d1ee3668effbe40e42256fd26756d184e9b2555e5d.
The policy artifact contains all 84 declared map-pair policies.
Full raw event logs remain local. Across all seven phases they total 2,400,567,157 compressed bytes in 28 shards. Immutable receipts and hashes provide the portable evidence record.
Do not rewrite absolute canonical paths inside sealed evidence.
Every sealed phase
All seven phases are sealed. The seal SHA-256 is the SHA-256 of the phase archive file named in the row.
| Phase | Rows sealed | Blocks | Seeds | Seal file | Seal SHA-256 |
|---|---|---|---|---|---|
| Baseline training | 16,800 games | 2 | 120000–120001 | baseline.json.baseline-training.phase.json |
37dd6864d9f0f41d7170c972858d5f51100aec010651cd98ab81146b64afccbc |
| Screen | 23,520 games | 2 | 130000–130001 | screen.json.screen.phase.json |
3cbb5f8349c638633a93d959b847fe044d90684f3ec9257ffd5ba75af527d019 |
| Isolates | 1,758,976 rows | 256 | 101000–101255, Momentum panel 111000–111255 | screen.json.isolates.phase.json |
75b5d45c159e1490025748eb861306c003ca309185c6302a0a7a6f681a997758 |
| Opening diagnostic | 6,912 games | 8 | 140000–140007 | screen.json.opening.phase.json |
9d1eceadf2e23371d42bb2e8eda2c3bc0fa0ea3809c198ee31e8431c38112961 |
| Selected training | 33,600 games | 2 | 120000–120001 | selected.json.selected-training.phase.json |
85a023413a72e37ecf4503d9efe86e5cd872c0874ed209e4f0c712690cfa89b1 |
| Pilot panel | 12,288 games | 8 | 310000–310007 | selected.json.pilots.phase.json |
390722b43161ce728cc99607fa32c6b765af0e4cae212d295b397a635b4c3c6d |
| Confirmation | 16,128 games | 16 | 230000–230015 | confirmation.json.confirmation.phase.json |
a26d17fea120ec9b992f796f6a108fe8d23eb7760218d683ecd59e628c6684ba |
Every phase ran in four receipted shards. Every seal lists its four receipt paths and receipt hashes.
The seed ranges are disjoint across phases. Baseline training and selected training share 120000–120001 by design, because the selected grids retrain on the original training seeds.
Five phases produced an analysis report. The two training phases produced a frozen policy artifact instead.
| Phase | Analysis artifact | Policy basis recorded in the artifact |
|---|---|---|
| Baseline training | baseline.json.baseline-training.policy.json |
84 map-pair policies |
| Screen | screen.json.screen.report.json |
frozen baseline policies |
| Isolates | screen.json.isolates.report.json |
declared isolate or training policies |
| Opening diagnostic | screen.json.opening.report.json |
frozen baseline policies |
| Selected training | selected.json.selected-training.policy.json |
168 map-pair policies |
| Pilot panel | selected.json.pilots.report.json |
fixed aggression 0.5 |
| Confirmation | confirmation.json.confirmation.report.json |
own-trained candidate policies |
The screen also produced the frozen selection artifact screen.json.selection.json, SHA-256 d9a4feb05f4a2416cd8e5ac017bebdd3c02aaa0bae92b53125b3437d65cad9cc.
Two supplements sit outside the frozen closure. The legal-only frontier supplement is legal-frontier-supplement.json, SHA-256 4db14f6f776bb7032d2c8d8295eedc102f3bf0a5143e110693425b0085ea950c. The First Side supplement is first-side-supplement.json, SHA-256 3515b5ca64be06922f6b893c83dca71e84d8524531f21c4c3d5e207f423f94f8, with the confirmation replication first-side-supplement-confirmation.json, SHA-256 c68d6cb0c35ea9c3d22e5f5753ff9a346bb78d48bcae09d9ca214c078f50b3cb.
The compact evidence archive is docs/tuning/evidence-study-01.tar.gz, SHA-256 1d45964a100b19ce354a2cfa6ba1c7d8fc9e976e400c190af1333a92d236c13f, 8,389,134 bytes. Its index is docs/tuning/evidence-study-01-index.json.
Phase order and exact commands
The phase order below is the order actually run. Artifact timestamps establish it.
Baseline training, the screen, the selection and the isolate runs completed on 2026-09-12. The remaining work ran on 2026-09-14 in this order.
seal:opening, thenreport:opening.report:isolates.- The four
selected-trainingshards, thenseal:selected-training. - The First Side supplement on the opening seal.
train:selected-training.- The four
pilotsshards, thenseal:pilots, thenreport:pilots. preparefor the confirmation manifest.- The four
confirmationshards, thenseal:confirmation, thenreport:confirmation. - The First Side supplement on the confirmation seal.
- The compact evidence archive.
Each manifest's commands object holds the exact command text. The commands below are quoted from those objects. Shard 0 is quoted in full. Shards 1, 2 and 3 repeat it with --shard 1, --shard 2 or --shard 3 and the matching output index.
Manifest preparation:
pnpm exec tsx cli/balance-experiment.ts 'prepare' '--out' 'out/balance-experiment/study-01/baseline.json'
pnpm exec tsx cli/balance-experiment.ts 'prepare' '--policy' 'out/balance-experiment/study-01/baseline.json.baseline-training.policy.json' '--out' 'out/balance-experiment/study-01/screen.json'
pnpm exec tsx cli/balance-experiment.ts 'prepare' '--policy' 'out/balance-experiment/study-01/baseline.json.baseline-training.policy.json' '--selection' 'out/balance-experiment/study-01/screen.json.selection.json' '--out' 'out/balance-experiment/study-01/selected.json'
pnpm exec tsx cli/balance-experiment.ts 'prepare' '--policy' 'out/balance-experiment/study-01/baseline.json.baseline-training.policy.json' '--policy' 'out/balance-experiment/study-01/selected.json.selected-training.policy.json' '--selection' 'out/balance-experiment/study-01/screen.json.selection.json' '--out' 'out/balance-experiment/study-01/confirmation.json'
Baseline training, from baseline.json:
pnpm exec tsx cli/balance-experiment.ts run --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json' --phase baseline-training --shard 0 --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json.baseline-training.0.jsonl.gz'
pnpm exec tsx cli/balance-experiment.ts seal --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json' --phase baseline-training --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json.baseline-training.0.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json.baseline-training.1.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json.baseline-training.2.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json.baseline-training.3.jsonl.gz.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json.baseline-training.phase.json'
pnpm exec tsx cli/balance-experiment.ts train --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json' --archive '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json.baseline-training.phase.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json.baseline-training.policy.json'
python3 cli/analyze-balance-experiment.py report --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json' --rows '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json.baseline-training.phase.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/baseline.json.baseline-training.report.json'
The declared report:baseline-training command was not run. Baseline training delivers the policy artifact, not an outcome report.
Screen, from screen.json:
pnpm exec tsx cli/balance-experiment.ts run --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json' --phase screen --shard 0 --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.screen.0.jsonl.gz'
pnpm exec tsx cli/balance-experiment.ts seal --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json' --phase screen --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.screen.0.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.screen.1.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.screen.2.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.screen.3.jsonl.gz.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.screen.phase.json'
python3 cli/analyze-balance-experiment.py report --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json' --rows '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.screen.phase.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.screen.report.json'
python3 cli/analyze-balance-experiment.py select --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json' --rows '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.screen.phase.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.selection.json'
Isolates, from screen.json:
pnpm exec tsx cli/balance-experiment.ts run --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json' --phase isolates --shard 0 --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.isolates.0.jsonl.gz'
pnpm exec tsx cli/balance-experiment.ts seal --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json' --phase isolates --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.isolates.0.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.isolates.1.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.isolates.2.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.isolates.3.jsonl.gz.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.isolates.phase.json'
python3 cli/analyze-balance-experiment.py report --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json' --rows '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.isolates.phase.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.isolates.report.json'
Opening diagnostic, from screen.json:
pnpm exec tsx cli/balance-experiment.ts run --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json' --phase opening --shard 0 --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.opening.0.jsonl.gz'
pnpm exec tsx cli/balance-experiment.ts seal --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json' --phase opening --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.opening.0.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.opening.1.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.opening.2.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.opening.3.jsonl.gz.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.opening.phase.json'
python3 cli/analyze-balance-experiment.py report --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json' --rows '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.opening.phase.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/screen.json.opening.report.json'
Selected training, from selected.json:
pnpm exec tsx cli/balance-experiment.ts run --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json' --phase selected-training --shard 0 --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.selected-training.0.jsonl.gz'
pnpm exec tsx cli/balance-experiment.ts seal --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json' --phase selected-training --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.selected-training.0.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.selected-training.1.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.selected-training.2.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.selected-training.3.jsonl.gz.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.selected-training.phase.json'
pnpm exec tsx cli/balance-experiment.ts train --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json' --archive '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.selected-training.phase.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.selected-training.policy.json'
python3 cli/analyze-balance-experiment.py report --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json' --rows '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.selected-training.phase.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.selected-training.report.json'
The declared report:selected-training command was not run, for the same reason as baseline training.
Pilot panel, from selected.json:
pnpm exec tsx cli/balance-experiment.ts run --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json' --phase pilots --shard 0 --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.pilots.0.jsonl.gz'
pnpm exec tsx cli/balance-experiment.ts seal --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json' --phase pilots --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.pilots.0.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.pilots.1.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.pilots.2.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.pilots.3.jsonl.gz.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.pilots.phase.json'
python3 cli/analyze-balance-experiment.py report --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json' --rows '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.pilots.phase.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/selected.json.pilots.report.json'
Confirmation, from confirmation.json:
pnpm exec tsx cli/balance-experiment.ts run --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json' --phase confirmation --shard 0 --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json.confirmation.0.jsonl.gz'
pnpm exec tsx cli/balance-experiment.ts seal --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json' --phase confirmation --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json.confirmation.0.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json.confirmation.1.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json.confirmation.2.jsonl.gz.json' --receipt '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json.confirmation.3.jsonl.gz.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json.confirmation.phase.json'
python3 cli/analyze-balance-experiment.py report --manifest '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json' --rows '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json.confirmation.phase.json' --out '/Users/cody/Dev/mecha-skirmish/out/balance-experiment/study-01/confirmation.json.confirmation.report.json'
Each manifest also carries a validate command. It checks the manifest against the frozen source closure and the declared keys.
Experimental conditions
The primary mechanical factorial has four factors. These are TN11, Hammer2, Duelist Capacity 4, and Core Durability +2.
All 16 combinations include the control.
TN10, TN12, Duelist Capacity 5, and Core Durability +4 are separate dose singles.
Removing the Piloting pool bonus is a separate sensitivity. It does not enter the primary mechanical bundle.
Momentum, paid forms, and prospective melee threat form a separate three-factor policy panel.
The screen includes every nonempty policy subset on control mechanics and the full mechanical bundle.
Overlap removal gives 35 unique screen profiles. The isolate panel uses 21 distinct mechanical profiles.
Every option is experimental and opt-in. Absent options preserve the playable control's events and RNG state.
Catalog and roster controls
Candidate catalogs are pure clones. Each clone changes only its declared fields.
Hammer2 changes Hammer melee dice from one to two. It does not change damage, Pen, Heat, or Weight.
Core candidates add Durability to Light, Medium, and Heavy chassis only.
Capacity candidates change Duelist arm Capacity only.
Every original legal build remains unchanged. Only an illegal original enters deterministic refit selection.
The refit search evaluates all 121 ordered arm pairs. It validates the complete build and Team Cap.
Combined relevant Handling sums arms that support occupied weapon hands.
The declared ranking uses combined relevant Handling, changed arms, Weight, Durability, and lexical IDs in that order.
Frontier rows expose Capacity, combined relevant Handling, Weight, Durability, Armor, Size, equipment support, and legality.
The diagnostic no-dominance label covers Capacity, combined relevant Handling, Weight, and Durability. It ignores legality.
It does not establish a better arm or build.
Completed assembly evidence
The frozen assembly artifact is out/balance-experiment/study-01/frontiers.json.
Its SHA-256 is 49c53693c3d86848f6e66de607e71b7228e291bbff113a033625f661cb61d99b.
| Condition | Light Duelist refits | Team Weight | Legal |
|---|---|---|---|
| Control | None | 97 | Yes |
| Capacity 5 | Hammer support arm: Duelist to Rifle | 96 | Yes |
| Capacity 4 | Greatblade support arm: Duelist to Rifle; Hammer support arm: Duelist to Pulse | 95 | Yes |
The other six whole-game rosters remain unchanged. Every final roster refit is legal.
Only support arms change. Active weapon-source Handling stays at 1.
Greatblade keeps five melee pool dice. Hammer keeps four in control and Capacity-only profiles.
Hammer2 profiles give Hammer five melee pool dice.
Combined relevant Handling changes from 2 to 1. This ranking value is distinct from active weapon-source Handling.
All 8,712 rows remain in each frontier condition.
| Condition | No-dominance label | Illegal within label | Legal within label |
|---|---|---|---|
| Control | 3,258 | 364 | 2,894 |
| Capacity 5 | 3,192 | 422 | 2,770 |
| Capacity 4 | 3,048 | 463 | 2,585 |
Each no-dominance-label count includes its listed illegal rows.
The label uses Capacity, combined relevant Handling, Weight, and Durability axes only.
Illegal rows can dominate legal rows in this diagnostic. Legal labeled rows are not a legal Pareto frontier.
One illegal Light Shortblade and Shield row uses Autocannon and Spike arms.
It dominates the legal Blade and Pulse arm row on the declared axes.
Refit selection filters legal rows separately. All row data and refit validity remain sound.
Illegal rows remain visible but cannot enter a legal refit. Armor and Size are excluded from the diagnostic comparison.
Capacity changes the assembly only. Its combat effect is reported in result family 3, and the isolates show no combat effect in either direction.
Completed legal-only frontier supplement
The supplement filters legal rows before applying the same four-axis dominance test.
It groups rows by catalog, body, and package.
| Condition | Legal rows | Undominated legal rows |
|---|---|---|
| Control | 7,826 | 2,894 |
| Capacity 5 | 7,722 | 2,770 |
| Capacity 4 | 7,511 | 2,585 |
These undominated counts equal the legal counts within the original no-dominance labels.
The supplement verifies that equality through a separate legal-only recomputation.
The script is out/balance-experiment/study-01/legal-frontier-supplement.py.
Its SHA-256 is 589c917aa1c906e832add0b0d1b6403c325d08b5eee79fb10e0edae695927ef0.
The output is out/balance-experiment/study-01/legal-frontier-supplement.json.
Its SHA-256 is 4db14f6f776bb7032d2c8d8295eedc102f3bf0a5143e110693425b0085ea950c.
This supplement does not enter refits, screen, selection, or confirmation.
It adds no balance verdict.
The whole-game panel uses the prior six rosters and one Light Duelist roster.
The Light Duelist roster fields Dual Blades, Great Sword, and Hammer. This gives Hammer whole-game exposure.
All whole-game cells deploy one targetable Cooling Tender for each side. Both bots use platformTargets: true.
Whole-game cells retain the baseline platform position, movement, and target selection policy.
Complete exchanges, repeated-combat fixtures, and Momentum Charge fixtures omit launch platforms.
Isolate cohorts
The complete-exchange panel reruns the 15-package round robin for every mechanical profile.
It includes 120 unordered package pairs, both initiators, and 256 seeds.
The same-weapon sensitivity adds three Light Idris against Medium Ruko comparisons and both initiators.
The matched-class panel crosses Light, Medium, and Heavy for three weapons. It includes six class pairs and both initiators.
Together, these panels give 72,192 exchanges per profile and 1,516,032 declared exchanges.
The repeated panel crosses six packages, three stock targets, and declared attack policies.
It gives 45 cells per profile and 11,520 trials per profile. The declared total is 241,920 trials.
Each repeated trial uses a clear flat board at elevation zero. Ranged distance is six and melee distance is one.
The attacker uses Medium chassis, Ruko, Targeting head, two Duelist arms, Sprint legs, and Bare back.
Targets use the stock Courier with Vex, Foreman with Ilse, and Bastion with Sato.
Every weapon uses its Standard load and unlimited ammunition. The fixture preserves Heat, damage, ammunition, and status.
Ranged policies are ordinary Fire, Aimed Core, and Aimed disarm. Melee policies are targeted Core and targeted disarm.
The attacker makes one declared legal attack per activation. It vents and ends when the declared Heat rule requires it.
The target receives passive lifecycle processing. It takes no action outside the current automatic melee response.
Trials stop at combatant destruction or 16 attacker activations.
Target-event restricted time uses the observed activation. An absent event receives the fixed horizon of 16.
Early attacker destruction does not shorten restricted time. Competing attacker death and mutual destruction remain separate.
The Momentum fixture crosses distance two and three with Momentum off and on across 256 paired seeds.
It adds 1,024 exchanges. The declared isolate maximum is 1,758,976 rows.
Whole-game cohorts
Every whole-game matchup uses seven rosters, 28 unordered pairs, three maps, and four assignment cells.
The assignments cross two physical orientations with explicit First Side A and B.
The baseline trains on a 5 by 5 aggression grid. Seeds 120000 and 120001 produced 16,800 games.
The bounded zero-sum solver freezes one sampled policy for each map and pair.
The screen transfers those baseline policies to all 35 profiles. Seeds 130000 and 130001 produced 23,520 games.
The screen is a transferred-policy diagnostic. It is not an equilibrium certification for candidate profiles.
The opening diagnostic uses eight policy profiles on control mechanics.
It covers seven mirrors, new-ranged against mobile, and legacy against Light Duelists.
Three maps, four assignments, and seeds 140000 through 140007 give 6,912 declared games.
The diagnostic records both opening rounds and completes each game for outcome collection.
After selection, the standalone and combination each train on the 5 by 5 grid.
The selected training reuses seeds 120000 and 120001. It adds 33,600 declared games.
Confirmation compares control, selected standalone, and selected combination with their own frozen policies.
Seeds 230000 through 230015 give 16,128 declared confirmation games.
The pilot panel contains 128 conditions and 12,288 declared games.
It crosses 32 pilot configurations, Momentum off and on, and two mechanical context labels.
The panel uses eight seeds, three maps, four assignments, and fixed aggression 0.5.
Paid forms and prospective melee threat stay on in both pilot mechanics contexts.
The complete declared whole-game maximum is 109,248 games. The primary whole-game subset contains 90,048.
Every row below is taken from its phase seal and its manifest. The seal SHA-256 values are in the governance section.
| Phase | Units | Blocks | Seeds | Policy basis | Status |
|---|---|---|---|---|---|
| Baseline training | 16,800 games | 2 | 120000–120001 | 5 by 5 aggression grid | Complete, sealed, trained |
| Isolates | 1,758,976 rows | 256 | 101000–101255 and 111000–111255 | Declared fixture policies | Complete, sealed, reported |
| Opening diagnostic | 6,912 games | 8 | 140000–140007 | Frozen baseline policies | Complete, sealed, reported |
| Screen | 23,520 games | 2 | 130000–130001 | Frozen baseline policies | Complete, sealed, selected, reported |
| Selected training | 33,600 games | 2 | 120000–120001 | Candidate 5 by 5 grids | Complete, sealed, trained |
| Confirmation | 16,128 games | 16 | 230000–230015 | Each condition's frozen policy | Complete, sealed, reported |
| Pilot panel | 12,288 games | 8 | 310000–310007 | Fixed aggression 0.5 | Complete, sealed, reported |
Every declared row ran. No phase was reduced, truncated, or resampled after inspection.
All four baseline-training shards finished with 4,200 games each.
All four screen shards finished with 5,880 games each. Screen selection is complete.
All four isolate workers finished 439,744 rows each.
All four opening-diagnostic shards finished with 1,728 games each.
All four selected-training shards finished with 8,400 games each. The training produced 168 map-pair policies.
All four pilot shards finished with 3,072 games each.
All four confirmation shards finished with 4,032 games each. Confirmation validated 252 frozen map-pair policies before the run.
The isolate Momentum panel uses seeds 111000 through 111255. Every other isolate panel uses seeds 101000 through 101255.
Policy controls
Mixed policies use a separate deterministic RNG. Policy selection never consumes combat RNG.
Matched candidates share keyed uniform variates. Each candidate maps them through its own frozen policy distribution.
The archive records every variate and selected aggression action.
Paid forms use one deterministic greedy heuristic. A successful change costs one Quick and removes Full eligibility.
The policy can switch each hand once per activation. A switch cannot enable a second Fire from that hand.
Prospective threat uses legal future contact with current movement, obstacles, occupancy, and Budget.
Diagnostics separate full-melee-capable and contact-only projections. Zero remaining Quick adds no movement threat.
Position queries use the scored future hex. The acting unit vacates its old hex and blocks its new hex.
The cache key includes the enemy, future acting hex, and relevant state. Caches expire between activations.
The attack valuation remains a legacy single-profile approximation. It ignores common-TN and Piloting-pool toggles.
Actual melee resolution applies those toggles.
Selection and confirmation
The screen ranks profiles by equally weighted distinct-opponent roster payoff spread. Lower spread ranks first.
Eligibility requires declared round, no-death, proactive-attack, and maximum First Side bias guards.
Mean rounds must not exceed control by more than 0.75.
The no-death fraction must not exceed control by more than 0.10.
Mean proactive mech attacks must reach at least 0.75 times control.
Maximum absolute First Side bias across mirror and map cells must not exceed the control maximum by more than 0.10.
Physical-side bias remains a reported audit. It is not an eligibility guard.
The standalone must contain exactly one change. The combination must contain at least two factors.
Eligible ties use fewer factors and then lexical condition ID.
If no profile passes, the fallback first minimizes failed guards. It then chooses lower spread.
Remaining ties use fewer factors, then lexical condition ID.
Any fallback receives a failed-screen exploratory label.
Selection cannot add an undeclared profile. Confirmation cannot change, replace, or extend a selected profile.
Screen selection
The screen is a selection step, not a result. Confirmation is the result. Read this section as the record of how the two candidates were chosen.
The validated selection artifact is out/balance-experiment/study-01/screen.json.selection.json.
Its SHA-256 is d9a4feb05f4a2416cd8e5ac017bebdd3c02aaa0bae92b53125b3437d65cad9cc.
Both tables in this section come from out/balance-experiment/study-01/screen.json.screen.report.json. The roster-mean table is recomputed from that report's matchup cells with the analyzer's own weighting, because the screen report holds no roster block.
The screen uses two seed blocks and fixed baseline policies. It is not a candidate-trained equilibrium.
All 35 profiles passed every declared guard.
The control maximum absolute First Side bias is 0.50, which is the metric's mathematical upper bound.
The control-relative addition of 0.10 gives an effective bound of 0.60. This guard cannot filter this screen.
Every candidate also records an actual maximum of 0.50. Passing this guard does not demonstrate fairness.
The guards.mirror.values fields are per-cell candidate-minus-control deltas. They are not actual cell biases.
The separate candidate and baseline maximum fields contain the actual maxima.
TN10 is the screen-selected standalone. It passed with a 41.67 percentage-point spread.
The control spread is 50.00 points.
The screen-selected combination is tn11+hammer2+blade-cap4+core-plus2@paid-forms.
It passed with a 48.26 percentage-point spread.
| Profile | Spread | Round delta | No-death delta | Activity ratio | Failed guards |
|---|---|---|---|---|---|
control |
50.00 pp | +0.000 | +0.00 pp | 1.000 | None |
tn11 |
54.86 pp | +0.100 | +0.00 pp | 0.998 | None |
hammer2 |
53.47 pp | -0.012 | +0.00 pp | 0.995 | None |
tn11+hammer2 |
53.47 pp | +0.055 | +0.00 pp | 0.990 | None |
blade-cap4 |
50.69 pp | -0.009 | +0.00 pp | 0.998 | None |
tn11+blade-cap4 |
55.56 pp | +0.088 | +0.00 pp | 0.997 | None |
hammer2+blade-cap4 |
52.78 pp | -0.016 | +0.00 pp | 0.993 | None |
tn11+hammer2+blade-cap4 |
54.17 pp | +0.051 | +0.00 pp | 0.991 | None |
core-plus2 |
52.08 pp | +0.152 | +0.15 pp | 1.057 | None |
tn11+core-plus2 |
50.00 pp | +0.249 | +0.15 pp | 1.057 | None |
hammer2+core-plus2 |
56.94 pp | +0.147 | +0.15 pp | 1.054 | None |
tn11+hammer2+core-plus2 |
52.78 pp | +0.196 | +0.15 pp | 1.055 | None |
blade-cap4+core-plus2 |
51.39 pp | +0.147 | +0.15 pp | 1.056 | None |
tn11+blade-cap4+core-plus2 |
50.69 pp | +0.250 | +0.15 pp | 1.057 | None |
hammer2+blade-cap4+core-plus2 |
56.94 pp | +0.146 | +0.15 pp | 1.053 | None |
tn11+hammer2+blade-cap4+core-plus2 |
53.13 pp | +0.195 | +0.15 pp | 1.054 | None |
tn10 |
41.67 pp | +0.031 | +0.00 pp | 0.985 | None |
tn12 |
44.44 pp | +0.086 | -0.15 pp | 0.999 | None |
blade-cap5 |
50.00 pp | +0.000 | +0.00 pp | 1.000 | None |
core-plus4 |
55.56 pp | +0.257 | +0.45 pp | 1.113 | None |
pilot-pool-off |
56.94 pp | +0.076 | -0.15 pp | 1.011 | None |
control@momentum |
50.00 pp | +0.000 | +0.00 pp | 1.000 | None |
control@paid-forms |
52.08 pp | -0.001 | -0.60 pp | 1.053 | None |
control@momentum+paid-forms |
52.08 pp | -0.001 | -0.60 pp | 1.053 | None |
control@prospective-melee-threat |
59.03 pp | +0.161 | +4.91 pp | 0.957 | None |
control@momentum+prospective-melee-threat |
59.03 pp | +0.161 | +4.91 pp | 0.957 | None |
control@paid-forms+prospective-melee-threat |
59.03 pp | +0.155 | +4.61 pp | 1.006 | None |
control@momentum+paid-forms+prospective-melee-threat |
59.03 pp | +0.155 | +4.61 pp | 1.006 | None |
tn11+hammer2+blade-cap4+core-plus2@momentum |
53.13 pp | +0.195 | +0.15 pp | 1.054 | None |
tn11+hammer2+blade-cap4+core-plus2@paid-forms |
48.26 pp | +0.164 | -0.45 pp | 1.104 | None |
tn11+hammer2+blade-cap4+core-plus2@momentum+paid-forms |
48.26 pp | +0.164 | -0.45 pp | 1.104 | None |
tn11+hammer2+blade-cap4+core-plus2@prospective-melee-threat |
57.64 pp | +0.347 | +5.36 pp | 1.008 | None |
tn11+hammer2+blade-cap4+core-plus2@momentum+prospective-melee-threat |
57.64 pp | +0.347 | +5.36 pp | 1.008 | None |
tn11+hammer2+blade-cap4+core-plus2@paid-forms+prospective-melee-threat |
53.47 pp | +0.333 | +5.21 pp | 1.053 | None |
tn11+hammer2+blade-cap4+core-plus2@momentum+paid-forms+prospective-melee-threat |
53.47 pp | +0.333 | +5.21 pp | 1.053 | None |
Round and no-death values are changes from control. No-death changes and spreads use percentage points.
Activity is the candidate-to-control proactive mech attack ratio. Values are rounded for display.
| Roster | Control mean | TN10 mean | Selected combination mean |
|---|---|---|---|
| Legacy | 52.08% | 52.78% | 50.69% |
| New ranged | 67.36% | 66.67% | 65.28% |
| New melee | 29.17% | 26.39% | 29.86% |
| Transformers | 17.36% | 25.00% | 18.75% |
| Mobile | 58.33% | 56.25% | 59.72% |
| Heavy anchor | 59.72% | 61.11% | 58.68% |
| Light Duelists | 65.97% | 61.81% | 67.01% |
These means weight the six distinct opponents and three maps equally.
Every matched pair that differs only by Momentum is bit-identical in headlines, matchups, mirrors, and per-map cells. The 35 profiles hold 27 distinct conditions. 5,376 of the 23,520 screen games carry no new information.
The protocol declares Momentum a negative control in the seven primary rosters, because the mixed pilot trio leaves D3 inactive. The opening review adds a needed qualification. Pilot Ruko Han carries the Momentum Ability and is fielded on every board. The engine gate also requires a move of three or more hexes. The zero is therefore two gates, not an absent carrier.
Two seed blocks do not support a significance claim. Every screen interval is the range of three resample patterns. The screen does not confirm either selection.
Neither selection changes a playable rule or default.
The screen's own numbers did not survive confirmation intact. Control's screen spread of 50.00 pp rose to 57.99 pp at confirmation with the same seven rosters. The 50.00 pp figure came from two blocks at eight games per cell, and the policy variate key contains the phase, so the screen and confirmation drew different aggression actions. Do not quote 50.00 pp as the study's baseline.
Confirmation: the primary result
Confirmation is the study's primary result. Every number in this section comes from out/balance-experiment/study-01/confirmation.json.confirmation.report.json.
The one exception is the roster-mean table. That report holds no roster block, so the roster means are recomputed from its 84 matchup cells with the analyzer's own weighting: distinct opponents only, the reverse cell mirrored as one minus the rate, six opponents and three maps weighted equally.
Confirmation ran three conditions on 16 fresh seed blocks, seeds 230000 through 230015. Each condition played 5,376 games, for 16,128 rows. Each condition covers 84 matchup cells at 64 games each. Each condition holds 21 mirror cells.
Each arm used its own trained aggression policy. Control used the frozen baseline grid. tn10 and the combination used the selected-training grid.
The policy uniform is keyed without the condition. All three arms consumed the same variate in the same cell. The pairing is per game, not only per block.
The preregistered selection metric is roster payoff spread. Spread is the maximum minus the minimum of the seven roster means. Smaller is more even.
Spread
| Condition | Spread | Paired difference from control | ci95 | Blocks |
|---|---|---|---|---|
control |
57.99 pp | 0.00 pp | [0.00, 0.00] | 16 |
tn10 |
48.35 pp | −9.64 pp | [−14.41, −3.99] | 16 |
tn11+hammer2+blade-cap4+core-plus2@paid-forms |
60.16 pp | +2.17 pp | [−1.48, +5.82] | 16 |
tn10 confirmed. Its interval excludes zero in the smaller-is-better direction. The screen predicted −8.33 pp. Confirmation gives −9.64 pp on fresh seeds and its own trained policy. Direction and size both replicate.
The combination did not confirm. Its interval includes zero and its point estimate is in the wrong direction. Spread increased by 2.17 pp. Its screen estimate was −1.74 pp with an interval of [−1.74, +1.39] pp that already included zero. The sign flipped between selection and confirmation.
The spread levels of 57.99 pp, 48.35 pp and 60.16 pp are bare point estimates. No spread level anywhere in the study carries an interval.
Sixteen blocks give 300,540,195 distinct resample patterns. The bootstrap draws 4,000 of them. The percentile grid is limited by the repetition count, not by block combinatorics.
Roster means
Each mean is the roster's payoff share over six distinct opponents and three maps, mirrors excluded. Each column sums to 350.00 pp.
| Roster | Control | tn10 |
Change | Combination | Change |
|---|---|---|---|---|---|
| legacy | 52.60 pp | 53.13 pp | +0.52 pp | 55.30 pp | +2.69 pp |
| new-ranged | 59.98 pp | 67.80 pp | +7.81 pp | 59.72 pp | −0.26 pp |
| new-melee | 29.17 pp | 30.47 pp | +1.30 pp | 29.86 pp | +0.69 pp |
| transformers | 15.97 pp | 19.44 pp | +3.47 pp | 17.36 pp | +1.39 pp |
| mobile | 52.86 pp | 50.95 pp | −1.91 pp | 55.64 pp | +2.78 pp |
| heavy-anchor | 65.45 pp | 61.98 pp | −3.47 pp | 54.60 pp | −10.85 pp |
| light-duelists | 73.96 pp | 66.23 pp | −7.73 pp | 77.52 pp | +3.56 pp |
No per-roster interval exists. The confirmation report holds no roster block. These means and their changes are point estimates. The finest paired intervals in the file are the 84 matchup cells.
tn10 compresses by reordering, not by a uniform squeeze. The floor rises 3.47 pp. The ceiling falls 7.73 pp, and new-ranged replaces light-duelists as the top roster at 67.80 pp.
The combination moves the two ends in opposite amounts. The floor rises 1.39 pp and the ceiling rises 3.56 pp. Its largest roster effect is heavy-anchor at −10.85 pp. That move is interior, so the selection metric cannot see it.
Headline metrics that moved
Each difference is the candidate minus control on 16 blocks. Every interval listed here excludes zero. Counts are per game unless marked pp.
| Metric | Control | tn10 change |
ci95 |
|---|---|---|---|
| payoff | 44.98 pp | +3.34 pp | [+2.18, +4.46] |
| noDeath | 3.85 pp | +0.32 pp | [+0.06, +0.58] |
| rounds | 6.243 | +0.039 | [+0.001, +0.077] |
| meleeStarts | 4.041 | +0.262 | [+0.180, +0.346] |
| parries | 9.661 | +3.029 | [+2.696, +3.389] |
| shieldParries | 3.177 | +0.435 | [+0.358, +0.511] |
| firstDeathRestrictedTime | 3.482 | +0.048 | [+0.028, +0.068] |
| heatAdded | 25.015 | −0.357 | [−0.565, −0.153] |
| limb:movement | 1.036 | −0.031 | [−0.058, −0.007] |
| limb:survivedNextActivation | 71.19 pp | −1.31 pp | [−2.66, −0.04] |
tn10 left these flat: wipes, part disables, proactive attacks, ending heat, First Side payoff, side A payoff, limb activations, limb attack, limb support, limb maintenance-only, and limb censoring.
Two tn10 exclusions are narrow. The rounds lower endpoint is +0.001297 rounds. The limb:survivedNextActivation upper endpoint is −0.000430, which is −0.0430 pp. Both exclude zero only at full precision.
| Metric | Control | Combination change | ci95 |
|---|---|---|---|
| noDeath | 3.85 pp | +1.90 pp | [+1.41, +2.36] |
| wipe | 51.17 pp | −9.02 pp | [−10.75, −7.18] |
| rounds | 6.243 | +0.180 | [+0.143, +0.217] |
| proactiveAttacks | 14.713 | +1.862 | [+1.738, +1.998] |
| meleeStarts | 4.041 | +0.418 | [+0.325, +0.510] |
| parries | 9.661 | +1.499 | [+1.192, +1.811] |
| partDisables | 6.003 | +0.071 | [+0.007, +0.132] |
| firstDeathRestrictedTime | 3.482 | +0.300 | [+0.270, +0.330] |
| heatAdded | 25.015 | +4.613 | [+4.370, +4.852] |
| endingHeat | 9.483 | +1.572 | [+1.437, +1.709] |
| firstSidePayoff | 50.07 pp | +1.79 pp | [+0.24, +3.16] |
| formChanges | 0.000 | +0.357 | [+0.351, +0.364] |
| limb:activations | 1.239 | +0.117 | [+0.077, +0.156] |
| limb:attack | 0.555 | +0.099 | [+0.071, +0.125] |
| limb:movement | 1.036 | +0.071 | [+0.030, +0.110] |
| limb:support | 0.705 | +0.042 | [+0.013, +0.071] |
| limb:noLaterActivationCensored | 5.08 pp | +1.33 pp | [+0.56, +2.17] |
| limb:survivedNextActivation | 71.19 pp | +3.90 pp | [+2.63, +5.20] |
The combination left payoff, shield parries, side A payoff and limb maintenance-only flat.
Read the two candidates plainly. tn10 buys evenness with defence. Parries rise by about three per game and no-death games rise slightly. Lethality does not change, because wipes and part disables do not move. Turn-order fairness does not change.
The combination trades a wider roster spread and a stronger turn-order advantage for markedly fewer wipes and a longer, hotter, busier game.
The limb: denominators are themselves outcomes. They are 7,003 records under control, 6,972 under tn10, and 7,707 under the combination. The combination produces about 10 percent more limb-agency observations, so its limb: differences mix a rate change with a composition change.
Five headline metrics are constant at zero in all three conditions. They are field repair, riposte, scramble, ability momentum, and Momentum dice. Three are null by instrumentation: Pace, Deadeye, and threat-changed choices.
formChanges is zero in control and in tn10. The transformers roster is the only roster with form-capable equipment. It never changed form in 10,752 games, while setting the floor of the primary metric in every arm.
First Side and mirrors at confirmation
Control First Side payoff by map, 1,792 games per map. The levels carry no interval.
| Map | Control First Side payoff | Control side A payoff |
|---|---|---|
| Quarry | 49.94 pp | 50.61 pp |
| Causeway | 52.23 pp | 50.67 pp |
| Foundry | 48.05 pp | 50.50 pp |
Control overall First Side payoff is 50.07 pp. Control overall side A payoff is 50.60 pp. The per-map range is 4.18 pp.
Paired First Side differences by map, 16 blocks:
| Map | tn10 change |
ci95 | Combination change | ci95 |
|---|---|---|---|---|
| Quarry | −0.59 pp | [−3.43, +2.18] | −1.17 pp | [−4.02, +1.40] |
| Causeway | −2.01 pp | [−5.47, +1.28] | +4.80 pp | [+3.18, +6.36] |
| Foundry | +0.28 pp | [−2.46, +3.01] | +1.73 pp | [−2.40, +5.80] |
The combination's Causeway First Side share is 57.03 pp. Its overall First Side share is 51.86 pp, and that difference also excludes zero.
The 21 mirror cells hold 64 games each. The mirror statistic is the absolute distance from 0.5, with the direction discarded.
| Statistic | Control | tn10 |
Combination |
|---|---|---|---|
| Maximum First Side magnitude | 0.3750 | 0.3438 | 0.5000 |
| Cells at the 0.500 ceiling | 0 | 0 | 3 |
| Cells at or above 0.250 | 5 | 3 | 8 |
| Maximum physical magnitude | 0.0938 | 0.1250 | 0.1563 |
Three mirror cells under the combination are 64-to-0 First Side sweeps. They are causeway/heavy-anchor, causeway/light-duelists, and quarry/transformers. All three carry a physical magnitude of exactly 0.0, which is the signature of a pure turn-order lock. Control's ceiling at the same resolution is 0.3750, which is 56 games to 8 in one cell.
Those three cells appear in the matchup table as perfectly even 0.5000 cells with [0.00, 0.00] intervals. The four balanced assignments cancel the sweep exactly. A reader of the matchup table alone will record them as the three most even cells in the study.
The protocol does not re-run the screen guards at confirmation. Re-evaluated on confirmation numbers the rounds guard, the no-death guard and the activity guard pass for both candidates. The mirror guard passes for tn10 at 0.3438 against control's 0.3750. The combination reaches 0.5000 against control's 0.3750, which is 12.5 pp against a 10 pp allowance, so it would fail.
Confirmation carries no interaction result
The confirmation report has no matchedFactorInteractions block. The analyzer emits that block only for the screen phase.
The absence is structural, not an omission. The confirmed standalone is not a component of the confirmed combination. tn10 and tn11 are different doses of the same lever. The protocol's ABC − AC − BC + C form is not computable from three arms without matched component-alone backgrounds.
No factor inside the combination can be credited or blamed from confirmation. The screen block remains the study's only interaction evidence.
Turn-order fairness
Turn-order fairness is reported from the opening diagnostic, the confirmation phase, and the First Side supplement. The supplement sits outside the frozen source closure. It is descriptive, and it did not influence selection.
Sources for this section: screen.json.opening.report.json, confirmation.json.confirmation.report.json, first-side-supplement.json for the opening, and first-side-supplement-confirmation.json for the replication. Every level with an interval comes from a supplement. Every level without one comes from a frozen report.
The screen's First Side guard was uninformative. Control's maximum absolute mirror bias was 0.50, which is the metric's mathematical ceiling. Six of 21 control mirror cells were swept 8 games to 0 by turn order at eight games per cell. All six had a physical bias of exactly 0.000, so side A split evenly while the first mover took every game.
The opening diagnostic was built as the substitute. Control's First Side share by map, 288 games per map, with the supplement's whole-block interval:
| Map | Opening control First Side share | Block interval | Blocks | Games |
|---|---|---|---|---|
| Quarry | 58.68 pp | [53.1, 64.9] | 8 | 288 |
| Foundry | 44.10 pp | [39.6, 48.6] | 8 | 288 |
| Causeway | 39.24 pp | [31.6, 47.2] | 8 | 288 |
| Pooled | 47.34 pp | [43.3, 51.0] | 8 | 864 |
Those intervals come from the supplement, not from the frozen analyzer. The opening report itself attaches no interval to any First Side level.
On confirmation's 16 fresh seed blocks with trained policies the map-level effects do not replicate:
| Map | Confirmation control First Side share | Block interval | Blocks | Games |
|---|---|---|---|---|
| Quarry | 49.9 pp | [47.9, 52.1] | 16 | 1,792 |
| Foundry | 48.0 pp | [45.4, 50.8] | 16 | 1,792 |
| Causeway | 52.2 pp | [49.7, 54.6] | 16 | 1,792 |
| Pooled | 50.1 pp | [48.7, 51.3] | 16 | 5,376 |
All four intervals cover even.
Pooled over mirrors only, where roster advantage is absent, part of the effect persists. First-mover share by map, opening then confirmation:
| Map | Opening mirrors, 8 blocks | Confirmation mirrors, 16 blocks |
|---|---|---|
| Quarry | 64.3 pp | 54.9 pp |
| Foundry | 44.2 pp | 42.9 pp |
| Causeway | 35.7 pp | 48.2 pp |
These mirror pools are point estimates. The supplement publishes no interval for the mirror pool.
Quarry first-mover and Foundry second-mover persist attenuated. Causeway does not replicate.
Specific roster-by-map cells replicate across both designs. Light-duelists on Quarry gives the first mover 0.88 in both, at 32 games then 64. Heavy-anchor on Causeway is strongly second-mover in both, 0.00 then 0.19. New-melee on Foundry reads 0.12 then 0.19.
Two cells flip. Legacy on Quarry reads 0.75 then 0.34. New-ranged on Quarry reads 0.62 then 0.44.
Read this as a roster-by-map effect concentrated in mirrors. It is not a map constant. The opening design amplified it, because seven of its nine pairings are mirrors and it transferred baseline policies. Confirmation covers 28 pairings with own-trained policies and dilutes the effect to even at the map level.
The candidates differ. tn10 is even on every map. The combination gives the first mover 57.0 pp on Causeway, interval [55.1, 58.8], and 51.9 pp pooled, interval [50.2, 53.6].
In the opening, all six mirror cells at a share of zero or one are second-mover sweeps. causeway/heavy-anchor is swept in all four distinct arms. quarry/transformers is swept in the two paid-forms arms.
The opening report has no per-assignment cell. The rows contain the orientation and the First Side letter. The frozen aggregator never keys on them.
Results by experiment family
Each family states its phase and its block count beside every number. A screen number on two blocks is not upgraded to a finding.
1. Melee opportunity target and Piloting-pool sensitivity
Source: screen.json.isolates.report.json for the isolates, confirmation.json.confirmation.report.json for the whole game.
Control sets no common target number. The melee threshold is the defender's Evasion. The dose conditions replace it with a flat number.
All 15 exchange packages have Evasion 11. In the exchange panel control therefore is TN 11, and tn11 is bit-identical to control across all 240 exchange cells and all 29 metrics. Any statement that tn11 did nothing is about the fixture, not the rule.
In the class panel control's thresholds are Evasion 14 for Light, 12 for Medium, and 9 for Heavy.
Exchange panel, 256 blocks, 61,440 rows per condition. Paired differences from control:
| Metric | Control | tn12 change |
ci95 | tn10 change |
ci95 |
|---|---|---|---|---|---|
| initiator usable offensive dice | 2.144 | −0.179 | [−0.206, −0.153] | +0.171 | [+0.147, +0.196] |
| defender usable offensive dice | 2.155 | −0.174 | [−0.192, −0.156] | +0.175 | [+0.159, +0.192] |
| initiator parried incoming strikes | 0.659 | −0.065 | [−0.074, −0.057] | +0.071 | [+0.062, +0.080] |
| defender parried incoming strikes | 1.104 | −0.094 | [−0.105, −0.083] | +0.084 | [+0.074, +0.095] |
| initiator zero available response | 4.58 pp | +1.85 pp | [+1.20, +2.53] | −1.80 pp | [−2.37, −1.25] |
| initiator accepted strikes | 0.594 | −0.021 | [−0.036, −0.007] | +0.018 | [+0.004, +0.032] |
| initiator body damage dealt | 3.325 | −0.068 | [−0.144, +0.006] | +0.063 | [−0.008, +0.135] |
| fighter0 alive | 86.56 pp | +0.26 pp | [−0.10, +0.64] | −0.18 pp | [−0.56, +0.18] |
| mutual survival | 75.21 pp | +0.33 pp | [−0.32, +0.98] | −0.24 pp | [−0.88, +0.39] |
The dose response is monotone and nearly antisymmetric about control on every dice-availability and traffic metric. It does not reach lethality. No exchange survival interval excludes zero, and no damage-dealt interval excludes zero. Usable shield dice are exactly unchanged at every dose.
The class panel is the only panel that separates Light, Medium and Heavy. Its cell splits carry no interval. Under control a Light initiator deals 11.27 body damage to a Heavy defender and kills it 31.77 percent of the time. A Heavy initiator deals 0.91 to a Light defender and kills it 8.98 percent of the time. The cross-class death gap is 22.8 pp against the Heavy.
Every dose closes that gap. tn12 leaves −2.1 pp, tn11 leaves −0.5 pp, and tn10 leaves +3.4 pp. Heavy-defender deaths fall from 31.77 percent to 15.76, 17.58 and 21.88 percent. Light-defender deaths rise from 8.98 percent to 17.84, 18.10 and 18.49 percent.
The gap closes by killing Heavies less, not by killing Lights more. Class-panel mutual survival rises at every dose: +0.52 pp [−0.39, +1.39] at tn12, +1.55 pp [+0.40, +2.66] at tn11, +1.49 pp [+0.31, +2.65] at tn10. Damage dealt falls on both sides at every dose.
tn10 raises class-panel usable offensive dice by +0.540 [+0.491, +0.588] and defender parries by +0.313 [+0.291, +0.336]. The extra dice arrive on defence as well as offence, and parries rise faster than strikes.
pilot-pool-off is bit-identical to control in all 240 exchange cells and all 36 class cells. The toggle bites only where a pilot has Piloting 2 or more. No pilot in those two panels does.
Whole game: the screen ranked tn10 first at 41.67 pp on two blocks. Confirmation gives −9.64 pp [−14.41, −3.99] on 16 blocks. tn10 is confirmed on the preregistered metric. It evens the field through defence and reordering, not through melee lethality.
2. Hammer opportunity increase
Source: screen.json.isolates.report.json, 256 blocks.
hammer2 changes exactly 30 of the 240 exchange cells and 6 of the 45 repeated cells. The sensitivity and class panels are bit-identical, because the Hammer is not in them.
The 30 changed exchange cells are a clean subset with equal denominators, so the panel interval rescales exactly by 8. The rescaled 256-block paired intervals for that subset:
| Metric | Difference | ci95 |
|---|---|---|
| initiator usable offensive dice | +0.271 | [+0.240, +0.302] |
| defender usable offensive dice | +0.326 | [+0.284, +0.371] |
| initiator accepted strikes | −0.082 | [−0.105, −0.058] |
| defender accepted strikes | −0.056 | [−0.093, −0.019] |
| fighter0 alive | +2.20 pp | [+0.81, +3.61] |
| fighter0 core lost | −0.351 | [−0.494, −0.201] |
| initiator body damage dealt | −0.201 | [−0.413, +0.013] |
| mutual survival | +1.15 pp | [−1.03, +3.32] |
Recast onto the Hammer side, as point estimates over the 30 cells with no interval at that cut: the Hammer deals 1.006 more body damage, its opponent deals 1.269 less, the Hammer dies 7.85 pp less often, and its opponent dies 6.71 pp more often.
The Hammer was weak to begin with. Over the 28 non-mirror exchange cells in which each package appears, it ranks 13th of 15 on damage dealt at 1.879 and last of 15 on net kill differential at −0.189. Under hammer2 it moves to 9th on damage at 2.958 and 10th on net at −0.033. It stays below the midpoint.
In the six repeated-panel Hammer cells, restricted time-to-kill moves +0.47 against the Courier under the Core policy, +0.20 against the Foreman, and −0.22 against the Bastion. Attacker death against the Bastion falls 3.9 pp under the Core policy and 4.7 pp under the disarm policy.
Whole game: the screen scored hammer2 at 53.47 pp on two blocks, worse than control. It was never confirmed alone. It entered confirmation only inside the failed combination. No whole-game claim can be made for it.
3. Duelist arm Capacity and legal refits
Source: frontiers.json, legal-frontier-supplement.json, screen.json.isolates.report.json, screen.json.screen.report.json.
The isolates contain no evidence about Capacity in either direction. blade-cap4 is bit-identical to control across all 327 of its cells, on every metric of every cell. Those 327 are 240 exchange, 6 sensitivity, 36 class, and 45 repeated. So is blade-cap5.
The inertness propagates through the whole factorial. Each blade-cap4 combination equals its blade-cap4-free twin exactly. The 16-cell mechanical cube therefore holds 8 distinct profiles in this phase.
The reason is in the fixtures. Every build used in the isolate fixtures already fits inside Capacity 4, so Capacity 5 and Capacity 4 produce the same builds and the same RNG stream.
Assembly is where Capacity does something. Only the Light Duelists roster needed refits. Team Weight falls from 97 to 96 to 95. Only support arms change. Active weapon-source Handling stays at 1.
Whole game: the screen scored blade-cap4 at 50.69 pp and blade-cap5 at 50.00 pp, both on two blocks. Neither entered confirmation alone.
The legal-only frontier supplement is descriptive. It adds no balance verdict.
The family is inconclusive.
4. Core Durability and disarm timing
Source: screen.json.isolates.report.json, repeated panel, 256 blocks, 11,520 rows per condition.
Keep the two time series apart. Restricted time assigns the fixed horizon of 16 activations when the event never happens. Observed conditional time uses only the trials where the event happened. They are not the same statistic.
| Metric | Control | core-plus2 change |
ci95 | core-plus4 change |
ci95 |
|---|---|---|---|---|---|
| core event activation, conditional | 4.051 | +0.406 | [+0.387, +0.426] | +0.808 | [+0.779, +0.835] |
| disarm event activation, conditional | 2.871 | +0.122 | [+0.098, +0.147] | +0.240 | [+0.206, +0.275] |
| core timing, restricted | 5.061 | +0.355 | [+0.322, +0.386] | +0.705 | [+0.660, +0.749] |
| disarm timing, restricted | 10.848 | −0.167 | [−0.191, −0.143] | −0.290 | [−0.322, −0.259] |
| weapon disabled | 39.25 pp | +1.65 pp | [+1.41, +1.88] | +2.98 pp | [+2.66, +3.29] |
| core destroyed | 91.55 pp | +0.15 pp | [−0.10, +0.40] | +0.30 pp | [−0.03, +0.65] |
| attacker destroyed | 8.28 pp | −0.23 pp | [−0.48, +0.01] | −0.52 pp | [−0.85, −0.20] |
| alive at the horizon | 0.17 pp | +0.08 pp | [+0.03, +0.14] | +0.22 pp | [+0.14, +0.30] |
| activations | 4.069 | +0.423 | [+0.406, +0.441] | +0.865 | [+0.840, +0.891] |
| attacks | 3.440 | +0.312 | [+0.299, +0.325] | +0.635 | [+0.618, +0.653] |
| vents | 0.629 | +0.111 | [+0.104, +0.119] | +0.230 | [+0.218, +0.241] |
| target core lost | 12.301 | +1.921 | [+1.897, +1.945] | +3.875 | [+3.839, +3.913] |
On the like-for-like conditional scale, plus two Core lengthens killing by 0.406 activations and disabling by 0.122. The ratio is about 3.3. Plus four roughly doubles both, so the dose response is close to linear.
The restricted disarm clock moves the opposite way. Longer fights let more disarms land inside the horizon, so weaponDisabled rises by 1.65 pp.
The 16-activation cap almost never binds. Alive-at-the-horizon is 0.17 percent panel-wide under control. It is nonzero in only two cells.
Attacker death is the real competing outcome. It is 8.28 percent panel-wide, and 30 to 79 percent in every melee cell against the Courier. In those cells the restricted time of 8.6 to 13.5 activations is dominated by the no-event rule, while the observed conditional time is 2.4 to 4.1 and is conditional on the attacker surviving.
Whole game: Core +2 was never confirmed alone. It entered confirmation only inside the failed combination. The combination's wipe fall of 9.02 pp cannot be attributed to it.
5. Momentum, paid forms, and prospective melee threat
Sources: screen.json.opening.report.json at 8 blocks, screen.json.screen.report.json at 2 blocks, screen.json.isolates.report.json at 256 blocks, selected.json.pilots.report.json at 8 blocks, confirmation.json.confirmation.report.json at 16 blocks.
Melee Momentum never fired in any whole game. The counter reads zero in all 6,912 opening games, all 23,520 screen games, and all 16,128 confirmation games. The rule was enabled in the arms that declare it, and pilot Ruko Han carries the Momentum Ability on every board.
The isolate Momentum panel is the only isolate place it fired. Three of the four cells are bit-identical. Only charge-3 with Momentum on differs. That matches the declared design, because the two-hex row is the eligibility control and the disabled-rule row is the option control.
The panel headline pools the two distances, so it is exactly half the Charge-3 effect. Doubling gives the exact Charge-3 paired interval on 256 blocks:
| Metric | Charge 3, Momentum off | Charge-3 difference | ci95 |
|---|---|---|---|
| target alive | 78.13 pp | −3.52 pp | [−9.77, +2.73] |
| target core lost | 4.742 | +0.422 | [−0.355, +1.160] |
| mutual survival | 73.05 pp | −3.91 pp | [−10.94, +3.13] |
Every Momentum interval includes zero. The point estimates go the expected way. At 256 blocks and one exchange per block, none of it separates from zero.
The pilot panel is the only place Momentum fired in whole games. It produced 117 melee Momentum dice across 12,288 games, all from Mika Rell and Ruko Han on the candidate side. The fixed opponent's control Ruko produced none in 6,144 games, so Momentum stays a true negative control on the opponent side. Turning the rule on moved no payoff interval off zero. The largest effect is +3.12 pp with an interval of [0.00, +7.29].
The Momentum counter measures the melee variant only. ability:momentum is a literal copy of momentumDice. The live ranged Momentum bonus is applied in every arm and never counted. Do not read a zero there as proof that the Ability did not fire.
Paid forms have a real mechanical surface in the whole-game panels. Form changes rise to 0.357 per game [+0.351, +0.364] inside the combination at confirmation. In the opening they rise 0.368 per game [+0.340, +0.394]. Opening heat added rises 2.536 [+2.078, +2.969], parries fall 1.167 [−1.631, −0.709], shield parries fall 0.600 [−0.692, −0.508], melee starts fall 0.167 [−0.286, −0.039], and wipes fall 3.0 pp [−5.0, −1.0].
The transformers roster is the only roster with form-capable weapons. It never changed form in control or in tn10, across 10,752 confirmation games, and it sets the floor of the primary metric in every arm. With paid forms on, it gains only 1.39 pp.
Prospective melee threat is in no confirmed candidate. The screen scored it at 59.03 pp spread, which is 9.03 pp worse than control on two blocks. In the opening, 8 blocks, it cuts melee starts 0.684 [−0.860, −0.532], parries 1.966 [−2.590, −1.417], shield parries 0.743 [−1.126, −0.323], part disables 0.362 [−0.447, −0.279], and proactive attacks 0.525 [−0.727, −0.337]. It raises no-death games 5.3 pp [+3.8, +6.5], first-death restricted time 0.307 [+0.264, +0.355], and rounds 0.142 [+0.043, +0.243].
The factor's own decision counter is measured in the opening phase only. It is derived from opening counterfactual rows, so it is null in the screen, pilot and confirmation reports by construction. In the opening it is the least distinguishable number in its own table: −0.012 [−0.031, +0.001] under paid forms and +0.005 [−0.060, +0.065] under prospective threat. It counts changed decisions per game and has no decision denominator.
6. Pilot stats and ability access
Source: selected.json.pilots.report.json, 8 blocks, 12,288 games.
These are controlled diagnostics against one fixed opponent at fixed aggression 0.5. They are not equilibrium, not a faction rank, and not a both-sides result.
The 128 condition blocks carry no interval. The pilots phase has no condition named control, so every headline paired interval, the spread, and the mirrors are null. Every interval quoted here comes from the controlled contrasts block, which contrasts four axes and never compares one faction to another.
Native stats matter for two trios. Normalizing to 1/1/1 costs FSU payoff −0.198 [−0.333, −0.083] in the control arm and −0.135 [−0.219, −0.052] in the selected arm. Yutani shows the same sign in both arms and clears zero only in the selected arm at −0.125 [−0.281, −0.010]. Hauer, Dioscuri and B&B span zero in both arms.
FSU's result is confounded. It is the only trio with a live intra-trio Bond on the board, Marrow and Ruko. Its stats and abilities contrasts sit on top of a plus die no other trio receives.
Losing the ability package costs payoff with an interval excluding zero for Yutani and B&B in both arms, and for FSU in the selected arm. Yutani reads −0.188 [−0.281, −0.094] in the control arm and −0.188 [−0.344, −0.042] in the selected arm. B&B reads −0.135 [−0.250, −0.031] and −0.115 [−0.198, −0.042]. Their proactive attacks fall about 1.3 to 1.7 per game, with intervals excluding zero.
Yutani and B&B are exactly the two trios that carry Pace. Pace has no proc counter.
The Yutani subsets resolve onto Pace. Every subset that contains the Pace pilot is statistically indistinguishable from the full trio on payoff. Every subset that lacks him is clearly below it. Subset minus all three, control mechanics, native stats, Momentum off, which is the same slice as the two paragraphs above:
| Subset | Active abilities | Payoff difference | ci95 |
|---|---|---|---|
| none | None | −0.188 | [−0.281, −0.094] |
| Mika | Momentum | −0.135 | [−0.229, −0.052] |
| Tavi | Scramble | −0.198 | [−0.344, −0.073] |
| Mika and Tavi | Momentum, Scramble | −0.167 | [−0.260, −0.083] |
| Vex | Pace | −0.094 | [−0.219, +0.042] |
| Mika and Vex | Momentum, Pace | −0.010 | [−0.063, +0.052] |
| Tavi and Vex | Scramble, Pace | −0.031 | [−0.167, +0.135] |
The point estimates are identical on the Momentum-on slice. Only the interval endpoints differ.
Removing Scramble alone or Momentum alone costs nothing detectable. The subsets are implemented as per-pilot toggles. They coincide with Pace, Momentum and Scramble only because each Yutani pilot owns exactly one of the three.
52 of the 128 contexts are byte-identical to another context once the condition-derived labels are neutralized. The 128 labelled contexts reduce to 76 distinct game sets, in 40 singletons, 32 pairs, 2 groups of four and 2 groups of eight, so 4,992 of the 12,288 games are exact re-simulations. Most of those pairs are the legitimate Momentum-off and Momentum-on twins where no Momentum pilot is active. The cross-faction collapses are not legitimate: 8 of the 64 pilot-configuration cells duplicate another cell. Hauer and Dioscuri are the same games once stats are normalized. Hauer, Dioscuri, B&B and Yutani are all the same games at normalized stats with abilities off. The cause is that pilot Initiative never reaches combat.
Paid forms had no mechanical surface in this panel. Form changes are exactly zero in all 128 contexts, because the fixed loadout has no mode-switching weapon.
Rounds is at its cap in essentially every game, between 6.927 and 7.000. It is not a pacing result here.
The mechanical arm makes games busier and less lethal without moving the result. The slice is the 40 mechanics-axis contrasts at the two declared ability levels, all abilities off and all abilities on: 5 trios by 2 stat levels by 2 ability levels by 2 Momentum levels. Payoff intervals exclude zero in only 5 of those 40 cells, and with opposite signs. No-death games rise in 27 of 40 with intervals excluding zero, and never fall. Proactive attacks rise in 31 of 40 and never fall. Wipes fall in 6 of 40 and never rise.
Measurements and uncertainty
Melee isolates report offensive and shield opportunities separately. Zero response means neither kind is available.
Defender participation requires an accepted strike or parry. Shield parries count.
Repeated trials report destruction, disable, Heat, attacks, vents, action cost, restricted time, and competing outcomes.
Whole games report payoff, rounds, no-death games, wipes, first death, part loss, and proactive attacks.
They also report melee starts, parries, form changes, Momentum dice, threat-changed choices, Heat, and explicit ability events.
Part-loss agency uses part_destroyed events for arms and Legs.
It measures survival to another own activation, later activations, action categories, and maintenance-only activations.
Off-turn reactions do not count as own-activation activity. Missing later activations remain censored.
Opening diagnostics retain trajectories, legal alternatives, scored destinations, cover, sight, threats, contact, attacks, and scoring.
Pilot ability measures require explicit events. Unsupported ability counters remain null.
Intervals use 4,000 complete-seed bootstrap resamples with seed 9123001.
Each resample keeps maps, pairs, assignments, policies, candidates, and counterfactuals linked inside its seed block.
Variable-denominator metrics pool numerators and denominators before division. Zero-observation blocks stay in every resample.
Undefined denominator comparisons remain null. Reports retain observed denominators and valid-resample counts.
What the intervals are, and what they are not
Every interval in every report is a paired candidate-minus-control interval. Control's own interval is identically [0.00, 0.00] by construction.
spread.ci95 is the interval of the paired difference. It is never the interval of the spread level. The two sit next to each other in the artifact and are easy to confuse. Control's [0.00, 0.00] is the giveaway. No spread level anywhere in this study carries an interval.
No per-roster interval exists in any report. Roster means and their changes are point estimates.
The resolution of an interval follows its block count. The block counts below come from each phase's own report artifact.
| Phase | Blocks | Distinct resample patterns available |
|---|---|---|
| Isolates | 256 | far above the 4,000 repetitions |
| Confirmation | 16 | 300,540,195, so the 4,000 repetitions are the binding limit |
| Opening diagnostic | 8 | 6,435 |
| Pilot panel | 8 | 6,435 |
| Screen | 2 | 3 |
| Baseline and selected training | 2 | 3 |
Every screen interval is the range of three numbers. With two blocks the resampler has exactly three distinct patterns: block 0 twice, one of each, and block 1 twice. The 2.5 and 97.5 percentiles land on the extremes. A screen ci95 is therefore the range of the block-0 estimate, the pooled estimate and the block-1 estimate. It is not a confidence interval.
In the screen report, 2,292 of 4,550 condition-level intervals and 157 of 324 interaction intervals are zero-width. 167 condition-level intervals and 3 interaction intervals exclude zero only because they are zero-width, which means the two blocks happened to agree. Zero width is never precision.
Four screen exclusions are floating-point artifacts. Interactions 6, 27 and 30 on spread have an upper endpoint near −1e-16. Interaction 16 on rounds has a lower endpoint near +9e-16. None of them excludes zero.
In the confirmation report, 182 of 399 intervals are zero-width, and 130 of those are control's structural self-comparison. 23 matchup intervals have exactly one endpoint at 0.0 and do not exclude zero. The confirmation file carries no floating-point residual and no reversed endpoint.
Every interval inside one report shares one resample matrix. The bootstrap weights are cached on the block count and the repetition count and seeded once. All metrics, conditions, maps and cells in a report draw from the same 4,000 patterns. The intervals are mutually correlated. They are not independent statements.
Isolate intervals are panel-wide. The isolate cell table is a descriptive audit with no intervals. Where the changed cells are a clean subset of a panel with equal denominators, the panel interval rescales exactly. This report rescales by 8 for the 30 Hammer exchange cells and by 2 for the Charge-3 contrast, and says so at each use.
Interactions exist only in the screen block. Eight of its 36 rows are identically zero, so the effective count is 26. Rows 27 and 30, and rows 33 and 36, are exact duplicates of each other.
Limitations
Read every limitation below beside the numbers it governs.
- Screen intervals rest on two seed blocks. Each one is the range of three resample patterns, and about half are zero-width. A screen number is never a finding on its own.
spread.ci95is the interval of the paired difference, never of the level. No spread level anywhere in this study carries an interval. The screen's 50.00 pp control spread and confirmation's 57.99 pp are both bare point estimates.- No per-roster interval exists in any report. Every roster mean and every roster change is a point estimate. The finest paired intervals at confirmation are the 84 matchup cells.
- Only confirmation and the isolates give a real interval base. Confirmation has 16 blocks and the isolates have 256. The opening and pilot panels have 8 each. The screen and both training phases have 2 each.
- Interactions exist only in the screen block, and the effective count is 26 of 36. Confirmation carries no interaction result.
tn10is not a component of the combination, becausetn11is a different dose of the same lever. Nothing in the combination can be credited or blamed from confirmation. - Instrumentation nulls.
ability:paceandability:deadeyeare hardcoded null in the observer, although both Abilities execute in the engine.threatChangedChoicesis derived from opening counterfactual rows and is null in every other phase.ability:momentumis a duplicate column ofmomentumDice.ability:riposteandability:scrambleread zero in the whole-game panels for want of a carrier.ability:fieldRepairis instrumented and carried, and reads zero across all 6,912 opening games. Pace is the largest visible pilot effect in the study and it is the one Ability with no counter at all. - The Momentum counter measures the melee variant only. The live ranged Momentum bonus is applied in every arm and is never counted. A zero in that column is not evidence that the Ability did not fire.
- Duplicate contexts. Eight of the 35 screen profiles are bit-identical to another profile, leaving 27 distinct conditions and 5,376 uninformative games. Four of the eight opening arms are exact duplicates, so 3,456 of 6,912 opening games are re-runs. The 128 pilot contexts reduce to 76 distinct game sets, so 4,992 of 12,288 pilot games are re-simulations. Three of the 15 exchange packages are one fixture profile. Exchange and class mirror cells are exact label swaps, not independent replicates.
- Every interval inside one report shares one cached resample matrix. The intervals in a report are mutually correlated, not independent statements.
- Three axes are inert where they were measured.
blade-cap4andblade-cap5change nothing in any isolate cell, so the 16-cell cube holds 8 distinct profiles there.tn11is bit-identical to control in the exchange panel, because control's threshold there is already Evasion 11.pilot-pool-offis bit-identical to control in the exchange and class panels, because no pilot in them has Piloting 2 or more. - The
limb:denominators are endogenous. They are 7,003, 6,972 and 7,707 records at confirmation. Those differences mix a rate change with a composition change. The pooled-ratio rule is applied correctly. The interpretation caveat is separate. payoffis not a fairness statistic. It is the mean payoff of the manifest-earlier roster across unordered pairs. Control's level is a listing artifact.- The confirmation table is partly saturated. Eleven of the 63 non-mirror control cells are 64-to-0 sweeps, 9 under
tn10and 10 under the combination. Single cells can therefore move by 45 to 58 pp. - The mirror statistic discards direction. It is the absolute distance from 0.5. A swept mirror cell shows as a magnitude with no side attached.
- No guard reads the mirror
physicalaxis. In the screen report that axis reaches its 0.500 ceiling in 15 of the 35 conditions, every time in the same cell,foundry/new-ranged. All 15 are members of thecore-plus2family, and they include the selected combination. A physical magnitude of 0.500 means side A won that mirror cell 8 games to 0. Physical-side bias is a reported audit only; the mirror guard reads First Side alone. - The screen First Side guard had no filtering power. Its effective bound of 0.60 exceeds the metric's mathematical ceiling of 0.50, and control itself reached the ceiling in six of 21 cells at eight games per cell.
- The First Side analysis on the level comes from a supplement outside the frozen source closure. It is descriptive. It did not influence selection, and it cannot retrospectively repair the screening guard.
- The opening report has no per-assignment cell. The rows carry the orientation and the First Side letter. The frozen aggregator drops them.
- The pilot panel is a controlled diagnostic. It uses fixed aggression 0.5 against one fixed opponent, with no trained policy. It is not equilibrium, not a faction rank, and not a both-sides result. FSU is the only trio with a live Bond on the board, so its contrasts are confounded.
- Paid forms had no mechanical surface in the pilot panel. Form changes are exactly zero in all 12,288 pilot games, because the fixed loadout has no mode-switching weapon.
- The aggression grid bounds every trained policy. Its equilibrium does not establish optimal play. Screen candidates received no training of their own, so the screen ranks transferred baseline-policy performance only. The baseline and selected grids use two training seed blocks, and game count does not increase that independent training sample.
- The seven-roster panel cannot certify balance outside its declared opponents, maps, builds, and bot policies.
- Bot limitations, verbatim from the protocol's own
limitsarray, recorded in every report:Declared bot grid only; no human-counterplay or optimal-play claim.Paid forms use the existing single-profile attack-value approximation; melee TN and Piloting-pool toggles apply in resolution but not that valuation.Unsupported ability-use counters remain null.
- Simulation does not establish human counterplay, optimal form play, optimal AI, or a universal part price.
- The study does not authorize a pilot nerf or a faction tier.
Recommendations: the study adopts nothing
This study adopts nothing automatically. A passing candidate still requires a separate playable-default decision. BUG-017, TASK-082 and TASK-099 are unchanged by this study.
tn10is the only candidate supported on the preregistered metric. Send it to the separate playable-default decision. Carry this caveat with it:tn10evens the roster field through defence and reordering, not through melee lethality, so it does not by itself meet the design goal that closing distance should mean lethality.- Do not adopt the combination. If fewer wipes and longer games are wanted, test Core +2 standalone in a confirmation-grade design. The isolates point at it. The whole-game evidence cannot attribute it.
- Hammer +1 die is real in isolation and unconfirmed in whole games. Confirm it alone if Hammer viability is a goal.
- Drop Capacity from the next study unless a fixture that actually exercises it exists.
- Treat turn order as a roster-by-map problem in mirrors. A follow-up mirror study needs at least 64 games per cell and intervals on the level. A design lever such as the second player choosing the deployment side in mirrors is a decision for the owner, not a study result.
- Fix the tooling before any further rule test. Instrument Pace, Deadeye and ranged Momentum. Add per-roster and per-assignment intervals. Replace the ceiling-bound mirror guard with a First Side share and an interval. Label duplicate contexts.
- Keep the open items open. BUG-017 stays open. TASK-082's human playtest requirement is untouched. TASK-099's Bow-role work is not closed by this.
Any adoption must update the rulebook, GDD, README, cited tuning notes, and register separately.
Evidence
The compact evidence archive is docs/tuning/evidence-study-01.tar.gz. Its index is docs/tuning/evidence-study-01-index.json. Its companion is evidence-study-01-archive.md.
The archive holds 59 files at 342,070,366 bytes. It excludes 28 raw replay shards at 2,400,567,157 bytes. The index records the original path, byte count, and SHA-256 of every excluded shard.
The raw shards are preserved locally under out/balance-experiment/study-01/. That directory is outside version control.
Metadata alone cannot independently validate full phases without the raw replay logs.
Post-adoption balance checks and real-item pricing — 2026-09-09
Post-adoption balance checks and real-item pricing — 2026-09-09
The retained evidence and independent review are complete. The playable catalog and rules remain unchanged. This study measures the adopted ranged Accuracy +2 and paid vertical movement, then asks how to price future parts and weapons without rewarding one universally superior package.
Scope
The prospective protocol fixes 15,360 factorial games and 768 separate current-rule mirrors. Four conditions separate old/new ranged Accuracy and legacy/paid movement. All other rules, legal roster builds, maps and pilots are held fixed. The primary panel uses .75/.75 aggression; transferred historical policies are a separate sensitivity panel, not optimized current counterplay. Each full panel has eight shared seed blocks, not thousands of independent samples.
Separate evidence contains 1,440 exact standard-weapon marginal rows, 120 initial melee budgets, 9,216 passive-target firing sequences, and 2,136 deterministic mobility rows. The isolated checks explain mechanisms; they cannot establish full-game balance or finalized prices. No live changes follow automatically.
Full-game result: reliability improves, balance is not certified
The fixed .75/.75 panel has 1,920 games per condition and eight shared seed blocks. Payoff counts a draw as half a win. Family payoff equally weights maps and opposing families. Empty proactive Fires and wipe terminations pool the complete condition panel. Exploratory 95% intervals resample the eight whole seed blocks 1,000 times.
| Condition | Melee family payoff | Gunline family payoff | Empty proactive Fires | Games ending by wipe |
|---|---|---|---|---|
| Pre-adoption | 44.2% | 37.2% | 14.7% | 70.8% |
| Accuracy only | 43.3% | 44.8% | 9.8% | 77.0% |
| Movement only | 84.2% | 27.7% | 14.3% | 81.5% |
| Current adopted rules | 77.3% | 39.5% | 9.1% | 86.9% |
Accuracy +2 improves proactive-Fire reliability in this panel. Empty proactive Fires fall under both movement conditions. Accuracy also moderates the melee advantage under paid movement, while wipes increase.
From pre-adoption to current, melee payoff rises by 33.1 points [28.0, 38.8]. This comparison measures the adopted bundle. It does not assign the change to one rule.
Across both movement conditions, Accuracy reduces zero-body-damage proactive Fires by 0.86 per game. Its 95% interval is 0.71 to 1.00 fewer. It changes melee payoff by −3.9 points [−7.7, −0.1] and gunline payoff by +9.8 [6.6, 11.8]. It also raises wipe termination by 5.8 points [4.5, 7.1].
The movement factor produces the larger roster shift under these fixed policies. It changes ordinary elevation costs and the Jump elevation waiver. It also removes climbing Heat and fall consequences. The panel cannot attribute that shift to Speed or one movement rule.
Across both Accuracy conditions, the movement bundle changes melee payoff by +37.0 points [34.8, 39.8]. It changes gunline payoff by −7.4 points [−10.9, −4.2]. Wipe termination rises by 10.3 points [8.6, 11.7]. The Accuracy and movement interaction changes melee payoff by −5.9 points [−10.8, −0.9].
Current fixed-policy family payoff remains uneven:
| Current family | Payoff [95% interval] |
|---|---|
| Mixed | 45.3% [41.9, 48.9] |
| Armored | 34.5% [31.4, 37.8] |
| Mobile | 48.8% [43.4, 53.1] |
| Melee | 77.3% [75.2, 79.5] |
| Gunline | 39.5% [34.8, 45.0] |
| Control | 54.5% [51.3, 58.0] |
The current condition ends by wipe in 86.9% of games, up from 70.8%. The paired change is +16.1 points [13.6, 18.3]. Mean deaths rise from 3.73 to 4.13, a change of +0.39 [0.35, 0.44]. Five units die in 28.6% of current games, versus 17.8% before adoption. Eleven pre-adoption games have no death; no current game does.
A first death occurs by round 2 in 58.9% of current games, versus 48.0%. Mean length falls by 0.39 rounds [0.34, 0.45 fewer]. Death before a unit's first proactive attack stays 7.9% to 7.8%. Its paired interval [−1.0, +0.7] includes no change.
The first-loss side wins 29.8% before adoption and 37.7% under current rules. The counts are 568 of 1,909 and 724 of 1,920. This is a descriptive association. It does not show that wipes make the first kill less decisive. It does not identify Enraged as the cause.
The transferred-policy sensitivity keeps the same main pattern. Pre-adoption to current melee payoff changes 40.8% to 73.6%, or +32.8 points [29.4, 35.8]. Empty proactive Fires change 14.8% to 9.5%, or −5.3 points [−6.6, −4.0]. Wipes change 65.8% to 79.8%, or +14.1 points [12.0, 15.7]. Current gunline payoff is 38.4%. This profile transfers 20 trained cells and uses .75/.75 fallbacks for 40 cells. It is not optimized for the current rules.
Its pre-adoption and Accuracy-only conditions each have 64 no-engagement games of 1,920. All occur on Foundry in melee against gunline or control. Movement-only and current have none. Every factorial panel has zero draws.
Current fixed games give physical Side A 50.3% payoff and the first side 45.2%. The 768 fresh current mirrors give physical Side A 49.2% and the first side 45.3%. Draws and no-engagement games are 0% in both panels.
| Fresh current mirror map | First-side payoff |
|---|---|
| Flat | 38.5% |
| Quarry | 54.2% |
| Foundry | 46.4% |
| Causeway | 42.2% |
Exact rotational geometry does not guarantee first-activation fairness. Check initiative and matchup context before finalizing prices.
These policies are not optimized current counterplay or a human equilibrium. Both full-game profiles remain provisional for pricing. Retain the adopted rules for now. Do not apply another global Accuracy increase from this evidence. Test access, mission pressure and current-policy counterplay before further global melee or Accuracy tuning.
What helps design parts and weapons now
Start each item with a role, its best context and a useful weakness. Price the complete legal package against its closest legal alternative. Budget access, reach, survival and actions with the attack payload. Expected damage is one screening outcome. It is not universal power.
| Check | Practical threshold | Limit |
|---|---|---|
| +1 Accuracy | Rifle against Courier rises from 60% to 65% hit chance. Rifle against Bastion stays at the 95% ceiling. | Cover and movement can move the same weapon away from the ceiling. |
| +1 Pen | Cannon gains no printed damage against clear Courier. It rises from 8.163 to 8.920 expected printed damage against Bastion. | Critical effects and finite Durability are outside this exact check. |
| Piloting 1 to 2 | Ruko's dual Blade pool rises from six to seven dice. Successful offensive opportunities rise from 3.00 to 3.85 against Courier. | This step also changes first-spend order when Ruko initiates. |
| Piloting 2 to 3 | Marrow keeps seven dual Blade dice. Successful opportunities rise from 3.85 to 4.20 against Courier. | This step changes first-spend order when Marrow defends. |
| Arm package | +1 Handling on the right arm adds one die. +1 pool die on each held weapon adds two dice to a dual loadout. | Name the affected arm or weapon. Do not price these effects as the same unit. |
| Heat | Reducing Heat from one to zero removes Vent pressure in the declared passive sequences. | The samples do not demonstrate a kill-rate gain or another useful attack. |
| Jump | Jump waives elevation cost and opens routes or firing positions at specific allowances. | It is not a constant Speed bonus. Weight, Armor and Durability still apply. |
Use four tests for the next real item set:
- Compare the fastest legal melee packages with ranged disengagement, screens and Overwatch choices.
- Measure contact timing, exposure, firing access, initiative and scoring by map.
- Compare equal-role ranged packages at retained Accuracy. Require a meaningful reliability, damage or Heat tradeoff.
- Test the strongest legal package around each relevant breakpoint. Include Pen, Piloting, movement allowance, capacity and Weight.
These are next measurements. They do not approve a catalog or rules change.
Mobility buys access, not a constant amount of power

Across every legal deployment cell on both physical ends, the shortest unopposed route to the nearest scoring footprint has these mean movement-point costs:
| Map | Ordinary legs | Working Jump legs | Jump saving |
|---|---|---|---|
| Quarry | 11.83 | 10.83 | 1.00 |
| Foundry | 13.22 | 11.18 | 2.03 |
| Causeway | 10.10 | 8.48 | 1.62 |
These are route costs, not arrival activations. Move and Boost have separate allowances; unused movement cannot simply be banked. The audit's multi-activation totals are explicitly optimistic lower bounds and exclude edges no individual allowance can pay.
The stronger breakpoint is roof access. With each movement allowance capped at 2, ordinary legs cannot enter any roof on Foundry or Causeway, because the available entry edges cost more than that allowance. Jump legs can. This is not an absolute restriction on a printed Speed 2 mech: active Enraged adds two points to ordinary movement and can change the result. At a fixed allowance of 4, a roof is reachable in one Move from 50% of Foundry deployments with Jump versus 15% with ordinary legs; on Causeway the figures are 94.8% versus 39.7%.
Price a mobility part for the routes, firing positions and actions it enables on the declared map pool. Do not give Jump a universal equivalent of “+1 Speed.” Its current comparison with Standard legs also has real drawbacks: one more Weight, one less Legs Armor and two less Legs durability. The geometry audit isolates movement capability; it does not erase those defensive costs or certify either part as superior.
All 2,136 rows obey exact rotation pairing. The audit independently cross-checks 216 raw shortest paths against Board.reachable; a separate reviewer checked all 21,360 row/budget/leg-mode single-Move predicates. Flat has no objectives and is excluded from objective-access denominators. Retained mobility data.
Weapon stat points are not interchangeable
The isolated marginal audit uses legal shared test platforms and retains each target/cover/movement cell. Its exact calculation includes printed hit, penetration and damage distributions; it excludes critical-table extras, Heat damage, finite target durability and future actions. The numbers below equally average five targets, three covers and two movement contexts.
| Weapon | +1 Accuracy | +1 Pen | +1 damage per projectile | +1 projectile |
|---|---|---|---|---|
| Rifle | +0.24 | +0.36 | +1.03 | +1.75 |
| Autocannon | +0.32 | +0.55 | +1.30 | +1.44 |
| Cannon | +0.44 | +0.21 | +1.43 | +1.65 |
| Pulse | +0.10 | +0.23 | +0.99 | +0.71 |
| Lance | +0.34 | +0.36 | +1.12 | +2.49 |
Entries are additional expected printed body damage per Fire, not price suggestions. Each change leaves other attributes fixed to measure its marginal benefit. A real item needs a corresponding cost or drawback.
An extra projectile repeats the weapon's payload, so its value depends on that payload. A flat damage bonus applies to every projectile and interacts with rounded glances. Accuracy reaches the natural-1 ceiling in some contexts. Pen can stop adding printed damage against already penetrable armor, but may still improve critical effects omitted by this table. Those are different breakpoints and cannot share one universal cost per stat point.
Heat requires a separate action-economy measurement. The immediate printed-damage audit correctly assigns Heat reduction no immediate damage benefit; the persistent engine sequences measure stress and Vent use instead. Those sequences use passive targets, at most eight firing activations, and declared automatic cooling policies. Their saved Vents are opportunities for other actions, not a measured number of extra attacks or objective points. See the full appendix for kill, self-death and surviving-horizon censoring.
A reusable process for real parts and weapons
For each proposed item, keep a short role statement and a measurable tradeoff. Then evaluate it in this order:
- Check legality and categorical differences. Include individual chassis cap, arm capacity, held Weight, two-handed occupancy, ammunition Weight/use limits, support abilities and pilot interactions. A Precision arm cannot carry an Autocannon merely because its handling-to-weight ratio looks good. Unused team Weight does not bypass an individual cap.
- Measure an outcome vector. Record hit reliability, empty attacks, actual damage, disable/kill probability, Heat and actions consumed, survival, range and movement access. For melee, track usable opportunities and initiative as well as damage; spending a die to parry removes an attack opportunity.
- Test thresholds and combinations. Include armored/evasive targets, cover, wounded states, different pilots, and the maps/mission pool. Check one point on either side of movement, penetration, capacity and Piloting thresholds. Price the complete weapon/arm/pilot package as well as its components.
- Compare legal whole-build substitutions. An item should improve its intended role while surrendering useful performance elsewhere. Reject a genuinely dominated item, but do not mistake differences in unmeasured abilities or ammunition for proof of dominance. The current conservative body check found no confirmed same-context dominance; that does not establish optimal pricing.
- Use game and human results to calibrate costs. Isolated performance provides candidate ranges and explains failures. Map-specific matchups, action use and human counterplay determine whether those tradeoffs matter. Retain the original tests as regression checks when real content replaces the demo catalog.
Use the reusable item worksheet to record those decisions for each real part or weapon. It retains separate outcomes rather than a single uncalibrated power score. A part can be efficient at its role without being the best choice on every mech.
Retained evidence and reproduction
The study ran from a worktree based on commit 460abb237e44b582daae2dfa30999d81a29d40dc. Each manifest pins the exact changed source and input hashes used by its audit.
pnpm exec tsx cli/post-adoption-balance.ts --manifest docs/tuning/evidence/2026-09-09-post-adoption/post-adoption-manifest.json --out docs/tuning/evidence/2026-09-09-post-adoption/fullgame/post-adoption-results.json --execute --freeze-approved
python3 cli/post-adoption-summary.py --input docs/tuning/evidence/2026-09-09-post-adoption/fullgame/post-adoption-results.json --validation docs/tuning/evidence/2026-09-09-post-adoption/fullgame/post-adoption-validation.json --out docs/tuning/evidence/2026-09-09-post-adoption/fullgame/post-adoption-summary.json --bootstrap 1000 --bootstrap-seed 20260909
pnpm exec tsx cli/post-adoption-mobility.ts docs/tuning/evidence/2026-09-09-post-adoption/mobility.json
pnpm exec tsx cli/part-marginals.ts --prepare --out docs/tuning/evidence/2026-09-09-post-adoption/marginals/manifest-v2.json
pnpm exec tsx cli/part-marginals.ts --run --manifest docs/tuning/evidence/2026-09-09-post-adoption/marginals/manifest-v2.json --out docs/tuning/evidence/2026-09-09-post-adoption/marginals/results.json
python3 cli/part-marginals-summary.py docs/tuning/evidence/2026-09-09-post-adoption/marginals/results.json docs/tuning/evidence/2026-09-09-post-adoption/marginals/summary.json
The retained full-game results contain 15,360 factorial games and 768 mirrors. The validation record confirms complete keys and matching source hashes. The derived summary retains definitions, intervals, distributions and provenance. The independent review approves the scoped verdict. The mobility rows and marginal provenance retain their commands and hashes.
Permanent Enraged experiment — 9 September 2026
Permanent Enraged experiment — 9 September 2026
Current decision — 2026-09-09: After these comparisons, the owner selected permanent offensive Enraged for new games. The findings and default-status statements below describe the experiment when it ran; its evidence is unchanged. Existing saves retain their recorded duration. Defensive rerolls remain an optional experiment. See current rule E9 and TASK-089.
Making Enraged last for the rest of the game improved comeback wins in these fixed-policy bot samples, while also making wipes more frequent. The comeback increase was clearest on Flat, Foundry and Causeway; Quarry's interval includes no change. The cost is a much larger, recurring combat bonus for both teams: roughly 2.4–2.8 times as many attack rerolls per game, with about half or more happening while the acting side had equal or more surviving units.
Permanent Enraged remains an experimental rule option. The live default still lasts one activation. This comparison supports trying the permanent variant in a human playtest, not silently promoting it or concluding it balances the game.
What “permanent” means here
Both conditions enable Enraged and use the same opponent-caused ally-death trigger. Temporary Enraged grants surviving teammates +2 ordinary movement budget and one shared failed offensive attack-die reroll during their next own activation. Permanent Enraged gives those same benefits again on every subsequent own activation until the mech dies or the game ends. Rerolls refresh once per activation; benefits do not stack, do not affect reactions, and do not change Speed, Boost or Charge.
The bonus is not conditional on remaining outnumbered. A team that earns the first kill becomes eligible later when it loses a mech. Both sides can therefore retain it at once, including when tied or ahead in surviving units. This experiment compares the combined repeated movement and reroll benefits; it does not isolate movement's contribution.
Matched full-game comparison
The batch ran 16,000 full bot games: 8,000 matched temporary/permanent pairs across 12 cells. Primary comparisons used 500 seeds (210000–210499) in both roster orientations on each of four maps: 8,000 executions. Mirrors used 500 seeds (220000–220499) for each of two identical-roster compositions on each map: another 8,000 executions. A separate 80-game smoke check preceded the batch.
Mixed rosters were Courier/Foreman/Reaver versus Bastion/Foreman/Courier. Primary light/heavy aggression remained 1/0.5 on Flat/Causeway and 0.75/0.75 on Quarry/Foundry, carried with the roster when sides swap. Mirrors used 0.75/0.75 on every map and were not duplicated by swapping identical rosters. These are new seeds and matched current-engine controls, not direct comparisons to earlier reports' samples or mirror policies. No aggression grid was run for this duration question.
Every pair matched through its first death, or game end if no death occurred: zero prefix mismatches, zero unknown prefixes and no pre-first-death rerolls. Both conditions used the same frozen catalog, engine and other rules. Tracked source hashes did not change during the 119-second batch. Default temporary behavior also passed two independent full-history/future-RNG golden checks against the prior engine.
Primary results
Each row contains 1,000 matched pairs and 500 seed clusters. Differences are permanent minus temporary, in percentage points. Brackets are exploratory 95% paired bootstrap intervals from 2,000 resamples of whole seed clusters, keeping both orientations together. Maps are analyzed separately; intervals are not a simultaneous multiple-comparison guarantee.
| Map | First-loss side wins | Retaliation before next own loss | Game ends in wipe |
|---|---|---|---|
| Flat | 18.4% → 24.8%; +6.4 [+3.4, +9.3] | 60.0% → 68.9%; +8.9 [+6.2, +11.7] | 74.1% → 77.7%; +3.6 [+0.3, +6.8] |
| Quarry | 24.8% → 27.0%; +2.2 [-0.6, +5.1] | 76.1% → 79.6%; +3.5 [+1.7, +5.4] | 69.3% → 76.8%; +7.5 [+4.2, +10.9] |
| Foundry | 26.3% → 29.6%; +3.3 [+0.8, +5.9] | 54.3% → 55.1%; +0.8 [-1.5, +3.1] | 32.2% → 43.6%; +11.4 [+8.2, +14.5] |
| Causeway | 21.3% → 26.0%; +4.7 [+1.5, +7.8] | 64.4% → 72.3%; +7.9 [+5.5, +10.3] | 57.7% → 62.2%; +4.5 [+0.9, +8.2] |

The first-loss side is fixed from the identical first death. “Retaliation” means that side earns a credited opposing kill before suffering another death. It is not synonymous with winning the match. Games ending before either event count as no observed retaliation, not proof retaliation would never occur. Temporary/permanent unresolved counts were Flat 0/0, Quarry 1/0, Foundry 4/1 and Causeway 0/0; none had unknown ordering. Rare uncredited Heat first losses remain in these first-loss cohorts and do not grant Enraged.
The credited-first-kill/winner association is retained separately. It uses only the same opponent-credited first death and decisive results under both settings: 1,000 pairs on Flat and 998 each elsewhere, excluding two uncredited first deaths on each of Quarry, Foundry and Causeway. There were no primary draws. The credited first-kill side still won about 70–75% of permanent games in that cohort. Getting the first kill remains strongly associated with winning; this association alone is not causal evidence.
| Map | Mean rounds, temporary → permanent | Change in rounds [95% interval] |
|---|---|---|
| Flat | 6.036 → 6.058 | +0.022 [-0.049, +0.090] |
| Quarry | 6.183 → 6.001 | -0.182 [-0.245, -0.121] |
| Foundry | 6.794 → 6.710 | -0.084 [-0.116, -0.050] |
| Causeway | 6.480 → 6.454 | -0.026 [-0.070, +0.018] |
More wipes did not mean dramatically shorter games: Quarry shortened by about 0.18 rounds and Foundry by 0.08; Flat and Causeway showed little clear change. Permanent Enraged changes the amount of fighting more than the calendar length of these capped games.
Repeated bonuses and counter-escalation
These are lifetime means per game, following the original first-loss side and its opponent throughout the match. A first-loss-side reroll may occur later at equal strength or while ahead; it is not necessarily a reroll made while outnumbered. Full evidence also retains physical Side A/B lifecycle and reroll counts.
| Map | Enraged activations, both sides | First-loss side rerolls | Opposing side rerolls | Total rerolls |
|---|---|---|---|---|
| Flat | 4.74 → 12.24 | 1.83 → 4.57 | 0.85 → 2.47 | 2.69 → 7.04 |
| Quarry | 4.83 → 11.59 | 1.56 → 3.60 | 0.87 → 2.18 | 2.43 → 5.78 |
| Foundry | 4.26 → 11.00 | 1.31 → 3.69 | 0.55 → 1.50 | 1.87 → 5.18 |
| Causeway | 4.61 → 11.46 | 1.67 → 4.16 | 0.86 → 2.38 | 2.52 → 6.54 |
The separate table below classifies each permanent reroll by surviving unit counts at the moment it was used, not score, remaining HP or objective control. This exposes the counter-escalation directly: both teams receive recurring bonuses after casualties, even when not outnumbered.
| Map | Permanent rerolls counted | Fewer units | Equal units | More units |
|---|---|---|---|---|
| Flat | 7036 | 44.2% | 38.8% | 16.9% |
| Quarry | 5777 | 40.5% | 42.9% | 16.5% |
| Foundry | 5183 | 50.3% | 33.5% | 16.2% |
| Causeway | 6540 | 44.1% | 38.7% | 17.2% |
Counts include ranged rerolls once from aggregate Fire events and melee rerolls once from upfront pools. An Enraged activation need not spend its reroll. Permanent activation starts can exceed grants because one grant can renew across several turns. This is a recurring combat state for much of the match, not solely a temporary recovery window.
Mirror check and limits
Each mirror cell uses 500 matched seeds. Raw Side A wins below are temporary → permanent; bracketed changes are percentage points with 95% paired intervals.
| Map | Courier/Foreman/Reaver mirror | Bastion/Foreman/Courier mirror |
|---|---|---|
| Flat | 48.2% → 49.4%; +1.2 [-3.6, +6.2] | 50.4% → 49.0%; -1.4 [-4.8, +2.2] |
| Quarry | 57.0% → 59.4%; +2.4 [-2.0, +6.6] | 48.0% → 49.8%; +1.8 [-2.4, +6.2] |
| Foundry | 44.4% → 46.0%; +1.6 [-2.0, +5.0] | 49.8% → 51.2%; +1.4 [-2.2, +5.0] |
| Causeway | 53.4% → 52.4%; -1.0 [-5.4, +3.0] | 79.6% → 79.8%; +0.2 [-3.6, +4.2] |
Causeway's heavy mirror remains heavily favorable to Side A, 79.6%→79.8%. No mirror duration-change interval excludes zero. These checks do not establish map symmetry or human balance; Foundry's existing objective/pathfinding and round-cap bot artifacts also remain. No new policy search or human-choice model was added.
The useful design tradeoff is therefore concrete: permanent Enraged offers more comeback opportunities in this sample, but also keeps survivors on both teams stronger after the original disadvantage ends. Human testing should determine whether that recurring state feels right. The experiment makes no automatic rule-strength change and leaves the default temporary.
Reproduction and validation
All evidence is under docs/tuning/evidence/2026-09-09-permanent-enraged/. Sixteen *-activation.json / *-game.json files retain compact per-game rows, full catalog and explicit rules, seeds, orientation, score, first-loss and lifetime/balance telemetry. Eight *-paired.json files retain cohorts, intervals and parity checks. Their reusable estimator fields off and on mean temporary baseline and permanent candidate, explicitly identified by conditionLabels; both conditions have Enraged enabled.
commands.txt records every full batch and comparison command; smoke-commands.txt records the preliminary check. source-fingerprints.json pins simulation/tool hashes and run-summary.json records all successful runs and zero tracked source changes. Use fresh output paths when reproducing: the tools refuse to overwrite retained evidence.
pnpm exec tsx cli/attrition-batch.ts --mode primary --map flat --games 500 --seed 210000 --aggression-a 1 --aggression-b .5 --enraged on --enraged-duration activation --out /tmp/enraged-temporary.json
pnpm exec tsx cli/attrition-batch.ts --mode primary --map flat --games 500 --seed 210000 --aggression-a 1 --aggression-b .5 --enraged on --enraged-duration game --out /tmp/enraged-permanent.json
pnpm exec tsx cli/enraged-duration-compare.ts --temporary /tmp/enraged-temporary.json --permanent /tmp/enraged-permanent.json --out /tmp/enraged-duration-paired.json
python3 cli/plot-permanent-enraged.py
The figure command requires matplotlib and reads the retained primary evidence. Eleven focused CLI tests passed, covering paired validation, credit/censoring, lifecycle ordering, duplicate logs and recurring use as unit counts move from behind to tied to ahead. An independent reviewer verified all 16,000 game executions' pair/cohort/cluster estimates, first-death parity, lifetime/balance count conservation and source hashes without finding a data defect.
Weapon and part marginal values — 2026-09-09
Weapon and part marginal values — 2026-09-09
The current catalog needs contextual budgets, not a single damage-per-weight formula. Accuracy, armor penetration, projectiles, Heat, melee resources and movement create different thresholds. These checks make those thresholds measurable; they do not adopt another balance change or establish prices for future content.
This appendix uses the adopted ranged Accuracy +2 catalog and paid elevation rules. It complements the post-adoption protocol and its separate competitive games and movement geometry. No games or movement policies run here.
What was measured
The retained manifest, full results and derived summary contain:
- 1,440 exact ranged rows: eight standard profiles × five stock targets × clear/soft/hard cover × standing/moved × base, +1 Accuracy, +1 Penetration, +1 printed damage per projectile, +1 projectile per Fire, −1 Heat per Fire.
- 120 exact melee-budget rows: dual Blade/Spike × Ruko/Marrow/Vex × five stock targets × base, +1 pool die on each weapon, +1 right-arm Handling, +1 Piloting.
- 9,216 persistent exposure sequences: Rifle/Cannon/Pulse × Courier/Foreman/Bastion × clear/hard cover × base/−1 Heat × no Vent/spare-Quick Vent × 128 shared seeds. Each sequence schedules at most eight shooter activations against one passive target. The observed run took 3.516 seconds.
- Same-context body-stat comparisons, conservative held-weapon comparisons, explicitly legal/illegal Reaver body swaps, conditional Lock On hit probabilities and range cutoffs.
The ranged platform is a Medium Foreman body with Standard head/legs, Loader right arm, Utility left arm, Ilse, no ammunition, and an explicitly empty left hand. Its back is Bare except when testing the Missile rack, which leaves both hands empty. All eight frames are legal at Weight 35–40 under Cap 50; exact builds, arm capacities, equipment and stats are pinned. These are one-axis cloned counterfactuals at unchanged weight, not purchasable upgrades or recommended stats. The normal target bodies/pilots are held fixed. No active allied ability, bond, Lock On, Enraged or command reserve modifies the principal attack matrices.
Accuracy and penetration depend on the opponent
The exact helper enumerates printed damage before critical-table extras, on-hit Heat, finite part durability, overflow and early volley termination. Its expected damage is not actual Hull lost or kill probability. Natural 1/20 and shared modifier dice are included; this is fresh ordinary Fire at range 4 without Evasive, Brace, height or stationary-target bonuses.
| Common-frame Fire, clear and standing | Hit probability | After +1 Accuracy | Printed damage/Fire | After +1 Pen |
|---|---|---|---|---|
| Rifle → Courier, Evasion 15 | 60% | 65% | 3.828 | 4.145 |
| Rifle → Bastion, Evasion 6 | 95% | 95% | 4.333 | 4.845 |
| Cannon → Courier | 50% | 55% | 5.250 | 5.250 |
| Cannon → Bastion | 95% | 95% | 8.163 | 8.920 |
More Accuracy is valuable when it converts failures, then saturates at the natural-1 ceiling. This does not make an accuracy upgrade worthless everywhere: cover and other penalties can move the same weapon away from saturation. Cannon's +1 Pen has no printed-damage benefit against this clear Courier because ordinary damage already penetrates; it can still affect critical frequency, which this helper does not price.
The following increments average equally over five targets × three covers × two movement states for each weapon. Each column buys a different amount of functionality; it is not an equal-price ranking.
| Weapon | +1 Accuracy | +1 Pen | +1 damage/projectile | +1 projectile/Fire |
|---|---|---|---|---|
| Rifle | +0.236 | +0.360 | +1.031 | +1.746 |
| Autocannon | +0.318 | +0.552 | +1.303 | +1.443 |
| Cannon | +0.441 | +0.205 | +1.430 | +1.653 |
| Pulse | +0.095 | +0.230 | +0.985 | +0.707 |
| Flak | +0.319 | +0.576 | +1.413 | +1.199 |
| Rotary | +0.485 | +0.537 | +1.235 | +1.805 |
| Lance | +0.335 | +0.358 | +1.121 | +2.487 |
| Missile rack | +0.309 | +0.419 | +0.961 | +2.107 |
Values are additional expected printed damage per Fire. Another projectile benefits from the existing action and Heat payment, and brings another penetration/critical opportunity in real combat. A damage bonus applies to every projectile; glancing damage uses integer rounding, so it is not simply “one more damage.” Both upgrades need whole-volley and persistent checks before assigning weight. Pulse's on-hit Heat is absent from this table, so a low printed-damage number cannot establish that it is weak.
All 240 paired −1 Heat exact rows matched base exactly, as they should: immediate printed damage omits that resource. Across the 30 contexts per weapon, +1 Accuracy's mean hit improvement ranged from 4.52 to 4.83 percentage points, but one or two contexts per weapon had zero improvement. The machine-readable rows preserve this spread rather than just its average.
Heat buys safety and usable actions
The persistent check uses real activation bookkeeping, criticals, part loss, target/self Heat and reactor stress. Targets take passive activations to clear temporary states but never fire, cool, repair or move. One ordinary Fire is scheduled per shooter activation when its weapon/action remains usable. The cooling policy spends a remaining Quick on Vent whenever the shooter is hot. It does not optimize actions or spend saved Quicks on additional offense. Sampling continues through the fixed horizon for censoring; no further attack occurs after target or shooter death.
Every row below has 768 exposures per version, consisting of six target/cover cells sharing 128 seeds, not 768 independent seed blocks. Kill percentages mean target killed within eight scheduled activations, not winning a duel. Each interval is an exploratory paired 95% interval from 1,000 whole-seed bootstrap draws, preserving all six exposures per sampled seed. These are unadjusted intervals for this fixed mixture.
| Weapon and policy | Base → lower Heat | Target kill by horizon | Kill difference, percentage points [95% interval] | Shooter stress events/sequence | Vents/sequence |
|---|---|---|---|---|---|
| Rifle, no Vent | 1 → 0 | 47.40% → 48.96% | +1.56 [−0.39, +3.78] | 0.723 → 0 | 0 → 0 |
| Rifle, Vent when hot | 1 → 0 | 47.53% → 48.96% | +1.43 [−2.34, +5.08] | 0 → 0 | 6.909 → 0 |
| Cannon, no Vent | 3 → 2 | 85.03% → 85.16% | +0.13 [−2.34, +2.60] | 1.336 → 0.980 | 0 → 0 |
| Cannon, Vent when hot | 3 → 2 | 84.24% → 84.38% | +0.13 [−0.39, +0.78] | 0.155 → 0.001 | 5.095 → 5.303 |
| Pulse, no Vent | 1 → 0 | 14.84% → 14.19% | −0.65 [−2.21, +0.78] | 0.928 → 0 | 0 → 0 |
| Pulse, Vent when hot | 1 → 0 | 15.10% → 14.19% | −0.91 [−3.78, +2.21] | 0 → 0 | 7.703 → 0 |
These samples do not establish a kill-rate change from −1 Heat. They do show safety and action-budget differences. Going from 1 to 0 removes the need to Vent for this weapon; going from 3 to 2 leaves it hot. The fixed cooling policy can even record more Vents for the cooler Cannon because it has fewer stress resets/lost actions and continues firing. That is a limitation of treating Vent count as a universal efficiency score, not evidence that lower Heat is harmful. Counts include a permitted spare-Quick Vent after a lethal Fire in the fixture; they do not guarantee an equivalent number of useful actions in a competitive game.
The sampled negative kill deltas have intervals spanning zero. Changed stress/Vent branches consume different random draws, so a shared seed is a matched experiment, not a guarantee that every later hit roll stays identical. Pulse applied roughly 19 target Heat per sequence in this fixture, illustrating power omitted by the printed-damage table. This is gross inflicted Heat, not Hull damage or guaranteed useful pressure.
Censoring remains explicit. For the no-Vent Rifle, base had 364 kills, 399 living-shooter horizon-censored exposures and 5 shooter-dead/no-kill exposures; lower Heat had 376, 392 and 0. For no-Vent Cannon these were 653/103/12 and 654/106/8. For no-Vent Pulse they were 114/651/3 and 109/659/0. Each triple totals 768. The summary retains the corresponding cooling-policy counts and per-seed timing; dead or still-alive no-kill trials are never discarded from the kill denominator.
Melee pool and pilot breakpoints
Keep the stock Braced right arm and Duelist left arm for the following legal Reaver builds. Dual Blade weighs 46; dual Spike weighs 44. Their principal differences are:
| Pair | Weapon base dice across both hands | Per-strike damage | Pen | Weight across both weapons |
|---|---|---|---|---|
| Dual Blade | 4 | 2d6+2 | 3 | 8 |
| Dual Spike | 6 | 2d6 | 2 | 6 |
Handling and class/Piloting bonuses are added afterward. With Ruko, the complete fresh pools are six Blade dice or eight Spike dice. More dice support both attacks or defense and are not interchangeable with more damage per accepted strike. Blade has a genuine penetration/damage tradeoff; Spike's extra resources and lower weight are substantial advantages. Neither is a strict stat-dominance result, and these initial budgets do not establish the winning loadout under player decisions. The earlier isolated loadout study remains separate evidence for complete exchanges under its declared automatic choices.
| Dual Blade, versus Courier | Total dice | Expected successful offensive opportunities | Acts first when initiating / defending |
|---|---|---|---|
| Ruko, Piloting 1 | 6 | 3.00 | no / no |
| Ruko, +1 die on each weapon | 8 | 4.00 | no / no |
| Ruko, +1 right-arm Handling | 7 | 3.50 | no / no |
| Ruko, Piloting 1 → 2 | 7 | 3.85 | yes / no |
| Marrow, Piloting 2 | 7 | 3.85 | yes / no |
| Marrow, Piloting 2 → 3 | 7 | 4.20 | yes / yes |
Piloting affects hit success, floor(Piloting/2) bonus dice and deterministic first actor. It also raises the mech's own Evasion, a defensive benefit deliberately not valued in this attacking-pool comparison because the opponent is fixed. Against Bastion, Marrow's successful Blade resources stay at 6.65 when Piloting rises 2→3: the hit chance is already 95% and no new pool die is earned. Own Evasion and contests can still improve. This is why a universal “one pilot point” price is particularly misleading.
The distributions also retain all-defense standard/heavy parry capacities. These are alternatives to spending those successes on attacks; adding them to offensive output would double-count the same pool. +1 die on each held weapon adds two to a dual loadout, whereas +1 Handling on one arm adds one. Future modifiers must name their unit of application.
Mounting, movement and utility are part of the price
The conservative current body audit found zero confirmed numeric Pareto dominances when Size, class and categorical abilities match. Different Size reallocates hit-location exposure, so smaller is not automatically better. This does not certify the entire catalog: zero detected dominance is weaker than demonstrated strategic balance, and nonlinear critical/limb-disable effects still matter.
Whole-build substitutions can invalidate apparently good component bargains. Keeping Reaver's Autocannon and Blade explicit, a Precision right arm cannot carry the Autocannon (capacity 4 versus weapon Weight 6). Adding the Missile rack makes the build Weight 51 against Cap 50. Both cases are retained as illegal; neither is silently optimized away. Heavy legs, in contrast, can raise the cap: that Reaver swap weighs 51 but has Cap 60 and remains legal.
| Legal Reaver leg swap, same other parts | Whole-build Weight | Hull | Speed | Evasion | Distinct value/tradeoff |
|---|---|---|---|---|---|
| Standard | 47 | 42 | 4 | 11 | Ordinary movement, more Hull than Jump |
| Jump | 48 | 40 | 4 | 11 | No elevation surcharge in either direction |
| Light | 44 | 40 | 5 | 12 | Faster, lighter, ordinary elevation cost |
| Sprint | 43 | 39 | 6 | 12 | Still faster/lighter; less Hull/leg armor |
| Heavy | 51 | 44 | 3 | 10 | Higher cap/leg protection; lower mobility/evasion |
| Tracked | 48 | 43 | 4 | 10 | Extra cap/protection; Evasion penalty |
The parent's separate geometry audit measures Jump access and travel thresholds on actual maps. This table only establishes legal body tradeoffs; whole-build Hull does not substitute for armor or loss of a particular limb.
Range is similarly discrete: the current long-range limit is floor(1.5 × printed Range), with no current long-range accuracy penalty. Range 5→6 increases the reachable firing-distance cutoff 7→9; Range 6→7 increases it 9→10; Range 8→9 increases it 12→13; Range 10→11 increases it 15→16. A point's value depends on map sight lines and whether movement can obtain a legal shot, not on its contribution to damage at range 4.
Free Lock On saves a Quick and can affect multiple subsequent attacks, but a lock still needs acquisition and a usable sensor path/range. On the common Rifle platform against a standing clear Courier, a successful Lock changes per-shot hit chance 60%→77.5%; against a clear Bastion it remains 95%. Against hard-cover Courier it changes 37.6%→42.5%, with leg absorption still separate. Ilse's own acquisition chance in these fixed examples is 60% for Courier and 75% for Bastion. These are conditional probabilities, not guaranteed bonuses or a complete valuation of the Sensor mast. Smoke, repair, allied abilities/bonds, disruption, ammunition, Overdrive, two-hand occupancy, disabled-arm penalties and team support remain additional dimensions.
Reusable pricing method
For each future item, retain a vector of reliability, damage/crit/disable, Heat and action use, survival, mobility/access, utility and legal weight/capacity headroom. Compare legal whole-build substitutions against several target/terrain roles; preserve poor contexts as well as best cases. Mark breakpoints explicitly: accuracy saturation, armor/crit thresholds, per-projectile bonuses, reactor overflow, zero-Heat transition, Piloting bonus steps, lost-limb effects and range/access cutoffs.
Use conservative Pareto checks to catch an item with the same functional role and no compensating disadvantage. Then use exact models for their supported mechanics, persistent full-engine exposure for durability/Heat/crit consequences, complete melee exchanges for shared-pool decisions, and separately reviewed competitive policy samples for action opportunity and objectives. A drawback only pays for an advantage if it changes a meaningful legal choice or outcome in relevant contexts. No universal scalar price is fitted or recommended by this audit.
Reproduction and verification
pnpm exec vitest run cli/part-marginals.test.ts --maxWorkers=2 --testTimeout=15000
pnpm exec tsx cli/part-marginals.ts --prepare --out NEW-manifest.json
pnpm exec tsx cli/part-marginals.ts --run --manifest NEW-manifest.json --out NEW-results.json
python3 cli/part-marginals-summary.py NEW-results.json NEW-summary.json
Actual retained commands and hashes are in provenance. manifest-v2.json is the executed manifest; the earlier manifest.json is an unused pre-typecheck capture retained for transparency. Execution checks all 39 engine/data/helper fingerprints before and after, pins full current rules/catalog/builds, and refuses overwrite. The analysis validates all factorial keys, every shared seed, probability mass, actual damage plus remaining Hull conservation, explicit kill/censor denominators and Heat negative controls. Focused tests include a real shooter meltdown and surviving horizon-censored exposure. Independent review approved the design and implementation before execution. The retained-number review reproduced 40 aggregates, 54 Heat metrics, 108 confidence-interval endpoints and 39 hashes. The consolidated review approves the scoped conclusions.
Multivariant strategic balance study — 2026-09-09
Multivariant strategic balance study — 2026-09-09
The map repair is complete; no experimental balance replacement is accepted. All authored maps now have exact rotational symmetry. The study completed 280,320 full-game executions, including 6,144 exact control/parity repeats, and a separate 153,600-exchange melee loadout audit. The strongest findings concern bot pathing, policy choice, melee opportunity counts and turn-order sensitivity. Permanent offensive Enraged remains the playable combat default.
The pool-minus-one plus ranged-accuracy-plus-two combination remains promising under the selected bot policies: melee payoff falls from 75.3% to 53.5% across its five opponents. However, every finalist candidate shows unresolved Causeway first-side sensitivity beyond the review margin. No candidate advances to the untouched holdout. This is a reviewed diagnosis, not a claim that the game is balanced or that the unrun full-panel confirmation would fail. Read the selection decision and independent final review.
Later owner adoption: after this study closed, the owner selected the ranged-accuracy-plus-two change by design decision, without the pool reduction, and separately replaced legacy climbs and falls with paid vertical movement. The original no-advancement study verdict and retained data remain unchanged. Its accuracy candidate ran under the old movement rules, so it does not validate or predict the combined live ruleset. See the adoption record and TASK-092.
All changes remain local on feature/local-playtest-prototype. Start a new match to use the repaired maps; existing saves retain their embedded board for replay consistency.
What is fixed in the actual maps
All four authored maps have exact 180° symmetry of resolved terrain, elevation, deployment areas and complete, non-overlapping objective footprints. Quarry terrain is now rotated correctly. Quarry, Foundry and Causeway have four paired seven-hex objectives; Flat remains an empty no-zone control. On the even-sized 32×20 hex board, the previous singleton central flower could not rotate onto itself. The current rules, Lite Rules and packet describe the four-zone layout.
The separate old/fixed diagnostic uses six same-roster mirrors, both first sides, 64 paired seed blocks, and all three objective maps: 4,608 games. This compares the combined terrain/objective repair, including three to four zones; it does not isolate terrain from scoring geometry.
| Map | Old physical-A payoff | Fixed physical-A payoff | Fixed first-side payoff |
|---|---|---|---|
| Quarry | 52.2% | 51.8% | 40.4% |
| Foundry | 51.4% | 50.1% | 45.4% |
| Causeway | 53.5% | 49.1% | 40.1% |
The geometry repair brings physical-end observations close to 50%; it does not remove the observed advantage of acting second. Causeway wipes fell from 83.3% to 64.8% in this mirror sample as objective opportunity increased. These are exploratory bot results, not universal human-side guarantees. Paired intervals and complete map diagnostic.
The pooled values also hide large family-specific shifts. In the 18-cell map-by-family stratification, Causeway armored physical-A payoff changed 77.3→43.8% and its first-side payoff 50.8→23.4%; Quarry mixed changed 51.6→60.2% physical-A and 46.9→33.6% first-side. These are paired 64-seed exploratory observations. Foundry melee’s 50% mirror payoff is entirely non-engaging draws: units move, but neither side attacks or scores. It is not evidence of healthy counterplay. The independent map review verifies the retained results and explains their limits. Exact map symmetry fixes a structural defect, but it does not guarantee family, activation-order or policy fairness.
Screening evidence
All 30 conditions cover 16 shared seed blocks, four maps, eight diagnostic roster pairings and all four roster-end/first-side assignments. The panel is incomplete and uneven across families, so its spread is a prioritization signal rather than a full-meta estimate. Draws score half. Selection is retained in the stage record.

The most promising reliability mechanisms were ranged accuracy +1 and a replenishing offensive command reserve. Both reduced empty proactive Fires while increasing wipes and early deaths. Uniform Hull increases reduced early deaths but worsened the exploratory roster gap, motivating combinations rather than a blanket durability increase. Removing free Lock On sources exposed the contribution of unpriced support actions, but made attacks less reliable. Melee damage/accuracy buffs barely changed the large terrain-specific failures.
The command experiments use a shared team pool with fixed, equal-round or casualty income and offense, defense or adaptive automatic spending. These are nine distinct economy/policy conditions. Offensive CP buys one eligible failed offensive reroll; defensive CP reduces eligible incoming damage by one while preserving positive damage. Enraged has first claim on its own eligible reroll. Cap waste, declined spending, reserves, usage and nominal mitigation are retained. Human choice, bluffing and timing are not represented by the automatic policies, and nominal mitigation is not measured Hull saved.
Wide full-panel evidence
The completed wide stage contains 76,800 games: ten conditions, all 15 family pairings, four maps, all four roster-end/first-side assignments and 32 shared seed blocks. It uses equal map and opponent weighting. The 1,000-replicate 95% paired bootstrap intervals are exploratory; they are not the predeclared 5,000-replicate 99% confirmation intervals. Complete tables and intervals.


| Condition | Spread | Mean abs dev | Empty Fire | Dead before attack | Wipes | Rounds |
|---|---|---|---|---|---|---|
| baseline | 20.0% | 6.4% | 13.7% | 8.3% | 69.8% | 6.00 |
| accuracy1 | 18.0% | 6.0% | 11.0% | 9.2% | 72.9% | 5.93 |
| nofreelock | 20.2% | 5.9% | 15.4% | 7.0% | 69.1% | 6.04 |
| accuracy1+nofreelock | 17.8% | 5.1% | 12.2% | 7.9% | 71.3% | 5.97 |
| hull120 | 25.8% | 6.5% | 13.4% | 6.0% | 57.8% | 6.30 |
| accuracy1+hull120 | 21.3% | 6.3% | 10.7% | 6.9% | 61.1% | 6.27 |
| cp-round-offense | 20.9% | 6.3% | 10.0% | 9.9% | 76.2% | 5.80 |
| cp-round-offense+hull120 | 22.9% | 6.5% | 9.9% | 7.6% | 65.4% | 6.14 |
| goalpath | 37.7% | 10.1% | 13.7% | 10.3% | 64.6% | 6.14 |
| goalpath+accuracy1+nofreelock | 35.3% | 9.6% | 12.4% | 9.5% | 64.9% | 6.12 |
accuracy1+nofreelock had the smallest point spread and mean absolute deviation. Its paired spread change was −2.1 percentage points, with a wide 95% interval of [−7.6, +3.2]; it therefore does not establish a spread improvement. It reduced Empty Fire by 1.5 points [−1.9, −1.1] and early deaths by 0.5 points [−0.7, −0.2]. Accuracy alone reduced Empty Fire by 2.7 points but increased early deaths by 0.8 points and added 4.6 points of worst-map absolute first-side bias. Removing free Lock On alone moved those reliability and survival measures in the opposite directions.
Hull 120 reduced early deaths by 2.3 points and wipes by 12.0 points, but increased spread by 5.9 points [1.6, 9.8], driven especially by gunline falling to 35.5% and mobile rising to 61.3%. Offensive round CP reduced Empty Fire by 3.7 points while increasing early deaths by 1.6 points and wipes by 6.4 points. The Hull combination offset those lethality results: relative to baseline, cp-round-offense+hull120 reduced early deaths by 0.7 points and wipes by 4.4 points, but its spread was 2.9 points higher. It granted 11.07 CP per game, spent 7.48, wasted 1.21 at the cap and ended with 3.59; most spending occurred while scores were equal (4.63 per game), compared with 1.12 while behind and 1.73 while ahead. This automated policy leaves substantial reserves and cannot establish the value of human timing or comeback choice.
The complete component controls permit point-estimate interaction checks. Interaction here is combination − component A − component B + baseline; it is descriptive and has no interval in this stage.
| Combination | Spread interaction | Empty Fire interaction | Early-death interaction | Wipe interaction |
|---|---|---|---|---|
| accuracy1+nofreelock | −0.5 pp | −0.4 pp | +0.0 pp | −0.8 pp |
| accuracy1+hull120 | −2.6 pp | +0.0 pp | +0.0 pp | +0.2 pp |
| cp-round-offense+hull120 | −3.9 pp | +0.2 pp | +0.1 pp | +1.2 pp |
| goalpath+accuracy1+nofreelock | −0.2 pp | +0.2 pp | −0.3 pp | −1.1 pp |
The aggregate family scores conceal severe map matchups. In the baseline, gunline scored 26% into mobile and 32% into control after map averaging. On Foundry, melee scored 0% into control and gunline but 100% against mixed, armored and mobile. Flat reversed several of those relationships: armored and mixed scored only 2% and 3% into melee. Quarry melee scored 91% into control. All ten conditions retained extreme cells, so a moderate aggregate spread does not show uniformly healthy counterplay. Baseline physical-side absolute bias stayed at or below 1.3% on each map. Acting second led by 6.4 points on Causeway and 5.3 on Flat, while Foundry was nearly even; several attack-reliability candidates enlarged the worst-map first-side difference.
goalpath increased spread by 17.7 points [13.6, 22.5] and reduced melee's family payoff from 47.0% to 26.7% [25.2, 28.1]. Adding accuracy and removing free locks left melee at 29.8% [28.3, 31.3] and control at 65.1%. These are useful routing diagnostics: the known controller can enter safe-movement roof traps, and corrected distance direction alone does not preserve unreachable-route information. They do not show that human melee strategy has the same weakness, and they should not motivate compensating melee statistics before the safe-approach controls are measured.
The historical wide-stage shortlist was accuracy1+nofreelock, accuracy1, and cp-round-offense+hull120. They represent the best observed aggregate candidate, its attack-reliability component, and a distinct resource-plus-durability tradeoff. Retain nofreelock, cp-round-offense and hull120 as component controls for interaction interpretation. The reference and every candidate must use the same safe-approach controller. This shortlist is a measurement priority, not a promotion or final verdict.
Geometry and reachability controls
The completed reachability comparison separates four controller states across the same full 15-pair, four-map, 32-seed panel. baseline is the historical geometric policy. goalpath corrects distance-field direction. zonegoals also seeds every passable objective flower rather than only the center marker. safeapproach additionally preserves “goals exist but no safe route” with a finite board-bounded penalty. The immutable comparison reuses the original 7,680-row baseline and goalpath files after independent exact 2,048-row parity repeats for each, and adds complete 7,680-row zonegoals and safeapproach conditions. Source identities, phases and hashes remain visible; this is adaptive exploratory evidence.


| Controller | Spread | Mean abs dev | Melee payoff | Gunline payoff | Early deaths | Wipes |
|---|---|---|---|---|---|---|
| baseline | 20.0% | 6.4% | 47.0% | 40.3% | 8.3% | 69.8% |
| goalpath | 37.7% | 10.1% | 26.7% | 48.6% | 10.3% | 64.6% |
| zonegoals | 31.5% | 7.9% | 31.0% | 46.1% | 9.6% | 65.5% |
| safeapproach | 51.8% | 11.2% | 83.7% | 32.0% | 6.7% | 82.1% |
Correct direction alone made the hidden routing problem more visible: relative to baseline, goalpath increased spread by 17.7 percentage points [13.6, 22.5] and moved melee from 47.0% to 26.7% [25.2, 28.1]. Using complete zone footprints recovered 4.3 points of melee payoff and reduced spread by 6.1 points relative to goalpath, but melee remained at 31.0% [29.4, 32.7]. The one-seed Foundry trace agrees with this mechanism: zonegoals still sent all three healthy Jump units onto the original roof component, where none had a safe route to a scoring flower.
Preserving unreachable-route information changed the outcome regime. Relative to zonegoals, safeapproach raised melee payoff by 52.7 points, lowered early deaths by 2.9 points, added 0.82 proactive melee starts per game and raised wipes by 16.6 points. In the retained Foundry mechanism trace, it chose ground routes, left every melee unit with safe paths to all four scoring flowers at round two, and produced scoring and proactive combat; zonegoals did neither. This supports the claimed routing mechanism.
The resulting 83.7% melee payoff [81.6, 85.6] is evidence that the old controller distorted the balance measurement, not evidence that human melee play is balanced. The old 47.0% average and 20.0-point family spread hid severe, opposing AI failures across maps and matchups. Once the known trap preference is removed, melee dominates this finite bot panel, gunline falls to 32.0% [29.1, 35.1], wipes rise to 82.1%, and overall spread reaches 51.8%. The corrected controller therefore invalidates promotion decisions based on the old aggregate ranking and requires the selected stat/resource candidates to be measured again against a common corrected reference.
All four controller states and their original outputs remain historical evidence. goalpath, zonegoals and safeapproach are explicit optional capabilities in saved configurations; none changes the ordinary gameplay default. The corrected-controller screen below uses the same safeapproach controller on both sides. This exploratory comparison supplies no human-balance proof or live-default change.
Corrected-controller screen
The completed corrected-screen analysis covers 13 conditions, all 15 family pairings, four maps, all four roster-end/first-side assignments and 16 shared seed blocks: 49,920 games. All 13 immutable output hashes match the execution log and are pinned in the comparison manifest. The 1,000-replicate 95% paired intervals are exploratory.


| Condition added to safeapproach | Spread | Spread change [95% interval] | Mean abs dev | Empty Fire | Early deaths | Wipes |
|---|---|---|---|---|---|---|
| baseline | 54.8% | — | 11.7% | 15.5% | 6.5% | 84.5% |
| melee accuracy −1 | 49.5% | −5.2 [−7.7, −3.0] pp | 11.1% | 15.5% | 6.5% | 84.3% |
| melee damage −1 | 54.2% | −0.5 [−2.0, +0.8] pp | 11.9% | 15.5% | 6.3% | 84.4% |
| melee damage −2 | 54.6% | −0.2 [−2.1, +1.6] pp | 12.0% | 15.5% | 6.3% | 84.7% |
| melee pool −1 | 37.5% | −17.3 [−22.2, −12.8] pp | 9.4% | 15.3% | 6.6% | 82.5% |
| no pilot abilities | 56.2% | +1.4 [−1.5, +4.2] pp | 12.3% | 16.0% | 6.3% | 83.8% |
| neutral pilots | 42.0% | −12.8 [−17.6, −3.4] pp | 12.3% | 15.2% | 6.4% | 76.3% |
| ranged accuracy +1 | 46.7% | −8.0 [−12.5, −3.2] pp | 10.9% | 12.2% | 7.2% | 85.3% |
| ranged accuracy +2 | 38.3% | −16.5 [−20.5, −8.4] pp | 10.1% | 9.7% | 7.9% | 87.0% |
| no free Lock On | 56.6% | +1.8 [−2.0, +5.8] pp | 11.9% | 16.5% | 6.1% | 83.0% |
| Hull ×1.20 | 64.1% | +9.4 [+5.3, +13.2] pp | 13.7% | 15.3% | 4.9% | 73.5% |
| offensive round CP | 47.6% | −7.2 [−13.8, +0.2] pp | 11.1% | 11.2% | 7.8% | 86.8% |
| defensive round CP | 60.9% | +6.1 [+3.0, +9.1] pp | 12.7% | 15.4% | 5.6% | 79.0% |
The corrected baseline confirms that safe routing exposed a large roster problem rather than solving balance: melee averaged 84.8% [82.0, 87.7] and gunline 30.0% [24.5, 35.9]. Melee's across-map matchups were 89% into mixed, 91% into armored and mobile, 81% into gunline and 71% into control. Individual map cells remained more extreme. For example, the baseline melee roster scored at least 90.6% against control on Causeway and Quarry and 100% against gunline on Foundry, while gunline scored 25% into mobile and 29% into control after map averaging. A lower aggregate spread therefore remains insufficient if extreme matchups persist.
Melee damage −1 and −2 barely changed spread or melee's family payoff. Accuracy −1 reduced spread by 5.2 points but left melee at 80.5%. Melee pool −1 was the strongest targeted single: spread fell 17.3 points, melee fell to 70.5% [66.9, 73.8], gunline rose to 33.0% [27.6, 38.8], and Empty Fire, early deaths and wipes moved by less than two points. It still leaves melee's interval wholly above the 65% review band and several extreme matchup cells.
Ranged accuracy +2 produced a similar spread reduction of 16.5 points and brought every family except melee inside the point-estimate review band; melee remained 78.1% [75.8, 80.5]. It reduced Empty Fire by 5.8 points while increasing early deaths by 1.4 points and wipes by 2.5 points. Accuracy +1 was a smaller version of the same tradeoff. Neutral pilots also reduced spread, but it simultaneously replaces all pilot stats, abilities and bonds, so it is a diagnostic of unpriced pilot power rather than a bounded rules finalist. Removing pilot abilities alone and removing free Lock On did not improve spread.
Every condition passed the four preregistered point-estimate guardrail margins: no more than +2 points Empty Fire, +5 early deaths, +5 worst-map added physical-side absolute bias and +5 worst-map added first-side absolute bias. This does not make the exploratory intervals confirmation tests. Accuracy +1's worst-map physical-bias interval reached +5.1 points and its first-side interval +8.9; accuracy +2's first-side interval reached +8.2. Map-level side effects must remain visible in the next stage.
Offensive round CP spent 6.76 of 10.30 granted points per game and ended with 3.54; it reduced Empty Fire by 4.3 points but increased early deaths by 1.3 and wipes by 2.3. Defensive CP spent 10.23 of 11.36, reported 10.23 nominal one-damage mitigations, reduced early deaths by 0.9 and wipes by 5.5, but widened spread by 6.1 points. These automatic policies show distinct reliability and survival effects, but they do not model human timing, bluffing or target choice.
The complete corrected screen selected melee pool −1 and ranged accuracy +2 for the focused policy comparison below. They produced the two largest targeted spread reductions through different mechanisms. The four-condition design retains the safeapproach control, both singles and their combination to expose complementarity or overshoot. This exploratory selection did not accept a live rule or a holdout finalist.
Cautious-policy grid
The approved four-condition grid completed 64,000 games with zero failures or resumed conditions and matching frozen inputs. Each condition crosses five melee-involving pairings, four maps, eight seed blocks, all four roster-end/first-side assignments and every combination of aggression 0, 0.25, 0.5, 0.75 and 1. All four immutable output hashes are pinned in the comparison manifest, and the paired analysis uses 1,000 exploratory 95% seed-block bootstrap replicates.


This is a partial five-pair panel. Each non-melee family is observed only against melee, and every policy cell is pooled equally in the table below. “Observed spread” is the range across those partial-panel payoffs; it is not a global six-family spread estimate and cannot select a policy profile.
| Condition | Observed spread | Melee payoff across five opponents | Mixed vs melee | Armored vs melee | Mobile vs melee | Gunline vs melee | Control vs melee | Empty Fire | Early deaths | Wipes |
|---|---|---|---|---|---|---|---|---|---|---|
| baseline | 15.8% | 53.0% | 41.8% | 46.2% | 39.6% | 52.0% | 55.4% | 11.8% | 22.4% | 68.9% |
| melee pool −1 | 17.9% | 43.3% | 51.7% | 59.6% | 55.0% | 56.0% | 61.2% | 11.7% | 22.7% | 65.0% |
| ranged accuracy +2 | 16.4% | 45.5% | 49.2% | 54.4% | 48.0% | 58.8% | 61.9% | 7.2% | 26.3% | 75.4% |
| both changes | 32.9% | 36.1% | 58.7% | 68.0% | 61.9% | 62.1% | 69.0% | 7.2% | 26.3% | 73.4% |
Policy pooling changes the picture from the fixed 0.75 corrected screen. On the same eight fresh seeds, baseline melee payoff is 85.6% at fixed 0.75/0.75, 81.3% when pooling only the old 0.5/0.75/1 grid, and 53.0% when pooling all five levels. This matched comparison demonstrates that bot policy can dominate a balance reading; none of these equal mixtures is a strategic equilibrium. Each single reverses the pooled advantage moderately. Their combination overshoots: melee falls to 36.1%, armored and control score 68.0% and 69.0% against it, and observed spread rises by 17.1 points [11.8, 22.2] from baseline. Combination interactions are evaluated on matched payoff cells in the policy diagnostic; spread is nonlinear and is not used as an additive mechanism measure.
All three candidate conditions remain within the four point-estimate guardrail margins on this partial panel. Accuracy +2 and the combination reduce Empty Fire by about 4.5 points while increasing early deaths by 3.9 points; the combination raises wipes by 4.5 points. Melee pool −1 changes Empty Fire negligibly, raises early deaths by 0.3 points and lowers wipes by 3.9 points. These pooled point checks do not replace map-level review or confirmation intervals.
The completed policy diagnostic selects one common profile from control alone. Non-melee families select aggression 0/0.25 in 18 of 20 map/pair cells and 0.5 in two; melee selects 0.75/1 throughout. Each condition has 640 observations at that shared profile. These are selected training data, not confirmation. The retained full profile marks 40 other map/pair cells as untrained 0.75/0.75 fallbacks.
| Shared control-selected profile | Control | Pool −1 | Accuracy +2 | Both |
|---|---|---|---|---|
| Melee payoff across five opponents | 75.3% | 66.4% | 69.1% | 53.5% |
| Empty proactive Fires, equal map weighting | 13.37% | 13.27% | 9.06% | 8.69% |
| Deaths before a proactive attack | 15.39% | 15.52% | 18.05% | 17.71% |
| Games ending in a wipe | 67.97% | 58.13% | 72.81% | 66.56% |
| Causeway first-side payoff | 50.00% | 40.63% | 39.38% | 36.88% |
The selected-profile combination is promising rather than a general overshoot. It still has uneven matchups: melee scores 68.8% into mixed, 38.3% into armored, 36.3% into mobile, 68.0% into gunline and 56.3% into control. Its matched melee-oriented payoff interaction is −6.64 points beyond the sum of the singles, a descriptive selected-training contrast. Joint leave-one-seed policy agreement ranges from 37.5% to 100%; the Quarry mobile cell has a 25-point pure response gap. Pure security choices are not necessarily an equilibrium.
The new exchange observer also exposes a play-feel cost that ranged Fire metrics miss. Among completed exchanges at the shared profile, the initiating side deals zero body damage in 21.4% of control exchanges, 32.3% with pool minus one and 33.8% with the combination. Mean initiating body damage falls from 7.87 to 6.15 and 6.06 respectively, while exchanges per game rise from 3.16 to 3.67 and 3.44. These initiator-role observations combine all families and changing combat situations; they are not a matched isolated weapon effect. They show why a pool reduction needs direct melee review even when aggregate ranged reliability improves.
The unresolved selection concern is Causeway: the added absolute first-side bias is 9.4 points for pool minus one, 10.6 for accuracy plus two and 13.1 for both, above the five-point review margin. The combination’s empty-Fire and early-death point results are acceptable, but those benefits do not resolve the turn-order concern. The broad conditional intervals also do not rule out harmful bias. These five-pair observations do not prove failure of the unrun full-15 confirmation, whose opponent weighting differs. They support the reviewed decision to advance no finalist while preserving the combination as a scoped future candidate.
Power budget and simulation limits
The exact roster audit enumerates 5,940 ranged situations and 90 initial melee matchups. It identifies distinct offense, survival, mobility, exchange-control and team-utility axes. Three Couriers use only 99/145 team weight but almost fill their individual chassis caps; they combine Evasion 14–15, Speed 6 and three free Lock On sources. The gunline has stronger common-target printed shooting and more Hull. Unspent team weight cannot simply become extra equipment without violating personal caps. The six concrete rosters do not represent optimized archetypes or every ability synergy; only the melee roster enables special pilot abilities.
The separate melee loadout audit executes 153,600 fresh adjacent exchanges, not full games. Across five legal held-loadouts, three pilots, five stock targets and both initiating roles, dual Spike is lighter than dual Blade (44 versus 46 total build weight) and carries two additional melee opportunities. With equal pilot/target/initiator weighting, its one-exchange enemy-kill probability is 82.8% versus Blade’s 75.7%. Pool minus one lowers these to 62.6% and 46.3%, widening that gap. This contact-only result does not establish global dominance, but it identifies a concrete weakness in pricing and in the full-game panel, which fields only Blade melee rosters. A precise result for those six rosters would miss the alternative loadout.
Official competitive-game research supports using several controls together: roster budgets and composition restrictions, limited shared resources, access/action costs, scenario design and empirical adjustments. These are design patterns, not a transferable single formula for pricing mech parts.
The goal-path diagnostic confirmed that the bot used distance-from-goals as distance-to-goals despite directional climbs and terrain entry costs. The optional correction passed independent review, 498 full-suite tests and typecheck; its 2,048 repeated baseline rows exactly match the original screen. But its paired candidate did not fix Foundry's melee failures and worsened the exploratory gap. Further traces identify roof traps: healthy Jump units can climb onto a connected roof but cannot leave through safe movement, while the bot excludes falls and substitutes geometric distance for an absent route. Quarry also contains valid scoring flowers with blocked centers, which center-only objective goals misrepresent. These are planning defects requiring separate controlled treatment before interpreting stat changes as strategic balance.
Reproduction and acceptance
The protocol freezes practical targets, primary guardrails and seed-block pairing. Each simulation phase retains exact commands, complete catalogs/rules/rosters/maps, source hashes, immutable outputs and execution logs under the evidence directory. The runner refuses incomplete factorial outputs and source drift. Analyzer tests reject incomplete confirmation grids, and independent review checked pairing, weighting, bootstrap and baseline-trained policy locking.
The final selection record is written before any final-range data are accessed. No holdout or additional tuning ladder was launched. Independent review accepts the retained measurements and the bounded diagnosis; it does not certify the game, catalog or human strategy balance.
Full verification passed 536 Vitest tests across 77 files and TypeScript checks. Map symmetry and packet routes have additional focused verification; Python analyzers validate exact pairing and grid completeness. At study close, the current rules, Lite Rules, GDD and simulator specification described the map repair while experimental CP, routing and stat candidates remained separate. The later adoption note above records the owner's subsequent ranged Accuracy decision without rewriting this evidence.
The next useful work is to explain Causeway activation-order sensitivity, improve threat-aware bot choices, and expand legal loadout/pilot coverage before choosing another candidate. Raw damage alone is a weak answer to the observed melee advantage: opportunities govern both striking and parrying, while mobility and range management determine whether those opportunities occur at all.
Fixed-position melee loadout audit — 9 September 2026
Fixed-position melee loadout audit — 9 September 2026
The shared-pool reduction leaves a substantial Spike substitution risk that the six-family game study cannot measure: its melee family carries dual Blades. In this separate, fresh adjacent-exchange test, dual Spikes cost less, retain two more opportunities, and kill the opposing stock kit more often than dual Blades. The observed kill-rate gap grows from 7.1 to 16.3 percentage points after the pool reduction. This supports limiting any forthcoming balance claim to the tested roster definitions. It does not establish an optimal loadout or predict a new game-wide meta.
No live catalog, rules, controller, or frozen study source changed for this audit. It supplies a loadout-budget warning, not another candidate-selection stage.
Fixed design and exact budgets
All 153,600 exchanges were executed: five Reaver equipment variants × three pilots × five stock opponents × four conditions × two initiating roles × 256 fresh seeds (900000–900255). Every one of the 600 declared cells was legal; none was omitted. The run took 23.4 seconds.
Each Reaver keeps its stock Braced right arm and Duelist left arm. Their capacities are 10 and 7. The two-handed Greatblade uses their combined capacity of 17, with the left equipment slot explicitly empty. No arm optimization or replacement was needed. Shield equipment supplies the defense-only pool even on the retained Duelist arm.
Offensive pool counts below are Ruko / Marrow / Vex, before rolling. They include retained arm handling, class and Piloting bonuses. The reduction removes one base die from each held melee weapon, to a minimum of one; it leaves shield dice unchanged.
| Reaver equipment | Weight / cap | Control offensive dice | Pool−1 offensive dice | Shield dice |
|---|---|---|---|---|
| Dual Blade | 46 / 50 | 6 / 7 / 7 | 4 / 5 / 5 | 0 |
| Dual Spike | 44 / 50 | 8 / 9 / 9 | 6 / 7 / 7 | 0 |
| Dual Ram | 48 / 50 | 6 / 7 / 7 | 4 / 5 / 5 | 0 |
| Blade + shield | 47 / 50 | 3 / 4 / 4 | 2 / 3 / 3 | 2 |
| Greatblade | 48 / 50 | 3 / 4 / 4 | 2 / 3 / 3 | 0 |
The manifest also pins exact source budgets and stats for every opponent: stock Courier, Foreman, Bastion, Reaver and Lantern, including their printed pilots/equipment. Stock Reaver here has one Blade and an Autocannon; it is not the game study's dual-Blade melee-family unit.
One exchange, no movement policy
Each trial creates a fresh adjacent open-ground GameState, begins only the designated initiator's activation, then calls the real GameState.fight. The existing deterministic MeleeExchange.auto declares the first available offensive opportunity against Core and parries whenever enough opportunities remain, spending shield opportunities first and then the lowest totals. The exchange runs to completion. Its d20s, damage and critical effects are seeded random rolls; the decisions are scripted, not the dice.
Both initiating roles are sampled independently. Piloting still determines who makes the first exchange decision, so “initiates” does not necessarily mean “strikes first.” The fixed Reaver variant is always side A; this test has no spatial or initiative roll-off comparison.
There are no movement decisions, objectives, other activations, prior damage or Heat, Enraged qualification, CP, allied bonds or reactions. Pilot stats remain printed; this isolated F11 sequence does not exercise their surrounding-game ability actions. Normal critical effects and weapon/self Heat still apply.
Observed exchange outcomes
Each table entry represents 7,680 exchanges, equally weighting three pilots, five targets and two initiating roles. Damage means actual opposing body durability removed, including critical effects and transfer, excluding overkill. “Empty” means the tested Reaver dealt no body damage over the whole exchange. “Enemy killed” is an exchange outcome, not a game win rate.
| Loadout | Mean damage: control → pool−1 | Empty: control → pool−1 | Enemy killed: control → pool−1 |
|---|---|---|---|
| Dual Blade | 10.88 → 8.24 | 12.4% → 25.4% | 75.7% → 46.3% |
| Dual Spike | 11.58 → 10.36 | 5.8% → 10.8% | 82.8% → 62.6% |
| Dual Ram | 11.05 → 8.64 | 7.2% → 15.9% | 73.5% → 46.4% |
| Blade + shield | 8.07 → 5.47 | 23.2% → 39.6% | 41.5% → 22.2% |
| Greatblade | 7.85 → 5.84 | 34.6% → 49.8% | 50.4% → 35.5% |
The Spike-versus-Blade ordering appears against every sampled opponent in these mixtures. Each target/loadout/condition entry below has 1,536 exchanges.
| Stock opponent | Control kills: Blade / Spike | Pool−1 kills: Blade / Spike |
|---|---|---|
| Courier | 49.0% / 62.4% | 26.2% / 41.1% |
| Foreman | 92.6% / 95.5% | 67.3% / 82.1% |
| Bastion | 84.2% / 88.2% | 34.8% / 52.7% |
| Reaver | 64.9% / 77.5% | 45.4% / 63.7% |
| Lantern | 87.7% / 90.4% | 57.7% / 73.4% |
The direction also holds separately when the tested variant initiates and when its opponent initiates. Under pool−1, Blade/Spike kill rates are 46.1%/62.5% when the variant initiates and 46.5%/62.7% otherwise. These role-specific entries each contain 3,840 exchanges. Pilot and initiation breakdowns, damage received, deaths, declaration/acceptance/parry counts, initial failures and damage histograms are retained in the evidence.
All four requested conditions were executed. Adding ranged accuracy +2 is an exact negative control for this F11-only fixture: control equals accuracy2, and pool−1 equals their combination. All aggregates, compact seed outcomes and SHA256 digests of complete ordered per-seed result objects matched across 300 cell pairs / 76,800 seed pairs. This says nothing about accuracy2's ranged or full-game effects.
What this establishes, and what it leaves open
Spike retains a lower printed damage profile (2d6 versus Blade's 2d6+2) and lower penetration (2 versus 3), while sharing accuracy 2 and parry cost 1. Its base pool of three versus two is therefore a real tradeoff, not strict statistical dominance across all situations. Here, two extra shared opportunities help sustain attacks and defense after opposing opportunities are spent. The candidate reduces both dual-weapon pools by two, preserving that relative surplus; it does not price or remove it.
The scripted always-parry/Core policy, intact starting arms and finite stock targets strongly constrain the result. Arm targeting, damage accumulated before contact, alternative spending decisions, mixed equipment, optimized frames, positioning, disengagement and ranged attacks are absent. A shield's survival value also remains uncertain in this panel: tested-Reaver death rates were low (0.1–3.4% across loadout/condition mixtures), with little incoming body damage on average. These results cannot certify kit-wide balance or justify an automatic further weapon nerf.
All percentages are descriptive point estimates. Seeds are reused across cells and conditions, so the 153,600 trials are not independent evidence units for a cross-loadout contrast. Compact per-seed outcomes preserve that dependence; the summary additionally retains 256 whole-seed Spike-minus-Blade contrast clusters. No confidence intervals, multiple-testing claims, holdout outcomes or new condition selection are involved.
Evidence and reproduction
- Pretrial manifest used for execution: exact builds, legality, full catalogs/rules, source fingerprints and fixed factorial.
- All 600 cell results with compact per-seed outcomes: counts, totals, histograms, negative-control checks and command.
- Derived summaries and paired seed clusters.
- Analysis script.
- Exact retained commands.
The earlier manifest.json was written before review requested per-seed retention and stricter negative-control checks. It is retained as a superseded pretrial artifact; no trials used it. Manifest-v2 was written after those implementation changes and before any outcome trials.
pnpm exec vitest run cli/melee-loadout-audit.test.ts
pnpm exec tsx cli/melee-loadout-audit.ts --prepare --out /tmp/melee-loadout-manifest.json
pnpm exec tsx cli/melee-loadout-audit.ts --run --manifest /tmp/melee-loadout-manifest.json --out /tmp/melee-loadout-results.json
python3 docs/tuning/evidence/2026-09-09-melee-loadout-audit/summarize.py
The runner refuses output overwrites and source/catalog/rule drift. Use new output paths for another execution. The summary script reads this retained evidence directory and also refuses to overwrite its existing summary.json; reproduce it in a copied evidence directory with that derived file omitted. Five focused tests and typecheck passed; an independent reviewer approved the fixture, legality, event metrics and execution checks before the trials.
Isolated attack audit — 2026-09-09
Isolated attack audit — 2026-09-09
Historical baseline. The owner subsequently authorized the burst-fire prototype. The measurements below retain the pre-change catalog; use the newer report for current profiles, whole-volley aiming and lethality.
Multi-shot attacks substantially reduce empty actions with the same total raw damage. They also reduce immediate part destruction and kills. The main balance hotspots are single-shot reliability, Lance Overdrive's output on small frames, weak AP tradeoffs, and arm bodies that are strictly better at the same weight. These results support a controlled burst-fire prototype, not a general damage increase.
No live catalog or combat rules changed in this audit. Work remains local on feature/local-playtest-prototype.
Method and limits
This is a non-bot audit. Each trial resets both mechs, resolves the specified attack through the actual engine, and records the result. It does not play a match or choose moves. The retained evidence contains 8,760,000 ranged program trials, plus 360,000 melee pool initializations. Barrage trials can resolve two weapons; these counts are not projectile counts or independent full games.
- Weapon stand: legal Medium chassis, Standard head, Siege arms, Standard legs, reactor booster and Ilse. The tested weapon is held in the right hand; the left hand is explicitly empty. Missile tests use the rack instead of the booster. Gunnery is 1. This isolates weapon differences; it is not the stock Bastion's Gunnery 3.
- Distance is four hexes, inside every tested weapon's printed range. No target-stationary, high-ground, Lock On, bond, Momentum or other allied pilot ability bonus. Cover is supplied explicitly. Main comparison tables use three fresh stock targets, Courier / Foreman / Bastion, each in clear terrain and hard cover, weighted equally. They contain 10,000 trials per cell, not a measured frequency of battlefield situations.
- Extra weapon rows cover soft cover, attacker movement against an evasive target in hard cover, braced Bastion, and Heat weapons against warm targets. Braced and Boost/evasive states are not combined. Warm means target Heat starts one below reactor capacity.
- Damage is actual total body durability lost, including critical and Heat stress damage. Zero body damage does not mean zero effect. Gross inflicted Heat and stress are recorded separately. A destroyed non-core part includes head, legs, arms or back.
destroyWeaponPartcounts newly destroyed weapon-bearing parts, including melee; it does not mean all ranged capability is lost. It excludes temporary jams and other non-destruction disabilities. - Builds obey individual weight and arm-capacity limits. The search evaluates 201,126 cheapest-arm and 167,754 armored-arm candidates. The policies can overlap; 368,880 is not a unique-build count. All chassis, heads, legs, backs, pilots and single/unordered dual held ranged combinations are considered under those two arm policies. It excludes alternate ammunition, shield/melee/back-only builds, exhaustive arm combinations and left/right placement permutations.
- An expected-damage proxy nominates output and output-per-weight leaders by chassis and action cost. Actual engine trials test the 30 resulting/stock builds and 59 build/program combinations. Rankings describe the sampled shortlist, not a proven global optimum. Proxy screening does not include targeted-shot or Heat utility. Sato aimed-core alternatives are measured separately with the normal aimed penalty.
- Configuration programs start cold and have Heat cost no higher than reactor capacity. Over-cap firing is legal but excluded from this shortlist. Cooling, repeated activations, risk-taking and retaliation are not modeled. Full actions and Quick actions remain separate. Barrage uses distinct weapon slots; the second weapon uses its standard profile, matching the current controller.
- These are individual builds, not a legal roster recommendation: pilots cannot be duplicated in a roster. Range, movement opportunity, support utility, area collateral and sustained Heat efficiency remain outside the headline ranking. Small differences are not evidence of meaningful superiority. At 10,000 trials, a single probability estimate near 50% has roughly ±1 percentage point sampling uncertainty. Cells reuse seeds; do not treat their pooled samples as fully independent.
Weapon performance
This table gives one Quick Fire action against the six equally weighted fresh-target/cover cells. Body damage can be useful without destroying a part. The rack's weight includes the back module; held-weapon weights exclude the supporting arm. HE loads are limited to two uses and add weight. Other alternate loads add weight even where ammunition is unlimited.
| Weapon profile | Mean damage | No body damage | Non-core part destroyed | Heat cost | Weapon/load weight |
|---|---|---|---|---|---|
| lance+overdrive | 4.69 | 52.7% | 25.7% | 4 | 5 |
| rotary+ap | 4.40 | 31.8% | 17.5% | 3 | 10 |
| cannon+he | 4.01 | 61.3% | 19.2% | 3 | 10 |
| rotary | 4.00 | 31.8% | 16.9% | 3 | 8 |
| autocannon+ap | 3.78 | 27.4% | 12.8% | 2 | 8 |
| missile-rack+he | 3.78 | 37.7% | 16.3% | 2 | 10 |
| cannon | 3.66 | 61.3% | 20.1% | 3 | 8 |
| lance | 3.62 | 52.7% | 20.6% | 2 | 5 |
| flak | 3.51 | 16.8% | 8.0% | 2 | 5 |
| cannon+ap | 3.48 | 61.3% | 19.3% | 3 | 11 |
| flak+ap | 3.30 | 18.3% | 8.1% | 2 | 7 |
| autocannon+flechette | 3.17 | 21.0% | 6.9% | 2 | 7 |
| autocannon | 3.03 | 30.1% | 9.9% | 2 | 6 |
| missile-rack | 2.98 | 37.7% | 12.8% | 2 | 8 |
| rifle+ap | 2.87 | 52.7% | 16.4% | 1 | 6 |
| rotary+flechette | 2.85 | 25.1% | 5.9% | 3 | 9 |
| pulse+overdrive | 2.66 | 35.4% | 9.2% | 3 | 3 |
| missile-rack+incendiary | 2.64 | 37.7% | 10.2% | 2 | 9 |
| rifle | 2.59 | 52.7% | 13.8% | 1 | 4 |
| pulse | 1.04 | 42.7% | 1.3% | 1 | 3 |
Strongest damage profiles. Lance Overdrive leads the standardized stand at 4.69 mean damage, but costs 4 Heat. Standard Rotary is the highest mean-damage standard profile at 4.00, with three shots and 3 Heat. Rotary AP improves its mean to 4.40 for two extra weight. Autocannon AP improves 3.03 to 3.78 for two extra weight. These remain role/cost comparisons, not automatic upgrades for every build.
Most reliable chip damage. Flak produces some body damage in 83.2% of Fires. It retains four shots and +1 Accuracy. Its five-hex printed range is shorter than Rifle, Cannon or Lance. Its fresh-target kill rate is only 0.025% across this mix. It is reliable pressure, not equivalent finishing power.
Cannon's cost/reliability concern. Standard Cannon and Lance average 3.66 and 3.62 damage. Cannon costs 8 weapon weight and 3 Heat; Lance costs 5 weight and 2 Heat, with the same printed range. Cannon's empty-Fire rate is 61.3% versus Lance's 52.7%. Cannon retains a larger base hit and HE option, so this is a weak tradeoff signal, not strict domination. Overdrive makes Lance more dangerous, at higher Heat cost than standard Cannon.
AP traps. Cannon AP averages 3.48 damage, below standard Cannon's 3.66, while adding three weight. Against braced Bastion in hard cover it gains only 3.21 to 3.33. Flak AP is worse at its apparent anti-armor role: against that same target, mean damage falls 3.08 to 2.31, while empty Fires rise 7.9% to 15.1%. Its smaller damage die and rounded glances outweigh penetration here. Flak AP can improve rare kills against lighter targets; it is not worse on every outcome. Rotary flechette trades damage, 4.00 to 2.85, for fewer empty Fires, 31.8% to 25.1%.
Pulse needs a separate success metric. Standard Pulse averages only 1.04 body damage, but adds 1.89 gross Heat. Its no-effect rate is 32.9%, below its 42.7% zero-body-damage rate. Against a warm Bastion in hard cover it triggers stress in 56.0% of attacks and causes 1.77 body damage; Overdrive gives 64.4% stress and 3.26 damage. Against a cold Bastion in hard cover the corresponding damage values are 0.93 and 2.25. Do not erase its Heat role by judging only damage or final remaining Heat after stress resets it.
Where empty attacks come from
Cannon against hard-cover Courier on the standard stand: 90.8% hit nothing, and 93.1% cause no body damage. Against hard-cover Bastion, these are 46.4% and 59.8%. Hard cover can intercept a hit after the hit roll, so the difference is not an armor-only statistic. Bracing Bastion lowers mean Cannon damage from 3.55 to 3.21 without changing its empty-Fire rate. Armor affects severity; misses and cover are the main reliability barrier for this weapon.
Flak against hard-cover Bastion causes no body damage only 7.9% of the time. Against hard-cover Courier that rises to 57.6%. High Evasion plus cover remains a hotspot even for a four-shot accurate weapon.
Matched-damage shot splitting
The experimental Rifle changes 1×2d6 to 2×1d6. Cannon changes 1×3d6 to 3×1d6. Accuracy, penetration, Heat, weight, range and tags stay fixed. The total raw damage distribution is preserved. The existing engine still rolls conditions once per Fire and hit/location/penetration/damage per projectile. This is a test of burst fire in the current engine, not an implementation of another game's complete combat sequence.
Each cell has 20,000 trials. Fresh-target six-cell averages:
| Profile | Mean body damage | No body damage | Non-core part destroyed | Mech killed |
|---|---|---|---|---|
| Rifle 1×2d6 | 2.57 | 52.7% | 13.6% | 0.99% |
| Rifle 2×1d6 | 2.54 | 35.8% | 9.1% | 0.36% |
| Cannon 1×3d6 | 3.66 | 61.3% | 20.0% | 3.76% |
| Cannon 3×1d6 | 3.88 | 32.5% | 15.1% | 1.36% |
Cannon's mean increases about 6%; Rifle's is nearly unchanged. More location rolls spread damage across parts. More penetration/critical opportunities and per-shot rounding mean the same raw budget does not guarantee equal resolved damage.
The finishing tradeoff persists against wounded targets. With the right arm already destroyed and core at half durability, Cannon's kill rate falls 18.7% to 10.9%; Rifle's falls 9.0% to 5.3%. These are fresh independent wounded fixtures, not repeated attacks on one defender.
Splitting also does not solve every accuracy cliff. Against a fresh hard-cover Courier, Cannon still has 81.5% zero-damage Fires after splitting, down from 93.0%. Against a fresh clear Foreman, the same change cuts empty Fires from 44.7% to 9.2%. Target/cover context matters more than the overall average suggests.
Recommended prototype direction: test a two-shot Rifle and a controlled Cannon burst profile while preserving their raw damage budgets. Retain or compare a concentrated single-shot option for part destruction and finishing. Do not simply multiply current full-damage shots. Decide how burst profiles interact with the current single-shot requirement for Aimed Shot before changing live profiles. Track damage, empty actions, part destruction, kills and Heat separately.
Mech configuration hotspots
All outgoing results below use the same six target/cover cells as the weapon table. Every highlighted build uses Sato and therefore competes for one roster pilot slot. Deadeye is off: Sato has no other current catalog pilot sharing Ninesuns or Marksman. His Gunnery 3 still applies. Ruko and Marrow do share Hollow and can activate each other; this is not a claim that all pilot abilities are unavailable.
Highest observed Quick damage
Light chassis, Targeting head, Sprint legs, bare back, Sato, Conduit right arm holding Lance and empty Precision left arm: weight 26/35, Speed 7, Evasion 13, hull 30. Lance Overdrive gives 5.90 mean damage, 40.5% empty Fires, and 32.7% non-core part destruction, for 4 Heat out of reactor 5.
The same firing profile on every chassis gives the same outgoing result. A larger chassis does not directly increase ranged offense when accuracy and weapon stay equal. Larger bodies buy capacity, durability and Heat headroom. This is why light high-Gunnery Lance configurations are an efficiency hotspot.
The sampled two-Bulwark-arm Light variant weighs 33/35, has hull 40, and keeps Speed 7, Evasion 13 and the same outgoing damage. Bulwark arms here are body parts, not equipped shields. These two builds were not included in the incoming-damage subset, so hull alone does not establish which survives better. The cheapest-arm policy chose Conduit by deterministic ID tie-break; Utility can replace it at the same weight with better body stats. The search is not an exhaustive final build optimizer.
Highest observed Full-action damage
Medium chassis, Targeting head, Sprint legs, reactor booster, Sato, two Bulwark arms holding Lance and Rotary: 50/50 weight, Speed 6, Evasion 11, hull 45, reactor 9. Barrage with Lance Overdrive first and standard Rotary second gives 10.61 mean damage, 11.8% empty actions, and 47.0% non-core part destruction, at 8 Heat. These are Full-action numbers, not comparable one-for-one with a Quick Fire.
The Heavy version uses a bare back and weighs 49/65, Speed 5, hull 49, reactor 8, with identical outgoing results. It reaches its Heat cap from cold. Repeating the action needs Heat management; the result is opening output, not sustainable damage per activation.
The lighter-arm Medium variant weighs 45/50 and retains the same output, but has hull 37. This exposes the protection-versus-weight choice that arm bodies should support.
Highest observed output per weight
The Light/Scout-head/Sprint/bare-back/Sato single-Lance build weighs 24 and averages 5.55 Quick damage (0.231 per weight). It sacrifices a little accuracy and head durability for efficiency. A Light/Targeting-head/Sprint/bare-back/Sato twin-Lance build, with Conduit arms, weighs 32/35 and averages 8.79 Full-action damage (0.275 per weight). Its standard-standard Barrage costs 5 Heat, the entire reactor capacity. These scores do not value support equipment or pilot scarcity.
Stock kit context
| Stock kit | Best screened Quick program | Mean damage | No body damage | Heat |
|---|---|---|---|---|
| Courier | Rifle | 2.33 | 57.1% | 1 |
| Foreman | Autocannon | 3.03 | 30.1% | 2 |
| Reaver | Autocannon | 3.67 | 21.6% | 2 |
| Bastion | Cannon | 4.48 | 52.7% | 3 |
| Lantern | Lance Overdrive | 4.26 | 57.1% | 4 |
| Drayman | Autocannon | 3.03 | 30.1% | 2 |
These programs were nominated for expected body damage, not chosen for status utility or reliability alone. Reaver's melee is excluded from the ranged ranking. Foreman and Drayman can instead Barrage Autocannon plus rack for 5.97 mean damage and 17.3% empty Full actions, costing 5 Heat. Stock Bastion's aimed-core action averages 3.78 damage and 57.8% empty Full actions with the correct aimed penalty. Aiming concentrates damage; lower total damage alone does not establish that it is a bad finishing action.
Defense and slow-heavy assembly
The defensive subset receives the same six incoming profiles—Rifle, Autocannon, Cannon, Lance, Pulse and Pulse Overdrive—in clear and hard cover. Twelve cells per body, weighted equally. These are unbraced, cold, independent attacks. Lower received damage is better; fresh kill risk and body capacity also matter.
| Body | Weight | Speed | Evasion | Hull | Mean incoming damage | Non-core part destroyed |
|---|---|---|---|---|---|---|
| Courier | 33 | 6 | 15 | 32 | 1.76 | 11.1% |
| Lantern | 42 | 4 | 11 | 38 | 2.83 | 17.0% |
| Reaver | 48 | 4 | 11 | 40 | 2.85 | 16.4% |
| Foreman | 48 | 4 | 10 | 41 | 3.06 | 15.9% |
| Foreman with Impact right arm | 48 | 4 | 10 | 42 | 2.99 | 14.7% |
| Bastion with Workhorse chassis | 61 | 3 | 7 | 53 | 3.26 | 9.7% |
| Bastion with Light legs | 55 | 4 | 8 | 50 | 3.35 | 13.8% |
| Bastion | 62 | 2 | 6 | 54 | 3.47 | 10.4% |
| Drayman | 52 | 4 | 7 | 47 | 3.80 | 19.2% |
Courier avoids the most damage in this subset but has a 3.2% fresh kill rate, versus less than 0.1% for each heavy body in this incoming mix. Avoidance and resistance to immediate death are different strengths. Repeated survival is unmeasured.
Bastion's poor speed is not mandatory for its weapon/shield loadout. Light legs fit legally and double Speed 2 to 4, but reduce hull and increase non-core destruction risk. Workhorse gains one Speed and one Evasion, loses one hull and reactor capacity, and receives about 6% less average damage in this subset. It has the same Core Armor 7. These are concrete assembly tradeoffs worth testing before a global heavy movement rule change. Higher Speed also reduces travel time in principle; this audit does not simulate routes or engagement rounds.
Arm parts with no meaningful tradeoff
With independently selected held weapons, legacy default equipment is not a balancing benefit. These exact printed-stat comparisons hold at equal weight, size and handling:
- Utility over Conduit: weight 3, size 3, handling 0; Capacity 6 vs 5, Armor 5 vs 4, durability 6 vs 5.
- Impact over Braced: weight 4, size 4, handling 0; both Capacity 8, but Armor 6 vs 5 and durability 8 vs 7.
- Braced over Field: weight 4, size 4, handling 0; same Armor 5 and durability 7, but Capacity 8 vs 7.
These are stronger evidence of an assembly problem than a small Monte Carlo rank difference. Different manufacturers need a cost, handling or protection tradeoff that survives the separation of arms from weapons. Do not change the numbers until that role decision is made.
Melee opportunity check
This side check rolls the real upfront pools, with Marrow, Targeting head, Sprint legs and the listed legal held loadouts. It does not choose strikes, parries or targeted parts and makes no claim about total melee damage. Across the three stock defenders:
| Loadout | Light offensive opportunities | Medium | Heavy |
|---|---|---|---|
| Twin Spikes | 8.44 | 7.67 | 6.91 |
| Twin Blades | 6.91 | 6.15 | 5.38 |
| Greatblade | 4.11 | 3.42 | 2.74 |
| Blade + Shield | 4.61 | 3.84 | 3.07 |
The shield adds roughly 1.51 defense-only opportunities. These successful dice are shared between offense and defense; they are not guaranteed strikes through a defender. Greatblade's parry cost and damage must be valued separately. This confirms that dual wielding and lighter classes receive larger usable pools. It does not justify a melee damage nerf or a ranged/melee power ranking without human decisions.
Reproduction and handoff
Evidence directory: docs/tuning/evidence/2026-09-09-isolated/. Each JSON records the command, seed range, fixture context, counts and individual rows. configs-builds.json retains complete recipes, search scope and nominations. inputs.json archives catalog inputs and source fingerprints for this measured local version. Seeds 61000–70999 are reused per ordinary cell; split-shot cells use 61000–80999.
pnpm exec tsx cli/isolated-attacks.ts weapons --samples 10000 --seed 61000 --out docs/tuning/evidence/2026-09-09-isolated/weapons.json
pnpm exec tsx cli/isolated-attacks.ts multishot --samples 10000 --seed 61000 --out docs/tuning/evidence/2026-09-09-isolated/multishot.json
pnpm exec tsx cli/isolated-attacks.ts configs --samples 10000 --seed 61000 --out docs/tuning/evidence/2026-09-09-isolated/configs.json
pnpm exec tsx cli/isolated-attacks.ts defense --samples 10000 --seed 61000 --out docs/tuning/evidence/2026-09-09-isolated/defense.json
pnpm exec tsx cli/isolated-attacks.ts melee --samples 10000 --seed 61000 --out docs/tuning/evidence/2026-09-09-isolated/melee.json
pnpm test
pnpm typecheck
pnpm site:data
pnpm site:build
These commands use the current repository catalog and engine. Future tuning will change the outputs. The evidence captures this local prototype version; do not overwrite it when comparing a new profile. Use a new dated evidence directory.
Validation: 387 tests across 51 files passed, including fixture reset, deterministic sampling, Heat damage accounting, raw-budget split-fire behavior, no unearned Deadeye, and legal build generation. Typechecking and the packet production build passed. Final independent review checked the configuration recipes, all headline tables and scope, with no remaining blockers. The evidence review checked all 474 weapon/multishot/defense rows against their histograms and reran one armor-sensitive cell exactly. Review corrections removed an unearned Deadeye bonus, renamed weapon-bearing-part destruction, and made the cold-start Heat restriction explicit.
Decisions and follow-ups: TASK-071 remains the reliability decision. TASK-075 records this audit; TASK-076 tracks arm roles; TASK-077 tracks unavailable pilot synergy; TASK-078 tracks weak AP loads. Register T38–T42 records the new evidence. Keep bot/map issues TASK-073/TASK-074 separate from these isolated findings. No deployment or live tuning is part of this audit.
Full-game attrition diagnostics — 2026-09-09
Full-game attrition diagnostics — 2026-09-09
First deaths usually arrive in rounds 2–3, but wipes and surviving-team shapes vary sharply by map. Flat ends in a wipe in 73.9% of sampled games; Foundry does so in 27.2%. The side with the first credited kill wins about 78–81% of decisive primary games. Falling to 2v3 is consequential but recoverable: the disadvantaged side wins about 19–22% of observed cases that persist into a later activation.
These are complete bot-controlled matches using the retained burst prototype catalog. They include movement, retaliation, Heat, terrain, objectives, and the game's ending rules. They describe this bot/map/roster setup; they do not establish human balance, causal first-kill advantage, or an optimal strategy. Causeway's mirror asymmetry and the known Foundry bot routing issue specifically prevent clean roster-balance verdicts. No game values were changed for this analysis.

For the separate no-bot experiment with passive defenders, see controlled attrition distributions. Its scheduled firing slots are not comparable to the scoring rounds below.
Controls and sample accounting
The two mixed rosters are Courier / Foreman / Reaver (“light”) and Bastion / Foreman / Courier (“heavy”). Those labels identify fixed rosters, not uniform chassis classes. Scenarios use standard map deployment, legal individual builds, team weight limits, unique pilots within each team, and normal objective/round-cap rules. Each mixed case runs both roster orientations, carrying each roster's aggression setting with it when sides swap.
There are 15,200 match executions, retained in 12 JSON files:
| Stage | Per map | Four-map executions | Seeds | Purpose |
|---|---|---|---|---|
| Grid | 9 policy cells × 100 seeds × 2 orientations = 1,800 | 7,200 | 150000–150099 | Screen aggression 0.5 / 0.75 / 1 for each roster |
| Primary | 500 seeds × 2 orientations = 1,000 | 4,000 | 160000–160499 | Detailed fixed-policy distributions |
| Mirror | 2 identical-roster matchups × 500 seeds = 1,000 | 4,000 | 170000–170499 | Check raw Side A outcomes with equal rosters/policies |
Seeds are reused across orientations, cells, maps, and the two mirror compositions. These executions are therefore paired or correlated, not 15,200 independent trials. A primary map has 500 paired seeds, not 1,000 independent seed draws. Mirrors run each composition once per seed; swapping identical sides is not counted as a second execution.
| Map | Primary light / heavy aggression | Grid interpretation | Primary light-roster wins |
|---|---|---|---|
| Flat | 1 / 0.5 | Sampled pure cell in this restricted grid | 55.4% |
| Quarry | 0.75 / 0.75 | No pure cell found; fixed diagnostic policy | 56.4% |
| Foundry | 0.75 / 0.75 | Sampled pure cell in this restricted grid | 32.3% |
| Causeway | 1 / 0.5 | Sampled pure cell in this restricted grid | 60.8% |
A “pure cell” is a result of the finite sampled aggression grid, not an established game-theoretic equilibrium. Quarry has none in this screen. The fresh primary seeds reduce reuse of the screening sample, but do not expand the bot's strategy space or remove map artifacts. Primary tables below always use these map-specific policies; they do not pool the grid and mirrors into one headline rate.
Aggression choices materially change the observed wipe rate even before switching maps. Each screening cell has 200 executions from 100 paired seeds; these extrema describe nine tested cells, not a confidence interval or the full range of possible strategies.
| Map | Wipe-rate range across the nine grid cells |
|---|---|
| Flat | 50%–93% |
| Quarry | 36.5%–86% |
| Foundry | 15%–47.5% |
| Causeway | 31.5%–89.5% |
First-death round distribution
Percentages use all 1,000 primary games per map. These are disjoint bins, not cumulative death probabilities. Every primary game contains at least one death and at least one opponent-credited kill. There are no unknown-time deaths or first deaths after round 6 in these primary samples.
| Map | Round 1 | Round 2 | Round 3 | Round 4 | Round 5 | Round 6 | No death |
|---|---|---|---|---|---|---|---|
| Flat | 27.4% | 58.6% | 12.0% | 1.7% | 0.3% | 0.0% | 0.0% |
| Quarry | 8.3% | 59.8% | 26.9% | 4.9% | 0.1% | 0.0% | 0.0% |
| Foundry | 0.0% | 28.5% | 42.8% | 22.5% | 5.4% | 0.8% | 0.0% |
| Causeway | 0.0% | 30.2% | 53.5% | 14.9% | 1.3% | 0.1% | 0.0% |
Flat has its first death by round 2 in 86.0% of games; Quarry in 68.1%. Foundry and Causeway have no round-1 death in this sample, and their round-2 totals are 28.5% and 30.2%. By round 3, 71.3% of Foundry and 83.7% of Causeway games have a death. This is evidence of different engagement pacing, not proof that terrain alone causes the difference: policies, paths, targeting, and bot behavior also differ.
Before the first death, a non-core part has already been destroyed in 79.8% of Flat, 85.9% of Quarry, 81.0% of Foundry, and 85.6% of Causeway games. These are event-order comparisons across the whole match, not necessarily an earlier part loss on the eventual first victim. They show that most games do enter a damaged-part state before losing a mech.
Wipes, round-cap endings, and remaining units
A wipe means the engine ends the game because at least one side has no living mechs. Flat includes one mutual wipe, ending 0v0 in a draw. It counts as a wipe, but has no winning side. Round-cap endings and wipes partition the sample; “draw” is an outcome that can overlap either category. All retained primary games end by round 7.
| Map | Wipe ending | Round-cap ending | Draws | Wipe by round 5 | Wipe by round 6 |
|---|---|---|---|---|---|
| Flat | 73.9% | 26.1% | 1/1000 | 27.7% | 50.9% |
| Quarry | 55.2% | 44.8% | 0/1000 | 15.4% | 34.2% |
| Foundry | 27.2% | 72.8% | 0/1000 | 3.0% | 11.7% |
| Causeway | 53.1% | 46.9% | 0/1000 | 13.3% | 31.6% |
Final survivor shapes below merge A/B orientation: “3v1” means one side has three living mechs and the other one, whichever side wins on points. Percentages use all games, and each row totals 100%.
| Map | 3v0 | 2v0 | 1v0 | 3v2 | 3v1 | 2v2 | 2v1 | 1v1 | 0v0 |
|---|---|---|---|---|---|---|---|---|---|
| Flat | 25.3% | 37.7% | 10.8% | 0.0% | 0.6% | 1.0% | 12.6% | 11.9% | 0.1% |
| Quarry | 19.4% | 30.0% | 5.8% | 0.1% | 2.3% | 1.7% | 20.5% | 20.2% | 0.0% |
| Foundry | 21.1% | 5.9% | 0.2% | 0.2% | 14.2% | 5.5% | 43.7% | 9.2% | 0.0% |
| Causeway | 21.1% | 26.4% | 5.6% | 0.2% | 2.3% | 2.4% | 27.0% | 15.0% | 0.0% |
Foundry often stops with both sides still fielding units: 43.7% end 2v1 and 14.2% end 3v1. Its relatively rare wipes are particularly uneven in unit counts:
| Map | Decisive wipes | Winner has 3 survivors | 2 survivors | 1 survivor |
|---|---|---|---|---|
| Flat | 738 | 34.3% | 51.1% | 14.6% |
| Quarry | 552 | 35.1% | 54.3% | 10.5% |
| Foundry | 272 | 77.6% | 21.7% | 0.7% |
| Causeway | 531 | 39.7% | 49.7% | 10.5% |
A 3v0 finish is not necessarily an undamaged team. It counts living mechs, not remaining armor, parts, weapons, or Heat. On Foundry, 77.6% of decisive wipes leave all three winners alive, but the wiped side still records about 20.3 direct-and-critical durability loss dealt on average. That shot-based damage field excludes later on-hit Heat stress and is distinct from engine damage counters that can include overkill. The result warrants examining one-sided engagement and routing before increasing lethality globally.
First-kill association and 2v3 comebacks
The first-kill column includes only decisive games with an opponent-credited kill. It uses the first credited kill even if an earlier uncredited death occurred, and excludes draws. A death caused by enemy-inflicted Heat may still be credited to that enemy. The comeback column asks whether the side that falls to 2v3 later wins, regardless of how the first death was credited.
“Actionable 2v3” here has a precise, limited meaning: the imbalance lasts until any later activation starts. That may be the opponent's activation; it does not guarantee the disadvantaged team receives an activation of its own while still 2v3. This filter removes an imbalance that disappears within the same interrupted attack/action. It is not a claim that a useful response was available.
| Map | First credited kill's side wins | Raw 2v3 comebacks | Comebacks after actionable 2v3 |
|---|---|---|---|
| Flat | 812/999 (81.3%) | 187/1000 (18.7%) | 187/1000 (18.7%) |
| Quarry | 782/1000 (78.2%) | 220/1000 (22.0%) | 220/1000 (22.0%) |
| Foundry | 784/1000 (78.4%) | 216/1000 (21.6%) | 215/999 (21.5%) |
| Causeway | 797/1000 (79.7%) | 203/1000 (20.3%) | 203/1000 (20.3%) |
Foundry has one transient 2v3 case excluded by the later-activation filter; its 216/1000 raw comebacks become 215/999 actionable comebacks. Flat's mutual-wipe draw remains a non-win in the comeback denominator, while the first-kill winner association excludes it. These columns therefore need not be exact complements.
The association is strong enough to track in human tests, but it does not measure a causal first-kill bonus. The position and decisions that produce the kill can also produce the win; kill points, objective control, remaining weapons, and bot targeting contribute. The comeback results show that the first loss is not an automatic defeat under these policies.
First victims: prior attacks, causes, and kits
Every primary first victim had started at least one own activation. Some still died before making a proactive attack:
| Map | First victim had no proactive attack | First victim had no own activation | First death attributed to Heat | First death attributed to attack |
|---|---|---|---|---|
| Flat | 304/1000 (30.4%) | 0/1000 (0.0%) | 5.2% | 94.8% |
| Quarry | 157/1000 (15.7%) | 0/1000 (0.0%) | 7.1% | 92.9% |
| Foundry | 17/1000 (1.7%) | 0/1000 (0.0%) | 7.7% | 92.3% |
| Causeway | 30/1000 (3.0%) | 0/1000 (0.0%) | 4.2% | 95.8% |
Proactive means Fire, melee initiation, or a non-break grapple/throw during the victim's own activation. It excludes reactions, defensive melee strikes, and support actions. “No proactive attack” therefore does not mean the mech had no turn, did nothing, dealt no damage, or never helped its team. The table concerns the first victim only, not every destroyed mech. Flat's 30.4% is a concrete opening-play flow concern to inspect in replays and human tests.
The Heat column describes the immediate inferred death cause, not necessarily self-inflicted overheating. Enemy on-hit Heat and critical stress can cause those deaths. No other first-death causes appear in this primary sample.
| Map | Courier first victims | Foreman | Reaver | Bastion |
|---|---|---|---|---|
| Flat | 900 (90.0%) | 6 (0.6%) | 53 (5.3%) | 41 (4.1%) |
| Quarry | 714 (71.4%) | 141 (14.1%) | 145 (14.5%) | 0 (0.0%) |
| Foundry | 837 (83.7%) | 159 (15.9%) | 4 (0.4%) | 0 (0.0%) |
| Causeway | 551 (55.1%) | 195 (19.5%) | 253 (25.3%) | 1 (0.1%) |
Courier is fielded twice among the six units in each mixed game, as is Foreman; Reaver and Bastion each appear once. These are shares of first-victim events, not per-copy death risk or isolated durability rankings. Deployment, exposure, role, targeting, and bot choices differ. Courier's concentration among first victims, especially Flat's 90.0%, is a reason to inspect how it is committed to the fight. Bastion's rarity as a first victim cannot be attributed to armor alone.
Checks that block a balance verdict
Identical-roster mirrors use aggression 0.75 on both sides and 500 seeds per composition/map. The values below are raw Side A win rates; draws, if any, remain non-wins in the denominator.
| Map | Light-roster mirror: Side A wins | Heavy-roster mirror: Side A wins |
|---|---|---|
| Flat | 54.0% | 47.4% |
| Quarry | 48.0% | 52.4% |
| Foundry | 46.2% | 50.4% |
| Causeway | 56.2% | 79.8% |
Causeway's heavy mirror gives Side A 79.8% wins with identical rosters and policies. This reproduces a strong side-associated problem with the current catalog; it blocks interpreting mixed-roster outcomes as clean balance measurements. It does not identify whether geometry, deployment, turn order, targeting tie-breaks, or their interaction is responsible. Other mirrors being closer to 50% does not establish perfect symmetry.
Foundry has a known bot routing/inactivity problem. The earlier balance audit retained a Reaver oscillation/unused-Overwatch trace. That older catalog's frequency should not be reused as a current rate, but the unresolved behavior limits interpretation here. Foundry's many round-cap games and uneven wipes merit replay inspection before changing armor, damage, or melee strength.
The useful next measurements are whether human Courier pilots can contribute before becoming the first casualty; whether damaged weapons materially change objective decisions; and whether a team at 2v3 has meaningful choices before the next loss. First-death timing, surviving counts, actual later activations, and the final outcome should be retained together. Do not pool unfinished human sessions into completed-game win rates.
Reproduction and retained evidence
All 12 evidence files retain per-game analyzed rows, seed ranges, complete catalog inputs, rules, policies, and summary definitions under docs/tuning/evidence/2026-09-09-game-attrition/. The corresponding Quarry, Foundry, and Causeway files and all grid/mirror files share that directory. Source tools are cli/attrition-batch.ts, cli/game-attrition.ts, and cli/plot-attrition.py.
The source-manifest.json in that evidence directory records SHA256 fingerprints for the engine, catalog, analyzers, runner, observation code, and lockfile. Grid rows predate the additional score/zone/hull output fields; their recorded attrition measurements are unchanged.
The commands below reproduce the recorded settings into a fresh directory. The batch tool reads the checked-out engine and live catalog; matching historical numbers requires this same implementation and the catalog embedded in the retained JSON. Later tuning can intentionally change results. These commands are instructions, not additional runs included in the 15,200 count.
attrition_output=/tmp/mecha-game-attrition-rerun
mkdir -p "$attrition_output"
for map in flat quarry foundry causeway; do
pnpm exec tsx cli/attrition-batch.ts --mode grid --map "$map" \
--games 100 --seed 150000 \
--out "$attrition_output/grid-$map.json"
done
for map in flat quarry foundry causeway; do
case "$map" in
flat|causeway) light_aggression=1; heavy_aggression=0.5 ;;
quarry|foundry) light_aggression=0.75; heavy_aggression=0.75 ;;
esac
pnpm exec tsx cli/attrition-batch.ts --mode primary --map "$map" \
--games 500 --seed 160000 \
--aggression-a "$light_aggression" --aggression-b "$heavy_aggression" \
--out "$attrition_output/primary-$map.json"
done
for map in flat quarry foundry causeway; do
pnpm exec tsx cli/attrition-batch.ts --mode mirror --map "$map" \
--games 500 --seed 170000 --aggression-a 0.75 --aggression-b 0.75 \
--out "$attrition_output/mirror-$map.json"
done
To rebuild the PNG/SVG charts from the retained repository evidence, using Matplotlib:
python3 -m venv /tmp/mecha-attrition-plot-venv
/tmp/mecha-attrition-plot-venv/bin/python -m pip install matplotlib
/tmp/mecha-attrition-plot-venv/bin/python cli/plot-attrition.py
The plotting script reads the retained paths and writes both controlled and full-game figures under docs/images/; it does not run simulations. Table percentages are rounded. The report preserves denominators where draws, transient states, or no-credit outcomes change eligibility. Paired-seed uncertainty and bot artifacts matter more than small differences between displayed percentages.
Enraged paired experiment — 9 September 2026
Enraged paired experiment — 9 September 2026
Current decision — 2026-09-09: After these comparisons, the owner selected permanent offensive Enraged for new games. The findings and default-status statements below describe the experiment when it ran; its evidence is unchanged. Existing saves retain their recorded duration. Defensive rerolls remain an optional experiment. See current rule E9 and TASK-089.
Enraged increased immediate retaliation and total attrition, but did not consistently improve the eventual winning chance of the side that lost the first mech. The clearest primary comeback improvement was on Foundry. Quarry produced substantially more retaliatory kills and wipes with almost no change in comeback wins. These results support testing the accepted rule with people; they do not justify automatically increasing its strength.
Controlled comparison
ON enables the accepted E9 rule: an opponent-caused ally death queues Enraged on surviving teammates for their next own activation, granting +2 ordinary movement budget and one shared reroll of the first failed eligible attack die. The replacement stands. It applies to proactive ranged attacks or initiating melee attack dice, excludes shields and defensive/reaction attacks, does not stack, and expires at activation end. Movement does not alter Speed, Boost or Charge.
OFF disables only rules.enraged in the same frozen current engine, catalog and bot policies. Both conditions include the destroyed-Legs Jump legality fix. OFF uses new matched seeds and is not the older attrition report's engine baseline. No weapon, part or Enraged strength values changed during these experiments.
The experiment completed 30,400 full bot games: 15,200 ON/OFF pairs across 48 map/policy cells. The separate smoke check added 40 games. Every retained full-game pair matched through its first death, or game end when no death occurred: zero prefix mismatches, zero unknown prefixes, and no pre-first-death Enraged rerolls. Combat values remain in the prefix comparison; only Enraged lifecycle/state metadata is excluded. All tracked simulation-source hashes remained unchanged during the 251-second batch.
| Batch | Per map and setting | All four maps, ON + OFF | Seeds |
|---|---|---|---|
| Primary | 500 seeds × both roster orientations | 8,000 games | 190000–190499 |
| Aggression grid | 9 cells × 100 seeds × both orientations | 14,400 games | 180000–180099 |
| Identical-roster mirrors | 2 compositions × 500 seeds | 8,000 games | 200000–200499 |
Mixed rosters were Courier/Foreman/Reaver versus Bastion/Foreman/Courier. Primary light/heavy aggression was 1/0.5 on Flat and Causeway, and 0.75/0.75 on Quarry and Foundry. Swapping sides carried each roster's policy with it. Grid cells used every pair from 0.5, 0.75 and 1. Mirrors used identical policies on both sides: 1 on Flat/Causeway and 0.75 on Quarry/Foundry. Mirrors were not duplicated by swapping identical rosters.
Primary outcomes
Each primary row uses 1,000 matched games per setting, grouped into 500 seed clusters. Brackets are 95% paired percentile bootstrap intervals for ON minus OFF, in percentage points, from 2,000 resamples of whole seed clusters. Both orientations stay together. These are separate exploratory cell estimates, not a pooled result or simultaneous confidence guarantee.
| Map | Retaliation before next own loss | First-loss side wins | Game ends in wipe |
|---|---|---|---|
| Flat | 62.3% → 63.9%; +1.6 [-1.9, +5.0] | 20.5% → 17.5%; -3.0 [-6.1, +0.2] | 69.9% → 72.6%; +2.7 [-1.1, +6.5] |
| Quarry | 66.4% → 78.4%; +12.0 [+8.6, +15.4] | 26.9% → 26.8%; -0.1 [-3.9, +3.7] | 52.7% → 66.7%; +14.0 [+10.2, +17.7] |
| Foundry | 51.4% → 56.8%; +5.4 [+1.9, +9.0] | 21.5% → 26.0%; +4.5 [+1.5, +7.2] | 24.6% → 31.5%; +6.9 [+3.6, +10.0] |
| Causeway | 60.5% → 64.9%; +4.4 [+0.9, +7.5] | 22.9% → 22.4%; -0.5 [-3.9, +2.8] | 55.4% → 56.3%; +0.9 [-2.8, +4.6] |

“Retaliation” means the side suffering the first death earns the next credited opposing kill before suffering another death. The first-loss side is fixed from the shared first death, including rare uncredited Heat losses. A game ending before either competing event counts as no observed retaliation, not proof it could never retaliate. Unresolved OFF/ON cases were Flat 0/0, Quarry 0/0, Foundry 7/1 and Causeway 2/1; none had unknown ordering.
The first-kill/winner association below uses only a shared opponent-credited first death and games decisive under both settings. It excludes an uncredited Heat first death even if a credited kill happens later, preventing the first-kill cohort from changing after treatment. All primary games were decisive; excluded pairs were uncredited first deaths, not draws. The association itself does not establish that getting the first kill causes victory.
| Map | Common decisive pairs | Excluded uncredited first deaths | First-kill side wins | Change, pp [95% interval] |
|---|---|---|---|---|
| Flat | 999/1,000 | 1 | 79.5% → 82.5% | +3.0 [-0.3, +6.4] |
| Quarry | 1000/1,000 | 0 | 73.1% → 73.2% | +0.1 [-3.7, +3.8] |
| Foundry | 996/1,000 | 4 | 78.5% → 74.0% | -4.5 [-7.4, -1.5] |
| Causeway | 999/1,000 | 1 | 77.2% → 77.7% | +0.5 [-2.8, +3.9] |
Mean final deaths increased on every primary map: Flat 3.70→3.88, Quarry 3.601→3.855, Foundry 2.93→3.10 and Causeway 3.52→3.61. Mean game length was nearly unchanged except Quarry, which fell from 6.45 to 6.20 rounds (paired change −0.25, interval −0.32 to −0.18).
First-to-second-death activation gaps were Flat 7.140→6.965, Quarry 5.698→4.724, Foundry 7.199→5.895 and Causeway 5.724→5.294. These conditional means require a timed second death in both runs: denominators 1,000, 1,000, 992 and 998 respectively. They describe selected observed pairs; they are not uncensored causal time-to-event estimates.
Did teammates actually receive and use it?
Each primary setting had 2,000 original survivors of the first death. The counts below follow those specific teammates into their next activation, rather than counting later replacement opportunities. An uncredited first death grants nothing. A granted teammate can die or the game can finish before its turn; an Enraged activation need not have a failed eligible attack to reroll.
| Map | Granted from first death | Starts next activation | That activation is Enraged | Uses reroll in that activation |
|---|---|---|---|---|
| Flat | 1998 | 1995 | 1993 | 1241 |
| Quarry | 2000 | 1968 | 1968 | 1089 |
| Foundry | 1992 | 1978 | 1971 | 1078 |
| Causeway | 1998 | 1968 | 1966 | 1156 |
OFF had zero Enraged lifecycle events or rerolls. Ranged rerolls are counted once from the aggregate Fire event, excluding duplicate projectile log entries; melee rerolls come from the upfront pool. This experiment evaluates the combined movement-and-reroll rule. It does not isolate how much of the game-level change came from movement.
Policy and board sensitivity
The nine-cell aggression grid reinforces that comeback effects depend on policy. Ranges below are ON-minus-OFF point estimates in percentage points across those nine cells; they are sensitivity ranges, not confidence intervals.
| Map | First-loss side wins | Retaliation | Wipes |
|---|---|---|---|
| Flat | -6.5 to +10.5 | -5.0 to +20.0 | -1.0 to +7.0 |
| Quarry | -8.0 to +12.5 | +2.5 to +20.0 | +2.0 to +12.0 |
| Foundry | -3.0 to +11.5 | -1.5 to +15.0 | -5.5 to +9.0 |
| Causeway | -2.0 to +2.0 | -7.5 to +7.5 | -6.5 to +15.5 |
Identical-roster mirrors still expose substantial Causeway side bias. Raw Side A wins are shown below; each entry has 500 matched seeds per setting. Other boards also show composition-dependent changes. Enraged should not be treated as a correction for map or bot behavior.
| Map | Courier/Foreman/Reaver mirror; change [95% interval] | Bastion/Foreman/Courier mirror; change [95% interval] |
|---|---|---|
| Flat | 50.8% → 53.8%; +3.0 [-2.6, +8.4] | 49.0% → 48.2%; -0.8 [-4.2, +2.6] |
| Quarry | 50.8% → 55.2%; +4.4 [-1.0, +9.8] | 54.0% → 47.6%; -6.4 [-11.4, -1.4] |
| Foundry | 43.8% → 47.6%; +3.8 [+0.0, +7.6] | 49.0% → 50.6%; +1.6 [-2.6, +5.6] |
| Causeway | 61.2% → 58.2%; -3.0 [-8.2, +2.0] | 81.0% → 84.0%; +3.0 [-0.6, +6.8] |
Causeway's heavy mirror remains strongly favorable to Side A (81%→84%). Foundry's primary comeback improvement must be read alongside the existing objective/pathfinding and round-cap bot artifacts. Grid cells reuse seeds and are exploratory; their estimates are correlated, and searching them for favorable intervals would overstate evidence. Human playtests remain necessary to assess positioning choices, readability and whether the bonus feels earned.
Separate isolated attack check — no bots
A complementary experiment ran 180,000 fresh ordinary Fires, separate from all full-game counts: three stock attackers × three stock targets × clear/hard cover × ON/OFF × 5,000 matched seeds (310000–314999). Both conditions start on the first own activation; only active Enraged/reroll-ready state differs. Range is four; there is no movement, aim, load, Overdrive, Barrage, Lock On, stationary bonus or ally bonus. This tests the single reroll, not the grant lifecycle or the whole E9 rule.
All 18 attacker/target/cover cells had lower no-damage probability and higher mean damage with the reroll. Representative results against Courier are below. These are point estimates; the shared seeds across cells are not independent additional samples.
| Attacker | Cover | No damage | Mean damage | Immediate kill |
|---|---|---|---|---|
| Courier | clear | 32.0% → 18.8% | 2.94 → 4.10 | 1.7% → 2.7% |
| Courier | hard | 70.8% → 59.5% | 1.13 → 1.66 | 0.9% → 1.5% |
| Foreman | clear | 19.8% → 11.5% | 3.81 → 4.99 | 1.2% → 2.0% |
| Foreman | hard | 60.3% → 50.7% | 1.47 → 1.96 | 0.7% → 1.0% |
| Bastion | clear | 13.8% → 6.7% | 5.60 → 7.18 | 7.8% → 11.8% |
| Bastion | hard | 51.2% → 40.9% | 2.42 → 3.21 | 4.1% → 6.2% |
The isolated evidence also retains new non-Core part losses; a part loss can overlap a kill. Successful hits, damage, part loss and kills are separate outcomes. The reroll improves reliability while retaining substantial hard-cover no-damage chances; it does not guarantee retaliation or a comeback.
Reproduction and review
Evidence is under docs/tuning/evidence/2026-09-09-enraged/. The 24 *-off.json / *-on.json full-game files retain every compact analyzed game row, seeds, orientation, score, final outcomes, first-loss/retaliation details, complete catalog and explicit rules. Twelve *-paired.json files retain cohort counts, intervals and prefix checks. Full event streams are not duplicated per row; seeds, scenario controls and pinned source hashes reproduce them.
commands.txt contains every batch/comparison command and the isolated attack command. Use fresh output paths when repeating them; tools refuse to overwrite evidence. The chart script requires Matplotlib. A representative matched primary comparison is:
pnpm exec tsx cli/attrition-batch.ts --mode primary --map flat --games 500 --seed 190000 --aggression-a 1 --aggression-b .5 --enraged off --out /tmp/enraged-flat-off.json
pnpm exec tsx cli/attrition-batch.ts --mode primary --map flat --games 500 --seed 190000 --aggression-a 1 --aggression-b .5 --enraged on --out /tmp/enraged-flat-on.json
pnpm exec tsx cli/enraged-compare.ts --off /tmp/enraged-flat-off.json --on /tmp/enraged-flat-on.json --out /tmp/enraged-flat-paired.json
python3 cli/plot-enraged.py
source-fingerprints.json pins branch, commit and simulation/tool SHA256 values; the separate isolated-source entries were recorded after that complementary run. run-summary.json records 24 successful input runs, 12 successful comparisons and zero changed tracked sources during the full-game batch. The report does not claim that the entire worktree was committed.
Focused attrition, telemetry and pairing tests passed (9 tests), including self-Heat credit, live lifecycle ordering, Fire/projectile deduplication, draw/cohort exclusions and seed-cluster resampling. An independent reviewer recomputed every retained cell's pair/cohort/cluster denominators and point estimates, checked first-death parity, lifecycle counts and six-mech conservation across all 30,400 full games, and found no data defects.
Defensive Enraged comparison — 2026-09-09
Defensive Enraged comparison — 2026-09-09
Current decision — 2026-09-09: After these comparisons, the owner selected permanent offensive Enraged for new games. The findings and default-status statements below describe the experiment when it ran; its evidence is unchanged. Existing saves retain their recorded duration. Defensive rerolls remain an optional experiment. See current rule E9 and TASK-089.
Replacing the permanent offensive reroll with a defensive reroll reduces wipes on all four primary maps. It does not improve comeback wins in this sample. First-loss wins fall clearly on Foundry and Causeway; Flat and Quarry remain uncertain. Proactive shooting actions that cause no body damage become more frequent. This candidate does not meet the combined goals of better recovery and fewer empty attacks.
The live default remains temporary offensive E9. Neither permanent candidate is selected for normal games. This report compares two permanent variants, not defensive Enraged against no bonus or against the live temporary rule.

Candidate contract
Both variants retain +2 ordinary movement on each qualifying own activation, the enemy-caused ally-death trigger, and the delay until the survivor's next own activation. Additional casualties do not stack or refill the current bonus. Both teams can acquire it.
The defensive candidate removes the offensive reroll. Each qualified survivor gets one defensive charge at its own activation start. The charge remains available during enemy turns and refreshes at the next own activation. It automatically forces a replacement of the first successful incoming hit d20, including reaction hits. Original modifiers stay fixed. The replacement stands, even if it still hits or becomes a natural 20.
In interactive melee, defense rerolls an enemy die committed to a strike after declaration and before parry. Failure cancels that spent strike and passes the exchange turn. Success allows the normal parry decision. Shield and parry dice are unchanged. Strike damage cannot consume the defense a second time. This experiment does not reroll penetration or damage.
Use rules.enragedDuration='game' and rules.enragedReroll='defensive' in an explicit scenario. Temporary defensive combinations are rejected. Candidate saves use local-prototype-4-enraged-defense. Existing default-v4 and permanent-offensive histories and future RNG remain unchanged. Ready/spent status, replacement faces, and preview caveats appear in the bench. The simulator spec documents the extra dice draws; the live rulebook remains temporary E9.
Design and limits
Retained 16,000 complete bot-game executions, or 8,000 matched pairs, plus 80 separate smoke executions. Primary: four maps × 500 seeds × two roster orientations × two variants = 8,000 games. Mirrors: four maps × two identical-roster compositions × 500 seeds × two variants = 8,000 games.
Primary seeds are 250000–250499. Light roster: Courier/Foreman/Reaver. Heavy roster: Bastion/Foreman/Courier. Flat and Causeway use aggression 1.0/0.5; Quarry and Foundry use 0.75/0.75. Mirror seeds are 260000–260499 with 0.75 aggression on both sides. Seeds are reused across maps and mirror compositions; the pooled executions are not independent experimental units.
All 8,000 paired first-death prefixes and first-death records match. No reroll occurs before the first death. Thus this bonus cannot change the first-death timing or victim distribution within a pair. Simulation-source hashes remained fixed. Each primary interval resamples 500 whole seed clusters, retaining both orientations together, with 2,000 bootstrap replicates. Intervals are exploratory 95% intervals without multiple-comparison correction.
Policies were held fixed; no new aggression equilibrium was fitted. Causeway side bias (T36) and Foundry bot routing (T37) remain unresolved. These results describe this bot experiment and are not a human balance verdict. A first-kill/winner association does not prove that the first kill caused the win.
Primary results
Every arrow is permanent offensive → permanent defensive. Comeback means the side that lost the first mech eventually wins. Each map has 1,000 matched pairs. Wipe means the game ends by team elimination.
| Map | First-loss wins | Difference, 95% interval (points) | Games ending in wipe | Difference, 95% interval (points) |
|---|---|---|---|---|
| Flat | 23.2% → 22.3% | -0.9 [-3.9, +2.2] | 75.4% → 68.2% | -7.2 [-10.8, -3.6] |
| Quarry | 26.8% → 24.0% | -2.8 [-6.1, +0.1] | 76.6% → 68.6% | -8.0 [-11.4, -4.5] |
| Foundry | 29.7% → 24.9% | -4.8 [-7.7, -2.2] | 41.6% → 29.7% | -11.9 [-15.3, -8.5] |
| Causeway | 27.6% → 20.5% | -7.1 [-10.5, -3.8] | 64.0% → 54.1% | -9.9 [-13.9, -5.8] |
Foundry and Causeway show lower comeback rates with intervals below zero. Flat and Quarry do not establish a change. Wipes decrease by 7.2–11.9 percentage points across the four primary maps. Fewer wipes therefore do not imply that the first casualty became less decisive.
| Map | Retaliation before another own loss | Mean deaths per game | Mean rounds | Mean activation gap to next death |
|---|---|---|---|---|
| Flat | 71.2% → 64.4% | 4.01 → 3.78 | 6.09 → 6.22 | 6.35 → 7.27 |
| Quarry | 81.0% → 76.0% | 4.01 → 3.84 | 6.03 → 6.21 | 4.46 → 5.15 |
| Foundry | 55.9% → 50.9% | 3.26 → 2.97 | 6.78 → 6.85 | 5.91 → 6.64 |
| Causeway | 72.8% → 62.5% | 3.78 → 3.50 | 6.46 → 6.53 | 5.03 → 5.85 |
Retaliation is the observed probability of scoring an enemy kill before another own loss, among the shared first-loss cohort. An unresolved outcome does not count as successful retaliation. The next-death activation gap uses only pairs with an observed next death in both variants. Defensive games lose fewer mechs and delay the next death, but retaliation is less frequent.
Empty shooting actions
These rates count proactive ranged Fire volleys once. They exclude reactions, interactive melee, and duplicated shot log entries. No-body-damage means zero actual direct/critical durability loss and no positive on-hit Heat meltdown damage. It is not a claim that an action caused no status effect. The rate uses total Fires as its denominator; projectile misses use total projectiles. Attack-rate intervals resample whole seed clusters with the actual numerator and denominator totals.
| Map | No-body-damage Fires after first death | Difference, 95% interval (points) | No-hit Fires after first death | Projectile misses after first death | Whole-game no-body-damage Fires |
|---|---|---|---|---|---|
| Flat | 7.4% → 14.5% | +7.0 [+6.4, +7.8] | 6.6% → 13.4% | 21.4% → 34.0% | 12.8% → 17.2% |
| Quarry | 4.6% → 10.4% | +5.8 [+5.2, +6.4] | 4.0% → 9.5% | 17.2% → 29.4% | 12.7% → 15.7% |
| Foundry | 9.2% → 16.6% | +7.4 [+6.6, +8.3] | 8.1% → 15.1% | 28.1% → 40.3% | 18.6% → 22.1% |
| Causeway | 8.3% → 15.5% | +7.2 [+6.5, +8.0] | 7.6% → 14.5% | 23.9% → 36.2% | 14.9% → 18.7% |
After the first death, no-body-damage Fire rates rise by 5.8–7.4 points. This comparison combines removal of the offensive reroll with addition of the defensive reroll. It cannot attribute the full increase solely to forced cancellations. Whole-game rates include the identical pre-first-death portion, which dilutes the observed difference.
How the defense was used
Incoming-hit counts include direct legacy melee reaction hit checks. Interactive melee uses a separate declaration event. Attribution belongs to the protected mech, including uses outside its own activation. No duplicate shot-event counting occurs.
| Map | Mean lifetime uses: offense → defense | Incoming hit rerolls / canceled | Declared melee rerolls / canceled | Defense uses at equal or greater living-unit count |
|---|---|---|---|---|
| Flat | 7.17 → 8.11 | 4605 / 1296 | 3509 / 1474 | 52.2% |
| Quarry | 5.81 → 7.67 | 4837 / 1103 | 2829 / 1027 | 60.6% |
| Foundry | 5.25 → 5.96 | 3716 / 1068 | 2248 / 886 | 39.5% |
| Causeway | 6.68 → 7.19 | 3623 / 1014 | 3564 / 1400 | 54.2% |
The bonus remains useful after numerical parity returns. Living-unit count does not measure health, score, or board control. Natural-20 loss/gain counts are retained in the comparison JSON; a lost natural 20 is not necessarily a prevented critical, because penetration is rolled later.
Raw mirror controls
Each cell has 500 paired games with identical rosters and equal aggression. Values show raw Side A win probability, without swapping or normalization.
| Map | Identical roster | Side A wins: offense → defense | Difference, 95% interval (points) |
|---|---|---|---|
| Flat | courier,foreman,reaver | 49.8% → 53.2% | +3.4 [-2.0, +8.4] |
| Flat | bastion,foreman,courier | 52.0% → 51.2% | -0.8 [-4.4, +2.8] |
| Quarry | courier,foreman,reaver | 61.8% → 61.8% | +0.0 [-5.2, +5.2] |
| Quarry | bastion,foreman,courier | 50.4% → 49.8% | -0.6 [-6.0, +5.0] |
| Foundry | courier,foreman,reaver | 51.8% → 48.2% | -3.6 [-7.4, +0.2] |
| Foundry | bastion,foreman,courier | 55.8% → 53.4% | -2.4 [-6.6, +2.2] |
| Causeway | courier,foreman,reaver | 59.4% → 57.8% | -1.6 [-6.2, +3.6] |
| Causeway | bastion,foreman,courier | 79.4% → 82.0% | +2.6 [-1.4, +6.8] |
Every mirror difference interval includes zero. That does not establish fair starting sides: the heavy Causeway mirror is 79.4% → 82.0% for Side A, and other cells also show asymmetry. The defensive bonus has not fixed map or bot bias.
Recommendation and verification
Keep this version optional. It is a candidate for reducing elimination frequency, but the measured recovery and empty-Fire tradeoffs conflict with the current goals. A future defensive experiment could reduce incoming damage while preserving some damage from a hit. That candidate has not been tested here.
Two separate agents approved engine behavior and UI/replay. The reviewer independently recomputed primary outcomes and shooting rates. The root then checked all 12 retained primary/mirror cells, all paired prefixes, raw outcome/Fire-rate calculations, and current source hashes; see final-audit.json. Final report and mirror auditing were completed by the root after the review agents became unavailable.
Validation: the full 457-test suite passed, then both additional cancellation/session tests passed with the changed engine suites (14/14). Typechecking passed. Four focused desktop/tablet browser checks passed, including real candidate import, between-activation defense, replacement-face display, and restored spent state. TASK-088 and T50 retain this result; TASK-086 remains human follow-up. Work stays local on feature/local-playtest-prototype; no push, merge, or deployment.
Reproduction
Evidence directory: docs/tuning/evidence/2026-09-09-defensive-enraged/. It contains compact per-game inputs, paired outputs, smoke results, commands, source fingerprints, run summary, and final audit. Existing evidence refuses overwrite; choose a fresh output directory to rerun. The complete batch took about 129 seconds. Generate the figure with a Python environment containing matplotlib: python cli/plot-defensive-enraged.py.
Exact commands retained in commands.txt:
pnpm exec tsx cli/attrition-batch.ts --mode primary --map flat --games 500 --seed 250000 --aggression-a 1 --aggression-b .5 --enraged on --enraged-duration game --enraged-reroll offensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-flat-offensive.json
pnpm exec tsx cli/attrition-batch.ts --mode primary --map flat --games 500 --seed 250000 --aggression-a 1 --aggression-b .5 --enraged on --enraged-duration game --enraged-reroll defensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-flat-defensive.json
pnpm exec tsx cli/attrition-batch.ts --mode primary --map quarry --games 500 --seed 250000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll offensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-quarry-offensive.json
pnpm exec tsx cli/attrition-batch.ts --mode primary --map quarry --games 500 --seed 250000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll defensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-quarry-defensive.json
pnpm exec tsx cli/attrition-batch.ts --mode primary --map foundry --games 500 --seed 250000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll offensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-foundry-offensive.json
pnpm exec tsx cli/attrition-batch.ts --mode primary --map foundry --games 500 --seed 250000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll defensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-foundry-defensive.json
pnpm exec tsx cli/attrition-batch.ts --mode primary --map causeway --games 500 --seed 250000 --aggression-a 1 --aggression-b .5 --enraged on --enraged-duration game --enraged-reroll offensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-causeway-offensive.json
pnpm exec tsx cli/attrition-batch.ts --mode primary --map causeway --games 500 --seed 250000 --aggression-a 1 --aggression-b .5 --enraged on --enraged-duration game --enraged-reroll defensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-causeway-defensive.json
pnpm exec tsx cli/attrition-batch.ts --mode mirror --map flat --games 500 --seed 260000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll offensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-flat-offensive.json
pnpm exec tsx cli/attrition-batch.ts --mode mirror --map flat --games 500 --seed 260000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll defensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-flat-defensive.json
pnpm exec tsx cli/attrition-batch.ts --mode mirror --map quarry --games 500 --seed 260000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll offensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-quarry-offensive.json
pnpm exec tsx cli/attrition-batch.ts --mode mirror --map quarry --games 500 --seed 260000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll defensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-quarry-defensive.json
pnpm exec tsx cli/attrition-batch.ts --mode mirror --map foundry --games 500 --seed 260000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll offensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-foundry-offensive.json
pnpm exec tsx cli/attrition-batch.ts --mode mirror --map foundry --games 500 --seed 260000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll defensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-foundry-defensive.json
pnpm exec tsx cli/attrition-batch.ts --mode mirror --map causeway --games 500 --seed 260000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll offensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-causeway-offensive.json
pnpm exec tsx cli/attrition-batch.ts --mode mirror --map causeway --games 500 --seed 260000 --aggression-a .75 --aggression-b .75 --enraged on --enraged-duration game --enraged-reroll defensive --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-causeway-defensive.json
pnpm exec tsx cli/enraged-defense-compare.ts --offensive docs/tuning/evidence/2026-09-09-defensive-enraged/primary-flat-offensive.json --defensive docs/tuning/evidence/2026-09-09-defensive-enraged/primary-flat-defensive.json --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-flat-paired.json
pnpm exec tsx cli/enraged-defense-compare.ts --offensive docs/tuning/evidence/2026-09-09-defensive-enraged/primary-foundry-offensive.json --defensive docs/tuning/evidence/2026-09-09-defensive-enraged/primary-foundry-defensive.json --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-foundry-paired.json
pnpm exec tsx cli/enraged-defense-compare.ts --offensive docs/tuning/evidence/2026-09-09-defensive-enraged/primary-quarry-offensive.json --defensive docs/tuning/evidence/2026-09-09-defensive-enraged/primary-quarry-defensive.json --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-quarry-paired.json
pnpm exec tsx cli/enraged-defense-compare.ts --offensive docs/tuning/evidence/2026-09-09-defensive-enraged/primary-causeway-offensive.json --defensive docs/tuning/evidence/2026-09-09-defensive-enraged/primary-causeway-defensive.json --out docs/tuning/evidence/2026-09-09-defensive-enraged/primary-causeway-paired.json
pnpm exec tsx cli/enraged-defense-compare.ts --offensive docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-flat-offensive.json --defensive docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-flat-defensive.json --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-flat-paired.json
pnpm exec tsx cli/enraged-defense-compare.ts --offensive docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-quarry-offensive.json --defensive docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-quarry-defensive.json --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-quarry-paired.json
pnpm exec tsx cli/enraged-defense-compare.ts --offensive docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-foundry-offensive.json --defensive docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-foundry-defensive.json --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-foundry-paired.json
pnpm exec tsx cli/enraged-defense-compare.ts --offensive docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-causeway-offensive.json --defensive docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-causeway-defensive.json --out docs/tuning/evidence/2026-09-09-defensive-enraged/mirror-causeway-paired.json
Cautious-policy diagnostics — 9 September 2026
Cautious-policy diagnostics — 9 September 2026
The combination remains promising for the six fixed roster families, but there is no eligible finalist for holdout now. Under policies selected from the corrected control, the melee family's expected score falls from 75.3% to 53.5%, and empty proactive Fires decline. However, all three candidate conditions show a Causeway first-activation bias increase above the predeclared five-point margin. Eight shared seeds leave substantial uncertainty, and policy selection itself is unstable in several cells. This is an unresolved stress-test concern, not a failed full-15-pair confirmation or proof that the combination cannot work.
No holdout games, additional condition selection, live tuning or controller changes were performed for this analysis. The fresh seed-600000 holdout remains untouched.
What was measured and locked
All four approved conditions completed 16,000 games each: 64,000 total. Each includes four maps × five melee-involving roster pairings × all 25 aggression combinations [0,.25,.5,.75,1] × eight seeds 500000–500007 × four physical-end/first-side assignments. The actual conditions are safeapproach, safeapproach+meleepoolminus1, safeapproach+accuracy2, and their combination safeapproach+meleepoolminus1+accuracy2.
The reviewed selector learns pure maximin/minimax choices from control only, with its fixed tie preference nearest .75, then lower aggression. Its common selected profile evaluates 640 games per condition: 20 map/pair cells × eight seeds × four assignments. Every candidate uses the same control-selected policies in the primary descriptive comparisons below. This reuses training outcomes; it is not independent confirmation.
The exported locked profile explicitly includes all 60 map/pair cells. Twenty are trained here; the other 40 are labeled untrained .75/.75 fallbacks. Those 40 have no outcomes in this policy stage. A future full comparison would measure that declared mixed profile, not an equilibrium or comprehensive strategy training. A complete six-family spread cannot be estimated from the five-pair panel alone.
Cautious choices are active and consequential
Control selects non-melee aggression 0 in 11 cells, .25 in seven, and .5 in two. Melee aggression is 1 in 14 cells and .75 in six. The wider policy range therefore changes the observed comparison materially: on these same seeds, the control melee payoff is 85.6% at .75/.75, versus 75.3% at the selected profile. The combination is 66.1% at .75/.75 and 53.5% under the common selected profile. Neither uniform pooling over all 25 policies nor the old .75-only result substitutes for the selected-policy estimate.
Holding the melee team's aggression at 1, the following descriptive rows each contain 640 games per condition. Action counts combine both teams; they do not identify which team moved or fired.
| Non-melee aggression | Control melee payoff | Combination melee payoff | Control: hexes moved / Fires per game | Combination: hexes moved / Fires per game |
|---|---|---|---|---|
| 0 | 78.9% | 55.7% | 145.8 / 11.8 | 142.1 / 12.0 |
| .25 | 79.4% | 58.3% | 136.5 / 11.4 | 135.9 / 12.0 |
| .5 | 88.1% | 64.4% | 117.7 / 9.8 | 117.0 / 10.6 |
| .75 | 93.0% | 78.9% | 112.4 / 8.0 | 113.4 / 8.9 |
| 1 | 98.1% | 92.7% | 103.9 / 5.3 | 105.4 / 5.7 |
No game in these slices had both zero proactive Fires and zero melee exchanges. This supports observable cautious counterplay within the available bot action set. It does not establish optimized ranged play: the documented missing enemy Move+Melee threat horizon and legacy action valuation remain.
Selection stability and security gaps
Whole-seed leave-one-out fits remove all four assignments of one seed from every policy cell. Each omitted fit trains on seven seeds/28 games per aggression pair. The selected joint policy remains unchanged in 81.9% of fits averaged across cells; eight of 20 cells retain it in all eight omissions. Two retain it in only three of eight: Quarry mobile versus melee and Foundry mixed versus melee. These are descriptive stability counts, not confidence levels.
| Map | Opposing roster | Opponent / melee aggression | Same joint policy in omitted-seed fits |
|---|---|---|---|
| Flat | Mixed | 0 / 1 | 8/8 |
| Flat | Armored | 0 / 1 | 5/8 |
| Flat | Mobile | 0 / 1 | 8/8 |
| Flat | Gunline | 0 / 1 | 8/8 |
| Flat | Control | 0 / 1 | 8/8 |
| Quarry | Mixed | .25 / 1 | 7/8 |
| Quarry | Armored | 0 / 1 | 8/8 |
| Quarry | Mobile | 0 / 1 | 3/8 |
| Quarry | Gunline | .25 / 1 | 6/8 |
| Quarry | Control | .25 / 1 | 7/8 |
| Foundry | Mixed | 0 / .75 | 3/8 |
| Foundry | Armored | .25 / .75 | 8/8 |
| Foundry | Mobile | .5 / 1 | 7/8 |
| Foundry | Gunline | .25 / .75 | 7/8 |
| Foundry | Control | .25 / 1 | 8/8 |
| Causeway | Mixed | 0 / 1 | 6/8 |
| Causeway | Armored | 0 / .75 | 6/8 |
| Causeway | Mobile | .5 / .75 | 8/8 |
| Causeway | Gunline | 0 / .75 | 6/8 |
| Causeway | Control | .25 / 1 | 4/8 |
Six selected cells have a positive observed pure-response gap. The largest is 25 points for Mobile on Quarry: a different row policy has a 25-point higher observed payoff against the selected opposing policy. The independently secured choices need not be a Nash equilibrium. All 5×5 payoff matrices, both response gaps and every omitted-seed choice are retained.
Retraining the selector separately on each candidate changes 12 of 20 selected policies in each case. Its secondary melee payoffs are 62.2% for pool−1, 65.9% for accuracy2 and 51.8% for the combination. These candidate-adapted results change policy alongside rules and are not the common-policy treatment contrasts used below.
Common-policy outcomes and the holdout blocker
| Condition | Melee expected score | Empty proactive Fires¹ | Death before first proactive attack² | Wipes | Mean rounds |
|---|---|---|---|---|---|
| Corrected control | 75.3% | 13.37% | 15.39% | 67.97% | 6.16 |
| Pool−1 | 66.4% | 13.27% | 15.52% | 58.13% | 6.41 |
| Ranged accuracy +2 | 69.1% | 9.06% | 18.05% | 72.81% | 6.05 |
| Combination | 53.5% | 8.69% | 17.71% | 66.56% | 6.22 |
¹ The primary-compatible Fire statistic equally weights four within-map empty-Fire/Fire ratios. It uses attacks as denominators within maps, unlike game-payoff rates. The separately retained pooled-attack values are 13.32%, 13.20%, 9.01%, 8.66%; those are descriptive and differently weighted. ² Deaths before any recorded proactive attack, divided by all six starting units per game. First attack includes proactive Fire, melee initiation and qualifying grapple actions; this is not death before any activation.
The combination lowers melee payoff by 21.80 points versus control. Pool−1 alone lowers it by 8.91 and accuracy2 by 6.25. On matched cells, the melee-oriented combination interaction is −6.64 points, calculated as combination − pool−1 − accuracy2 + control, with the payoff direction consistently oriented toward the melee family. It is a conditional payoff interaction, not a nonlinear spread comparison or an established synergy. Across eight shared seed clusters its value ranges from −22.5 to +10.0 points.
The central eligibility concern is on Causeway, where first-side expected score changes from .500 to .40625, .39375 and .36875. The corresponding added absolute deviations from 50% are 9.375, 10.625 and 13.125 points; each exceeds the predeclared five-point harm margin. The direction favors the team activating second in this panel. All three conditions show this observed concern, so switching to a single does not supply a clearly acceptable fallback.
A fixed exploratory paired whole-seed bootstrap produced the following descriptive 95% intervals. It used 5,000 replicates with seed509901, sharing each seed weight across all maps, pairs, assignments and conditions. The profile stays fixed during resampling; selection uncertainty is not incorporated. With only eight independent blocks and no multiplicity adjustment, these are not the predeclared 99% held-out acceptance intervals.
| Candidate minus control | Pool−1: point [interval], pp | Accuracy2: point [interval], pp | Combination: point [interval], pp |
|---|---|---|---|
| Equal-map empty Fire rate | −0.11 [−0.63, +0.47] | −4.31 [−5.79, −2.76] | −4.68 [−6.22, −3.20] |
| Early-death rate | +0.13 [−0.10, +0.34] | +2.66 [+1.46, +3.75] | +2.32 [+1.30, +3.28] |
| Worst-map added absolute physical-side bias | +1.88 [0.00, +10.63] | +3.13 [−0.63, +6.88] | +0.63 [−1.25, +5.63] |
| Worst-map added absolute first-side bias | +9.38 [+1.25, +14.38] | +10.63 [+0.63, +15.00] | +13.13 [0.00, +15.00] |
The worst-map statistic is recalculated in every resample; it is not simply the interval for Causeway alone. Its uncertainty does not establish population-level harm, but it also does not rule out the stated margin. Physical-side uncertainty remains unresolved despite smaller point changes. Empty-Fire improvements therefore do not settle overall acceptability.
The decision is no finalist now, while retaining the combination as a promising narrow candidate. No full-six-family spread claim or confirmation failure is inferred from these five pairings. A future holdout would require a credible resolution of this stress concern under a prospectively documented decision, rather than treating the existing holdout as a ceremonial step toward promotion.
Whole melee exchanges expose the play-feel cost
The new observer measures matching completed melee_start→melee_end spans using actual accepted-strike damage events. It does not count each strike as another exchange or use final game hull to reconstruct damage. Both roles below combine whichever family actually initiated or defended; they are not synonymous with melee and ranged rosters.
| Condition | Completed exchanges | Initiator empty | Initiator mean body damage | Defender empty | Defender mean body damage |
|---|---|---|---|---|---|
| Corrected control | 2,023 | 21.4% | 7.87 | 87.5% | 0.77 |
| Pool−1 | 2,349 | 32.3% | 6.15 | 82.8% | 0.87 |
| Accuracy2 | 1,936 | 20.2% | 8.08 | 87.5% | 0.73 |
| Combination | 2,201 | 33.8% | 6.06 | 81.1% | 0.89 |
Every exchange here completed and its empty/non-empty status was observed. Damage totals use actual durability removed, including critical effects, rather than rolled damage or overkill. Counter-strikes, parries, failed upfront opportunities and credited kills remain separately retained. Defender “empty” can include useful parrying; it is not automatically a failed defensive experience.
Pool−1 reduces attacks and parry resources. More exchanges per game and lower damage per initiation accompany a higher chance of an initiation doing no body damage. The combination improves the Fire-only reliability statistic while raising initiator-empty melee exchanges from 21.4% to 33.8%. These attack-weighted mixtures include changed contact timing, wounds and eligible Enraged states; they are not fixed-weapon probabilities or causal isolation of a single die.
The separate fixed-position loadout audit adds a further scope limit: the game study's dual-Blade family does not cover cheaper dual Spikes, which retain two extra opportunities under pool−1. That risk does not automatically disqualify a finite-roster result. It prevents extending such a result to catalog-wide balance, and warrants explicit kit-budget coverage in any later broader claim. The present holdout decision rests on the observed first-side stress concern and uncertain policy selection.
Retained evidence and reproduction
- Full selector diagnostics: exact input hashes/IDs, matrices, selection, leave-one-out fits, conditional contrasts, full policy-cell interactions and candidate-adapted profiles.
- Locked 60-cell control profile.
- Observed action/exchange summaries and reproduction script.
- Conditional uncertainty and eight-seed sufficient statistics and script. Its
zeroFirefield is the explicitly pooled-attack statistic. - Primary-compatible equal-map Fire supplement and script. It reuses the exact same 5,000 bootstrap weights, not additional replicates or simulations; the earlier pooled artifact remains unchanged.
- Approved 64,000-game manifest and execution log.
Exact analysis commands are retained. The scripts read only this completed policy stage and refuse output overwrites. Reproduction requires Python and NumPy. Copy the evidence directory and omit only its derived outputs to regenerate summaries; retain all four raw condition files, the manifest and source records. No holdout file is an input.
Burst-fire prototype and lethality — 2026-09-09
Burst-fire prototype and lethality — 2026-09-09
Implemented for local playtesting. All demo ranged profiles now fire multiple small-die projectiles. Ranged weapon Accuracy rises by 2. Aimed Shot fires the whole volley at the chosen part for a Full action with the normal aiming penalty. Three arm changes remove the four confirmed equal-Size body-stat dominances. Melee still uses its interactive opportunity pool and strike profiles.
The owner authorized this direction after the isolated attack audit. Part and weapon values remain provisional demo content. Work stays on feature/local-playtest-prototype; no deployment or push.
What changed
| Profile | New shots × damage per projectile | Raw mean per Fire |
|---|---|---|
| Rifle | 2 × 1d6 | 7 |
| Rifle AP | 2 × (1d3+1) | 6 |
| Cannon / Cannon AP | 3 × 1d6 | 10.5 |
| Cannon HE | 4 × 1d6 | 14 |
| Lance | 2 × (1d6+1) | 9 |
| Lance Overdrive | 3 × 1d6 | 10.5 |
| Missile rack HE | 4 × 1d6 | 14 |
Existing burst weapons keep their shot counts. Every ranged base, ammunition and Overdrive profile now has at least two shots and one damage die per projectile. All ranged weapons, including the missile rack, gain +2 printed Accuracy; this also carries into their loads and Overdrive. Ranged Accuracy now spans +1 to +3. Pilot stats and melee Accuracy are unchanged.
The raw budgets of standard Rifle, Cannon, Lance and their Overdrive/HE examples above match their previous totals. Rifle AP changes 6.5→6 raw mean because two identical small projectiles need an integer damage profile. Cannon AP changes 9→10.5 raw mean, keeping the normal damage die while its three added weight pay for Pen 6. Flak AP retains standard 1d3+1 damage instead of dropping to 1d3; its two added weight pay for Pen 3. Alternate loads still consume arm/chassis capacity. HE remains limited to two Fires. Heat is paid once per weapon Fire, not once per projectile.
Conduit capacity rises 5→7, Braced capacity 8→10, and Field durability 7→9. Protection, capacity and weight now create explicit choices in the previously dominated pairs. See the body tradeoff audit.
Why not lower damage again?
The candidate screen compared baseline, split-only, split with +1/+2 Accuracy, and split/+2 with additional smaller damage dice. The extra reduction looked attractive in fresh attacks but delayed sustained kills. Splitting already spreads damage across components and reduces immediate finishing. The selected profile keeps the original main-weapon raw budgets and uses accuracy to reduce empty actions. The lower-damage alternative is retained as a separate candidate, not applied. A 2,000-sequence holdout confirms the cost: Courier Rifle against Bastion takes a median 13 clear / 18 hard-cover activations with the extra damage reduction, versus 11 / 15 in the selected version. Distributed clear-terrain fire takes 16 shooter activations to the first kill, versus 12 in the selected version.
This is not a universal damage buff: ordinary burst accuracy improves, concentrated one-hit kills become less common, Heat pressure changes, and aimed volleys create a distinct concentration option. Each outcome is measured separately below.
Fresh attack results
Baseline and current tests each resolve 3,180,000 fresh-state ranged Fire trials, 10,000 per cell, with seed range 110000–119999. These are holdout seeds after the candidate screen at 91000–100999. Both mechs reset for each trial. No bots or full matches are involved.
The following comparison uses seven standard held guns, with an equally weighted three-target mix—stock Courier, Foreman, Bastion—each in clear terrain and hard cover. The shooter is a legal Gunnery-1 standard-head fixture, range four, with no Lock On, high ground, stationarity or allied abilities. These are conditional firing opportunities, not their frequency in a game. All weapons receive the same opportunities; range and Heat costs still matter outside this table.
Across that mix, zero-body-damage Fires fall 41.5%→24.2%, all-projectile misses fall 34.7%→16.4%, and mean body damage rises 3.05→3.72. Fresh kill probability falls 1.19%→0.78%. These averages describe the selected contexts, not a universal power score. Zero body damage also includes cover interception and rounded glances; Pulse can still add useful Heat.
| Standard weapon | Mean damage before → now | Empty Fires before → now | Fresh kill chance before → now |
|---|---|---|---|
| Rifle | 2.56 → 3.02 | 52.8% → 27.9% | 0.95% → 0.53% |
| Cannon | 3.65 → 4.76 | 61.4% → 24.0% | 3.68% → 2.00% |
| Lance | 3.60 → 4.35 | 52.8% → 25.5% | 2.71% → 1.30% |
| Autocannon | 3.02 → 3.66 | 30.7% → 22.2% | 0.19% → 0.30% |
| Rotary | 3.97 → 4.88 | 32.3% → 23.5% | 0.73% → 1.23% |
| Flak | 3.51 → 4.17 | 17.1% → 10.9% | 0.03% → 0.07% |
| Pulse | 1.03 → 1.23 | 43.4% → 35.3% | 0.02% → 0.04% |
The lower miss rate is real, but a high-Evasion mech in hard cover can still avoid an entire volley. Cover and evasive movement remain meaningful. This pass does not guarantee damage on every attack or change the glance rule.
Costs and outcomes for every ranged profile
Same six fresh-target/cover cells. The body-damage column includes actual critical and Heat damage, excludes overkill, and clamps to real lost durability. Part destruction means at least one new non-core part is destroyed. Weapon-bearing-part destruction and Heat/stress are also retained in JSON. Weapon weight excludes its supporting arm; the rack weight includes its back module. Load weight is included. HE is limited and Overdrive is more expensive in Heat.
| Current profile | Weight | Range | Heat | Mean damage | Empty Fires | Part destruction |
|---|---|---|---|---|---|---|
| lance+overdrive | 5 | 8 | 4 | 6.14 | 16.5% | 25.0% |
| flak+ap | 7 | 5 | 2 | 5.90 | 10.9% | 21.4% |
| cannon+ap | 11 | 8 | 3 | 5.54 | 23.6% | 21.8% |
| rotary+ap | 10 | 8 | 3 | 5.36 | 23.5% | 21.8% |
| cannon+he | 10 | 8 | 3 | 5.05 | 18.5% | 19.1% |
| rotary | 8 | 8 | 3 | 4.88 | 23.5% | 20.9% |
| cannon | 8 | 8 | 3 | 4.76 | 24.0% | 19.0% |
| autocannon+ap | 8 | 6 | 2 | 4.56 | 19.7% | 15.9% |
| missile-rack+he | 10 | 10 | 2 | 4.40 | 16.3% | 13.7% |
| lance | 5 | 8 | 2 | 4.35 | 25.5% | 20.5% |
| flak | 5 | 5 | 2 | 4.17 | 10.9% | 10.1% |
| autocannon+flechette | 7 | 6 | 2 | 3.84 | 13.8% | 9.1% |
| autocannon | 6 | 6 | 2 | 3.66 | 22.2% | 12.5% |
| missile-rack | 8 | 10 | 2 | 3.57 | 29.5% | 15.5% |
| rotary+flechette | 9 | 8 | 3 | 3.51 | 17.1% | 8.0% |
| rifle+ap | 6 | 8 | 1 | 3.32 | 25.5% | 11.3% |
| missile-rack+incendiary | 9 | 10 | 2 | 3.18 | 29.5% | 12.7% |
| pulse+overdrive | 3 | 6 | 3 | 3.18 | 27.8% | 11.1% |
| rifle | 4 | 8 | 1 | 3.02 | 27.9% | 11.1% |
| pulse | 3 | 6 | 1 | 1.23 | 35.3% | 1.7% |
Lance Overdrive leads damage, but costs 4 Heat. Flak AP is now a strong short-range anti-armor option: 7 carried weight, Range 5 and Heat 2. Its longer-range competitors retain a meaningful reach advantage. This profile deserves playtest attention because it combines four shots, Accuracy +3 and Pen 3. Normal Pulse's low body damage still needs its separate Heat/stress results; do not rank it only by this table.
Lethality over repeated attacks
The sustained harness preserves target damage, Heat and critical effects between attacks. The shooter also retains Heat and damage. It uses normal activation bookkeeping. It compares a Quick Fire followed by a paid spare-Quick Vent with firing without cooling. Full aimed actions have no spare Quick for Vent. Defenders receive their normal activation bookkeeping but pass: no retaliation, movement, repairs or cooling. Hit bonuses from stationarity, allied abilities, Lock On and high ground are excluded.
Baseline and selected catalogs each run 140,000 sequences: 70 cases × 2,000 seeds, 110000–111999, through 18 scheduled shooter activations. Each row records survival curves, first part loss, first kill, weapon impairment, stress, Heat, and no-kill cases. The additional lower-damage candidate uses the same harness and 140,000 sequences, for 420,000 retained sustained sequences in total. Baseline comparisons use the archived catalog with the current engine; they are not historical engine replays.
Reported kill medians include every trial. A median is absent if fewer than half the targets die by the horizon. Conditional kill timing is stored separately; dead shooters and surviving targets are not silently dropped. A two-thousand-trial probability near 50% has roughly ±2.2 percentage points sampling uncertainty. Contexts reuse seeds; they are not independent pooled samples.
Median scheduled firing activations to kill
Ordinary Fire with paid Vent. A scheduled activation can be lost to impairment; these numbers are not scoring rounds or wall-clock minutes.
| Attacker → target | Clear, before → now | Hard cover, before → now |
|---|---|---|
| Courier Rifle → Courier | 7 → 7 | >18 → 14 |
| Courier Rifle → Foreman | 8 → 8 | 14 → 13 |
| Courier Rifle → Bastion | 10 → 11 | 16 → 15 |
| Foreman Autocannon → Courier | 7 → 5 | >18 → 11 |
| Foreman Autocannon → Foreman | 7 → 6 | 12 → 10 |
| Foreman Autocannon → Bastion | 9 → 8 | 14 → 12 |
| Bastion Cannon → Courier | 4 → 4 | 10 → 7 |
| Bastion Cannon → Foreman | 3 → 4 | 6 → 6 |
| Bastion Cannon → Bastion | 5 → 5 | 7 → 7 |
The change is not uniformly more lethal. Accuracy removes some long miss streaks, while dispersed damage often delays finishing. Stock Bastion's first ordinary Fire kills a clear Foreman 5.4%→1.5%. A non-core part is lost before the first kill in 77.4%→82.3% of those sequences. Against clear Bastion, that part-before-kill rate rises 81.2%→87.4%. This gives more opportunities to play through damage and impairment.
Aimed volleys are the main lethality hotspot
Aimed Shot targets every projectile at the selected part, retains the normal 1[−], costs the Full action, rolls each hit/Pen/damage separately, and spends Heat/ammunition once. Later projectiles transfer to Core if the chosen part is destroyed. Hard cover absorbs aimed Legs shots but cannot intercept shots deliberately aimed at Core. The one shared modifier roll per Fire is unchanged.
Current stock Bastion, aimed Core with no spare Vent:
| Defender | Median aimed Full actions, clear / hard | Ordinary Fire+Vent, clear / hard |
|---|---|---|
| Courier | 3 / 3 | 4 / 7 |
| Foreman | 2 / 3 | 4 / 6 |
| Bastion | 3 / 3 | 5 / 7 |
A clear Foreman dies by the third aimed action in 81.5% of trials; hard cover gives 73.6%. These are passive targets already in range over repeated opportunities. Aimed Fire spends the action budget that could pay for Quick actions such as Boost, Vent or Prepare; it still permits ordinary Walk movement. It still deserves a focused human playtest: it may be the preferred static finishing action, and its core concentration can bypass the enjoyable phase where other parts break first. Sato's Deadeye is not assumed; the current pilot catalog has no legal enabling partner for him.
Heat remains relevant. Against a hard-cover Bastion, ordinary Cannon firing without Vent produces 1.525 shooter stress events per sequence, versus 0.008 with paid Vent. Aimed sequences produce 0.476, partly because they end earlier. Do not assume an expensive action automatically balances itself through Heat when it kills before stress occurs.
How kills can change a three-mech fight
A second script rotates three shooters—Courier, Foreman, Bastion—against the same three passive defenders. It compares always focusing the first living target with distributing each shooter's fire to its assigned target. All shots are already in range. It retains a fixed alternating shoot/pass schedule. It does not optimize movement, react, score zones or play competitively.
| Targeting policy | Median first kill, clear before → now | Median first kill, hard before → now |
|---|---|---|
| Focus fire | 6 → 5 shooter activations | 16 → 10 |
| Distributed fire | 12 → 12 | 18 → 18 |
In clear terrain, focus fire's chance of a kill by the sixth shooter activation rises 59.6%→76.4%. Distributed fire's falls 14.2%→7.5%. At that point current defenders average 2.18 survivors under focus versus 2.92 under distributed fire. In hard cover, distributed fire still produces no kill by activation 18 in 49.5% of trials.
A kill removes a mech's future firing, movement and objective options. In the actual rules, the surviving side gets remaining activations when the other side runs out, and a kill scores points. These are reasons an early 3v2 can matter. The script measures attrition potential, not the causal size of that advantage or the probability of winning. Human games can answer differently because threatened mechs withdraw, retaliate, repair, use cover and contest zones.
Actual session JSON and Markdown exports now include deathImpact: first death with event/round/activation and cause when known, before/after survivor counts, credited kills versus uncredited deaths, and activations started after the first death. Heat deaths and duplicate events are covered. Missing command stamps remain unknown; unfinished sessions have no winner association. A completed first-kill/winner association is descriptive, not causal.
The practical playtest questions are whether focus fire feels rewarding without becoming compulsory, whether the damaged-unit phase lasts long enough, and whether aimed Core fire crowds out targeted arm/leg attacks. Record when the first death happens and the subsequent active-mech counts, not just final damage totals.
Measuring power without pretending one number is enough
Use three layers, with explicit contexts and costs:
- Reject clear stat dominance. The repeatable body audit compares same-slot, same-Size, same-ability components. A part is flagged if it costs no more weight, improves at least one benefit, and loses none. It now finds zero confirmed pairs; all six stock kits remain legal. Different Size and abilities remain context-dependent, not automatically balanced.
- Measure each weapon's outcome distribution. Compare hit/empty-action probability, actual damage, part loss, kills, inflicted Heat/stress, range, carried weight, required capacity, Heat cost, action cost and ammunition limits. Standard shots, AP/HE, Overdrive and aimed fire must remain distinct. Keep clear/cover/light/heavy contexts visible instead of hiding all differences in one average.
- Measure complete builds over time and in playtests. Include time to first part loss/kill, survival curves and censored survivors, useful weapon loss, cooling actions, movement/reach, team weight, pilot scarcity and objectives. Check both opening output and sustainable output. Use actual playtest observations to calibrate the value of those outcomes later.
A single power rating would require agreed weights for range, speed, durability, Heat and utility. The old P/Pwt model has not established those exchange rates. Tuner now labels it uncalibrated and removes its claim to be a balance yardstick. A zero dominance count prevents a known class of bad choices; it does not prove every component or build equally strong. Every offer should have an identifiable benefit and a meaningful cost or vulnerability.
Reproduction and local testing
Start a new local match to use the new demo catalog. Existing saves keep their embedded catalog; restore preserves those older values. Aimed-volley compatibility is an engine rule and also supports older saved profiles. No migration silently rewrites saved weapon statistics.
Evidence: docs/tuning/evidence/2026-09-09-burst-prototype/. Source tools: cli/burst-candidates.ts, cli/burst-screen.ts, cli/isolated-attacks.ts, cli/lethality-audit.ts, cli/catalog-audit.ts. JSON retains per-context results and complete catalog inputs for lethality. The original isolated evidence remains unchanged.
pnpm exec tsx cli/burst-screen.ts --out docs/tuning/evidence/2026-09-09-burst-prototype/screen.json
pnpm exec tsx cli/isolated-attacks.ts weapons --samples 10000 --seed 110000 --catalog docs/tuning/evidence/2026-09-09-isolated/inputs.json --out docs/tuning/evidence/2026-09-09-burst-prototype/weapons-baseline.json
pnpm exec tsx cli/isolated-attacks.ts weapons --samples 10000 --seed 110000 --out docs/tuning/evidence/2026-09-09-burst-prototype/weapons-current.json
pnpm exec tsx cli/lethality-audit.ts --catalog docs/tuning/evidence/2026-09-09-isolated/inputs.json --trials 2000 --seed 110000 --horizon 18 --out docs/tuning/evidence/2026-09-09-burst-prototype/lethality-baseline.json
pnpm exec tsx cli/lethality-audit.ts --trials 2000 --seed 110000 --horizon 18 --out docs/tuning/evidence/2026-09-09-burst-prototype/lethality-current.json
pnpm exec tsx cli/lethality-audit.ts --catalog docs/tuning/evidence/2026-09-09-burst-prototype/lower-candidate-catalog.json --trials 2000 --seed 110000 --horizon 18 --out docs/tuning/evidence/2026-09-09-burst-prototype/lethality-lower-candidate.json
pnpm exec tsx cli/catalog-audit.ts --json docs/tuning/evidence/2026-09-09-body-parts.json
pnpm test
pnpm typecheck
pnpm test:browser
pnpm site:data
pnpm site:build
Use a new evidence directory for later tuning. The candidate screen always clones the archived input; the ordinary attack CLI can load that archive with --catalog. Current-catalog commands intentionally reflect whatever demo data is present when run.
Independent review found no blockers in the lethality harness or whole-volley action changes. It checked persistent Heat, censoring, kill counts, paid Vent, target selection, per-projectile resolution and hard build limits. All 403 tests across 55 files, 34 desktop/tablet browser checks, typechecking and the production packet build pass, including an actual aimed volley through the UI and save/restore. See the session handoff for final counts and follow-up tasks.
Body-part tradeoff audit — 2026-09-09
Body-part tradeoff audit — 2026-09-09
The demo catalog previously contained four confirmed component-stat dominances. Three small arm changes remove them without adding weight, changing any stock kit's parts, or changing a weapon profile. The current audit finds zero confirmed numeric dominances and all six stock kits pass individual hard limits.
Repeatable comparison
Run pnpm exec tsx cli/catalog-audit.ts --json docs/tuning/evidence/2026-09-09-body-parts.json. The command prints the current catalog's cost/benefit vectors, reports dominated pairs and validates stock kits. It exits unsuccessfully when either a confirmed dominance or an illegal stock kit is found. The machine-readable snapshot at docs/tuning/evidence/2026-09-09-body-parts.json records the comparisons and conditional armor outcomes. Run pnpm exec vitest run cli/catalog-audit.test.ts for the detector's before/after regression checks.
A confirmed pair must share the same body slot, Size and categorical behavior. The better part must cost no more weight, be no worse on every measured numeric benefit, and improve at least one. Benefits include armor, durability, carrying capacity, handling, chassis cap, mobility, Evasion, Sensors, E-Def, reactor and head Accuracy as applicable. Legacy defaultEquipment is a boxed suggestion, not an arm-body benefit. Manufacturer identity currently has no independent body-stat bonus.
Size is deliberately not scored as universally smaller-is-better: hit allocation can expose a fragile limb or divert hits away from the Core. Different chassis classes, Jump rules, mounted weapons, smoke and free Lock On remain context-dependent comparisons. Numeric dominance is a catalog-stat defect check, not proof that one part wins every combat situation. A zero count does not establish equal power.
The report additionally gives Pen 0/2/4/6 probabilities of glance/full/critical outcomes against each part's armor, conditional on an ordinary connected hit. It respects automatic full penetration on a natural six and the current critical margin. Those probabilities exclude natural-20 hit bonuses, statuses, damage rounding, critical effects, overflow and location allocation. Durability/weight is included as a descriptive ratio; it is not a universal power rating.
Changes and the choices they create
| Body part | Change | Resulting tradeoff |
|---|---|---|
Conduit arm (pulse-arm) |
Capacity 5 → 7 | Carries more than Utility at the same weight, while Utility retains one extra Armor and durability. Conduit remains fragile. |
Braced arm (autocannon-arm) |
Capacity 8 → 10 | Carries heavier weapon/load combinations than Impact, while Impact retains one extra Armor and durability. Siege still buys capacity 11 for one extra weight. |
Field arm (flak-arm) |
Durability 7 → 9 | Carries less than Braced or Impact, but has more durability; Impact retains higher Armor. |
Before tuning: Utility dominated Conduit; Braced dominated Field; Impact dominated both Braced and Field. Tests reconstruct those exact earlier values and require the detector to find all four. They then require explicit advantages on both sides of each changed pair in the live catalog.
All other body numbers are unchanged. There are still deliberate strong-looking tradeoffs worth contextual testing:
- Workhorse gains one Evasion, Speed and Sensors and saves one weight against Heavy, while losing one Core durability and reactor capacity. It is efficient, but not strictly superior on the measured axes.
- Sprint legs save one weight and gain one Speed against Light legs, while losing one Armor and durability. Both retain the same Evasion bonus and Size.
- Tracked and Heavy legs add payload capacity and protection while reducing mobility or Evasion. Jump legs exchange weight/protection for different terrain access and climb Heat rules.
- Brawler versus Armored head differs in Size as well as durability/E-Def. Whether that additional hit allocation helps or harms the assembled mech requires full-body analysis.
- Bulwark versus Loader arm trades Armor/durability against carrying capacity. A body called Bulwark grants no shield response by itself; Guard belongs to held shield equipment.
Ammunition is relevant through arm capacity and total build weight: compare the complete carried weapon plus its load, not the weapon alone. The companion isolated weapon analysis owns current per-volley profiles and ammunition outcomes. These body changes neither alter those profiles nor claim that a particular ammunition load is balanced.
Why the old scalar is insufficient
engine/power.ts remains a historical heuristic, not the acceptance criterion for these changes. Its coefficients are placeholders and are not calibrated to the current prototype:
- Arm utility ignores carrying capacity and handling. Raw body rows omit held weapons, while resolved arm rows can include weapon offense divided only by body-arm weight. The displayed arm power-per-weight therefore does not consistently price the complete equipment package.
- The melee model estimates a conventional weapon attack with fixed uptime rather than the shared upfront pools, source-specific opportunities, parry costs, shield savings and alternating decisions now implemented.
- Armor effective-HP pricing omits body Size, aimed location, disabled-limb consequences, critical effects, overflow and the Core's special importance. Splitting a weapon into several projectiles changes those interactions and damage rounding.
- Pilot pricing rewards the legacy Initiative stat, uses the same flat ability value for every pilot, and cannot represent pilot/faction/bond context or the current continuous activation order.
- The generic reference targets, range uptime, Heat sustain and fixed number of attacks are assumptions, not measured opportunities on the shipped maps. The model does not represent whole-volley Aimed Shot, guaranteed availability of particular targets, or exact finish probabilities.
Use the Pareto detector to prevent plainly inferior body choices, isolated attack samples to compare damage/Heat/critical distributions in controlled contexts, and complete builds to examine weight, hit allocation, disabled systems and survival. Match balance needs separate evidence; this audit runs no full games or bots.
Verification
The focused checks cover the four former dominated pairs, categorical/Size exclusions, natural-six penetration behavior, explicit tradeoffs after tuning, and stock-kit legality. The ranged build generator's capacity-policy expectation was updated: the improved Conduit is now a valid cheapest arm for an Autocannon. Re-run the generated snapshot when the live catalog changes.
Balance audit: missed shots, armor and engagement — 2026-09-09
Balance audit: missed shots, armor and engagement — 2026-09-09
The owner reported too many missed shots, armor stopping attacks, and heavy mechs taking about three turns to enter combat. The measurements support a reliability and engagement problem. They do not support treating every weak attack as an armor failure or immediately reducing all armor.
Recommended order: investigate the Causeway side bias and Foundry bot movement; improve heavy engagement and cannon reliability in separate local tuning trials; then judge armor and anti-armor access. No live catalog, rules, map or combat-engine values were changed by this audit. Experiments use catalog copies on feature/local-playtest-prototype.
What was tested
The retained evidence contains 21,200 distinct full-game trials:
- 7,200 games searching the 0.5 / 0.75 / 1.0 aggression grid on four maps, 100 seeds per orientation per cell.
- 4,000 detailed baseline games, 500 seeds per orientation on each map.
- 7,000 sensitivity games: three catalog variants on Flat and Foundry, plus one closer-deployment variant on Flat, each 500 seeds per orientation.
- 3,000 distinct identical-roster mirror games: 500 per map, then 1,000 fresh seeds to confirm Causeway.
Repeated identical-roster executions inside the CLI’s --both-sides path are deterministic duplicates; they are not counted as independent games. The math tests also compare exact probabilities with 40,000 isolated seeded attack resolutions, with three shots each. Existing game regression tests were run as well.
The mixed rosters are Courier / Foreman / Reaver against Bastion / Foreman / Courier. Baseline policies are Flat 1 / 0.5, Quarry 1 / 0.75, Causeway 0.75 / 0.5, and Foundry 0.75 / 0.75. The first three pairs were screening-grid equilibria. Foundry had no pure equilibrium in that grid, so its fixed-policy results diagnose play flow, not final roster balance. The grid is a screening sample; small cell differences do not establish an equilibrium precisely.
The audit adds cli/balance-audit.ts, cli/balance-math.ts, and three math checks. Machine-readable evidence is in docs/tuning/evidence/2026-09-09-balance/. Every detailed result records its command, seeds, policies, counters and metric definitions. The evidence reflects today’s catalog, not a player’s potentially older embedded save catalog.
The current play experience
| Map | Ranged shots hit | Ranged Fires with no body damage | Cannon Fires with no body damage | Bastion first attack, mean round | Bastion first damage, mean round | Bastion never deals body damage |
|---|---|---|---|---|---|---|
| Flat | 61.0% | 30.2% | 60.3% | 1.57 | 2.57 | 29.9% |
| Quarry | 60.9% | 29.6% | 53.5% | 2.17 | 3.21 | 14.7% |
| Foundry | 49.4% | 38.2% | 66.0% | 3.00 | 4.49 | 23.7% |
| Causeway | 57.3% | 33.0% | 56.9% | 2.79 | 3.64 | 15.6% |
A “Fire” is one weapon resolution, including reactions. Barrage has two Fires. Misses, cover interception and zero-damage glances can all produce an empty Fire. Heat-only effects count as no body damage, not as having no effect. These are not percentages of entire player activations.
First attack is the first fire event in that mech’s own activation. It excludes reaction shots and defensive exchange attacks. A fully parried melee exchange produces no fire event. First-damage timing includes any positive body damage. Both timing means are conditional on that event occurring; the separate never-damage column prevents survivorship bias. These are scoring-round numbers, not the number of alternating player clicks.
1. The cannon’s reliability is a clear problem (F2–F4)
On Foundry, 2,301 of 3,488 cannon Fires cause no body damage: 66.0%. The cannon hits only 34.6% of its shots. Among the 1,187 hits that reach armor, only 37 glance. Its empty outcomes are primarily misses and cover, not inadequate penetration.
The stock Bastion has Gunnery 3, no head accuracy bonus, and Cannon Acc −1: total accuracy +2. The stock Courier has Evasion 15: Light chassis 12 + Light legs 1 + Piloting 2. Exact fresh-target calculations, with no helpful status or pilot-ability dice:
| Cannon into Courier | Hit chance | Chance this Fire causes no body damage |
|---|---|---|
| Clear shot, no condition dice | 40.0% | 60.0% |
| One net difficulty die | 22.5% | 77.5% |
| Hard cover, two net difficulty dice | 17.6% | 86.8% |
| Hard cover, moving heavy weapon, evasive target | 13.8% | 89.7% |
Hard cover applies difficulty dice and then absorbs hits to the Legs band, which is 25% on the stock Courier. The exact table separates those two effects. The last scenario also uses a braced target; brace changes damage but not its chance of taking zero cannon damage in this example.
Why it feels worse than the average suggests: the cannon has one shot and Fire is once per activation. A 3d6 hit can be decisive, but a player commonly spends the attack for no visible damage. The heavy-weapon movement penalty also punishes the slow mech for advancing into range. Its high damage does not make those empty decisions satisfying.
The stated rulebook benchmark is a competent shot hitting a baseline target about 70%. It is not a requirement that every gun hit an evasive light in cover at 70%. The gap here is nevertheless large enough to test more reliable cannon attacks, with damage/Heat adjusted if needed, rather than compensating with still larger damage dice.
2. Heavy movement stacks too many costs (C7, E3–E5, H3)
Stock speeds are Courier 6, Foreman/Reaver 4, and Bastion 2. The Bastion pays twice: heavy chassis Speed 3 plus heavy legs −1. It also has an actuator-critical cliff: −2 Speed can reduce its base movement to zero until repaired. Vex’s nearby Pace bonus can help; it is not guaranteed throughout a game.
Standard front deployment is 27 hexes apart; flank units start 28 apart. A normal Speed-2 Walk crosses only one rubble hex. Boost helps, but it spends a Quick action and removes the Full-action option for that activation. Advancing the cannon also adds a difficulty die. On Foundry, broken sightlines and routing make this more than a raw range problem.
Foundry’s Bastion first fires in round 3 on average. Among games where it ever removes body durability, first damage is in round 4.49 of a nominal seven-round game. 23.7% never remove body durability at all. This matches the owner’s concern about waiting several turns to contribute.
3. Armor reduces output, but it is not an absolute wall (F5–F6)
Against the Bastion, 80–88% of ranged shots hit across these baselines. About 65–69% of armor checks glance. A glance halves rolled damage, rounded down; it does not automatically cancel the attack. A natural penetration 6 is always at least Full damage.
A Pen-2 rifle reaches full damage on two of six penetration faces against Armor 7; Brace raises that to Armor 8, leaving one of six. Natural-20 hit bonuses improve this slightly. The remaining successful shots still chip durability. Reducing only core Armor 7→6 leaves armored legs and the other defensive layers in place.
Small damage dice suffer disproportionately from rounding. A normal Pulse does 1d3: on a glance its outcomes become 0, 1, 1. Against a fresh Bastion in hard cover, the exact model gives only 0.84 expected base body damage per two-shot Fire. This excludes its on-hit Heat, critical-table extras and overkill. The bots heavily prefer Overdrive, so their aggregate Pulse output is not what a player using normal shots sees. Its standard profile and Heat payoff still need a focused review.
Do not interpret Bastion’s 95.1% Foundry survival as armor alone. Only 6.4% of ranged Fires target it there. It survives partly because it is poorly engaged. The Speed-3 experiment lowers survival to 72.6% while leaving its armor unchanged.
4. Two harness problems can distort a balance verdict
Causeway side bias: with identical Bastion / Foreman / Courier rosters and identical aggression, raw side A wins 70.0% over 500 seeds. A fresh 1,000-seed run confirms 69.8%. The other mirrors read Flat 49.8%, Quarry 53.4%, Foundry 48.8%. A simple independent-seed binomial interval for the Causeway confirmation is approximately 67–73%, far from even.
This is a side-associated regression under the current map, deployment and bot system. The audit does not isolate terrain, deployment geometry, target/path tie-breaking or side-ID behavior. Averaging identical rosters across “both sides” hides it by mechanically reporting 50%. Causeway should not support a kit-balance verdict until this is understood.
Foundry bot inactivity: Reaver produces no proactive resolved attack in 51.3% of its baseline appearances. A concrete replay at seed 12000 shows a living Reaver moving back and forth around its own side and setting an Overwatch that never fires; it does not attack all game. This is a policy/routing investigation, not evidence that the Blade needs more damage. The full trace is preserved as foundry-stall-seed12000.json.
Which levers helped
Foundry, same 500 seeds in each orientation, same 0.75 / 0.75 policies:
| Cloned-catalog variant | Empty ranged Fires | Bastion first attack | Bastion first damage* | Bastion never damages | Bastion survives |
|---|---|---|---|---|---|
| baseline | 38.2% | 3.00 | 4.49 | 23.7% | 95.1% |
| heavy-speed3 | 38.9% | 2.55 | 3.78 | 25.6% | 72.6% |
| accuracy+1 | 33.1% | 3.07 | 4.39 | 18.9% | 93.6% |
| heavy-armor6 | 38.0% | 3.01 | 4.45 | 24.8% | 93.6% |
Conditional on ever dealing body damage. “heavy-speed3” changes heavy legs Speed −1→0. “accuracy+1” adds 1 Gunnery to every pilot. “heavy-armor6” changes heavy core Armor 7→6 only.
- Gunnery +1 is a useful reliability candidate: ranged hit rate rises 49.4→54.0%, and empty Fires fall 38.2→33.1%. Cannon hit rate rises 34.6→40.7%. It leaves the broader cannon/difficulty problem visible.
- Speed 3 helps earlier contact among successful games: first attack moves 3.00→2.55 and first damage 4.49→3.78. But never-damage gets slightly worse, 23.7→25.6%, and survival falls sharply. It improves timing, not consistent contribution by itself.
- Core Armor 6 alone barely changes the experience: empty ranged Fires remain about 38%, and first damage stays around round 4.45. It does not address why the cannon misses or why a mech cannot engage.
- Closer deployment has a tradeoff: translating both flat-map deployment strips four columns inward keeps the board, rows and toughness-based formation, while reducing the front gap 27→19. Bastion first attack moves 1.57→1.00 among games with an attack, and first damage 2.57→2.10 among games with damage. Never-damage rises 29.9→33.6%. Earlier contact can also mean being disabled or drawn into exchanges sooner.
These are fixed-policy sensitivity results. They are not re-equilibrated balance verdicts. Changes of a few percentage points in roster wins are not treated as proof of improvement. The same-seed pairing helps compare experiments, but changed decisions consume different dice and shots within a game are correlated.
Recommended next local tuning pass
- Fix the measurement problems first. Reproduce and isolate Causeway’s side bias and Foundry’s bot oscillation. Retain both as benchmark scenarios so later balance claims cannot hide them.
- Test a minimum viable engagement pace. Use Speed 3 as a heavy candidate, compare first-action and never-contributes rates, and test deployment distance on an actual playtest map. Include a heavy melee build, not only the long-ranged Bastion. Do not tune Speed against survival alone.
- Test cannon reliability separately. Compare Cannon Acc −1→0 and a milder movement penalty against a general Gunnery change. Measure whole firing actions that accomplish nothing, not just mean damage per shot. Re-run aggression grids if a candidate is adopted.
- Review anti-armor access and the normal Pulse profile. Keep armor distinct, but verify that normal kit choices can produce useful actions into a braced heavy. Count Heat/status effects separately from body damage. Avoid changing glance fraction before these narrower tests; that affects the whole damage scale.
- Playtest fresh games on the local branch. Existing saves embed their catalog. The owner should compare new sessions under a candidate catalog rather than expecting old saves to inherit tuning.
Reproduction
The baseline instrumented commands are recorded in each JSON. Exact stock batch equivalents for its roster/ranged summary are:
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map flat --aggression-a 1 --aggression-b 0.5 --both-sides -n 500 --seed 12000
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map quarry --aggression-a 1 --aggression-b 0.75 --both-sides -n 500 --seed 12000
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map foundry --aggression-a 0.75 --aggression-b 0.75 --both-sides -n 500 --seed 12000
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map causeway --aggression-a 0.75 --aggression-b 0.5 --both-sides -n 500 --seed 12000
The audit actually runs runBatchBothSides with a read-only event observer to capture actual durability loss and timing, which the stock summary does not contain:
pnpm exec tsx cli/balance-audit.ts --map foundry --games 500 --seed 12000 --aggression-a 0.75 --aggression-b 0.75 --out docs/tuning/evidence/2026-09-09-balance/baseline-foundry.json
pnpm exec tsx cli/balance-audit.ts --map foundry --variant heavy-speed3 --games 500 --seed 12000 --aggression-a 0.75 --aggression-b 0.75 --out docs/tuning/evidence/2026-09-09-balance/heavy-speed3-foundry.json
pnpm exec tsx cli/balance-audit.ts --map foundry --variant accuracy+1 --games 500 --seed 12000 --aggression-a 0.75 --aggression-b 0.75 --out docs/tuning/evidence/2026-09-09-balance/accuracy+1-foundry.json
pnpm exec tsx cli/balance-audit.ts --map foundry --variant heavy-armor6 --games 500 --seed 12000 --aggression-a 0.75 --aggression-b 0.75 --out docs/tuning/evidence/2026-09-09-balance/heavy-armor6-foundry.json
pnpm exec tsx cli/balance-audit.ts --map flat --variant close-deployment --games 500 --seed 12000 --aggression-a 1 --aggression-b 0.5 --out docs/tuning/evidence/2026-09-09-balance/close-deployment-flat.json
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map foundry --levels 0.5,0.75,1 -n 100 --seed 9000 --json docs/tuning/evidence/2026-09-09-balance/grid-foundry.json
pnpm sim batch --a bastion,foreman,courier --b bastion,foreman,courier --map causeway --aggression 0.75 --both-sides -n 1000 --seed 25000 --json docs/tuning/evidence/2026-09-09-balance/mirror-causeway-confirm.json
pnpm sim play --a courier,foreman,reaver --b bastion,foreman,courier --map foundry --aggression 0.75 --seed 12000 --json docs/tuning/evidence/2026-09-09-balance/foundry-stall-seed12000.json
pnpm exec vitest run cli/balance-math.test.ts
The grid command is repeated for Flat, Quarry and Causeway. The first mirror pass uses each map with -n 500 --seed 15000. The three catalog variants also run on Flat at 1 / 0.5. Those commands and output names are preserved in a manifest beside the JSON files.
The independent reviewer checked the metric definitions, major counts, conditional timing, exposure confounds, duplicated mirror samples and exact-math claims. Their review supports the diagnostic direction and rejects an immediate blanket armor nerf. The closer-deployment test was corrected after review to preserve the normal formation rather than placing units in roster-index rows.
Validation: pnpm test passes 380 tests across 49 files; pnpm typecheck passes. The three new math checks verify exact hit/cover behavior and compare burst empty-fire probabilities against the seeded combat engine. No engine RNG contract changed.
Controlled attrition distributions — 2026-09-09
Controlled attrition distributions — 2026-09-09
The burst prototype brings forward the first death under concentrated fire, while spreading fire often damages several mechs before any dies. Hard cover can preserve most of a team through the full observation window despite substantial part and weapon impairment. An early death and a team wipe have quite different distributions.
This is a reanalysis of retained evidence, with no new simulations or tuning. It supplements the burst prototype report. It does not measure competitive game duration, winners, scoring, or the causal advantage of the first kill.

For completed matches with movement, retaliation and objectives, see the separate full-game bot diagnostic. Its denominators and clocks differ from this experiment.
What the horizontal axis means
Each case contains 2,000 seeded trials (110000–111999). The baseline uses archived catalog values with the current engine; the selected catalog is the retained burst prototype. Each trial preserves damage, Heat, and critical effects. Defenders get normal activation bookkeeping but pass without attacking, moving, repairing, or cooling. Shots start at range four, with explicit clear/hard cover and no stationarity, allied ability, Lock On, or high-ground bonuses. Ordinary firing spends a Quick and uses its spare Quick for paid Vent when hot; aimed Core fire spends the Full action and gets no spare Vent.
The three-mech script rotates Courier Rifle, Foreman Autocannon, and Bastion Cannon against Courier, Foreman, and Bastion. 18 scheduled shooter slots means six allocated slots per shooter, interleaved with passive defender slots. Impairment or a finished wipe can prevent actual Fires. These are not 18 rounds, six scoring rounds, or 18 guaranteed attacks. The fixture preserves individual build legality but does not enforce competitive team weight or pilot uniqueness.
Focus always shoots the first living defender in that order. Distributed initially assigns each shooter its corresponding defender, then redirects when that defender dies. Thus this comparison includes different weapon/target pairings and a fixed focus order; it is not an isolated estimate of concentration alone. Neither policy is an optimizer.
Here “first death” means the first defender death; “wipe” means all three defenders destroyed. Shooter self-damage remains in the simulation. All three shooters survive in the retained 3v3 cases, consistent with the absence of retaliation and the cooling policy.
When the first defender dies
Each column below is a disjoint interval, not a cumulative probability. The final column retains trials with no defender death by slot 18. Every row sums to 100% before rounding.
| Catalog / policy | Slots 1–3 | 4–6 | 7–9 | 10–12 | 13–15 | 16–18 | No death by 18 |
|---|---|---|---|---|---|---|---|
| baseline / Focus, clear | 25.95% | 33.65% | 23.00% | 10.70% | 4.15% | 1.75% | 0.80% |
| baseline / Focus, hard | 9.05% | 10.10% | 9.30% | 10.35% | 9.45% | 8.65% | 43.10% |
| baseline / Distributed, clear | 3.15% | 11.05% | 22.95% | 23.90% | 20.95% | 11.65% | 6.35% |
| baseline / Distributed, hard | 1.30% | 4.40% | 10.10% | 10.35% | 13.30% | 12.15% | 48.40% |
| current / Focus, clear | 26.20% | 50.20% | 20.05% | 2.95% | 0.55% | 0.05% | 0.00% |
| current / Focus, hard | 8.55% | 18.15% | 21.85% | 18.35% | 15.40% | 8.60% | 9.10% |
| current / Distributed, clear | 1.85% | 5.60% | 14.40% | 29.00% | 30.25% | 15.05% | 3.85% |
| current / Distributed, hard | 0.85% | 1.65% | 4.00% | 9.35% | 15.95% | 18.75% | 49.45% |
Current clear focus has almost the same first-cycle death probability as baseline (26.20% versus 25.95%). The change shows up strongly in slots 4–9: 70.25% of current trials first lose a defender there, versus 56.65% before. The first death is becoming more reliable after repeated opportunities, rather than more explosive in the opening three slots.
Current hard distributed has only a 6.50% chance of any defender death by slot 9. Almost half of all trials still have no death at slot 18. “Median 18” alone hides that long survivor tail.
First-death timing and censoring
The all-trial median and P90 are the first slots reaching 50% and 90% cumulative death probability. “>18” means the threshold was not reached during observation; it is not an estimate of how much longer a target would live. The conditional columns include only trials with a death by 18 and can make a slow case look artificially fast.
| Catalog / policy | All-trial median | All-trial P90 | Conditional median / P90 | Deaths observed / 2,000 |
|---|---|---|---|---|
| baseline / Focus, clear | 6 | 12 | 6 / 11 | 1984 |
| baseline / Focus, hard | 16 | >18 | 9 / 17 | 1138 |
| baseline / Distributed, clear | 12 | 18 | 11 / 16 | 1873 |
| baseline / Distributed, hard | 18 | >18 | 12 / 18 | 1032 |
| current / Focus, clear | 5 | 8 | 5 / 8 | 2000 |
| current / Focus, hard | 10 | 18 | 9 / 15 | 1818 |
| current / Distributed, clear | 12 | 18 | 12 / 17 | 1923 |
| current / Distributed, hard | 18 | >18 | 15 / 18 | 1011 |
For baseline hard focus, selecting only successful kills produces a conditional median of 9, while the correct all-trial median is 16. Current hard focus also has conditional median 9, yet its all-trial median improves to 10 and its no-death share falls from 43.10% to 9.10%. The main improvement is eliminating many unsuccessful sequences, which the conditional median misses.
Wipes and the surviving team
Wipe probabilities below are cumulative. The median wipe time is slot 18 for both current clear policies. Neither current hard policy reaches a median wipe within the window; none of the baseline policies reaches it either.
| Catalog / policy | Wiped by 6 | By 9 | By 12 | By 15 | By 18 |
|---|---|---|---|---|---|
| baseline / Focus, clear | 0.05% | 0.45% | 6.50% | 23.75% | 46.90% |
| baseline / Focus, hard | 0.00% | 0.00% | 0.30% | 1.35% | 3.00% |
| baseline / Distributed, clear | 0.00% | 0.55% | 6.80% | 21.75% | 46.50% |
| baseline / Distributed, hard | 0.00% | 0.05% | 0.20% | 1.10% | 3.35% |
| current / Focus, clear | 0.00% | 0.15% | 3.60% | 21.25% | 54.40% |
| current / Focus, hard | 0.00% | 0.00% | 0.05% | 0.70% | 3.95% |
| current / Distributed, clear | 0.00% | 0.35% | 3.85% | 22.20% | 55.75% |
| current / Distributed, hard | 0.00% | 0.00% | 0.10% | 1.05% | 4.35% |
The full distribution of surviving defenders at slot 18 separates a lone survivor from an almost intact team:
| Catalog / policy | 0 alive (wipe) | 1 alive | 2 alive | 3 alive (no death) | Mean alive |
|---|---|---|---|---|---|
| baseline / Focus, clear | 46.90% | 44.00% | 8.30% | 0.80% | 0.630 |
| baseline / Focus, hard | 3.00% | 21.85% | 32.05% | 43.10% | 2.152 |
| baseline / Distributed, clear | 46.50% | 23.50% | 23.65% | 6.35% | 0.898 |
| baseline / Distributed, hard | 3.35% | 8.95% | 39.30% | 48.40% | 2.328 |
| current / Focus, clear | 54.40% | 44.90% | 0.70% | 0.00% | 0.463 |
| current / Focus, hard | 3.95% | 45.60% | 41.35% | 9.10% | 1.556 |
| current / Distributed, clear | 55.75% | 24.40% | 16.00% | 3.85% | 0.679 |
| current / Distributed, hard | 4.35% | 10.70% | 35.50% | 49.45% | 2.300 |
Current clear focus and distributed fire have similar wipe rates at 18 (54.40% and 55.75%), despite dramatically different first-death timing. The 1.35 percentage-point wipe difference is too small here to establish a policy ranking. Focus leaves at most one defender in 99.30% of trials; distributed leaves at least two in 19.85%. Comparable wipe rates can therefore coexist with meaningfully different partial outcomes.
These survivor distributions are recovered algebraically from retained aggregates, not guessed: P(3 alive) = no-death probability, P(0 alive) = wipe probability, P(2 alive) = mean alive − 1 + P(0 alive) − 2P(3 alive), and P(1 alive) is the remainder. This works because there are exactly three defenders. It does not recover individual histories or the distribution of the delay from first death to wipe.
Damage and impairment before deaths
| Current policy | First non-core part lost by 18 | Any defender death by 18 | Mean unusable ranged weapons on survivors at 18 | Mean alive at 18 |
|---|---|---|---|---|
| Focus, clear | 99.95% | 100.00% | 0.203 | 0.463 |
| Focus, hard | 95.95% | 90.90% | 0.495 | 1.556 |
| Distributed, clear | 99.85% | 96.15% | 0.497 | 0.679 |
| Distributed, hard | 96.50% | 50.55% | 1.131 | 2.300 |
Hard distributed fire destroys a non-core part in 96.50% of trials but kills a defender in only 50.55%. Its surviving team averages 1.132 unusable ranged weapons. That figure is a count across the surviving team, not a fraction of mechs disarmed: one mech can have multiple weapons, and a disabled held weapon can have different consequences from a destroyed back launcher. The harness checks actual firing usability before passive activation clears temporary effects.
This is a potentially useful damaged-mech phase, but the script cannot tell whether it is enjoyable. It also cannot realize the payoff from suppressing retaliation, since defenders never attack. Conversely, an early kill's effect on scoring and future enemy decisions is absent. Human tests should distinguish a prolonged fight with meaningful lost capabilities from prolonged empty attacks.
Selected single-target tails
The three-mech policies mix weapon roles. These controlled one-shooter cases show why a single mean damage number cannot predict all finishing times. All entries below use current catalog values. Ordinary shots use paid spare-Quick Vent; aimed Core uses a Full action without Vent. For one defender, first death and wipe coincide.
| Attacker / target / cover | Death by 3 | By 6 | By 9 | By 12 | By 18 | All-trial median / P90 |
|---|---|---|---|---|---|---|
| courier / bastion / clear | 0.25% | 4.85% | 31.90% | 76.05% | 99.90% | 11 / 14 |
| courier / bastion / hard | 0.05% | 1.05% | 8.00% | 26.45% | 74.75% | 15 / >18 |
| foreman / courier / clear | 19.30% | 68.85% | 93.90% | 99.15% | 100.00% | 5 / 9 |
| foreman / courier / hard | 4.00% | 18.25% | 38.35% | 58.00% | 85.30% | 11 / >18 |
| bastion / foreman / clear | 37.05% | 97.50% | 99.95% | 100.00% | 100.00% | 4 / 6 |
| bastion / foreman / hard | 13.90% | 59.45% | 90.10% | 98.45% | 100.00% | 6 / 9 |
| bastion / bastion / clear | 5.90% | 79.80% | 99.70% | 100.00% | 100.00% | 5 / 7 |
| bastion / bastion / hard | 2.05% | 35.30% | 81.25% | 97.00% | 100.00% | 7 / 11 |
| bastion aimed Core / foreman / clear | 81.50% | 99.20% | 100.00% | 100.00% | 100.00% | 2 / 4 |
| bastion aimed Core / foreman / hard | 73.55% | 97.90% | 100.00% | 100.00% | 100.00% | 3 / 5 |
| bastion aimed Core / bastion / clear | 67.10% | 99.40% | 100.00% | 100.00% | 100.00% | 3 / 4 |
| bastion aimed Core / bastion / hard | 52.70% | 97.80% | 100.00% | 100.00% | 100.00% | 3 / 5 |
Aimed Core is the main concentration hotspot: it repeatedly attacks the victory-critical part instead of spreading damage across the body. The normal aiming penalty remains; hard cover cannot intercept Core hits as it can Legs hits. Its Full cost gives up other Quick actions, including Vent and Boost, but preserves ordinary Walk movement. These tables show the resulting conditional firing performance, not how often the board permits it.
Statistical and practical limits
Each row has 2,000 trials. A probability near 50% has roughly ±2.2 percentage points of sampling uncertainty at 95% confidence; percentages at 0% or 100% are observed outcomes, not guarantees. Catalogs and contexts reuse seeds, so do not treat them as independent pooled samples or use an unpaired significance calculation to rank small differences. Integer quantiles near a threshold can shift by a slot with sampling noise. No-kill trials are retained throughout.
The retained curves can answer when a defender first dies, when the defending team is wiped, and the distribution of remaining defender counts. They cannot answer game winner, scoring-round duration, exact first-death-to-wipe delay, or whether an actual 3v2 advantage snowballs. Those require complete session events, with first-death timing, side, surviving units, later activation counts, outcome, and unfinished sessions reported explicitly.
Evidence: baseline JSON and selected prototype JSON. Every table above is derived from their recorded curves and timing fields; no trials were rerun. The harness and embedded catalog/rules preserve the experimental context.
Ranged Accuracy and paid vertical movement adoption — 2026-09-09
Ranged Accuracy and paid vertical movement adoption — 2026-09-09
Owner decision
New games use two live changes:
- Every ranged weapon gains +2 printed Accuracy. All melee weapon statistics, melee opportunity pools and melee rules are unchanged.
- Vertical movement is paid with movement points instead of climb caps, climbing Heat and falls. An ordinary-leg step costs the destination terrain entry plus one movement point per elevation level changed, uphill or downhill. Ordinary legs can cross any adjacent elevation change they can afford. Working Jump legs ignore the elevation surcharge in both directions and pay only destination terrain entry. Destroyed Jump legs use ordinary costs. Vertical movement adds no Heat. Voluntary and forced drops deal no fall damage and do not by themselves cause Prone or end movement; Throw, collisions and other rules retain their written effects.
Existing saves retain their embedded legacy vertical rules. The paid behavior is an explicit save/session capability, so an older battle is not silently reinterpreted.
The previous H3 contract allowed ordinary legs to climb at most one level for a +1 surcharge. Working Jump legs could climb one or two levels with no movement surcharge but added 1 Heat before every upward step; no mech could climb three or more levels in one step. A one-level descent added no surcharge. A drop of two or more levels dealt 1d6 + 1 per full 15 Weight to Legs through Armor and ended movement. The paid rule above replaces each of those clauses for new games.
Exact catalog change
The immutable before snapshot is parts-before.json, SHA-256 9a7206532e12d761533f13aa58632735e59d09fa93cfbddc3c49b5389b49ee41. The adopted data/parts.json snapshot has SHA-256 47f89c348498e18ffe091dedff126ac9ce02cd2e45b1d7bdae0b08000ee6a766. The machine-readable accuracy audit verifies that the only catalog differences between those two files are these eight non-melee acc fields:
| Ranged weapon | Previous Acc | Adopted Acc |
|---|---|---|
| Missile rack | +2 | +4 |
| Rifle | +3 | +5 |
| Autocannon | +2 | +4 |
| Cannon | +1 | +3 |
| Pulse | +3 | +5 |
| Flak | +3 | +5 |
| Rotary cannon | +1 | +3 |
| Lance | +3 | +5 |
Alternate ammunition and Energy Overdrive inherit their weapon's printed Accuracy. Their Shots, Pen, Damage, range, Heat and load rules do not change in this adoption.
The same exact audit confirms that the catalog's melee entries did not change. Blade remains Acc +2, Pen 3, Damage 2d6+2, Melee dice 2, Parry cost 1; Spike remains +2/2/2d6/3/1; Ram remains +1/4/1d6+3/2/2; Executioner greatblade remains 0/5/3d6+2/2/2. Shield remains a two-die Guard item. No melee pool, handling, class, pilot, parry or strike rule changed.
Evidence boundary
The earlier multivariant study tested an accuracy2 candidate under the former vertical-movement rules and under sampled bot policies. It found fewer empty proactive Fires, alongside candidate-specific lethality and first-side concerns. Those results informed the owner's choice but do not prove overall balance and do not predict the combined live ruleset after movement changed. No new simulation was run for this adoption.
Historical study files and conclusions remain unchanged. The study report has only an adoption addendum that separates this later design decision from its original no-advancement verdict. Fresh bot and human evidence should re-baseline ranged reliability, early deaths, wipes, map access, high-ground use, objective timing, Jump-leg value and activation-order effects under the combined live rules.
Independent review of the implementation and evidence boundary is recorded in the accuracy and vertical movement review.
Validation
The final integrated run passed all 549 tests across 78 files and TypeScript checking. All 26 browser checks passed: ten desktop vertical-movement cases and sixteen tablet movement/play cases, including restored legacy controls and stable board presentation. The independent reviewer approved the change after 123 focused passing checks. These checks validate implementation, compatibility and documentation; they are not balance evidence. No new simulation was run.
Start a new local match to use the adopted catalog and movement rules. Existing games retain their saved catalog and movement capability. Work remains on feature/local-playtest-prototype; this adoption does not deploy, push or merge the branch.
Guard, smoke and Indirect fire in the simulator — 2026-09-06
Guard, smoke and Indirect fire in the simulator — 2026-09-06
Until today two of the four kits carried parts the simulator ignored: the Bastion's Shield arm never took the Guard action and the Reaver's smoke launcher never fired; the Foreman's Missile rack never used its Indirect tag. All three are now simulated (FEAT-005), the bot uses them, and every batch counts them (support: guards · smoke clouds · indirect fires).
The rules as implemented
- Guard (E5, H5): a shield-bearer with a Full action covers one adjacent ally until its next activation. A shot "comes from the guard's side" when the shooter is closer to the guard than to the ally; that shot is at hard cover (2[−], Legs band hits the shield). Melee ignores it; losing the shield arm ends it. The rulebook now says so in those words.
- Smoke launcher (C6): Quick, twice per game, a three-hex cloud on passable ground within six hexes. Soft cover; three smoke hexes on a line block sight (H4). The cloud lifts at the end of the round after it was laid. The "twice per game" is new: the rulebook had no limit and the bot would have spent every Quick on smoke.
- Indirect fire (C6, E4): a weapon with the Indirect tag may fire at a Locked target it cannot see, at 1[−], with no cover or high ground.
Bot: a shield-bearer with nothing to shoot, or only a weak shot (expected damage under 1.5), Guards the adjacent ally under the most fire. A launcher lays its cloud across the sight line of the enemy that threatens it most, on the three hexes nearest itself, so that shooter loses it entirely. Indirect shots are considered against any Locked target out of sight.
What it changed
Standard rosters and the light roster with AP loads, default bots, 300 games per cell, before and after:
| Light roster win | Quarry standard | Quarry +AP | Foundry standard | Foundry +AP |
|---|---|---|---|---|
| Before support actions | 35% | 50% | 54% | 63% |
| With Guard, smoke, Indirect | 33% | 52% | 53% | 65% |
Inside the noise of a 300-game cell. Use in the batches: smoke 190–365 clouds per 300 games (the Reavers spend most of their two), indirect 143–320 fires, Guard 1–9. Guard is rare because the Bastion almost always has a target worth more than covering someone; that is the bot, not the rule, and it is fine for now.
What it says
The fidelity gap did not hide a balance swing. Smoke and Indirect are both well used and roughly cancel: smoke costs the heavy roster's cannon its lane, Indirect gives the missile rack a way to fire through the same smoke. Guard needs a moment where the shield matters more than the cannon, which the current bot rarely finds; a human Bastion pilot protecting a wounded Foreman will use it more.
Register: no new rows. FEAT-005 done.
Order, sides and the re-baseline (T30, T33, T21)
Order, sides and the re-baseline (T30, T33, T21)
Date: 2026-09-06. The balance review found that roster list order was worth up to eighteen points (T30). This note records the fix, a second harness artifact it uncovered (T33: side A and side B were not mirror images), the batch flag that judges a matchup from both sides, and the re-baseline at mutual best response.
Commands
pnpm sim batch --a bastion,foreman,courier --b bastion,foreman,courier -n 1000 --map flat --aggression 0.75 # and courier,foreman,bastion as A
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 1000 --map quarry --aggression-a 1 --aggression-b 0.75 # and reaver,foreman,courier as A; courier,foreman,bastion as B
pnpm sim batch --a bastion,foreman,courier --b bastion,foreman,courier -n 1000 --map foundry --aggression 0.75
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 500 --map foundry --aggression-a 1 --aggression-b 0.75 --both-sides
pnpm sim match --a courier,foreman,reaver --b bastion,foreman,courier --sideboard-a bastion --sideboard-b reaver --maps quarry,foundry,causeway -n 300 --aggression 1 # and the same with A and B exchanged
The 3×3 aggression grid, the point-reflected maps and the lever tables came from throwaway scripts over
runBatch and swapSides (each cell: n games as given plus the same seeds with sides swapped, mean of the two).
What changed in the harness
- Deployment (
deploySlots,frontRank): the mech that wants the front most takes the front, central slot: class and core toughness, then a melee weapon or a shield over long guns. The Bastion leads, the Reaver stands in front of the Foreman, the Courier deploys last. Ids still follow the list. - Activation order (
chooseNext): E2 lets the player choose; the bot now leads with the mech whose turn is worth most: its best attack from where it stands (or, discounted, from a step closer), a free Lock On for every ally still waiting, a way out for a mech an enemy can already hit. Ties go to the front rank, so the wall advances first when nothing can shoot. BothrunGameand the Play tab's controller use it (a human side gets the bot's pick for now: FEAT-011). - Sides as mirrors (T33): side B's deployment rows and the bot's tie-break between equal hexes now read the board through its centre, so A and B are exact mirror images. Before, both sides leaned to the same corner of the map.
--both-sides: a batch also plays the same seeds with sides swapped and reports each roster's mean.
List order no longer moves a batch (T30)
| Batch, 1,000 games | Before | After |
|---|---|---|
| Heavy mirror, open field, Bastion listed first / Courier listed first | 56.2% / 38.2% | 51.0% / 51.0% |
| Light roster vs heavy roster, Quarry, A 1.0 / B 0.75, Courier first / Reaver first | 42.9% / 34.2% | 47.2% / 47.1% |
| Same, B listed Courier, Foreman, Bastion | 52.0% | 47.2% |
Sides were not mirrors either (T33)
| Heavy mirror, aggression 0.75, 1,000 games | A win | Zone points A / B |
|---|---|---|
| Foundry, before | 64.4% | 4.6 / 1.6 |
| Foundry, point-reflected map (A still on the left), before | 58.4% | 5.0 / 2.1 |
| Foundry, after | 49.7% | 3.3 / 3.4 |
| Open field, after | 51.4% |
The edge stayed with side A when the map was reflected, so it was the harness, not the map: side B deployed on the
same rows as A (not the mirror rows) and both sides broke ties toward the same corner. With that fixed, a mirror on
Foundry reads even. Maps still favour a side by a few points in places (Quarry heavy mirror 55%, Causeway light
mirror 45%), which is what --both-sides is for.
Re-baseline at mutual best response, both sides (T21)
Light roster (Courier, Foreman, Reaver) vs heavy roster (Bastion, Foreman, Courier), 300 games × 2 sides per cell.
| Quarry | H 0.5 | H 0.75 | H 1.0 |
|---|---|---|---|
| L 0.5 | 48.0% | 40.2% | 39.8% |
| L 0.75 | 60.5% | 49.0% | 41.7% |
| L 1.0 | 55.7% | 50.5% | 50.3% |
| Foundry | H 0.5 | H 0.75 | H 1.0 |
|---|---|---|---|
| L 0.5 | 73.3% | 68.2% | 71.3% |
| L 0.75 | 71.5% | 77.7% | 72.7% |
| L 1.0 | 70.3% | 71.0% | 70.5% |
| Causeway | H 0.5 | H 0.75 | H 1.0 |
|---|---|---|---|
| L 0.5 | 47.7% | 43.3% | 43.8% |
| L 0.75 | 50.7% | 55.0% | 60.2% |
| L 1.0 | 52.8% | 61.0% | 64.2% |
Pure-strategy equilibria: Quarry L 1.0 / H 1.0 → 50.3%; Causeway L 1.0 / H 0.5 → 52.8%; Foundry has none and reads 68–78% in every cell. The best-of-three with sideboards over Quarry, Foundry, Causeway at aggression 1.0 both sides: light roster 48.3% as A, 44.0% as B, mean 46.2%. The design goal (TASK-024: 45–55% at best response) holds on Quarry, on Causeway and at match level. Before T30 and T33 the same question read 34% on Quarry.
Cannon at the equilibrium (T10)
Quarry, L 1.0 / H 1.0, 300 games × 2 sides:
| Lever | L win | Cannon kills per 1,000 | Bastion survives |
|---|---|---|---|
| As is (Pen 4, Range 8) | 50.3% | 737 | 70.7% |
| Pen 3 | 49.5% | 707 | 70.2% |
| Range 7 | 50.3% | 693 | 65.5% |
The Cannon still takes the most kills, but neither lever moves the verdict: texture, not balance. Left alone.
Foundry (T32)
Foundry, L 1.0 / H 1.0, 300 games × 2 sides:
| Lever | L win | Cannon kills per 1,000 | Bastion survives |
|---|---|---|---|
| As is | 70.5% | 773 | 84.7% |
| Zone points 0 (kills only) | 61.5% | 773 | 84.7% |
| Heavy chassis Speed 4 (Bastion moves 3) | 63.2% | 605 | 75.5% |
| Heavy legs Speed −1 → 0 | 63.2% | 605 | 75.5% |
Zones are worth nine points to the light roster on Foundry and the Bastion's Speed 2 is worth seven, and neither brings the map near the band. On Foundry the Bastion survives 85% of games while its cannon sees almost nothing (12% clear sight past 8 hexes) and it cannot reach a zone in time; the heavy roster's Foreman and Courier die doing the work instead. The sideboard absorbs it at match level (the light roster's Foundry games in the Bo3 read 48–56%), so this is a map and roster-building question, not a number: either Foundry gets a zone the wall can hold, or Foundry stays the map where you bench the Bastion.
Decisions taken the same day (TASK-021, TASK-027, FEAT-011, IDEA-007)
- Judging (TASK-021):
pnpm sim gridis the verdict; the CLI's default aggression is 1.0 for both sides; the bench's Play tab keeps 0.5. Register T20 resolved. - Map order (TASK-027): I1 now fixes the rotation per season, opening on the most even map: Quarry, Causeway, Foundry. Foundry stays as built and is the map where the Bastion sits on the bench. Register T32 resolved.
- Best of three on that rotation, sideboards, aggression 1.0 both sides, 300 matches per orientation: light roster 47.0% as A, 40.3% as B, mean 43.7%.
pnpm sim match --a courier,foreman,reaver --b bastion,foreman,courier --sideboard-a bastion --sideboard-b reaver -n 300 # and A/B exchanged
pnpm sim grid --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 300
- Play tab (FEAT-011): a human side with more than one mech waiting now chooses which activates (E2). The bot's suggestion is offered first; any waiting mech can be taken from the banner or by clicking it on the board.
Melee weapons and the value of closing (T28)
Melee weapons and the value of closing (T28)
Date: 2026-09-06. Question from play: a melee weapon should be more effective; the reward for closing the gap should be lethality. Light roster A (Courier, Foreman, Reaver with the Blade arm) against the heavy roster B, Quarry, best response (A 1.0, B 0.75) so that melee happens; 400 games per variant.
Commands
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 400 --map quarry --aggression-a 1 --aggression-b 0.75
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier -n 400 --map quarry --aggression-a 1 --aggression-b 0.75 --vary arms.blade-arm.weapon.shots=1,2
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier -n 400 --map quarry --aggression-a 1 --aggression-b 0.75 --vary arms.blade-arm.weapon.pen=3,4,5
Today
The Blade arm hits 83% of the time (Piloting 1, Acc +2, no cover, no range die) and does 6.0 damage per Fire. That is the best per-attack number in the catalog (Cannon 3.9 per shot at 45% hits). It fires 428 times in 400 games and scores 130 kills; melee is 17.7% of all damage. At the Play tab's default aggression 0.5 it fires 35 times in 500 games: the cautious bot does not close, and a human who closes eats a round of fire on the way in. The Reaver survives 51% of games and scores 0.59 kills per game.
So the weapon is effective per swing and rare per game. Closing costs an activation of movement and a volley taken, and pays one strike back.
Levers, 400 games each
| Variant | Damage per Fire | Blade kills | Reaver kills / game | Reaver survives | Light roster win | Wipes |
|---|---|---|---|---|---|---|
| Base (2d6+2, Pen 3, Shots 1) | 6.0 | 130 | 0.59 | 51% | 49.0% | 41.3% |
| Shots 2 (two strikes per Fire) | 10.0 | 257 | 0.89 | 54% | 53.5% | 48.0% |
| 3d6, Pen 4 | 7.4 | 207 | 0.77 | 55% | 52.3% | 44.5% |
| Shots 2, 3d6, Pen 4 | 11.3 | 304 | 1.02 | 56% | 58.5% | 50.5% |
| Pen 5 | 6.5 | 163 | 0.65 | 50% | 47.8% | 43.0% |
A second strike per Fire is the strongest single lever: the blade goes from 6 to 10 damage per activation, the Reaver's kills rise by half, and the roster reads 53.5%. Bigger dice help less than more dice, because each strike rolls its own location and can take a second part.
The mechanic question (TASK-031)
Numbers alone make the blade a better gun. The design ask is that entering melee is a decisive event for both mechs, the way a Kill Team 2024 fight is: both fighters roll their attack dice, then alternate spending them to strike or to parry, attacker first, and the fight usually ends with one of them down. An adaptation to our pipeline:
- Fight (Full, adjacent). The attacker rolls its melee attack dice: Shots of the melee weapon, or 1 for a strike, +1 for a Charge. The defender rolls its own melee dice at the same time (its weapon or its best strike).
- Each die is a hit roll (F3 with Piloting). Hits are kept as hit dice; a natural 20 is a crit die.
- Starting with the attacker, the players alternate spending one die: strike (resolve Location, Penetration and Damage with that die, F4–F6) or parry (discard one enemy hit die; a crit die parries a crit die). A Shield arm parries with any die and needs no die of its own once per Fight.
- A mech that is destroyed or knocked Prone loses its remaining dice. Knockdown by class (F11.4) still applies.
The attacker's edge is going first; the Charge's edge is a die; the defender is never a free target. Lethality comes from both sides spending dice to strike rather than parry, which the simulator can measure once the bot has a parry policy. Cost: a new resolution path in the engine and the Play tab, a bot policy, and rulebook F11 rewritten.
Recommendation
Take the number now and the mechanic as a decision: Blade arm Shots 1 → 2 (and Spike, Ram to match, checked by sweep) as an interim, and TASK-031 for the fight sequence. If the fight sequence is adopted, the Shots value becomes the weapon's attack dice, so the change is not wasted.
Weight and size rules applied (2026-09-06, TASK-031 options 1, 3, 4, 5)
Nimble and Mass (F11.1), Charge dice capped at half Speed (F11.3), a push only by an equal or heavier mech with a stagger otherwise (F11.3), Grapple bonus by Weight difference (F11.5), fall damage +1 per 15 Weight (H3). Fight order by Weight waits for the fight sequence. Same rosters, best response, 1,000 games each.
| Before | After | |
|---|---|---|
| Light kick hit rate | 64.9% | 70.1% |
| Heavy kick hit rate | 46.7% | 46.3% |
| Melee share of damage, Quarry | 16.3% | 15.7% |
| Light roster win, Quarry / Causeway | 43.6% / 67.8% | 42.9% / 68.3% |
| Wipes, Quarry / Causeway | 45.5% / 28.2% | 46.1% / 30.5% |
| Charges / knockdowns / pushes, Quarry | 1510 / 185 / 825 | 1466 / 195 / 809 |
| Falls, Causeway mixed batch | 19 per 1,000 | 13 per 1,000 |
The rules change who wins a brawl (a Light kicks a Heavy 70% of the time now, and cannot shove it), not how often brawls happen or how much of the game they decide. The melee share stays at about 16%. Closing still pays one strike for a volley taken, so the lethality of closing is still the Shots 2 number or the fight sequence (TASK-031).
Why shots miss (T27)
Why shots miss (T27)
Date: 2026-09-06. Question from play: "weapons miss a lot". Light roster A (Courier, Foreman, Reaver) against the heavy roster B (Bastion, Foreman, Courier), Quarry, both bots at the Play tab's default aggression 0.5, because that is what a player sees.
Commands
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 500 --map quarry
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier -n 400 --map quarry --vary rules.longRangeDice=1,0
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier -n 400 --map quarry --vary rules.evasiveMove=3,5,99
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier -n 400 --map quarry --vary chassis.light.evasion=11,10,9
rules.longRangeDice (F2, default 1) and rules.evasiveMove (F2, default 3 hexes) are new sweep knobs. At their
defaults nothing changes. The per-shot breakdown came from a throwaway script over 300 games' event logs.
What the numbers say
| Value | |
|---|---|
| Ranged shots that hit | 45% (13,341 shots) |
| Melee attacks that hit | 62% |
| Activations that Fire | 82% |
| Firing activations that hit nothing | 43% |
| Activations with no damage at all | about 53% |
By target class: Light 30%, Medium 54%, Heavy 73%. By cover: none 46%, soft 42%, hard 40%. By range band: optimal 50%, long 44%, and 79% of all shots are at long range. By net modifier dice: 0 dice 60%, −1 38%, −2 35%, +1 78%; only 21% of shots have zero or positive dice. By the number needed on the d20 (Evasion − Accuracy): ≤4 80%, 5–8 58%, 9–12 41%, 13+ 27%, and 29% of shots need 13 or more.
With no modifier dice at optimal range, kit against kit: a Foreman's rifle hits a Courier (Evasion 14) 40%, a Foreman 65%, a Bastion 80%. The rulebook's stated target (C) is about 70% against a baseline target. The game plays at 45%.
Why
- Long range is the normal shot. The bots fire whenever a target is in the 1.5× band, so four shots in five carry the long-range die. A human who kites does the same.
- "Target moved 3+ hexes" is nearly always on. Every mech moves 3 or more hexes most activations, so the evasive die is a permanent −1, not a reward for evasive play.
- Light Evasion is 14. Chassis 11, Light legs +1, Piloting +2. A Gunnery 1 rifle needs a 12.
- The three stack: a long shot at a moving Courier behind soft cover is three difficulty dice and a 13+.
Levers, 400 games each
| Variant | Ranged hit | Light roster win | Wipes | Kills / game | First kill round |
|---|---|---|---|---|---|
| Base | 44.8% | 35.3% | 34.3% | 2.63 | 3.1 |
| Long range: no die | 53.4% | 34.0% | 49.3% | 2.98 | 2.7 |
| Evasive needs 5+ hexes | 50.0% | 33.5% | 41.3% | 2.89 | 3.0 |
| Evasive off | 51.7% | 30.3% | 47.5% | 2.92 | 2.7 |
| Chassis Evasion −1 | 48.9% | 30.8% | 43.8% | 2.84 | 2.9 |
| Chassis Evasion −2 | 53.8% | 27.8% | 57.5% | 3.06 | 2.6 |
| Long 0 + evasive off | 63.2% | 30.3% | 58.3% | 3.21 | 2.4 |
| Evasive off + Evasion −1 | 55.7% | 31.8% | 53.3% | 3.04 | 2.5 |
| All three | 67.4% | 26.8% | 63.7% | 3.29 | 2.3 |
Every lever that raises the hit rate also raises lethality (wipes) and helps the heavy roster, because the Cannon benefits most from hitting more. Any change here is paired with the lethality target (about 50% wipes) and the best-response balance check (TASK-021).
Note the matchup at aggression 0.5 reads 35/65 for the light roster; at best response it is 46/54. The Play tab's default bot is the cautious one.
Recommendation
Drop the long-range die (F2) and make the evasive die a reward for Boost or a 5-hex move rather than the default: ranged hits go from 45% to about 60%, wipes to about 55%. Keep Evasion values: a Light that is hard to hit is its identity, and Evasion −2 flips the balance. If wipes then sit above the target, the next Durability step is the correction, not the hit roll. Decision: TASK-029.
Applied (TASK-029) and re-measured, 1,000 games each
Rules: longRangeDice 1 → 0 and the evasive die on a Boost or a 5-hex move (F1, F2). Alone, that took the light
roster from 46% to 34% at best response: more hits favour the side with the biggest gun. The compensation that
returned the band with the least distortion (nine variants measured): Cannon arm range 10 → 8, Light chassis Evasion
11 → 12, Medium chassis Evasion 9 → 10.
| Before | After | |
|---|---|---|
| Rifle hits, best response on Quarry | 49% | 60.5% |
| Autocannon / Missile / Cannon hits | 61% / 52% / 45% | 70% / 65% / 39% |
| Light roster win, best response, Quarry | 45.7% | 43.6% |
| Wipes, best response, Quarry | 42% | 45.5% |
| Light roster win, default bots, Quarry | 36% | 44.3% |
| Light roster win, best response, Foundry | 54% | 66% |
The Cannon now misses more than any other weapon (Acc −1 and the Heavy die after a move): the next candidate for register T10. The map split widened (Quarry 44%, Foundry 66%), which the best-of-three sideboard is for (TASK-027).
Catalog expansion: two signature parts per runner — 2026-09-06
Catalog expansion: two signature parts per runner — 2026-09-06
TASK-008 asked for the runners' wants from GDD section 6. Thirteen parts and two kits went in, taking the catalog from 22 parts and 4 kits to 35 and 6. Every part uses mechanics the engine already had (loads, Overdrive, Guard, cap bonus, jump, sensors, E-Def); none needed a new rule.
| Runner | Want (GDD 6) | Part | The trade |
|---|---|---|---|
| Kessler | a heavy chassis variant, a flak option | Workhorse chassis (Heavy: Armor 7, Dur 17, Speed 4, Evasion 8, Wt 15) · Flak arm (R5, 4 shots, Pen 0, 1d3+1, Burst, AP load) · Tracked legs (Armor 6, Dur 10, cap +5, Evasion −1) | a heavy that moves and costs less but is not a wall; a hose that shreds lights and bounces off Armor 6 |
| Meridian | a fast melee option, a decoy oversized part | Spike arm (melee, Acc +2, Pen 2, 2d6, Wt 5) · Decoy pod (Size 4, Armor 3, Dur 6, Wt 3, no effect) · Sprint legs (Speed +2, Evasion +1, Armor 3) · Scout head (Wt 1, Sensors +2) | speed and a hit-band sponge, all fragile |
| Hollow Saints | a knockdown arm, an armored brawler head | Ram arm (melee, Pen 4, 1d6+3, Wt 9) · Brawler head (Size 2, Armor 6, Dur 5, E-Def +1) | anti-armor melee that weighs like a cannon |
| Nine Suns | a slow multi-shot weapon, a bulwark back | Rotary cannon arm (R8, 3 shots, Acc −1, Pen 2, 1d6+1, Burst, Heavy, AP and Flechette loads, Wt 14) · Bulwark plate (Armor 8, Dur 8, Reactor +1, Wt 7) | volume at cannon weight, armor on the back |
| Tessellate | an E-Def jammer back, a heat-dump weapon | Lance arm (R8, Pen 3, 2d6+2, Heat 2, Energy; Overdrive Pen 5, 3d6, +2 Heat) · Jammer mast (Sensors +1, E-Def +2) | a gun that pays in heat, a back that makes Lock On fail |
Kits: Lantern (Tessellate, Medium: Lance, Pulse, Sensor head, Jammer mast, Q; 42 weight, Hull 37, E-Def 14) and Drayman (Kessler, Workhorse: Autocannon, Rifle, Tracked legs, Missile rack, Ilse; 52 weight, Hull 47).
The Lance retune
The first Lance was Range 7, Pen 3, 2d6, Heat 3 with an Overdrive of +3 Heat: a 41-weight kit whose only real gun cost its whole reactor to fire hot. The Lantern lost 71% of duels against a Foreman and melted itself 55 times in 300 games. Now Range 8, 2d6+2, Heat 2, Overdrive +2 Heat for Pen 5 and 3d6, on a sturdier arm (Armor 5, Dur 7, Wt 9).
Batches
Duels on Quarry, 300–400 games, default bots:
| Duel | New kit wins |
|---|---|
| Lantern vs Foreman (before / after the retune) | 29% / 57% |
| Lantern vs Courier (before) | 39% |
| Drayman vs Bastion | 43% |
| Drayman vs Foreman | 56% |
Rosters against the heavy roster (Bastion, Foreman, Courier), 300 games:
| Roster | Quarry | Foundry |
|---|---|---|
| Lantern, Foreman, Courier | 40% (Lantern survives 10%) | 71% (39%) |
| Drayman, Reaver, Courier | 24% (Drayman survives 27%) | 61% |
The Lantern is a support piece that dies first on open ground and carries a roster on Foundry; the Drayman is a heavy without a wall, so on Quarry the cannon roster shoots it apart and on Foundry its volume wins. Both fit their runners' philosophies, and both are strong on one map and weak on the other, which is the shape the maps are supposed to produce.
Power model reads (not measured, see T8 and T17)
Per-weight outliers after the expansion: Sprint legs +106%, Scout head +50%, Light chassis +50%, Missile rack +179%, Bulwark plate +29% high; Shield arm −53%, Ram arm −32%, Cannon −26%, Rotary cannon −26%, Armored head −28%, Jammer mast −29% low. The model still overprices evasion and speed and underprices soak and range (register T8, T9, T10); the two new melee arms inherit the melee-uptime discount. Treat these as a reading list for sweeps, not as verdicts.
Rulebook
Section C tables (C1, C3 with loads, C4, C5, C6, C8) carry the new rows in both the Markdown and the HTML, generated from the catalog by the row script that inserted them; IDEA-004 (generate the tables permanently) is the durable fix.
Bot leftovers (Prepare while adjacent, heat planning) and the Causeway map
Bot leftovers (Prepare while adjacent, heat planning) and the Causeway map
Date: 2026-09-06. Closes TASK-001 and register rows T13, T19; opens and resolves T26. Roster and settings as in the aggression note: light roster A (Courier, Foreman, Reaver) against the heavy roster B (Bastion, Foreman, Courier) at best-response aggression (A 1.0, B 0.75), 300 games.
Commands
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 300 --map quarry --aggression-a 1 --aggression-b 0.75 # before and after the bot change
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 300 --map causeway --aggression-a 1 --aggression-b 0.75 # the new map
pnpm sim batch --a courier,foreman,reaver --b courier,foreman,reaver -n 300 --map causeway --aggression-a 0.75 --aggression-b 0.75 # mirror, side bias
pnpm sim maps # sightline audit
The stress-cause tally is a throwaway script over runGame (100 games, same rosters and aggression): for every
stress event, the last fire or boost by the same mech in the preceding twelve events.
Why the bot never Prepared while adjacent (T19)
Adjacent to a target the bot spent both Quick actions attacking: Strike, then Fire. Prepare only ran when a Quick was left over, which never happened in a brawl, so the Disengage strike existed on paper only (0 in 300 games at every aggression). The fix is a prediction, not a rule change: the bot runs the neighbour's own positioning policy (its side's aggression) and, if the neighbour would step out of adjacency, replaces the weaker of its two Quick attacks with Prepare. The Disengage strike it gains is the same limb at the same value, so the trade is a weaker attack now for a free one later. A Prone, grappled or legless neighbour is never predicted to leave. Grapple still comes first when the bot is the heavier class, which pins the leaver outright.
What overheated the bots (T26)
| Cause of the stress roll | Count (100 games, 233 rolls) |
|---|---|
| On-hit Heat from the enemy's Pulse arm in Overdrive, charge recoil (no own attack in the window) | 90 |
| Charge at or near the cap (+1 Heat, F11.3) | 45 |
| Backup Fire reaction at the cap | 29 |
| A plain shot with one Quick left, no Vent possible | 69 |
Three bot rules: no Charge when its Heat would pass the cap (walk in and Strike instead); with one Quick and a shot over the cap, take a cooler weapon if one is usable, else Vent unless the shot's expected damage covers the target's Hull; and Backup Fire is declined when the shot would push the partner over its cap (engine-side, since reactions resolve automatically; E6 now says a reaction is always optional).
Results on Quarry, best response
| Before | After | |
|---|---|---|
| Light roster win | 45.7% | 48.3% |
| Wipes | 49.7% | 46.7% |
| Stress rolls / meltdowns | 745 / 126 | 388 / 72 |
| Disengage strikes | 0 | 47 |
| Backup Fire | 234 | 166 |
| Charges | 578 | 451 |
| Pushes / falls | 308 / 0 | 223 / 0 |
The win rate moves inside noise (±5.7 points at n=300). Stress rolls halve; meltdowns fall by 43%. Backup Fire drops because hot partners now decline it. Charges drop because a hot bot walks in.
Causeway (T13)
data/maps/causeway.json, point-symmetric like Foundry (left half authored, rotated 180°). A level-2 spine runs
cols 10–21 on rows 9–10 with level-1 ramps at both ends; rows 8 and 11 stay level 0 and passable, so a push sideways
off the spine drops two levels (H3 fall). The centre zone sits on the spine; the outer zones are on the low ground near
each side's deployment behind blocks and low walls.
Audit: 552 passable hexes, clear sight 75% / 43% / 12% by band, mean longest sightline 19.9, deploy does not see deploy (Foundry: 78 / 45 / 12, 20.6; Quarry: 93 / 77 / 48, 27.8). Every zone is 7/7 passable.
| Batch (300) | A win | Wipes | Zone points A / B | Melee share | Pushes / falls | Disengage |
|---|---|---|---|---|---|---|
| Light vs heavy, best response | 51.7% | 33% | 3.9 / 1.8 | 17% | 183 / 8 | 30 |
| Mirror (light vs light, 0.75 / 0.75) | 46.3% | 58% | 1.5 / 2.8 | 36% | 387 / 48 | — |
Falls happen: one push in eight in the mirror, one in twenty-three in the mixed batch, against zero on Quarry and Foundry. The spine is a firing lane as well as a brawl (Cannon fires 1307 times, as on Quarry), and the faster roster takes the zones (3.9 to 1.8), which is why the light roster edges the heavy one here. The mirror's 46/54 is the same side bias as Quarry (46/54) and Foundry (47/53): the centre zone cannot sit exactly on the centre of an even-width board and the second player activates last in an odd round. No lever here; it is what the Bo3 map order is for (TASK-027).
Register
- T13 resolved: falls 8/183 and 48/387 on Causeway.
- T19 resolved: Disengage 0 → 47 per 300 games.
- T26 (new, resolved): stress rolls 745 → 388, meltdowns 126 → 72.
Best of three with a sideboard — 2026-09-06
Best of three with a sideboard — 2026-09-06
pnpm sim match plays I1/I2 as written: best of three, games rotating through a map list, a fourth mech on each bench. The bot's stand-in for the secret simultaneous swap is simple and deterministic: the loser of a game benches its worst performer (kills, damage dealt against damage taken, a penalty for dying) for the bench mech, provided the team stays legal; the winner stands pat. The mech that came off can come back after a later loss.
The question this exists to answer: the design goal says a heavy must not be mandatory, and the two maps disagree about heavies. A match spans both maps, so a match is where the goal is really judged.
pnpm sim match --a courier,foreman,reaver --b bastion,foreman,courier --sideboard-a bastion --sideboard-b reaver --maps quarry,foundry,quarry -n 300
pnpm sim match --a courier,foreman,reaver --b bastion,foreman,courier --sideboard-a bastion --sideboard-b reaver --maps foundry,quarry,foundry -n 300
pnpm sim match --a "courier[rightArm=ap],foreman[leftArm=ap],reaver[rightArm=ap]" --b bastion,foreman,courier --sideboard-a bastion --sideboard-b reaver --maps quarry,foundry,quarry -n 300
pnpm sim match --a courier,foreman,reaver --b bastion,foreman,courier --maps quarry,foundry,quarry -n 300
300 matches each, default bots. Light roster = Courier, Foreman, Reaver (bench Bastion); heavy roster = Bastion, Foreman, Courier (bench Reaver).
| Match | Light roster match wins | Games on Quarry (light win) | Games on Foundry (light win) | Swaps A / B |
|---|---|---|---|---|
| No sideboards, Quarry–Foundry–Quarry | 34% | 457 (35%) | 300 (50%) | 0 / 0 |
| Sideboards, Quarry–Foundry–Quarry | 45% | 469 (42%) | 300 (54%) | 246 / 223 |
| Sideboards, Foundry–Quarry–Foundry | 55% | 300 (51%) | 442 (55%) | 214 / 228 |
| Light roster with AP loads, sideboards, Quarry–Foundry–Quarry | 64% | 445 (58%) | 300 (60%) | 0 / 246 |
What it says
- The sideboard is what makes the goal hold at match level. Without it the light roster wins 34% of Quarry-first matches; with a Bastion on the bench it wins 45%, and 55% when Foundry opens. Both are inside the 45–55% band. The swap is the mechanism the rulebook promised: "the bench lets you answer what you just saw."
- The swap policy is a tuning oracle, not a player. It always swaps after a loss when it can. Both sides swapped in roughly 75% of matches, which is more than a human would; a human would also swap by map, not only by result. Good enough to measure with.
- AP loads and a heavy bench do not combine, by design: a light roster carrying 135 weight cannot fit a 62-weight Bastion under the cap, so the AP roster never swapped and still won 64% of matches. The Team Cap is doing its job as the price of anti-armor rounds.
- Map order is worth about ten points at match level (45% vs 55%). Ranked play will want the loser of game one to pick the next map, or a fixed neutral order; that is a rules question for I1 and is now on the Decisions page.
What is not done
The bench cannot be chosen in the web bench yet (CLI only), and there is no swap policy that reads the next map. Both are follow-ups on FEAT-004's liste notes.
The Bastion's wall (T6) and batch speed (T14)
The Bastion's wall (T6) and batch speed (T14)
Date: 2026-09-06. Light roster A (Courier, Foreman, Reaver) against the heavy roster B (Bastion, Foreman, Courier), Quarry, best-response aggression (A 1.0, B 0.75). Lever batches are 1,000 games each; the analytic table is F5 by hand.
Commands
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 1000 --map quarry --aggression-a 1 --aggression-b 0.75
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier -n 1000 --map quarry --aggression-a 1 --aggression-b 0.75 --vary chassis.heavy.armor=8,7,6
The lever matrix below was a throwaway script over runBatch applying catalog overrides (the same paths --vary
takes) and reading the Bastion's survival from builds.
Why the Bastion reads as unkillable
F5 rolls d6 + Pen against Armor. A six-sided die gives every weapon a six-point window, and the heavy core at Armor 8
sat at the far edge of the light weapons' windows:
| Weapon (standard round) | Pen | Full damage vs Armor 4 / 6 / 8 |
|---|---|---|
| Rifle | 2 | 83% / 50% / 17% |
| Autocannon | 1 | 67% / 33% / 0% |
| Missile rack | 2 | 83% / 50% / 17% |
| Pulse | 0 | 50% / 17% / 0% |
| Cannon | 4 | 100% / 83% / 50% |
| Rifle AP | 4 | 100% / 83% / 50% |
Crits (Armor + 4) against Armor 8 were impossible for everything but the Cannon's AP round. A rifle put 58% of its dice into the Bastion's core and 0% full damage into its shield (Armor 9). With Hull 53 that is fifteen rifle hits.
Levers, 1,000 games each
| Variant | Light roster win | Wipes | Bastion survives | Bastion damage taken / game |
|---|---|---|---|---|
| Base (heavy Armor 8, Durability 17) | 48.7% | 39.6% | 86.2% | 15.1 |
| Heavy Armor 7 | 46.2% | 43.2% | 72.5% | 21.5 |
| Heavy Armor 7, Durability 18 (chosen) | 45.7% | 42.4% | 75.5% | 21.9 |
| Heavy Armor 7, Durability 19 | 45.6% | 41.6% | 77.4% | 22.1 |
| Heavy Armor 7, Shield arm Armor 8 | 46.2% | 43.2% | 72.3% | 21.6 |
| Heavy Armor 6 | 45.0% | 45.9% | 63.1% | 23.5 |
| Heavy Armor 7 + light weapons Pen +1 | 44.1% | 49.2% | 64.7% | 23.0 |
| Base, A's two rifles carry AP | 45.6% | 37.9% | 82.7% | 17.9 |
| Heavy Armor 7 + A's rifles carry AP | 43.1% | 43.8% | 63.5% | 24.6 |
Earlier 300-game passes (register T6) with the pre-aiming bot: crit margin 3 hurts the light roster (44%) and does nothing to the Bastion (81%); heavy hull −20% moves it to 74%; light-weapon Pen +1 alone drops the light roster to 40% because it also opens their own armour.
Armour is the lever. Pen and the crit margin are global and cost the light roster more than they cost the Bastion. Shield armour barely matters (the shield is 20% of hits). Durability trades survival back one point per point.
What changed
- Heavy chassis Armor 8 → 7, Durability 17 → 18 (
data/parts.json). The heavy core keeps the deepest hull and gains one point of it; the wall drops one notch so a standard rifle gets Full damage one roll in three instead of one in six, the autocannon one in six instead of never, and the Cannon two in three. The Bastion's Hull is 54. Durability 18 keeps the Heavy chassis distinct from the Workhorse (same Armor now, Speed 4, Evasion 8): the Heavy is the deeper, hotter-running hull. - The bot takes Aimed Shots at the softest band when its core shot bounces (Full damage one roll in six or worse), counting the fire a stripped weapon part stops. Against Armor 8 this stripped the Bastion's cannon arm (Armor 5, Durability 7) and its survival rose to 86% while the light roster's win rate rose: disarming, not killing. At Armor 7 the rifle no longer bounces and shoots the core.
- The Play tab shows every part's armour on the cards and, in the inspector, the odds of the weapon in hand (hit, full damage, expected) against a hovered target, so a human sees the soft spot the bot sees.
Result at the chosen numbers: Bastion survival 86% → 75.5%, light roster 48.7% → 45.7% (inside noise), wipes 40% → 42%. The next notch if play still says unkillable is Armor 6 (63% survival), which makes heavy and medium cores equal.
Batch speed (T14)
A CPU profile of a 60-game batch: distanceField was 83% of the time. Its frontier was an array re-sorted on every
pop, its cells a Map keyed by strings built per neighbour, and the bot asked for the same fields several times per
activation. Now cells sit in a row-major array with inlined offset math, both Dijkstras use a binary heap (reachable
keeps the cost-then-key tie order so paths do not change; distanceField runs on grid indices with a precomputed
neighbour table), and the game memoises walking-distance fields until anything moves.
| Games / second (100 games, Quarry, best response) | |
|---|---|
| Before | 7.2 |
| Heap and array cells | 32.0 |
| Index-based field with cache | 63.9 |
The SHA-256 of the event logs of 36 games (twelve seeds on each map) is identical before and after, so every batch number in this register still holds. The remaining profile is the field itself (28%), its heap (14%) and the sight lines (10%); caching sight per activation is the next lever if sweeps need it.
Register
- T6 resolved: heavy Armor 8 → 7, Durability 17 → 18; Bastion survival 86% → 75.5% at 1,000 games.
- T14 resolved: 7 → 64 games per second, logs identical.
Balance review after the 2026-09-06 changes
Balance review after the 2026-09-06 changes
Date: 2026-09-06. Question from the design lead: "What do we think of balance so far? Highlights that are concerning." Everything below is after hit rate (TASK-029), rooftops (TASK-030), weight in melee (TASK-031 options 1, 3, 4, 5) and heavy Armor 7. Light roster A = Courier, Foreman, Reaver. Heavy roster B = Bastion, Foreman, Courier.
Commands
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 1000 --map quarry --aggression-a 1 --aggression-b 0.75
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 1000 --map foundry --aggression-a 1 --aggression-b 0.75
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 1000 --map causeway --aggression-a 1 --aggression-b 0.75
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier -n 400 --map quarry --aggression-a 1 --vary aiB.aggression=0.5,0.75,1
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier -n 400 --map quarry --aggression-b 1 --vary aiA.aggression=0.5,0.75,1
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier -n 400 --map foundry --aggression-a 1 --vary aiB.aggression=0.5,0.75,1
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier -n 400 --map causeway --aggression-a 1 --vary aiB.aggression=0.5,0.75,1
pnpm sim match --a courier,foreman,reaver --b bastion,foreman,courier --sideboard-a bastion --sideboard-b reaver --maps quarry,foundry,causeway -n 300 --aggression-a 1 --aggression-b 0.75
pnpm sim batch --a bastion,foreman,courier --b bastion,foreman,courier -n 1000 --map flat --aggression 0.75 # and quarry, foundry, causeway; --aggression 0.5 and 1; --seed 5000; --cols 33
pnpm sim batch --a courier,foreman,reaver --b courier,foreman,reaver -n 1000 --map quarry --aggression 1
pnpm sim batch --a courier,foreman,bastion --b bastion,foreman,courier -n 1000 --map flat --aggression 0.75
pnpm sim batch --a reaver,foreman,courier --b bastion,foreman,courier -n 500 --map quarry --aggression-a 1 --aggression-b 0.75 # and foreman,reaver,courier
pnpm sim batch --a courier,foreman,reaver --b courier,foreman,bastion -n 500 --map quarry --aggression-a 1 --aggression-b 0.75
pnpm sim batch --a lantern,foreman,courier --b bastion,foreman,courier -n 500 --map quarry --aggression-a 1 --aggression-b 0.75
pnpm sim batch --a drayman,reaver,courier --b bastion,foreman,courier -n 500 --map quarry --aggression-a 1 --aggression-b 0.75
Roster order is worth up to eighteen points (T30)
The batch harness deploys mechs in list order (first listed gets the front, central hex) and activates them in list order. The rules let a player choose both. The same three mechs, listed differently:
| Batch | A win |
|---|---|
| Heavy mirror on the open field, both listed Bastion first, aggression 0.75 | 56.2% |
| Same, A listed Courier, Foreman, Bastion | 38.2% |
| Same, both Bastion first, board 33 columns wide | 51.2% |
| Same, aggression 0.5 / 1.0 | 48.5% / 56.6% |
| Heavy mirror on Quarry / Foundry / Causeway, aggression 0.75 | 57.7% / 59.5% / 58.6% |
| Light mirror on Quarry, aggression 1 | 48.6% |
| Light roster vs heavy roster on Quarry, best response, A listed Courier first (the standard) | 42.9% |
| Same, A listed Reaver first / Foreman first | 34.2% / 38.2% |
| Same, B listed Courier, Foreman, Bastion | 52.0% |
A heavy roster that puts the Bastion front and first is eight to eighteen points better than one that does not, and that edge is what the heavy mirror shows as a "side A advantage" on every map (the light mirror shows none). Every balance number in the register was measured at one list order per roster. Until the bot chooses its deployment slots and its activation order, the win rates carry about ten points of harness noise, and the heavy roster has been read at its best order.
The heavy roster's best response moved (T21, T20)
| Quarry, 400 games | B 0.5 | B 0.75 | B 1.0 |
|---|---|---|---|
| A at 1.0, light roster win | 50% | 46% | 34% |
| Quarry, B at 1.0 | A 0.5 | A 0.75 | A 1.0 |
|---|---|---|---|
| Light roster win | 24% | 31% | 34% |
Since the hit-rate and melee changes, the heavy roster does best at aggression 1.0, not 0.75. At mutual best response on Quarry the light roster wins 34%, eleven points under the band. Foundry is the reverse (64% at B 0.75 or 1.0, 56% at B 0.5) and Causeway drops from 70% to 54% when B goes to 1.0. The best-of-three with sideboards over Quarry, Foundry, Causeway at A 1.0 / B 0.75 reads 41% for the light roster (Quarry 40%, Foundry 50%, Causeway 43%).
Per map, best response (A 1.0, B 0.75), 1,000 games
| Quarry | Foundry | Causeway | |
|---|---|---|---|
| Light roster win | 42.9% | 67.0% | 68.3% |
| Wipes | 46% | 21% | 31% |
| Games to round 7 | 69% | 93% | 89% |
| Zone points per game A / B | 3.4 / 3.0 | 3.0 / 0.1 | 4.5 / 2.3 |
| Bastion survives | 64% | 88% | 77% |
| Courier (A) survives | 22% | 40% | 82% |
| Foreman (B) survives | 44% | 48% | 12% |
| Melee share of damage | 16% | 30% | 15% |
| Cannon hit / kills | 40% / 594 | 40% / 538 | 48% / 779 |
Quarry is the heavy roster's map and Foundry and Causeway are the light roster's, by about 25 points each way. On Foundry the heavy roster scores almost no zone points and the Bastion survives 88% of games: the game there is the light roster taking zones while the Bastion cannot be killed and cannot reach anything.
Weapons
- Cannon hits 40 to 48% and still has the most kills on every map (9 damage per hit). T10 stands.
- Missile rack is the second or third most fired weapon; Indirect fired 31 times in 1,000 Quarry games. T5 stands.
- Blade 81% hit, 5.9 per Fire, 630 to 1,661 Fires per 1,000 games. Melee share 15 to 30% by map. T28 stands.
- Pulse is always fired on Overdrive (2,042 Overdrive to 78 plain). T11 half-resolved by Overdrive.
- Riposte 0 in every batch: Marrow is in no kit. Not a bug; a gap.
New kits at best response, Quarry, 500 games
| Roster | Win | Its new mech survives |
|---|---|---|
| Lantern, Foreman, Courier | 36.4% | 15% |
| Drayman, Reaver, Courier | 43.0% | 16% |
Both signature kits die first on the open map.
Heat
Stress rolls 1.3 per game, meltdowns 0.22 per game at best response on Quarry. T26 holds.
Terrain, line of sight and zones — 2026-09-05
Terrain, line of sight and zones — 2026-09-05
Second batch, same rosters and seeds as the baseline, after the simulator gained terrain, elevation, line of sight, cover from geometry, zone scoring, and an AI that evaluates positions (modifier-aware shot value, threat, cover, high ground, zones). Crit margin is Armor + 4.
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 1000 --seed 1
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 1000 --seed 1 # open field, deploy columns
=== quarry
A Courier, Foreman, Reaver win 34.4% avg kills 0.6
B Bastion, Foreman, Courier win 65.6% avg kills 1.3
draws 0.0% wipes 11.4% avg rounds 6.9 first kill round 4.3
map quarry zone points/game A 5.7 B 5.6
rounds 4:1 5:14 6:40 7:945
weapon fires shots hit% glance full crit cover dmg/shot dmg/hit kills
Rifle arm 13552 13552 51.5% 35.5% 57.1% 7.1% 0.3% 2.8 5.5 604
Missile rack 9434 18678 51.3% 35.8% 56.8% 7.0% 0.4% 1.8 3.5 407
Cannon arm 6317 6317 42.9% 7.0% 58.3% 32.2% 2.5% 4.0 9.3 522
Autocannon arm 4776 14091 53.5% 50.4% 47.2% 1.8% 0.5% 1.3 2.4 240
Pulse arm 1839 3659 48.3% 64.3% 32.5% 2.8% 0.5% 0.5 1.1 43
Blade arm 177 177 66.1% 13.7% 63.2% 23.1% 0.0% 4.9 7.4 31
=== open field
A Courier, Foreman, Reaver win 20.4% avg kills 0.4
B Bastion, Foreman, Courier win 79.6% avg kills 1.2
draws 0.0% wipes 8.5% avg rounds 7.0 first kill round 4.3
What it says
- Lethality collapsed once mechs stopped walking into each other. Kills per game fell from about 1.7 to 0.6–1.3 and wipes from 18% to 8–11%. The positional AI trades at long range from cover instead of closing; first kill moved from round 2.6 to round 4.3. Seven rounds now feel short for a kill-based decision and right for a zone-based one.
- Zones decide the map games, kills break the tie. 5.7 vs 5.6 zone points per game is near parity; the 34/66 split comes from the Bastion's cannon converting a few long shots into kills. That is the intended shape of the objective layer, at a lethality that is probably too low.
- Range beats everything on the open field. B wins 80% on flat ground with the same rosters that were 58% on the old charging AI. When nobody has to close, the twelve-hex cannon and ten-hex missiles decide games. The map narrows the gap to 66%: buildings and foliage break the long sightlines. This is the strongest argument yet for hand-crafted maps over open boards.
- Melee never happens. 177 blade attacks in 1000 games. The AI has no reason to close through fire, and no melee system (F11) rewards it. Blade and jump legs are dead weight until FEAT-009.
- Autocannon fell from king to middling. 63% hit and 2200 kills on the open charge became 53% and 240 kills. Its six-hex range keeps it out of most engagements now. Rifles and missiles carry the damage.
- Cover is doing its job quietly. Only 0.3–2.5% of hits land on cover because the AI avoids shooting into hard cover (modifier-aware valuation). The rule works by deterrence, which is what a cover rule should do.
- Speed. The positional AI costs a hundredfold: 80–130 games per second instead of ten thousand. Fine for thousand-game batches; a sweep tool will want sight caching (filed).
Next
Tuning targets, in order: lethality on maps (round cap, weapon ranges, or armor), the range-dominance of the Cannon and Missile rack, the melee system, and an AI aggression knob so we can tell rule problems from bot problems (TASK-001, TASK-007).
Scoring weights are not the lever for light rosters — 2026-09-05
Scoring weights are not the lever for light rosters — 2026-09-05
Question from the design lead: a heavy must not be a mandatory pick; light frames with light weapons have to be a real roster. Kill Team balances hordes against elites partly by paying for board presence, so the obvious untested lever was our I4 scoring: 3 per kill, 1 per zone per round. rules.killPoints and rules.zonePoints are now sweep knobs (defaults 3 and 1; the bot does not read them, so the same seed plays the same game and only the scoreboard changes).
Rosters, map and seed as every other note: Courier, Foreman, Reaver against Bastion, Foreman, Courier on Quarry, 300 games per value.
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 300 --vary rules.zonePoints=1,2,3
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 300 --vary rules.killPoints=3,2,1
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 300 --aggression-a 1 --aggression-b 0.75 --vary rules.zonePoints=1,2,3
| Knob | Values | Light roster win (default bots) | Light roster win (A 1.0 / B 0.75) |
|---|---|---|---|
| zonePoints | 1 / 2 / 3 | 21% / 22% / 22% | 40% / 40% / 40% |
| killPoints | 3 / 2 / 1 | 21% / 20% / 22% |
Nothing moves, for two reasons the batch shows directly:
- Half the games are wipes, and a wipe ignores the scoreboard. Points only decide the games that reach round 7, and in those the kill difference and the zone difference point the same way.
- The light roster does not out-hold zones. Zone points per game by the light roster's aggression (300 games, heavy roster at default):
| Light roster aggression | Light roster win | Zone points A / B |
|---|---|---|
| 0 (kites) | 3% | 2.1 / 6.7 |
| 0.5 | 23% | 4.6 / 4.8 |
| 1 (brawls) | 42% | 4.1 / 2.0 |
A kiting light roster runs away from the zones too, so paying more for zones rewards the heavy roster. A brawling light roster does hold more zones, but it wins those games on kills already.
What it says
Speed is not currently a scoring currency on Quarry, and no scoring weight makes it one while wipes decide half the games. The light roster's problem is upstream of the scoreboard: it cannot reach or hurt the Bastion (range, anti-armor access). Keep 3 per kill and 1 per zone per round until those are fixed, then re-run this sweep; if a fixed light roster still cannot convert speed into points, the zone layout (H7) is the next suspect, not the weights.
Register T21 carries the design goal and the full list of levers measured.
Melee and reactions — 2026-09-05
Melee and reactions — 2026-09-05
Same rosters, seeds and map as the terrain batch, after F11 (strikes, charge, knockdown, grapple) and E6 (reactions) landed.
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 1000 --seed 1
A Courier, Foreman, Reaver win 29.9% avg kills 0.6
B Bastion, Foreman, Courier win 70.1% avg kills 1.6
draws 0.0% wipes 23.5% avg rounds 6.8 first kill round 3.8
map quarry zone points/game A 5.2 B 5.4
weapon fires shots hit% glance full crit cover dmg/shot dmg/hit kills
Rifle arm 17132 17132 46.5% 33.6% 55.1% 10.4% 0.9% 2.5 5.5 825
Missile rack 12562 21688 45.5% 32.9% 57.3% 9.5% 0.3% 1.6 3.6 474
Cannon arm 6177 6177 42.6% 6.6% 58.2% 33.4% 1.7% 4.0 9.4 560
Autocannon arm 4393 11456 48.6% 46.2% 47.8% 5.2% 0.8% 1.2 2.5 211
Pulse arm 1486 2821 47.8% 57.9% 33.1% 8.7% 0.3% 0.6 1.2 57
Blade arm 117 117 65.8% 18.2% 55.8% 26.0% 0.0% 4.6 7.1 16
Kick (light) 144 144 56.9% 25.6% 69.5% 4.9% 0.0% 2.6 4.5 11
Kick (medium) 77 77 49.4% 39.5% 47.4% 13.2% 0.0% 2.7 5.4 7
Punch (medium) 10 10 60.0% 33.3% 50.0% 16.7% 0.0% 3.2 5.3 1
melee 358 attacks, 1.0% of damage · charges 181 · knockdowns 25 · grapples 43 · throws 3 · pushes 94 · falls 0
reactions: disengage 32 · overwatch 91 · backup 9690 · riposte 0
What it says
- Backup Fire dominates the reaction budget. 9,690 backup shots in 1,000 games, about ten per game. Both rosters carry the Vex–Ilse bond, and the rule only asks for range and sight, so nearly every attack by one draws a free shot from the other. Rifle fires rose from 13.5k to 17.1k and Missile fires from 9.4k to 12.6k for that reason alone; wipes doubled (11% → 23%) and B's edge widened to 70%. Bonds are worth a lot more than the power model's 1.5 says. Tuning candidates: require the partner within 2 hexes (like the [+]), or make Backup Fire the partner's own Reaction and cost heat.
- Melee is real but still rare: 1% of damage. 358 strikes and blade attacks, 181 charges, 25 knockdowns, 43 grapples. The mechanics work (kicks land 50–57%, knockdowns happen, pushes happen), but the AI closes only when the position scorer already liked the hex. That is the aggression knob (TASK-001), not a rule problem yet.
- Kicks over punches. The AI kicks with Piloting 2 pilots and it pays: light kicks 57% hit, 70% full. No kicker fell in these games worth noting.
- Grapples rarely convert. 43 grapples, 3 throws: the lighter mech usually breaks free on its activation before the heavier one gets to throw. Either the class bonus is too small or Throw should be available in the same activation as a successful Grapple.
- Overwatch is used (91) and riposte never fires (0): Marrow is not on either roster. Fine.
- Falls: none. Nobody got pushed off a ledge on Quarry; the ledges aren't where the fights are. Map design note.
Next
Give the AI a reason to close (TASK-001), then re-read melee. Decide the Backup Fire proximity rule before the tuning pass; it is the biggest single lever found so far.
Ammunition loads and cannon range 10 — 2026-09-05
Ammunition loads and cannon range 10 — 2026-09-05
The package recommended after the heavy investigation: Cannon arm range 12 → 10 (TASK-022) and ammunition loads for Ballistic weapons (F12, IDEA-005), judged with each side at its best-response aggression. Design goal being measured: a heavy is not a mandatory pick (register T21).
Rosters, map and seed as every other note: Courier, Foreman, Reaver against Bastion, Foreman, Courier on Quarry, seed 1. The light roster carries loads as courier[rightArm=ap],foreman[leftArm=ap],reaver[rightArm=ap] (135 weight, from 129). Default bots unless stated; best response is A 1.0 / B 0.75.
The loads as shipped (v0 numbers)
| Weapon | Load | Wt | Pen | Shots | Dmg | Other |
|---|---|---|---|---|---|---|
| Rifle arm | Armor-piercing | 2 | 4 | 1 | 1d6+3 | |
| Autocannon arm | Armor-piercing | 2 | 3 | 3 | 1d3+1 | |
| Autocannon arm | Flechette | 1 | 0 | 4 | 1d3+1 | |
| Cannon arm | Armor-piercing | 3 | 6 | 1 | 2d6+2 | |
| Cannon arm | High-explosive | 2 | 2 | 1 | 4d6 | Limited 2 |
| Missile rack | High-explosive | 2 | 0 | 2 | 2d6 | Limited 2 |
| Missile rack | Incendiary | 1 | 1 | 2 | 1d6+1 | each hit adds 1d3 Heat |
The bot treats a carried load as a second profile for the slot and fires whichever has the higher expected damage against the target's core armor; Limited loads run out.
The roster game
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 1000
pnpm sim batch --a "courier[rightArm=ap],foreman[leftArm=ap],reaver[rightArm=ap]" --b bastion,foreman,courier --map quarry -n 1000
pnpm sim batch --a "courier[rightArm=ap],foreman[leftArm=ap],reaver[rightArm=ap]" --b bastion,foreman,courier --map quarry -n 600 --aggression-a 1 --aggression-b 0.75
| Light roster | Default bots | Best response | Wipes | Bastion survival |
|---|---|---|---|---|
| Before this pass (cannon 12, no loads) | 23.2% | 34.0% | 47% | 97% / 74% |
| Cannon range 10, no loads | 38.6% | 33.5% | 39% | 94% / 79% |
| Cannon range 10 + AP loads | 41.5% | 42.3% | 36% / 45% | 93% / 74% |
| Same, heavy roster spends its last 2 weight on an AP Courier | 39.7% | 40% |
Two readings. Range moved the default-bot game (23 → 39) and did nothing at best response; loads moved the best-response game (34 → 42) and a little at default. Together they take the light roster from 23% to 42% on both readings, five points short of the 45–55% band.
The heavy roster's reply is thin by construction: at 143 of 145 weight it can afford one 2-weight load, and that bought it back two points.
Unit fights
pnpm sim batch --a "courier[rightArm=ap]" --b bastion --map quarry -n 600
| Duel vs Bastion | Before | Cannon 10 + AP |
|---|---|---|
| Courier | 39% | 51% |
| Foreman (AP on the rifle) | 35% | 38% |
| Reaver (AP on the autocannon) | 7% | 33% |
The Reaver's jump is the cannon range, not its load: the bot fired the standard autocannon 882 times and the AP round almost never, because at Pen 3 with 1d3+1 the AP autocannon does no more expected damage against Armor 8 than the standard round (2.0 vs 2.0 per hit). Burst weapons lose too much per-shot damage to a one-die step. Register T22.
Do the other loads get used?
pnpm sim batch --a "foreman[rightArm=flechette]" --b courier --map quarry -n 300
pnpm sim batch --a "bastion[rightArm=he]" --b foreman --map quarry -n 300
Flechette against a Courier: 102 flechette Fires to 0 standard, 2.1 damage per hit, Foreman wins 55%. High-explosive on the Bastion against a Foreman: 561 HE Fires in 300 games (both Limited shots nearly every game), 10.5 damage per hit against 8.1 for the standard round, Bastion wins 69%. The bot uses loads where they pay and the Limited count holds.
What it says
- The package works but does not finish the job: 23% → 42% for the light roster, target 45–55%. The remaining gap is the Reaver (27% survival, a melee kit the default bot still under-uses) and a Bastion that is still rarely targeted (93% survival at default).
- Loads are the right currency. The light roster spent its spare weight on Pen and gained nine points at best response; the heavy roster could not answer in kind. That is the asymmetry the design wanted.
- AP on burst weapons needs different numbers (T22): keep the dice and take a shot instead, or Pen 4. The rifle and cannon AP rounds behave as intended.
- Next levers, in order: the bot should prefer the heavy when it carries AP (focus fire, TASK-001); a second map with broken sightlines (T4 stays open for the map); Overdrive for energy weapons so the Pulse arm has its own version of this choice.
Same day: the AP retune and Overdrive
Autocannon AP Pen 3 → 4 (T22). Against Armor 8 the round now lands 75% of its dice instead of 67%, which is enough to beat the standard round (2.25 vs 2.0 expected per hit), and the bot fires it: Reaver +AP vs Bastion went from 882 standard Fires and no AP to 880 AP and 32 standard, and from 33% to 36% wins. Small, but the load is no longer dead weight.
Overdrive for Energy weapons (F12, IDEA-006 → Locked). The Pulse arm's Overdrive is Pen 2, 1d6, 1d6 Heat to the target, for +2 Heat per Fire; the bot fires it whenever the reactor can take it. Courier vs Bastion with Overdrive available: 47% (the Pulse arm fires in Overdrive 664 times to 106 standard); with AP on the rifle as well, 50%, and the rifle's AP round does the work.
pnpm sim batch --a "courier[rightArm=ap],foreman[leftArm=ap],reaver[rightArm=ap]" --b bastion,foreman,courier --map quarry -n 1000
pnpm sim batch --a "courier[rightArm=ap],foreman[leftArm=ap],reaver[rightArm=ap]" --b bastion,foreman,courier --map quarry -n 600 --aggression-a 1 --aggression-b 0.75
| Light roster +AP, after retune and Overdrive | Default bots | Best response |
|---|---|---|
| Win rate | 41.9% | 44.0% |
| Wipes | 40% | 47% |
| Bastion survival | 90% | 70% |
Without loads (Overdrive only, both sides have a Courier): 36.6% at default bots, within noise of the 38.6% before Overdrive existed. Overdrive is a heat decision, not a balance shift.
One point short of the band at best response. What is left is the Reaver (31% survival at default bots, a melee kit the default bot still under-uses) and a Bastion the light roster still rarely reaches at default aggression (90% survival).
The bench now has a load selector under every weapon slot that takes one, and the Tuner edits loads (a table under each weapon row) and Overdrive (four columns) in place.
Changes landed
data/parts.json: Cannon arm range 12 → 10;ballisticandenergyweapon tags; loads on the Rifle, Autocannon, Cannon and Missile rack.- Rulebook v0.6: F12 Ammunition, C3 loads table, B3 and E4 wording, K decision log.
- Engine: loads on builds and mech state,
loadon attacks, Limited counts, bot load choice, batch rows per load,kit[slot=load]andpart[load]team specs.
Lethality and the cost of reactions — 2026-09-05
Lethality and the cost of reactions — 2026-09-05
Two directives from the design lead after the melee batch: Backup Fire is too strong and reactions need a downside (prepare them as a Quick action), and about half of all games should end in a wipe. This note records the sweeps that picked the numbers and the batch that confirms them.
Rosters, seeds and map as the terrain and melee batches: Courier, Foreman, Reaver against Bastion, Foreman, Courier on Quarry, seed 1.
Step 1: Prepare (E4, E6)
Every reaction except the Overwatch shot now needs a Prepared mech. Prepare is a Quick action that arms the Reaction until the mech's next activation; reacting clears it. Overwatch already costs a Full action and arms itself.
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 1000 --seed 1
| Melee batch (before) | With Prepare | |
|---|---|---|
| Backup Fire shots / 1,000 games | 9,690 | 1,489 |
| Wipes | 23.5% | 11.3% |
| A win | 29.9% | 28.4% |
| Disengage strikes | 32 | 0 |
Prepare removed the free volley and put wipes back where the terrain batch had them. It also removed Disengage strikes entirely: the bot does not Prepare while adjacent (register T19).
Step 2: sweeps toward 50% wipes
pnpm sim sweep runs one batch per value of a single knob. 300 games per value unless noted, Prepare in effect.
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 300 --vary <path=v1,v2,...>
| Knob | Values | Wipes | Read |
|---|---|---|---|
roundCap |
7 / 8 / 9 / 10 | 11% / 21% / 33% / 46% | Works, but every step is a longer game; the 20-minute pillar says no |
rules.glanceFraction |
0.5 / 0.75 / 1.0 | 11% / 13% / 25% | Alone it barely moves; at 1.0 armor stops mattering |
rules.critMargin |
2 / 3 / 4 | 17% / 11% / 11% | Crits are not the lever |
chassis.heavy.armor |
6 / 7 / 8 | 10% / 11% / 11% | Heavy armor does not gate wipes |
chassis.medium.armor (100 games) |
4 / 5 / 6 | 16% / 17% / 12% | Noise at this sample |
arms.rifle-arm.weapon.damage (50 games) |
2d6 / 3d6 | 12% / 24% | One weapon's dice cannot carry it |
rules.durabilityScale |
1 / 0.85 / 0.7 / 0.6 | 11% / 24% / 46% / 65% | The lever. Every part breaks sooner, which is also pillar A3 |
rules.durabilityScale with glance 0.75 (600 games) |
0.8 / 0.75 / 0.73 / 0.72 / 0.7 | 44% / 46% / 52% / 55% / 56% | Glance at three quarters keeps armor a wall without a binary halving; 0.73 lands on target |
glance 0.75, durability 0.8, roundCap |
7 / 8 | 44% / 57% | Kept the cap at 7 |
Chosen: glance three quarters (F5) and Durability × 0.73, rounded to the nearest whole number and baked into data/parts.json (chassis 9/13/18, Rifle arm 6, Cannon arm 7, Shield arm 10, Heavy legs 12, and so on; kit hulls Courier 32, Foreman 42, Reaver 41, Bastion 55). The durabilityScale rule stays in the engine at 1.0 as a sweep knob.
Step 3: the batch after the change
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 1000 --seed 1
A Courier, Foreman, Reaver win 24.7% avg kills 0.8
B Bastion, Foreman, Courier win 75.3% avg kills 2.1
draws 0.0% wipes 50.9% avg rounds 6.4 first kill round 3.0
map quarry zone points/game A 4.6 B 4.8
rounds 3:13 4:54 5:108 6:175 7:650
weapon fires shots hit% glance full crit cover dmg/shot dmg/hit kills
Missile rack 8122 15668 49.4% 35.4% 57.1% 7.2% 0.3% 1.9 3.8 660
Rifle arm 10403 10403 46.8% 34.5% 56.9% 8.2% 0.3% 2.7 5.9 984
Cannon arm 5594 5594 41.1% 6.5% 58.8% 32.9% 1.8% 3.8 9.2 860
Autocannon arm 2899 8380 53.3% 50.1% 46.8% 2.3% 0.8% 1.5 2.8 242
Pulse arm 1096 2145 47.8% 59.6% 35.9% 3.9% 0.6% 0.7 1.4 70
Blade arm 63 63 76.2% 4.2% 72.9% 22.9% 0.0% 6.3 8.3 27
Kick (light) 91 91 60.4% 34.5% 61.8% 3.6% 0.0% 2.5 4.2 13
Kick (medium) 63 63 57.1% 25.0% 63.9% 11.1% 0.0% 3.3 5.7 8
parts destroyed Head 909 R Arm 1275 L Arm 1156 Core 2910 Back 1192 Legs 1273
stress rolls 1140: vents 362 exposed 593 meltdowns 185
melee 230 attacks, 0.9% of damage · charges 120 · knockdowns 16 · grapples 22 · throws 2 · pushes 48 · falls 0
reactions: disengage 1 · overwatch 63 · backup 922 · riposte 0
build survive kills/g dealt/g taken/g
A: Courier 40.6% 0.3 10.6 12.3
A: Foreman 20.8% 0.2 13.6 23.9
A: Reaver 25.4% 0.2 11.6 22.6
B: Bastion 94.7% 0.9 20.9 9.3
B: Courier 60.6% 0.6 14.7 10.9
B: Foreman 66.9% 0.7 22.4 16.8
What it says
- Wipes 50.9%, on the target. First kill moved from round 3.8 to 3.0; average length from 6.8 to 6.4 rounds; 65% of games still reach the cap, so points still decide a third of them.
- Backup Fire is a choice now: 922 shots per 1,000 games, from 9,690. The bot Prepares when a partner is in range and nothing else is worth a Quick.
- The heavy roster wins 75% and the Bastion survives 95% of games. Lethality rose on both sides but the lighter roster dies faster. Heavy armor and cannon range (register T4, T6, T18) are the next sweeps; this pass did not try to fix them.
- Parts break as intended: 2,910 cores and about 1,200 of each other slot per 1,000 games. Every game now tells a damage story (pillar A3).
- Melee is still 1% of damage. Unchanged by this pass; it waits on the AI aggression knob (T2).
- Disengage strikes are gone (T19): the bot will not spend a Quick to Prepare while standing next to someone.
- Stress fell with shorter games: 1,140 rolls from 3,001. Meltdowns 185.
A bug this batch found
Game 974 threw Reaver: cannot attack with leftArm: the Reaver charged, the Bastion's Overwatch cannon killed it on the way in, and the engine then swung with a dead mech. GameState.charge() now re-checks after the move; a charger that arrives destroyed, Prone, without the planned limb, or with its target gone either strikes with another limb or ends the Charge as a move (charge_aborted, +1 Heat, no recoil). Rulebook F11.3 carries the sentence. Higher lethality is what surfaced it: reactions kill more often now.
Revision the same day: glance back to half
The design lead wants glances to mean something and preferred them at half damage. Glance was never the main lever (½ → ¾ alone moved wipes 11% → 13%), so it went back, and durability took one more small step to hold the target.
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 600 --rule glanceFraction=0.5 --vary rules.durabilityScale=1,0.95,0.9,0.85
| Glance ½, durability vs the ×0.73 catalog | Wipes |
|---|---|
| ×1.00 | 43% |
| ×0.95 | 48% |
| ×0.90 | 56% |
| ×0.85 | 59% |
Applied: ×0.95 with rounding, which changes three numbers: Medium core 13 → 12, Heavy core 17, Heavy legs 11 (about ×0.69 of the original catalog overall). Kit hulls: Courier 32, Foreman 41, Reaver 40, Bastion 53.
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 1000 --seed 1
A 23.2%, B 76.8%, wipes 46.5%, avg rounds 6.4, first kill round 3.0, 67% of games reach round 7. Backup 948, melee 0.9%. Bastion survival 97.2% (was 94.7% at glance ¾), 7.3 damage taken per game.
Light weapons against the heavy, ½ vs ¾
Per hit, the expected fraction of a weapon's dice that lands is pFull + (1 − pFull) × glance, where pFull is the chance the d6 plus Pen reaches Armor (a natural 6 always counts):
| Weapon vs armor | pFull | at ½ | at ¾ |
|---|---|---|---|
| Rifle (Pen 2), Autocannon (Pen 1) or Pulse (Pen 0) vs Heavy core 8 | 1/6 | 0.58 | 0.79 |
| Cannon (Pen 4) vs Heavy core 8 | 3/6 | 0.75 | 0.88 |
| Rifle vs Medium core 6 | 3/6 | 0.75 | 0.88 |
| Autocannon vs Medium core 6 | 2/6 | 0.67 | 0.83 |
| Rifle vs Light core 4 | 5/6 | 0.92 | 0.96 |
So at ½ the light weapons lose about a quarter of their damage against Armor 8 compared with ¾, and the heavy wall is real again: they do 58% of their dice where the cannon does 75% against a Medium.
Duels against the Bastion on Quarry, 600 games each, default bots (glance ½ / ¾):
| Duel | Light kit wins | Bastion survives | Bastion damage taken / game |
|---|---|---|---|
| Foreman vs Bastion | 35% / 40% | 94% / 82% | 17.4 / 21.8 |
| Courier vs Bastion | 39% / 47% | 90% / 80% | 16.2 / 19.6 |
| Reaver vs Bastion | 7% / 9% | 99% / 98% | 6.6 / 8.1 |
Weapon lines inside those duels (every shot is at the Bastion): autocannon 82% glance, 1.9 damage per hit at ½ (2.3 at ¾); rifle 72% glance, 4.3 per hit (5.5); missiles 66% glance, 2.8 (3.5); pulse 76% glance, 1.0 (1.3).
At aggression 1 on both sides: Foreman 30% / 38%, Courier 55% / 59%, Reaver 45% / 46%; Bastion survival 92% / 76%, 89% / 78%, 92% / 82%.
Heavy core armor 8 / 7 / 6 at glance ½ with the standard rosters: A 23% / 22% / 22%. Armor still does not decide the roster game; range does (2026-09-05-aggression.md).
Reading. Half-damage glances make the heavy about 12 points more likely to survive a duel against a light kit and cut light-weapon damage against it by a fifth to a quarter. That is the wall the design wants, and it costs the roster game nothing it was not already losing to the cannon's range. If the wall ever needs softening, the honest levers are Pen on the light weapons or Armor on the heavy, not the glance fraction. Register T6 carries the numbers.
Foundry, the sightline audit, and the bot that could not walk around a wall — 2026-09-05
Foundry, the sightline audit, and the bot that could not walk around a wall — 2026-09-05
Two items from the roster balance queue: a second map with broken sightlines (register T4), and a bot that hunts the heavy when it carries armor-piercing rounds (TASK-001). Building the map exposed a third: the bot froze in place on any map where it could not see the enemy.
The audit tool
pnpm sim maps runs every registered map through engine/mapaudit.ts: for every pair of passable hexes it checks line of sight at ground level and buckets the pair by distance, so a map has a number for how much of it is rifle range (1–5), autocannon-to-rifle range (6–8) and cannon or missile range (9+). It also checks whether any deployment hex sees any of the other side's, and whether every zone is reachable on foot from both ends.
| Map | Passable | Clear at 1–5 | 6–8 | 9+ | Mean longest sightline | Deploy sees deploy |
|---|---|---|---|---|---|---|
| Flat | 640 | 100% | 100% | 100% | 30.8 | yes |
| Quarry | 606 | 93% | 77% | 48% | 27.8 | yes |
| Foundry | 534 | 78% | 45% | 12% | 20.6 | no |
The map
Foundry is 32×20 like Quarry. Two-hex buildings in staggered rows break every east-west lane inside about eight hexes; low walls stand beside the two outer zones; a raised slab (level 1, level 2 at the core) sits under the centre zone. The left half is authored and the right half is its 180° rotation, so the map is point-symmetric and side balance comes from the geometry rather than luck: the heavy-roster mirror reads 47/53 (Quarry's reads 46/54).
The first two drafts were too closed (long sight 8%, mid 37–40%) and produced games with 1% wipes and a Bastion that never fired. The shipped version trades a few interior blocks for low walls and foliage and lands at 12% long, 45% mid.
The bug
On the first Foundry draft the standard rosters drew 100% of 300 games with zero attacks. The bot's approach term used hex distance to the nearest enemy, so a mech with a building between it and the enemy found no reachable hex that scored better than standing still, and both teams stood still for seven rounds. Board.distanceField (multi-source Dijkstra over movement cost, no falls) now gives walking distance to the nearest enemy and to the nearest unheld zone, and the bot pulls along that. On Quarry this also lifted the standard light roster at best response from 34% to 44%: it had been getting stuck behind the pits too, just less often. Tracked as BUG-002.
The bot changes
- Hunt. A mech carrying an anti-armor load (a load whose Pen beats its standard round) plays at aggression +0.25 while a heavy core is on the board. The round is the reason to close.
- Focus fire. A target that allies can already shoot is worth 10% more per ally to one more gun.
- Walking distance for approach and zone pull, as above.
Batches
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map foundry -n 1000
pnpm sim batch --a "courier[rightArm=ap],foreman[leftArm=ap],reaver[rightArm=ap]" --b bastion,foreman,courier --map foundry -n 1000
pnpm sim batch ... --aggression-a 1 --aggression-b 0.75 -n 600 (best response)
| Light roster win | Quarry default | Quarry best response | Foundry default | Foundry best response |
|---|---|---|---|---|
| Standard kits | 35% | 44% | 54% | 50% |
| With AP loads | 50% | 44% | 63% | 55% |
| Wipes (standard / AP) | 34% / 40% | 46% / 49% | 24% / 21% | 34% / 30% |
Other Foundry readings from the 1,000-game batches: zone points 4.4 to 0.9 in the light roster's favour (speed converts into zones once the map is not a shooting gallery), Cannon arm 3,989 Fires (5,634 on Quarry), Bastion survival 96% but only 0.6 kills per game, melee 5.8% of damage at default and 20% at best response. The heavy roster answering with HE on the cannon does not help it (35%). Falls: still 0; a push off the level-2 core lands on the level-1 ring (T13 stays open, the next map wants a real edge).
What it says
- The design goal holds map by map, not on average. On Foundry the light roster is even with standard kits and favoured with AP; on Quarry it is even with AP at default bots and 44% at best response. The heavy is an asset on one map and a liability on the other, which is what a sideboard swap between games is for (I2).
- The 45–55% band is met on Foundry for standard kits and on Quarry for AP kits. The remaining outlier is Quarry at best response (44%), one point short.
- Lethality is map-dependent. Foundry runs 21–34% wipes against the 50% target set on Quarry; the target should be read per map, and Foundry's zone race is the intended alternative ending.
- The bot's navigation was a hidden confounder in every earlier batch on Quarry: the standard light roster's best-response number moved ten points from the fix alone.
Register: T4 map lever resolved, T13 still open, T18/T21 updated. liste: TASK-026 done, BUG-002 fixed, TASK-001 annotated.
Tuning baseline — 2026-09-05
Tuning baseline — 2026-09-05
First batch against the rulebook v0 placeholder numbers. Default kits, board edges deployment, no cover, no elevation.
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier -n 2000 --seed 1
Batch: 2000 games, seeds 1..2000, 0.21s
A Courier, Foreman, Reaver win 42.1% avg kills 1.6
B Bastion, Foreman, Courier win 57.9% avg kills 1.8
draws 0.0% wipes 18.3% avg rounds 6.9 first kill round 2.6
rounds 4:9 5:31 6:99 7:1861
weapon fires shots hit% glance full crit cover dmg/shot dmg/hit kills
Autocannon arm 21889 63492 63.2% 49.3% 42.2% 8.5% 0.0% 1.5 2.4 2209
Cannon arm 12705 12705 58.6% 5.0% 41.6% 53.3% 0.0% 5.5 9.4 2173
Blade arm 5674 5674 90.8% 20.2% 47.7% 32.1% 0.0% 6.8 7.5 1042
Missile rack 9706 19035 52.2% 27.1% 47.9% 25.0% 0.0% 1.9 3.7 721
Rifle arm 8993 8993 52.2% 26.7% 49.4% 23.9% 0.0% 3.0 5.8 585
Pulse arm 4500 8960 31.9% 56.2% 38.1% 5.7% 0.0% 0.4 1.3 74
parts destroyed Head 2061 R Arm 2571 L Arm 2530 Core 6818 Back 2986 Legs 3155
stress rolls 1806: vents 595 exposed 884 meltdowns 327
lock-ons 9217/15021
build survive kills/g dealt/g taken/g
A: Courier 2.4% 0.1 4.7 24.0
A: Foreman 47.3% 0.5 24.6 23.8
A: Reaver 66.8% 1.0 38.7 23.1
B: Bastion 99.0% 1.1 34.8 9.2
B: Courier 2.9% 0.2 9.5 26.0
B: Foreman 40.8% 0.5 24.8 35.0
What it says
- Games go the distance. 93% reach round 7; only 18% are wipes. Kill points decide most games. With zones unmodelled this is expected to shift, but lethality is on the low side for a 20-minute target.
- The Bastion is nearly unkillable (99% survival, 9 damage taken per game). Core Armor 8 plus a Shield arm at Armor 9 turns rifles and autocannons into glances half the time. Either heavy armor comes down a point, or light weapons need Pen, or the Heavy pays more Weight.
- Cannon crits 53% of its hits. Pen 4 against Armor 5–6 means the d6 only needs a 4. The crit threshold of Armor + 3 is too easy for high-Pen weapons; consider Armor + 4, or a natural-6 requirement for crits.
- The Courier dies instantly (2–3% survival, dead by round 3). Evasion 14 is not enough to offset Hull 43 when everything in range shoots it first. Light mechs need either more Evasion, real cover use, or a reason for the AI not to focus them (zones would help).
- Autocannon is the kill engine (63% hit, three shots, 2209 kills). Burst weapons benefit disproportionately from a low Evasion floor: a +3 accuracy pilot hits a Heavy at 6 on a 3+.
- Pulse arm is a dud (32% hit, 0.4 damage per shot). Its heat-adding role never mattered because Bastion has Reactor 11.
- Stress is common. 1806 stress rolls in 2000 games, 327 meltdowns. The AI vents reactively; check whether players would actually run this hot before nerfing heat.
Caveats
No cover, no terrain, no zones, greedy AI that always focuses the lowest-hull target in reach. Numbers will move when those land. Use this as the "open field" reference point.
Re-baseline after the crit margin moved to Armor + 4 (same command, same seeds)
A Courier, Foreman, Reaver win 40.9% avg kills 1.6
B Bastion, Foreman, Courier win 59.1% avg kills 1.8
draws 0.0% wipes 17.2% avg rounds 6.9 first kill round 2.6
weapon fires shots hit% glance full crit cover dmg/shot dmg/hit kills
Autocannon arm 22183 64497 62.9% 49.1% 49.0% 1.9% 0.0% 1.5 2.4 2181
Cannon arm 12730 12730 58.6% 5.7% 57.8% 36.5% 0.0% 5.4 9.3 2073
Blade arm 5845 5845 89.8% 19.6% 63.5% 16.8% 0.0% 6.8 7.5 1075
Missile rack 9842 19343 52.6% 27.4% 60.6% 11.9% 0.0% 1.9 3.7 701
Rifle arm 9261 9261 53.0% 25.1% 64.1% 10.8% 0.0% 3.1 5.8 620
Pulse arm 4527 9016 32.1% 56.0% 41.3% 2.7% 0.0% 0.4 1.2 80
Cannon crits fell from 53% to 37% of hits, autocannon from 8.5% to 1.9%, blade from 32% to 17%. Win rates and game length did not move: crits were not what decided games on the open field, damage volume was. Finding 3 is addressed; findings 1, 2, 4 and 5 stand and wait on terrain and zones.
The aggression knob, and what makes the heavy roster win — 2026-09-05
The aggression knob, and what makes the heavy roster win — 2026-09-05
Two questions from the design lead after the lethality pass: build the bot's aggression knob, and explain why Bastion/Foreman/Courier beats Courier/Foreman/Reaver three games in four. This note answers both with batches. Nothing in the catalog changed; the levers are listed at the end.
Rosters, seeds and map as before: A = Courier, Foreman, Reaver against B = Bastion, Foreman, Courier on Quarry, seed 1, 300 games per sweep value unless noted.
The knob
aggression runs 0 to 1 per side (--aggression, --aggression-a, --aggression-b; aiA.aggression in sweeps; two inputs in the bench). It scales the position scorer: the weight on incoming fire (1.4 at 0, 0.7 at 0.5, 0 at 1), the pull toward enemies when nothing is in reach, the reward for closing while a target is in reach (negative below 0.5, so a cautious bot kites), and the value of strikes. 0.5 reproduces the previous bot exactly, so every earlier batch is the 0.5 row.
pnpm sim sweep --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 300 --vary ai.aggression=0,0.25,0.5,0.75,1
| Both sides | A win | Wipes | Hit % | Melee share | Dmg / game |
|---|---|---|---|---|---|
| 0 | 3% | 26% | 38% | 0% | 63 |
| 0.25 | 8% | 40% | 41% | 0% | 75 |
| 0.5 (v1 bot) | 16% | 52% | 48% | 1% | 93 |
| 0.75 | 22% | 56% | 55% | 4% | 103 |
| 1 | 35% | 60% | 60% | 20% | 108 |
One side at a time, the other at 0.5:
| A aggression | A win | B aggression | A win | |
|---|---|---|---|---|
| 0.25 | 12% | 0 | 49% | |
| 0.5 | 25% | 0.25 | 37% | |
| 0.75 | 31% | 0.75 | 15% | |
| 1 | 44% | 1 | 21% |
Each side's best response against the other's default: A at 1.0, B at 0.75. Played that way (600 games): A 34%, B 66%, wipes 59%, melee 16% of damage.
pnpm sim batch --a courier,foreman,reaver --b bastion,foreman,courier --map quarry -n 1000 --aggression-a 1
At A = 1.0 against the default B: A 44.5%, melee 9.7% of damage (2,915 attacks, 1,339 charges, 164 knockdowns, 422 grapples, 60 throws), Bastion survival 71% and 22 damage taken per game (was 95% and 9). The light roster reaches the Bastion when it tries to.
Duels at aggression 1 (both sides, 400 games) against the same duels at 0.5:
| Duel | at 0.5 | at 1.0 |
|---|---|---|
| Reaver vs Foreman | 27% | 57% |
| Reaver vs Bastion | 31% | 49% |
| Reaver vs Courier | 44% | 56% |
The Reaver was the weakest kit under the default bot and is competitive under a bot that closes. Unit balance cannot be read off one bot setting.
Why the heavy roster wins
Each experiment removes one suspect.
| Experiment | Result | Reading |
|---|---|---|
| Mirror: heavy roster on both sides, 1,000 games | A 46%, B 54% | Side effects are worth about 4 points; the rest is the roster |
| Swap sides: heavy roster as A | A 79% | Roster, not side |
| Duel matrix at default bots (400 games each) | Bastion beats Courier 56%, Foreman 60%, Reaver 69%; Foreman beats Courier 55%, Reaver 73%; Courier beats Reaver 56% | Unit order Bastion > Foreman > Courier > Reaver under the default bot |
chassis.heavy.armor 8 / 7 / 6 |
A 25% / 24% / 23% | Heavy armor is not the cause; glance at ¾ already lets light weapons through |
arms.shield-arm.armor 9 / 7 |
25% / 25% | Not the shield |
arms.cannon-arm.weapon.range 12 / 10 / 8 |
A 25% / 40% / 47% | Range is the lever. At 8 the rosters are near even |
| Same at best response (A 1.0, B 0.75), 600 games | 34% / 37% / 40% | Range is worth 6 points once both sides play well; the rest is roster |
arms.cannon-arm.weapon.damage 3d6 / 2d6+2 / 2d6 |
25% / 23% / 35% | Damage matters less than range |
arms.cannon-arm.weapon.pen 4 / 3 / 2 |
25% / 17% / 20% | Pen is not it (inside noise at 300 games) |
arms.cannon-arm.weapon.heat 3 / 4 / 5 |
25% / 16% / 15% | Heat is not it |
| A fields a Medium with the cannon (Medium chassis, Targeting head, Cannon arm, Autocannon arm, Heavy legs, Missile rack, Ruko; 140 weight) against the standard heavy roster, 600 games | A 54%; the cannon Medium deals 27.5 per game, 0.9 kills, survives 67% | Whoever carries the cannon wins. The heavy chassis is not needed |
| B's Bastion carries a Rifle instead of the Cannon (roster rules off), 600 games | B 57% (from 75%); B's Foreman survives 86% | Removing the cannon closes 18 of the 25 points. The remaining 57/43 is spent weight (143 vs 129) and a Reaver the default bot cannot use |
Power model check: A totals 399 (118 + 150 + 131), B 408 (140 + 150 + 118). The model calls the rosters even; the batches do not. The gap is the cannon: the model prices it as the least efficient weapon per weight (T10) because it does not price "fires from outside everyone's range for seven rounds".
What it says
- The heavy roster wins because of the Cannon arm's 12-hex range, not because of the heavy chassis. Range 12 against 8 for the rifle and 6 for the autocannon means the Bastion fires from the first round and is answered only at long range with 1[−]. A Medium with the same cannon wins the same way.
- The default bot exaggerates it. A bot that never closes leaves the Reaver's blade and the Courier's speed unused, and the Bastion untouched (9 damage taken per game). At aggression 1 the light roster goes from 25% to 44% and melee from 1% to 10% of damage.
- Judge balance with each side playing its best response, not at one bot setting. Today that is A at 1.0 and B at 0.75, and the heavy roster still wins 66%.
- Heavy armor is fine where it is. Armor 8 → 6 moved nothing.
- Melee numbers were never the problem (T2). Strike and charge values hold up once the bot uses them.
Levers (not applied)
- Cannon range 12 → 10: light roster 25% → 40% at default bots, 34% → 37% at best response. The cleanest single change; keeps the cannon the long gun.
- Cannon range 12 → 9 or 8: 47% at default bots, 40% at best response, wipes fall to 31–52%.
- Cannon damage 3d6 → 2d6: 35% at default bots; touches the crit story (33% of cannon hits crit).
- Second map with broken sightlines (T4): the intended fix for range in general; Quarry has long lanes.
- Bot: teach it focus fire and Prepare while adjacent (T19: disengage strikes are still 0 at aggression 1).
The recommendation is range 12 → 10 plus judging future batches at best response. Decision tracked as TASK-021; the number as TASK-022.