# Intermission, ticker, controller identity and automatic replays — 2026-10-28-r6

Private evidence: work/intermission-review-20261028/. Release metadata and the
exact-source test receipt are release.json and QA_STATUS.json. Each new release
starts with fresh progress on both machines; controller mappings are retained.

## Scoring Leaders: one Start returns to the visible menu

Reported before period3: leaving Scoring Leaders produced a black screen until
Start was pressed again. The native replay exit at A39E/A3A2 sets C2F6 bit1,
meaning the caller should skip its next menu redraw because the handler already
drew. Automatic replay had no normal menu dispatcher to consume this bit.
Scoring Leaders later called native ExitStatsScreen9CD8, which blanks the screen
and reloads rink data. The stale latch suppressed the caller's required redraw.

This was reproduced with a real controller-shot goal and automatic replay,
followed by a timer-driven second-period horn and the actual pre-third menu.
The preceding ROM remained black after one Start; the corrected path redraws
and the following Start resumes play. No score/result/latch was injected in
that causal replay chain. Diagnostic cases additionally inject only the latch
to test clean/stale exits, before/during period3, with1/20-frame Start taps.

replay.s now consumes C2F6 bit1 immediately after its native automatic replay
returns. season/leaders.s also clears it before native ExitStatsScreen as a
local defensive exit contract. Manual replay retains its normal dispatcher.
Eight leader-exit cases and existing native replay/shot-panel tests cover this;
shot_panel_hook.py checks that automatic replay leaves no stale redraw latch.

## EA Hockey Night ticker: do not blank a foreign HUD layout

The screenshot's turquoise holes at the right edge of Minnesota/Pittsburgh's
scores came from crowd.s hiding its meter tiles during horizontal penalty view.
It wrote blank07FF cells after the native ticker had drawn there. The meter
owns HUD E000 rows24/26, columns27..30; the ticker overlaps those cells.

Horizontal view (C2EC byte bit7, sfhor) now invalidates BSHOWN without writing
into that other layout. Returning to ordinary play rebuilds the meters. Replay
still uses its separate clearing path. Native penalty setup (a queued valid
minor, processed by the engine) reproduces208 damaged pixels on the old ROM;
the new ticker has0 differences in the affected cells against a private
reference with only crowd drawing disabled. Meters return after the scene.
No crowd ratings or momentum rules change.

## Continue Season: the controller keeps the chosen club when playing away

seasonmenu.s correctly selects One-Home1 for even schedule indices and
One-Visitor2 for odd indices. The pre-Start settings lock called
seasonplayers.load, which remapped the saved count of One to One-Home1.
The native game then assigned the controller to the opponent in an away game.
The saved chosen club itself was still correct; logos alone missed the bug.

seasonplayers.startsettings preserves the existing Players1/2 across that load
only for one-human Regular Season. Co-op and playoff encodings keep their
existing paths. Paired native evidence: old away fixture C328=1/actor2(home),
fixed C328=2/actor9(away), native away club10=Edmonton. Home control stays1.

verify_season_identity.py covers all3 leagues, even/odd fixtures, one/two humans,
and Mini with3/4 humans:16 scenarios, two fresh emulator processes each. It
checks selected club, native controller sides, actual controlled actor team,
SRAM ownership/checksum and successful native play. Fixture snapshots must
retain D064=FF00 (human game) and D054=1 (User Records Off); zeroing D064 would
create a CPU-only fixture and give no valid human-ownership evidence.

## Main-menu Auto Replays: On / Off

The new final row affects automatic goal replays only. Default is On; Off
resynchronizes LASTG and discards the pending countdown without requesting an
automatic pause. Manual Instant Replay in the pause menu remains available.
The row stays editable in a started season, while game settings stay locked.

The preference is global across Full/Light/Mini and standalone native modes.
It persists through a normal restart. RAM F0DE is0=On,1=Off. The four-byte RP,
value, complement record occupies Full-bank logical2E18..2E1B (physical205C31),
in the shared-profile gap skipped by slots.copybank. Invalid/missing records
default On. Writes update that bank's native checksum with the mapper enabled
and interrupts masked. Native standalone player-count record2E14..2E17 and
context2D20 remain intact. New-version fresh-save policy resets the preference.

replaymenu.s at2DE000 provides row mapping, boot load and native writer. Labels
are relocated to2DE800; relative value groups to2DE900; count tables to2DEF00/
2DEF20. The eleventh row extends scrolling bounds. Existing row indices stay
unchanged. Native shootout's string-group pointer comparison is relocated too.
seasonplayers.writer dispatches only row20 to this preference writer; all other
rows retain their lock paths. crowd.defaults loads the global preference.

Seven targeted cases cover editing a locked season, switching slots, cold Off
and On boots, invalid tag/enum/complement, an actual controller-shot goal with
Off (no automatic replay), then pause->manual Instant Replay. Existing8 native
shot-panel cases retain replay lifetime, skip, all pads, timeout and pause.
No new physical controller/manual hardware playthrough is claimed.

## Combined release verification

All28 checks in run_release_checks.py must pass for this exact ROM and source:
original24 plus leaders_exit, hud_overlay, season_identity and replay_option.
The tests include four-pad goalies, shootouts, locks, menus/slots, Hard AI and a
complete native CPU game. Rebuilding independently produces identical bytes.
The5,283-byte difference against r5 is confined to the documented modules,
main-menu hooks/tables and ROM version/checksum. IPS reconstructs this ROM from
the original unmodified v5.1W base (MD5 8f863ecb108c1d213953bada9b98f4f2).

SHA256526ae0fd082774a83ca5f74b87b11e638d298f2a672d2a6974fd57d224339c35.
CRC32 1599055D. Detailed receipts and screenshots remain in the private workdir.
