Current update: **2026-10-28-r3** supersedes the legacy unlock policy. Read SETTINGS_LOCK.md and release.json first. The completed r2 handoff below is historical.

# Completed handoff — 2026-10-28-r2

Codex tested and completed the source/build/site work below. Current final SHA256:
`8caf93b508276b255e274b59573934c6ce7c09804d17bacec99ca93d22090662`.
Read FORUM_FIXES.md, CREDITS.md, FORUM_FOLLOWUP.md and SESSION_LOG.md for current
results, test limitations and delivery/migration status. The original handoff
below is historical; its untested-status and to-do list are superseded.

---

# Handoff to Codex: NHL94 forum fixes (Claude, 2026-10-28) - BUILT, NOT TESTED, NOT RELEASED

Current release: 2026-10-28 (settings record + PIM, released everywhere, see CHANGELOG top entry).
Work in progress on top of it, in the source tree (build passes; nothing deployed):

Build: `python3 tools/experimental/build_test.py "download/NHL 2026 - 94 Edition v5.1W.bin" OUT.bin --version 2026-10-28-r2`
(last output SHA256 9da3fd69bb84ffe4b9e02e8ac66656fcd31f902c0722d56cd164ea6210504ec3).

Source: forum post (jdc pasted it) + https://github.com/nhl94dotcom/NHL94MatchViewer/blob/main/docs/GENESIS_MECHANICS.md
Routine names: community disassembly https://github.com/abdulahmad/NHL94Genesis (src/*.asm, src/stubinc/equals.inc).
Our ROM still has most original code at original addresses.

## Changes (all new, untested)
- `tools/experimental/forumfix.s` + `forumfix.py` at $2EF000, called from build_test.py (before pim.s):
  1. Goalie lock (pass to a boxed player): passmode .findplayer `tst.w $34(a1); beq.w .next` -> `ble.w`
     at **$BD02** (original). The goalie-pass copy in patch.py HOOK5 ($2FF180, Fix 3) changed the same way.
  2. Runaway speed: friction in updateplayers at **$AC12** (`btst #0,$62(a3); beq; moveq #9,d2`) -> jsr +0:
     a pad-controlled skater (bit 3) gets bit 0 (deceleration off) cleared.
  3. Penalty shot: award ($ED96 in puckshootout, `clr.w $B772/$B774`) -> jsr +4 also clears $B776 and sets
     puck no-collision (bit 2 of $62(a3)); puckpenshot first call ($EF92, `bclr #1,$62(a3)`) -> jsr +8 clears
     bit 2 again (ghost puck) and keeps Z for the caller's beq.w.
  4. Awareness: asswingo $D0DE and asscentero $D2D6 `move.b $6B(a3),$40(a3)` -> $6A (Offensive).
- `tools/patch.py` Fix 3 HOOK4 ($2FF140): skater passes now get a minimum flight time of 2/8 s ("rocket pass";
  the game truncates the intercept time, t=1 => ~2x speed). Goalies keep GMIN/GADD.
- Item 5 (CPU pulls goalie only when down exactly 2): **already fixed in v5.1W** ($F754: bls / cmp #2 / bhi = down 1 or 2). No change.

## To do
1. Run the full regression set (commands in WORKFLOW.md / CHANGELOG entries): verify_critical, verify_critical_flash,
   verify_critical_trail, verify_season_navigation, verify_finished_season, verify_menu_team, verify_menu_font,
   verify_season_slots, verify_shootout (shootout uses the same puckshootout/puckpenshot path - check it!),
   verify_four_goalie / verify_goalie_request (goalie pass receiver changed).
2. Targeted checks: goalie pass on a penalty kill never selects the boxed player; human skater speed after a
   boards fall stays <= ~9500; a penalty shot after a puck flipped over the glass hits net/boards; short passes
   toward the receiver no longer exceed ~16000.
3. Release as a new version (policy: replace everywhere, carry saves, Bodin, site, notes).
4. jdc requests for the site (index.html):
   - a section/tab "From the NHL94 forum" listing each forum report and what was done (both reports so far:
     settings/PIM = 2026-10-28; this list = next release), so forum readers know where to look;
   - the Download button text does not show the release number (the file name is right) - fix the button label.
