Local prototype handoff — 2026-09-08
Current state
Work is on feature/local-playtest-prototype. The 100-question interview is answered and processed. The local prototype changes are implemented on this branch. They have not been merged, pushed, or deployed. Keep working on this branch until the owner finishes local testing and approves release.
The earlier boxed kit, melee, and packet work was released in 3e4d46b, with later documentation and shared-pool clarification commits. The live packet still represents that earlier release. Do not confuse its deployment evidence with validation of this branch.
Read first
- Original answered interview: preserve the owner's answers and question IDs.
- Processed interview decisions: current contract, precedence, and provisional defaults.
- Local prototype guide: implemented user flows and tuning limits.
- Rulebook and quickstart: current mechanics. HTML is generated.
- Implementation specification: architecture and original work packages; historical proposals yield to the processed answers.
- Initial inventory: historical baseline, not a list of current defects.
Implemented behavior
Workshop supports visual core boxes, component selection in any order, independent structural arms and held equipment, manufacturer browsing, candidate comparisons, multiple drafts and completed builds, and portable libraries. Hard build and arm-capacity limits apply. Weapons are affected through arms; a two-handed weapon can remain usable with one disabled arm. Pilot changes show faction and bond effects. Roster copies update only after an explicit comparison and confirmation. Locked match builds stay fixed.
A local match locks four public builds per side. Each player privately chooses three. Both teams reveal before the d6 end roll. The winner chooses an end; the loser places first and activates first. Placement alternates one mech at a time. Activations continue alternating across scoring boundaries. Maps are shuffled without replacement. Private between-game choices allow one reserve swap or stand pat and legal ammunition edits. BO1 and BO3 are bounded to one or three games; draws consume a game slot.
Human and bot play use deterministic serializable commands. Saves retain pending melee and reaction decisions, selected opportunities, private setup choices, content, and tuning. Multiple games and matches, pinned checkpoints, imports, rejected-file recovery, and exports are available. Completed ordinary saves retain the latest 20; unfinished and pinned entries remain.
Melee rolls both pools up front. Successful opportunities fund strikes and parries from one shared pool. Strikes choose a body part; defenders respond after the declaration. Higher Piloting acts first, with ties to the initiator. A fresh melee attack costs a Full action and gives fresh pools. Defenders keep their normal activation. Dual wielding, shields, two-die heavy parries, and impaired two-handed equipment are supported. These numbers are prototype tuning, not proven balance.
Prepared reactions pause for a human choice. Players choose the reactor, legal weapon, and firing point or pass the remaining movement. Passing preserves preparation and the Reaction. Resolve reactions in the chosen order and recheck legality. Disengage fires before leaving adjacency; Riposte triggers at the move's adjacent endpoint. Overwatch watches a fixed, visible cone at one elevation and requires LOS. Reaction attacks do not chain. Movement commits per hex, so climb Heat, falls, disabling damage, and wipes stop illegal continuation.
Overcharge is removed. Energy Overdrive remains. Each upward Jump-leg step adds Heat, including Boost and Charge. A drop of two or more levels causes a fall and ends movement. Games use seven normal rounds by default, then score and surviving Hull percentage. An exact tie gets one full bonus round, then can end in a draw. A wipe ends the game immediately.
Play has a larger board, zoom and pan, optional actor following, a pinned inspector, terrain and watch explanations, partial part-damage marks, exact hit previews, a shot log, opportunity pips, and public handoff banners. Private roster choices use a curtain. Desktop and tablet landscape are the supported prototype targets.
Replays support event, activation, and round navigation, speed, bookmarks, and inspection. Smoke and watch areas follow replay events. Sandboxes support custom setups, staged dice, exact resets, branches that preserve the original, and documented side/terrain mirrors. Practice activities cover melee, Overwatch, Heat, synergy, and actual private sideboarding. Optional help, keyboard controls, larger text, reduced motion, and extra fall confirmation are available.
Reports export JSON and Markdown with exact rules/catalog identity, commands, events, notes, targeted parts, actual durability lost, action and weapon use, and melee resources by source. Optional decision-time observation excludes pauses, hidden pages, and replay. It is not a turn clock. No remote play was added.
Architecture and evidence
engine/session.ts owns accepted commands and session restoration. Human reactions reconstruct the original command with previously accepted answers; only the dedicated suspension signal may pause it. Rejected commands do not publish state or consume live dice. engine/local-match.ts owns private setup, deployment, bounded games, and sideboarding. engine/battle.ts owns per-step movement and reaction legality. Content and prototype numbers remain in data/.
web/src/components/LocalPlay.tsx and Play.tsx present those controllers. Session storage, library import, event replay, observations, and match reports have separate modules. The ranged worked example J, seeded reproducibility, and controller/headless parity remain regression contracts. No balance conclusion follows from these functional tests.
Validation on feature/local-playtest-prototype:
pnpm test: 362 passing tests across 46 files. This includes real 2–0, 2–1, and three-draw local match histories and restoration.pnpm typecheck: passed.pnpm site:data && pnpm site:build: passed; generated rules and packet data are current.pnpm test:browser: eight desktop/tablet interaction checks passed, including direct sideboard practice and rejected-import recovery.- Independent reviewer
prototype_reviewverified 12 complete games across Quarry, Causeway, and Foundry against headless events, with identical restored events/results. The reviewer also checked private ammunition restoration and completed-game report export. - The reviewer concluded: “I independently agree this branch is in a great spot for owner local testing. No blocking findings remain from my review.”
The review approves owner local testing. It does not approve deployment, finished art, or balance.
Defaults still open to owner feedback
- Q034 specifies a cone but no angle or origin. The prototype uses a 60° cone from the watching mech, aimed at the clicked hex, at that hex's elevation, with the selected weapon's long-range reach.
- Q060 distinguishes public call signs from private build nicknames. The prototype uses the existing pilot name as the public designation. Workshop build names remain private nicknames.
These are implementation defaults, not new owner answers. Exact melee formulas, equipment values, and content breadth still need playtesting. Final art, remote play, and phone portrait optimization are outside this scope.
Local workflow
pnpm dev # build packet and serve the editable bench
pnpm test # deterministic engine and module regressions
pnpm typecheck
pnpm test:browser # Chromium desktop and tablet flows
pnpm site:data # export the local tracker for the packet
pnpm site:build # regenerate rules and build the whole packet
Use /bench/ for Workshop and Play. The development Tuner can write catalog JSON; hosted Tuner edits are exports. Do not deploy during local review. .liste/ is the local authoritative tracker and its changes must stay out of commits; retain site/data/liste.json in Git so other agents and the packet can read the work contracts. Existing tracked tracker files were not removed in this work.
Local testing follow-up: mech marker alignment
The owner reported offset-looking markers on the Play board. Measured body coordinates matched the hex centers, but the ID label sat below the hex and the click rectangle extended below the token. HexMap now translates the complete token from one hex center. Its base, silhouette, readable ID, centered click area and active ring stay together. The active ring CSS now keeps its fill transparent. Desktop and tablet browser checks measure token centering and label containment before and after zoom/pan; both pass. This is a presentation change; movement and rules are unchanged.
Local testing follow-up: stable board layout
The owner reported the board moving when prompts appeared above it. Play now gives the board a fixed desktop/tablet stage and moves turn controls, previews, melee, reactions, handoffs and inspection into an independently scrolling side panel. Setup and reporting tools sit below the live game. Only an explicit new/resumed session brings the board into view; combat transitions reset the controls panel alone. Browser checks measure the board's screen position and dimensions through movement controls, confirmation, melee declaration, parry and handoff. Desktop and tablet pass, including repeated runs. The independent reviewer found no blocking layout issues. This changes presentation, not game rules.
Strategy interface pass — 2026-09-09
The owner requested a larger strategy-game interface cleanup, motion and analyst explanations, with independent research and scored review. This supersedes the earlier intermediate layout description. Read the final strategy interface review and the updated prototype guide.
The focused battlefield, decision HUD, command families, actor-first melee panel, movement playback, preferences, modal tools and causal attack breakdown are implemented. Reviewer scores rose from 58/100 to 91/100 and 92/100 in separate final reviews, with no blocking findings in their reviewed flows. The same branch remains local and uncommitted; nothing was merged, pushed or deployed.
Safe elevation descent also received engine fixes: fall-only Walk access, safe continuing routes preserved while falls are enabled, functional-Jump reach checks, and a stepped rooftop practice exit. These implement H3; they do not introduce a new safe two-level drop rule. Final functional checks: 377 unit tests across 48 files and 26 desktop/tablet browser checks passed, with clean typechecking. The earlier test counts above are historical checkpoints.
Owner follow-up: begin turn and order organization — 2026-09-09
The owner found the start-player control hard to find and the command organization confusing. The single player handoff button now sits in the persistent HUD: Begin Player A/B’s turn for activations and Respond as Player A/B for melee/reactions. It works from Orders, Inspect and Analysis without changing board bounds or spending an engine action. Ready mech selection uses explicit activation cards. Before handoff, a short instruction replaces the disabled command wall.
Orders now has Movement, Ranged, Melee, Defense and Systems groups, with an All orders view and visible category filters. Each command has one place. The selected order remains named in the HUD while inspecting, with cancel/return controls in Orders. End activation stays outside the scrolling content. Weapon controls are accessible before arming a shot; a destroyed or jammed selected weapon falls back to an available slot so the displayed selector, preview and accepted command agree. No game mechanics changed in this follow-up.
Regression coverage adds persistent start controls across tabs, unchanged board/button bounds, handoff without spending a command, fixed End activation, category navigation and selected-order persistence, and an actual shot from the sole surviving arm after importing a save whose default selected arm was destroyed. The original answered interview remains unchanged. Continue on feature/local-playtest-prototype for owner local testing.
Final follow-up validation: 377 unit tests, 32 desktop/tablet browser checks and typechecking passed. Independent review scored 93/100 with no remaining blockers in the reviewed flows. The review page includes current turn-start and Defense screenshots. Packet data and production pages were regenerated locally; nothing was pushed or deployed.
Balance audit — 2026-09-09
Owner reported misses, armor walls and slow heavy engagement. Read the balance audit before tuning. Retained evidence: 21,200 distinct full-game trials and exact-math checks against 40,000 isolated seeded attacks. Foundry cannon Fires produce no body damage66.0%; Bastion first damage4.49 conditional with23.7% never damaging. Speed3 improves conditional timing but not consistent contribution; general Gunnery+1 reduces empty Fires; core Armor6 alone has little effect. All changes were cloned-catalog experiments; live tuning is unchanged.
Causeway identical-roster raw side-A advantage confirms69.8% on1,000 fresh seeds. Foundry Reaver bot oscillation has a concrete seed12000 trace. Do not tune weapons to compensate for these harness effects. T34–T37 and TASK-071–074 preserve the follow-up contracts; TASK-070 records the audit. Existing embedded save catalogs will not inherit future tuning. Continue on the local feature branch.
Isolated attack audit — 2026-09-09
The owner redirected balance work to non-bot attack metrics and possible multi-shot firing. Read the isolated audit. It retains 8,760,000 ranged program trials and 360,000 melee pool initializations, plus 368,880 legal candidate evaluations across two overlapping arm policies. New CLI: cli/isolated-attacks.ts, attack-lab-core.ts and attack-configurations.ts. Recipes and all result rows are in docs/tuning/evidence/2026-09-09-isolated/.
Matched raw-budget Cannon bursts reduce empty Fires 61.3% to 32.5%, but lower immediate kills and part destruction. Flak leads reliability, Lance Overdrive leads mean standardized damage, and some AP profiles underperform their anti-armor role. Small fast Sato/Lance builds match larger frames' opening output; this does not measure sustained Heat or roster utility. Utility/Conduit, Impact/Braced and Braced/Field expose exact body-stat dominance after equipment separation. Deadeye has no current legal allied pilot partner; the lab applies its normal aimed penalty. Ruko/Marrow can share Hollow.
Independent review checked retained data and corrected Deadeye, weapon-part destruction labeling and Heat scope. 387 unit tests across 51 files and typechecking passed. T38–T42 and TASK-075–078 preserve evidence and decisions; TASK-071 now includes the burst-profile recommendation. No live catalog or combat rule changed in this audit. Continue local branch testing; no push, merge or deploy.
Burst-fire demo and lethality — 2026-09-09
Owner authorized reliable split ranged fire, lethality measurement and meaningful demo item tradeoffs. Read the current burst/lethality report and body audit. These supersede the prior audit's unchanged-live-data status.
All ranged base/load/Overdrive profiles now use multiple small-die projectiles; all printed ranged Accuracy values increased by 2. Rifle, Cannon, Lance and HE/Overdrive split their previous main raw budgets. Rifle AP is 2×(1d3+1); Cannon AP keeps 3×1d6; Flak AP keeps 1d3+1. Melee profiles remain unchanged. Whole-volley Aimed Shot is Full with normal penalty, targets every projectile at one part and spends Heat/ammunition once. It still allows ordinary Walk; it gives up Quick action uses such as Vent.
Conduit capacity 7, Braced capacity 10, Field durability 9 remove four confirmed equal-Size numeric body dominances. All six stock kits remain legal. Tuner labels old P/Pwt uncalibrated; the repeatable catalog audit and measured cost/outcome vectors are the current foundation, not a claimed universal power number.
Retained evidence includes 2.1 million candidate-screen fresh attacks, 6.36 million baseline/current holdout fresh attacks and 420,000 persistent lethality sequences across baseline/current/lower-damage catalogs. Seven-standard-gun empty Fires fall 41.5%→24.2%, mean damage 3.05→3.72, and fresh kills 1.19%→0.78%. Extra blanket damage reductions delayed kills too much and were not selected. Aimed Core is a human-playtest hotspot: stock Bastion→Foreman median 2 clear / 3 hard Full actions, versus 4 / 6 ordinary Fire+Vent. Passive 3v3 focus/distributed results describe attrition potential, not competitive win rates.
Playtest observations and JSON/Markdown exports now record deathImpact: deduplicated deaths, first death and known cause, survivor-count transitions, credited kills, later activations and first-kill/winner association with partial-session/causality caveats. Unknown command stamps remain unknown. Heat deaths, mutual destruction and post-death counts received independent checks.
Final validation: 403 tests across 55 files, 34 desktop/tablet browser checks, typechecking and production packet build passed. Independent agents reviewed whole-volley rules, sustained sampling/censoring/Heat, actual-session death attribution, and all reported numeric results; no remaining blockers. T38–T40 now record implemented demo tuning; T43–T45 and TASK-079–082 retain current evidence and human follow-up. TASK-071/076/078 are done for this local prototype. TASK-017 scalar calibration and TASK-077 pilot synergy remain separate open work.
Continue on feature/local-playtest-prototype. Start a new match to use current demo catalog; existing saves retain embedded values. No push, merge or deployment. Keep .liste local and export site/data/liste.json.
First deaths and wipes — 2026-09-09
Owner requested death timing, wipe rates and related attrition measures. Read the full-game diagnostic and the separate controlled distributions. This follow-up changes analysis and documentation only. The burst demo rules and catalog remain unchanged.
Retained 15,200 complete bot-game executions: 7,200 aggression-grid games, 4,000 primary games and 4,000 mirrors. These are not independent seeds: seeds repeat across policies, maps and roster orientations. Each primary map has 500 paired seeds and 1,000 games. First deaths peak in round 2 on Flat/Quarry and round 3 on Foundry/Causeway. Wipes occur in 73.9%, 55.2%, 27.2% and 53.1% respectively. First-kill side wins 78–81%; this is an association, not a causal estimate. Teams behind 2v3 win 19–22% after that disadvantage persists to any later activation start.
Courier is 55–90% of first victims, with two Courier copies among six fielded units. Flat first victims have no prior proactive attack in 30.4% of games, though all have started an activation. Support and reactions are excluded from proactive attacks. Foundry has fewer wipes, but 211/272 wipes leave all three winners alive. T46/T47 and TASK-084 record follow-up diagnosis alongside human-playtest TASK-082. T36/T37 remain unresolved: current Causeway heavy mirror reads 79.8% raw Side A; existing Foundry bot movement can distort combat participation. Avoid tuning game numbers to compensate for bot artifacts.
The analyzer in cli/game-attrition.ts preserves death causes, action history, survivor transitions, comeback denominators and first-death censoring. cli/attrition-batch.ts retains compact per-game rows plus catalog/rules and exact commands. cli/plot-attrition.py creates the two report charts with matplotlib. Evidence and source fingerprints are in docs/tuning/evidence/2026-09-09-game-attrition/. Independent review checked all 12 result files and 15,200 rows. Full validation: 407 tests across 56 files and typechecking pass. TASK-083 records the completed measurement work. Continue on the local feature branch; no push, merge or deployment.
Enraged prototype and paired measurement — 2026-09-09
Owner rejected the earlier comeback proposals and authorized trying a team Enraged bonus after an enemy-caused casualty. E9 is now enabled in new games: each surviving ally queues its next own activation, with +2 ordinary movement allowance and one offensive reroll shared across that activation. The prototype rerolls the first eligible failed ranged hit or offensive opportunity die in initiated melee. It retains the replacement even if it fails. Boost/Charge, defensive pools and reactions get no extra allowance/reroll. Another casualty queues or refreshes a future activation without stacking or refilling the current reroll. Self-inflicted/environmental deaths do not grant it; enemy-inflicted Heat and lethal pushes do.
Pending/active status, ready/spent reroll, original/replacement die faces and base-odds preview caveats are visible in the play UI and event replay. New dice consumption is documented in the simulator spec. Sessions now use local-prototype-4; old-engine saves are rejected without modifying their original exports. Start a new match. New partial rule overrides retain defaults; the paired baseline explicitly sets rules.enraged=false. Both baseline and enabled games use the current engine, including the bot's destroyed-Legs Jump restriction fix.
Read the Enraged report. Evidence in docs/tuning/evidence/2026-09-09-enraged/ includes 30,400 complete bot-game executions: 8,000 primary, 14,400 grid and 8,000 mirror. There are 15,200 matched pairs with seeds reused across orientations/maps/policies. Every first-death prefix matches and no Enraged reroll occurs before that death. Paired intervals resample seed clusters with both orientations together. Another 180,000 fresh fixed-position attacks isolate the offensive reroll; they exclude movement and bot policy.
The result is stronger retaliation, not a consistent comeback gain. Primary first-loss-side wins OFF→ON: Flat 20.5→17.5%, Quarry 26.9→26.8%, Foundry 21.5→26.0%, Causeway 22.9→22.4%. Only Foundry's primary increase excludes zero in its exploratory paired interval. Quarry retaliation before another own loss rises 66.4→78.4%, but wipes rise 52.7→66.7%. Causeway mirror asymmetry and Foundry bot routing remain interpretation limits. No larger bonus was selected. T48 and TASK-085/086 retain implementation, evidence and human follow-up.
Independent code, UI/replay and full retained-data reviews pass. Final unit validation: 433 tests across 61 files, clean typechecking, and 36 desktop/tablet browser checks. Continue on feature/local-playtest-prototype; no push, merge or deployment. Keep .liste local and export site/data/liste.json.
Permanent Enraged duration experiment — 2026-09-09
Owner asked what happens if Enraged becomes permanent. An optional rules.enragedDuration='game' candidate now preserves the first qualifying enemy-casualty trigger and next-own-activation delay, then refreshes +2 ordinary movement and one offensive reroll on every later own activation. It does not stack or grant reaction/Boost/Charge bonuses. Both teams can acquire it. The accepted default remains one activation; DEFAULT_RULES and normal v4 exports are unchanged.
Candidate sessions use local-prototype-4-enraged-game so older v4 readers reject them instead of silently treating them as temporary. Current readers verify that the capability marker matches the explicit duration setting. Omitted/'activation' uses ordinary v4. Independent pre-change golden sessions retain identical events, snapshots, movement budgets and future RNG. The optional continuation event is visible in replay and candidate inspection; no new default setup control was added.
Read the permanent-duration report. Retained 16,000 full bot games: 8,000 primary and 8,000 mirrors, plus 80 separate smoke games. These are 8,000 full matched pairs; seed reuse and orientation clustering remain explicit. Mirrors use equal 0.75 policies on every map. No new aggression grid was run: this is a fixed-policy duration comparison, not a re-equilibrated balance verdict. All first-death histories match, and simulation-source hashes stayed frozen.
Primary first-loss wins temporary→permanent: Flat 18.4→24.8%, Quarry 24.8→27.0%, Foundry 26.3→29.6%, Causeway 21.3→26.0%. Quarry's exploratory paired interval includes zero; the other three increases exclude zero. Wipes increase on every map, including Foundry 32.2→43.6%. The continuing bonus also sees substantial use at equal or greater living-unit counts. This is a stronger recovery candidate with increased attrition, not a selected replacement for E9. T49/TASK-087 preserve the result; TASK-086 remains human follow-up.
Validation: 440 tests across 62 files, typechecking, and both focused desktop/tablet Enraged browser checks pass. Independent engine/default-compatibility and all retained-data checks pass. Continue on feature/local-playtest-prototype; no deployment, push or merge. Keep .liste local and export site/data/liste.json.
Defensive Enraged comparison — 2026-09-09
Owner asked about a defensive reroll after the permanent-duration experiment. The optional permanent defensive variant replaces the offensive reroll with one forced replacement of a successful incoming hit or committed melee strike. It keeps +2 ordinary movement, enemy-caused casualty eligibility, next-own-activation delay, and no stacking. Defense persists between activations and refreshes at each later own activation start. Melee cancellation spends the declared die and passes the turn without parry; shield/parry dice are unchanged. Reactions can be defended. Replacement modifiers remain fixed, and a replacement can still hit or gain a natural 20.
Select rules.enragedDuration='game' and rules.enragedReroll='defensive' in an explicit scenario. Candidate saves use local-prototype-4-enraged-defense. Temporary defensive combinations are rejected. Ordinary v4 and permanent-offensive golden histories/future RNG remain identical. UI/replay shows defense readiness, spending, incoming faces, canceled strikes, and base-odds caveats. Live E9 remains temporary offensive; no setup default was promoted.
Read the defensive report. Retained 16,000 full executions (8,000 matched pairs), plus 80 smoke games. Primary seeds 250000–250499; mirrors 260000–260499. All first-death prefixes match and source hashes stayed frozen. Compared permanent offense→defense: first-loss wins Flat 23.2→22.3%, Quarry 26.8→24.0%, Foundry 29.7→24.9%, Causeway 27.6→20.5%. Foundry/Causeway decreases exclude zero; other two remain uncertain. Wipes fall 7.2–11.9 points, while post-first-death empty Fires rise 5.8–7.4 points. Removing offense and adding defense both contribute. T50/TASK-088 record the result; human follow-up remains TASK-086. No re-equilibrated or human balance verdict; Causeway mirror bias and Foundry routing persist.
Separate agents approved engine/UI and independently recomputed primary outcomes. Root audited all 12 retained cells and wrote the final report after agents became unavailable. Validation: full 457-test suite passed, then two additional cancellation/session tests passed with the changed suites (14/14); clean typechecking and four focused desktop/tablet checks. Continue locally on feature/local-playtest-prototype; no deployment, push, or merge. Keep .liste local and export site/data/liste.json.
Current decision: permanent offensive Enraged — 2026-09-09
The owner selected permanent offensive Enraged after the offensive/defensive comparison. This supersedes the temporary-default statements in the earlier dated entries above. After an enemy-caused allied death, survivors qualify for the rest of the game beginning at their next own activation. Every later own activation refreshes +2 ordinary movement allowance and one shared offensive reroll. First-failure selection, replacement-kept behavior, no stacking/refill, and reaction/Speed/Boost/Charge exclusions remain unchanged. Both teams can qualify regardless of unit-count advantage. Defensive rerolls remain experimental.
New sessions and local matches pin permanent duration and use local-prototype-4-enraged-game. Restored base-v4 files pin omitted duration to activation before any command or deployment replay; old temporary games stay temporary, and existing permanent games stay permanent. No v5 migration. Current rulebook E9, Lite Rules, GDD, prototype guide, simulator spec and UI now reflect the decision. Historical reports retain their original data and carry dated decision notes. T49/T50 and TASK-089 record adoption; TASK-086 remains the human-playtest follow-up.
Independent review approved actual legacy-save event/RNG identity and old/new three-game match propagation. Validation covers 462 tests across full/focused runs, clean typechecking and four focused browser checks. A round-cap assertion was corrected to allow the existing I5 tie bonus round; no round rule changed. Continue on feature/local-playtest-prototype; no deployment, push or merge. Keep .liste local and export site/data/liste.json.
Current map correction — 2026-09-09
TASK-091/T51: all authored 32×20 maps now have exact 180° rotation of terrain, elevation, deployments and whole objective flowers. Quarry, Foundry and Causeway have four non-overlapping seven-hex zones; Flat remains an open control without zones. Current rules distinguish the theoretical 21-point zone ceiling per team from the 28-point combined board ceiling over seven normal rounds. Each team has three deployed mechs and can hold at most three separate zones per checkpoint. The fourth zone adds combined scoring opportunity without changing the scoring rule. Structural tests enforce symmetry; the completed TASK-090 paired mirror diagnostic is in docs/tuning/2026-09-09-multivariant-balance.md. Historical reports are unchanged. The command-reserve option belongs to that study, not live default rules. No deployment or push.