# 38-win base maintenance — 2026-10-30-r2

The selected 2026-10-30 tactical base is retained. That earlier image won 38 of 50
Edmonton Hard games against Chicago Normal, goals 132–66. This maintenance has
not been given a new 50-game qualification series; the win-rate search stays stopped.

## Changes

- **Crit Shots:** its menu row rejects Left/Right after the selected season has
  completed match 1, including cold boots and Full/Light/Mini slot changes. The
  existing global preference record, On/Off shot behavior and rendering remain.
  Before a completed first match and in native modes it remains configurable.
  Auto Replays and every other menu option retain their existing behavior.
- **B player switching:** a fresh physical B selects the eligible teammate
  nearest the actual puck when the controlled skater does not own it, including
  own-goalie possession and an old pass animation. Another human's player is
  protected. B with your skater's own puck retains passing; Y retains its existing
  goalie/outlet behavior. A goalie outlet follows the pressing pad's newly
  selected skater. Holds do not repeatedly switch; a new press can switch again.
- **Stars of the Game:** retire the shot panel and crowd meters before the native
  window is drawn. Its right border can no longer be erased by a shot-panel
  timeout. Original names, font, frame, score and statistics are preserved.

## Exact-image evidence and limitations

All 67 required checks ran: **66 passed; finisher_hold retains the same known
failure as the selected 38-win base. The strict release gate remains FAILED.**
In that comparison, mean receiver slot distance is 2.777 versus 1.905 with native
tracking; early direct releases remain 2 versus 2. That existing AI policy was not
silently replaced while repairing controls and graphics.

New coverage includes 21 real-menu Crit lock/boot/slot cases; all 43 preference and
physical-shot cases; 12 native Crit rendering cases; 156 input-entry/native cursor
assignment cases; 41 ordinary and 80 adapter keeper cases; 14 native postgame HUD
contexts; and 40 unchanged AI replay scenes (24,000 frame samples). Observed B
switches in 67 real-input clips occurred 1–2 frontend frames after the press.
Seven two-match controller lifecycles, including natural matches, and two cold
boots per lifecycle pass. The lifecycle driver was updated to press normal Start
on the new postgame HUD state; the original failed driver run is retained.
Scripted native inputs are not a new physical-controller playthrough by a person.

All 40 stored pressure/point/relay/finish trajectories match the selected 38-win
image byte-for-byte when no B is pressed. Original AI modules, roster attributes
and native skating/pass/shot/assignment code are unchanged. Seven independent
rebuild/rollback comparisons and original-v5.1W IPS reconstruction pass.
The first maintenance draft introduced an AI timing regression; its full failed
matrix/source/image are retained. The final event-based input/HUD design restores
those 40 original traces without padding, RNG writes or physical forcing.

ROM SHA256: f2a6d2ee40f4ac6c7bfe3277fe1859930fc1c579f1cb15aed742c1798f8fd9a3
CRC32: AD60AF42. Current machine-readable report: [QA_STATUS.json](QA_STATUS.json).

## Source, hooks and exact rollback

- Native input dispatcher: B1B6 -> fourgoalie at 2EA600; ordinary switch module at
  2DB000, with compatibility entries at 2FD900/+4. The existing outlet request
  entry 2FDC0C classifies fresh physical B only after its original no-button return.
  No-B gameplay keeps its original executed paths. Files:`switch.s`,
  `fourgoalie.s`, `outlet.s` and `verify_b_switch.py`.
- Crit season writer: seasonplayers entry 2EB02C. Row 22 checks selected-season view,
  actual completed-game index and running/playoff/completed-season lock state.
  The tagged global CT record remains logical SRAM 2E1C..2E1F; no new save format.
- Native Stars entry 18514 now calls 2DB600 before the original BSET/branch contract.
  Cleanup exports are crowd +40 (2E0028) and shotmeter +8 (2ED008). Custom HUD state
  F738 = A507 marks postgame ownership; existing comparisons cover it without extra
  ordinary-frame instructions. Replay input scripting still covers only A502..A506.
  Files:`stars_hud.s`, `crowd.s`, `shotmeter.s`, `verify_stars_hud.py`.

With the normal builder input, these flags recreate the exact previous 38-win image:

```
python3 tools/experimental/build_test.py base.bin old38.bin \
  --legacy-crit-lock --legacy-b-switch --legacy-stars-hud --version 2026-10-30
```

Add `--no-hard-tactics --version 2026-10-29-r3` instead of the final version flag
to recreate the exact earlier r3 image. Apply hooks only with their matching
relocated modules; full byte exports and source are included in the tools ZIP.

Fresh progress applies to each new release on jdc and Bodin. Controller remaps,
configs and history are preserved. Remaining planned work is in [TODO.md](TODO.md).

## Delivery

The exact r2 ROM and IPS, source archive and QA report are published. Downloads
and the canonical workspace now contain r2; the preceding current image was
replaced. Local progress cleanup completed, with controller remap and play-history
hashes preserved. Steam RetroArch launched the r2 image successfully. Bodin's
existing playlist update is queued; remote installation is not yet confirmed.
