# Keeper catch handoff and requested defaults — 2026-10-30-r6

jdc reported a dark-blue keeper marker after a catch and requested CPU control
(light-blue marker) with outlets to the requesting P1/P2/P3/P4 skater. His latest
start-menu screenshot shows Auto lines, Fighting Off, Hard, Auto Replays Off,
Crit Shots Off and Icing Off. This release follows that latest screenshot;
r5's earlier explicit Icing On request remains recorded in its historical notes.

## Reproduction and change

The r5 input recording contains a Y press before a later catch. The recovered
native pre-catch state already has P1 controlling keeper5. At replay frame9757,
r5 accepts the puck but leaves control5 and human flag0800 (flags8800). Its
existing pickup guard stops a new automatic keeper assignment but does not
reverse manual control established before the catch.

The same native state and input prefix on r6 accept the same catch, return P1
to a free skater (object4 in this scene) and remove keeper human ownership.
The native AI job flag is armed (8200), then processed normally (8000). The
native marker uses this CPU ownership; no palette or artwork is recolored.
No game positions, velocities, scoring, clock or catch results are forced in
this reported-scene regression. The checkpoint was recovered from the actual
r5 initial checkpoint and recorded inputs using the same core/devices; the
session started without pre-existing SRAM. No input queries are missing.
Subsequent branches change only controller input and are not independent games.

`goalie_ai.s` calls the **288-byte `goalie_catch_control.s` at2DBC00** from its
approved cooperative-keeper path. The new call is at **2FE46E**. The original
15322 pickup hook remains. The helper runs only after an accepted owned catch,
with Manual goalie control and a previously human-controlled keeper. It uses
the native **C0F8** assignment routine to release the keeper and select the
nearest eligible free skater. Other humans, boxed/unavailable players and
keepers are excluded. P3/P4 temporary bank mirrors are updated consistently.
Native pass/recovery flags are preserved. Every register, CCR and stack value
is restored; no new persistent RAM is allocated.

If nobody can receive control, native object-1 safely detaches the pad while
the keeper still becomes AI. A pad without an eligible skater cannot request
an outlet until a receiver is available. Opposing human teams, CPU-only
keepers, shootouts, penalty shots and stopped play keep their existing rules.
Explicit Y pressed after the catch can still select the keeper.

The ordinary outlet publisher now lets a fresh B reach the validated keeper
request path before ordinary switching. An accepted AI-keeper request keeps
that pad's current skater. Otherwise the existing immediate nearest-puck switch
continues. The adapter's raw short-tap publisher and first-valid-request priority
remain. Physical A is logical Genesis B in jdc's current controller mapping.
The r4 nonnegative-deadline grace remains; expired/queued whistles are not revived.

## Defaults and compatibility

`crowd.s` initializes Hard; `seasonplayers.s` uses Hard only for an empty season
without a valid difficulty record. Played legacy fallback remains Normal.
`replaymenu.s` uses Off for absent/corrupt Replay/Crit preferences while honoring
valid saved On/Off records, without writing fallback bytes at boot.
`slots.s` gives new/restarted formats Hard and Icing Off. Period length, Manual
keeper control, penalties and Auto lines retain their defaults. Edmonton stays
club10; an ongoing season keeps its saved club. Existing S/T records and played
legacy saves retain native Icing On; valid U records retain their own choice.
Only an empty season without a valid record receives the new Icing Off default.
The normal post-first-result locks are unchanged.

`--legacy-goalie-catch --legacy-menu-defaults --version 2026-10-30-r5` reproduces
r5 byte-for-byte. Both flags are required for that complete rollback.

## Exact-build validation

- **44** native handoff ABI/guard cases cover both teams, every active pad/count,
  pass flags, no free receiver, orphan/stale ownership, Auto keeper, opposing
  humans and special/stopped modes. All registers/CCR/stack, all12 whole objects
  and all8 control/side words are checked. These are synthetic native fixtures.
- **148** native adapter cases pass, including **68 added** pre-controlled-catch
  handoff/current-requester/hold cases: every pairing of keeper-owning pad and
  requesting pad for1–4 teammates, both teams, no takeover or stolen controller.
  The original ordinary two-pad, Y and deadline suites also pass.
- **5** reported-catch replay branches reproduce r5's retained human ownership,
  then verify current CPU catch, no-input hold and requests to the current skater.
- **6** native fresh/default/new-format/saved-choice cases check the actual value
  renderer. The 34-case Icing and existing Crit/Replay compatibility suites pass.
- All **75 shared suites executed;74 pass**. The inherited `finisher_hold` failure
  remains: native1.9046278288761302 vs held2.777268439788352; early one-timers2vs2,
  four Normal/Easy controls unchanged. Strict release gate stays **FAILED**.
  This retains the user-selected38-win playtest's documented AI limitation.
- Forty current no-B scenes (24000 frame samples) have identical puck, ownership,
  match-clock, score and native action/control timelines. **35 raw traces are
  exact to fresh r5;15 observations across5 traces are not raw-byte-identical**.
  Each difference is confined to one actor's X/Y, the goal-line prediction cache
  or sprite-list cursor, with both neighbouring whole rows exact. Coordinates
  must match an adjacent reference coordinate; derived cache/cursor values must
  stay within the adjacent native range. All other fields remain exact. These
  are consistent with video sampling during native updates; no complete raw
  invariance is claimed. The historical observer calls BEEC `shot_clock`, but
  the native disassembly identifies it as puckcross6 crossing prediction.
  Fresh r5/r4/r3 controls agree exactly; fresh r2 controls reproduce the immutable
  original traces. Binary scope proofs and all raw diagnostic failures remain.
- Independent rebuild, exact r5 rollback and original-base IPS reconstruction
  pass. Original MD5:8f863ecb108c1d213953bada9b98f4f2.

The expanded low-level B test now models P3/P4's actual physical side/control
words as well as their temporary P1/P2 mirrors. The earlier synthetic setup
left the physical words empty, which cannot represent a valid P3/P4 outlet.
Real four-pad gameplay independently checks the resulting ownership and target.
Global-option tests seed explicit saved On for edit flows and independently
check the newly requested Off fallback. Diagnostic failures remain recorded.

ROM SHA256:74f099b10459e000b4b50870e41617983641445f83c813328dba019b6b02fd7d; CRC32:25BBB406.
Fresh progress per standing release policy; configs/remaps/history retained.
The faceoff alignment report remains open; the Hard strength search stays stopped.

## Report provenance

All75 shared checks ran on this exact image. Four affected checks were rerun
on the same image after the fixture/scope corrections described above;71
unaffected implementations and results remain unchanged. The final report binds
the current source manifest and explicitly records this refresh. Timing
experiments were private and were discarded; final goalie_ai.s retains the
small cooperative catch call and the original operand forms. The finisher comparison also rebuilds the exact current-source no-hold ablation,
so the new catch hook's timing is shared by both sides; its four Normal/Easy
controls remain strict raw comparisons. The replay audit
retains all40 cases before reporting a comparison failure.

Native prediction-cache naming/updates were checked against the primary source:
https://github.com/Chaos81/nhl94-disassembly/blob/main/src/ram_addrs.inc
and its `findpc` routine in nhl94.bin.lst. Raw recordings/states remain private.
