# Downed pass receivers — 2026-10-31-r3

## Problem and behavior

Bodin reported passing to a teammate lying on the ice. The native pass scan
rejects non-skater/off-ice roles and the unavailable bit, but ordinary falls do
not consistently set that bit. Both its normal search and keeper fallback can
therefore select a downed teammate. Once the temporary nopuck timer permits a
collision, the native stick path can also give him ownership before he is up.

The correction rejects active front/back, flip, injury and board-fall animations
(including their recovery), or the native board-fall flag. This applies equally
to human and CPU skaters on both teams. A pass already in flight is covered if
the recipient falls later. The helper does not cancel or teleport that pass: the
puck continues through the native stick/body collision decision. Native body
contact can still deflect it. Healthy skaters, standing shot/catch animations,
keeper saves/dives and post-recovery pickups retain their original eligibility.

## Code and hooks

`experimental/downed_receiver.s` is a small module at2DAE00, below the unchanged
manual-keeper module at2DB000. The existing shootout helper remains below2DAE00.
No RAM/SRAM, settings, controller assignment, rating, animation or physics field
is written by the new code.

| Site | Original bytes | New bytes | Purpose |
|---|---|---|---|
| BD06 |082900020063|4EB9002DAE00| native B-pass candidate eligibility |
| 2FF1B0 |082900020063|4EB9002DAE00| cached keeper fallback eligibility |
| 150F6 |4EB9002FF380|4EF9002DAE04| actual stick contact before the existing pickup gate |

The scan export preserves every register and the original BTST contract: only
Z may change, where Z clear means unavailable. N/V/C/X and the stack are exact.
The pickup export preserves the old accepted-pickup/crit gate at2FF380 with its
original150FCreturn stack. For a downed skater called from native14ECC, it
removes only that stick sub-call return and resumes the native14ED0body path;
the original collision save frame remains intact. A defensive isolated-call
path returns without granting possession. No additional general pickup/frame
loop or animation-update hook is installed.

Detection uses skater role>0 plus the board-fall flag or SPA IDs0D26,0DD8,136A,
145C,1776,17E8,185A,18CC,193E,1A00,1AF4. Native animation completion already clears
the posture; this code neither forces recovery nor steals the unavailable bit
from the native injury/line-change system. Stumble11E6, standing one-timer/windup
7FC and standing catch/check animations are not treated as downed.

Build with the standard current command and --version2026-10-31-r3. The flag
`--legacy-downed-receiver --version 2026-10-31-r2` recreates exact shootout r2.
The accepted source and byte exports are linked from the website's forum tracker.

## Native tests and actual scope

`verify_downed_receiver.py` calls the installed instructions.84paired scan ABI
contexts exercise the real sites, all specified posture/role cases and both
CCR extremes, preserving15registers, SP and every CCR bit except the intended Z.
114paired native/cached searches cover both teams, skater/keeper passers, downed
versus standing candidates and existing unavailable guards. The keeper fallback
is exercised only for a keeper; a skater correctly uses the blind-pass fallback.
44paired full native collision calls use real GetHot and native animation-frame
updates for fall geometry, then the actual stick/body dispatch and pickup path.
They prove downed capture is blocked, body response remains physical, and healthy,
keeper and recovered cases still work. Those are explicit synthetic RAM fixtures;
selected receivers, pickup results and deflections are never fabricated.

A separate cold-boot co-op game uses actual directional/B-pad input. On an actual
pass already in flight, the host injects only the intended recipient's native
fall/recovery animation state. It never writes actor/puck positions, velocities,
ownership, clock, RNG or outcomes. Subsequent collisions, animation/recovery and
control are native. Parent r2 has14synthetic falls and6downed possession episodes,
observed across579frontend samples; the correction has10falls and zero such
samples.12parent and7current fall instances have later legal possession by that
actor after recovery. These observations are not579separate catches, identical
paired game trajectories, natural fouls or physical-controller playtests.

An initial private helper mistakenly saved CCR after pushing an address, changing
N; the ABI test rejected it before release. Another private version checked every
nearby actor too early in collision dispatch. It was narrowed to actual stick
contact to reduce execution overhead. Failed/rejected builds and reports remain
private. No unsuccessful run is relabelled a qualification.

## Ordinary-game comparison and QA

New guard instructions consume cycles, and NHL94uses hardware HV-counter reads
for native random decisions. Thus even a healthy guard can change later timing
and choices. No RNG instruction/value is patched, but identical ordinary-game
trajectories are not promised. Every600-frame scene is retained against a fresh
exact r2 control; the comparison records exact counts and first differences.
A preliminary run has16raw-exact scenes and24with differences, including some
before a visible downed-puck event. Those differences are disclosed, not counted
as unchanged or as evidence of stronger AI. See the final result JSON for counts.

Only the three declared hook sites, new module, version and checksum may differ
from r2. The entire old strict shootout/net/keeper/input/history comparison chain
still runs on fresh parent controls. Current scenes must advance the native clock
and retain valid owners/actor coordinates. The new paired native ABI, eligibility
and collision tests independently assert the desired behavior and healthy guards.

The first full84-suite run retained four failures: the known geometry check, an
old r7-based rush comparison (7vs8goals), a new host sanity assertion rejecting
valid ST.Bnegative owner encodings such as FF02, and an r13-based burst comparison
that conflated new guard timing with the retained net feature. The host owner
check now accepts all signed-negative native owner words. Defense is compared
against a binary-verified matched current no-gap control:8vs8goals,9vs6observed
shots, with all48scenario assertions unchanged. The net test uses a matched
current legacy-threshold control verified to differ in only four immediates and
checksum; its boundary/CPU/burst assertions remain. The first report is preserved.
The complete matrix is rerun with exact final host sources. The ROM itself did
not change between those matrix runs. The retained geometry failure has different
measurements from r2; it is the same unresolved test/category, not an identical
numeric summary.
All84shared suites run;83pass and the inherited finisher_hold geometry failure
remains, so the strict gate is FAILED. Independent exact rebuild, r2 rollback,
original-base IPS and four matched feature ablations pass. No Hard strength
search or newly qualified win rate is claimed.

## Related pass-height research

Brodeur30's separate pass-height proposal was tested privately with64native
intercept-solver contexts and four caps12/6/3/0, including both directions,
skater/keeper passers and moving receivers. Changing the two vertical-cap
immediates BF65/BF6D preserves horizontal velocity, the solver's horizontal arrival-time estimate and the
receiver's predicted intercept in all256runs. It changes only the targeted-pass
vertical path; shot, lob and blind-pass instructions remain byte-identical.
The arrival estimate is not time airborne: lowering lift changes how soon the
puck lands and can change interception opportunities. This is arithmetic
isolation, not a human pass-completion/interception or balance test. No lift option or altered default is included in r3; flat/lower passes
would need separate native gameplay and user playtests. The diagnostic ROMs are
private reset probes, not playable releases. See FORUM_FOLLOWUP.md.

## Delivery

The dated r3basename replaces the previous current ROM/IPS in Downloads,
canonical workspace and website. Bodin receives the same ROM in his existing
playlist when reachable. Fresh progress follows the permanent release policy;
cleanup waits for an active RetroArch to exit normally. Configs, remaps and
history retain their hashes. Installation status is recorded in QA_STATUS.json
and DOWNED_RECEIVER_RESULT.json; queued sync is not reported as completed.
