# Manual keeper passing — 2026-10-30-r13

## Behavior and code

A fresh logical Genesis B (jdc's physical A/pass) from an explicitly owned,
puck-holding keeper now enters native B1C0/B72E/BC06. Previously the immediate
B-switch path exempted an owned skater but deliberately allowed an owned keeper
to switch. The two early branches now exempt every current puck owner. Without
possession the existing nearest-puck switching, human ownership and unavailable
player guards remain. Automatic catch handoff and CPU-keeper outlet requests
are unchanged. Native assignment to a receiver at release remains allowed.

`WITH_MANUAL_KEEPER_PASS` controls the two branches in switch.s and fourgoalie.s.
`--legacy-manual-keeper-pass --version 2026-10-30-r12` rebuilds exact r12. The
ordinary module remains at2DB000; the adapter module remains at2EA600. Branch
shortening moves later labels within those modules; the adapter deadline call
is now2EAAC8 instead of2EAACE. No new global hook or RAM field is allocated.
Original passing, physics, input polling, AI, ratings and season code are exact.

## Regression evidence

- `b_switch`:156 native input-dispatch/assignment cases. The12 owned-keeper
  cases now stay on the keeper at early dispatch; r12 selects a skater in all12
  when exercised through the same observer. Ordinary and adapter P1–P4, both
  teams, owned skaters, loose/opponent puck, other humans, downed/boxed players,
  held B, keeper flight and no-input cases retain their expected behavior.
- `manual_keeper_pass`:68 paired contexts,136 native core runs. Both teams,
  normal six-button1–2pads and adapter1–4pads, every active requester, both native
  keeper options and2/5-frame taps at different delays. Native pass recipient,
  outgoing vector, keeper ownership before release, no CPU-outlet queue and
  other pads' unchanged controlled skaters are asserted.
- Geometry and catches remain native. Adapter captures come from unforced CPU
  play after clearing human ownership; normal captures are historical native
  keeper states. The fixture configures human sides/pads and explicitly assigns
  manual ownership after the catch/held state. It never writes actor/puck
  position, velocity, timer, target, whistle or successful result. This explicit
  ownership premise is not a claim of replaying a user's full controller recording.
- A native video boundary can occur after ownership changes but before pass
  velocity is written. The observer separately records first release and waits
  for the native pass-action flag before asserting the outgoing vector. It never
  aligns, shifts or injects an outcome.
- Initial diagnostics are retained privately. A four-pad state reconfigured to
  normal hardware was invalid; final normal tests use their own native captures.
  A1-frame P4 tap was missed in both r12 and the first candidate in one synthetic
  context. Final asserted taps use2frames, matching existing goalie_request tests.
  No claim is made that every sub-poll-duration tap is buffered. An input-only Y
  branch after a catch requests the normal outlet; it cannot establish manual
  ownership and is not counted as a manual-keeper success.

The full81-suite matrix has80pass and the identical inherited finisher_hold
geometry failure. Strict gate FAILED; no waiver or new Hard win-rate claim.
All40 current no-input raw gameplay traces match fresh exact r12 controls.
Independent rebuild, exact r12 rollback and original-v5.1W IPS reconstruction
pass. Scripted native input and screenshots are not a physical hardware playtest.

## Delivery and remaining work

The new dated ROM replaces r12 in Downloads, canonical workspace, website and
Bodin's existing playlist item. A running RetroArch is left alone; old progress
cleanup waits for normal exit and protects any newly played r13 progress.
Controller config, remaps and history are retained and verified.

Next: downed pass recipients, fair automatic human pickup ownership, Penaltys
100%/50%/Off; later P2green/P3red/P4yellow. The intermittent faceoff formation
report and deferred AI attacking policy remain open. Hard win-rate work stays
stopped. See TODO.md and the machine-readable exact-build report.
