# Less sensitive goal nets — 2026-10-31

## Result

jdc reported that the own goal net moved too easily and too often. The native
release comparison now requires an absolute speed component greater than12288,
previously8192, on either axis. Both nets and all human/CPU skaters and keepers
use the same native routine; no physical-pad preference is involved. Light
contact retains the normal solid-net collision response. A hard hit can still
knock the goal loose, stop play and reset it normally. The nets are not pinned
or teleported every frame.

## Cause and minimal change

The existing14B38helper is byte-identical in the original v5.1W and r13. Its
random HV-counter gate, puck Y proximity within40units and absolute X/Y speed
checks can release a net during ordinary fast contact. A genuine CPU-play
reproduction crosses the old threshold near8509; ordinary skaters reach9608.

Only four immediate bytes change, at14B6C/14B74/14B7C/14B84: positive2000→3000,
negativeE000→D000. Comparisons remain strict greater-than/less-than. No extra
instructions, timing, hook or RAM field is added. The collision ellipse, actor
eligibility, random gate, puck-proximity check, quarter-speed transfer to the
net, collider stop, referee event8 and native net reset retain their exact code.
`--legacy-net-contact --version 2026-10-30-r13` produces exact r13.

A first private4000threshold was rejected: it suppressed the reported behavior
but exceeded the13868speed observed during a real C burst. The selected3000
threshold is50%above the original and remains below that actual hard burst.
The rejected build, diagnostic output and result history stay private.

## Verification

`verify_net_contact.py` calls the actual unmodified native helper from private
reset drivers.368paired contexts cover both net ends, home/away skaters and
keepers, all four signed axes, old/new exact speed boundaries, the actual13868
burst speed, heavy impacts, and puck distances -41/-40/+40/+41. Real HV reads
remain untouched; repeated calls advance native timing. Results assert release,
quarter-velocity transfer, collider velocity, saved registers on rejection and
both return-stack paths. There is no injected comparison or release result.

Two paired native gameplay branches use actual captured states and controller
input. Geometry, velocities, timers, target, clock, whistle and outcomes are
never written. The CPU scene clears human controller assignments at the start,
then runs30000frames with native play. Original r13 has one dislodgement and40
net-position changes; the correction has zero. Different later clocks and game
trajectories are expected once the old release/response path is avoided. This
particular contact occurs during a goal celebration; it is not a live-play
stoppage-frequency or saved-time measurement. This is a specific reproduction,
not a general frequency or win-rate estimate.

The second branch configures one human skater and presses Up then C through the
real six-button input. Both ROMs have identical motion traces and reach13868,
which the new native release comparison accepts in the boundary test. It does
not claim that a human physically tested a controller or that this burst branch
itself strikes the goal. Saved native before-move states and screenshots are
private; no live RetroArch was touched.

The complete82-suite exact-source matrix has81pass and the same inherited
finisher_hold geometry failure. The strict gate remains FAILED. Of40comparison scenes,38retain raw equality for all600frames. The other two
retain strict equality up to a verified native impact. Fresh r13 controls retain the complete strict
historical comparison chain. Independent rebuild,
exact r13 rollback, four matched feature ablations and original-base IPS
reconstruction pass. No Hard win-rate investigation is resumed.

## Delivery and queue

2026-10-31 replaces the previous current r13 ROM/IPS in Downloads, canonical
workspace, website and Bodin's existing playlist item. Progress cleanup waits
for a running RetroArch to exit normally; new-release progress is protected.
Controller remaps, settings and history are preserved and hash-verified.

The original next co-op request remains downed pass receivers, followed by fair
unassigned human pickup ownership, Penaltys100%/50%/Off and later distinct P2–P4
colors. Mini7 and manual-keeper passing are retained. Faceoff alignment remains
open; see TODO.md. Hard hits remain enabled.

## Net-impact comparison contract

The first full82-suite run was retained with two failures: the inherited AI
geometry failure and an obsolete raw-exact maintenance assertion. Case0 reaches
an actual live native net collision after534identical observed frames: r13 sets
net velocity2055/393 and stops the collider; the candidate leaves the net still
and uses the native solid-net bounce. The first ordinary observer difference
appears one frame later. Subsequent positions, clocks and AI decisions can then
differ as a consequence. Such a scene cannot truthfully be labelled unchanged.

The final audit preserves the original scene setup/observer byte-for-byte and
adds a host-side read-only net/actor velocity observer. It permits a different
trajectory only if all pre-impact observations are exact, the first difference
shows a previously stationary net acquiring the old quarter-velocity in the
changed speed band (with at most the native first-frame displacement along that
impulse), the candidate net stays still, and the old collider stops
while the candidate retains its solid-net response at the same position. Every
changed trajectory and its first qualifying impact are recorded. The exact r13
reference still passes all historical strict comparisons independently.

Deliberate pre-impact score drift, an unrelated difference with no net change,
an out-of-band impact, an oversized net jump and movement opposite the impulse
must all be rejected. A new full82-suite run is used
after this audit change; the earlier failure and its225-source snapshot remain
private and are not relabelled as passes. The live impact scene is a historical
fixture with its original nine setup frames followed by native play, separate
from the unforced CPU-match celebration collision described above.

The first event-audit diagnostic also retained a too-strict same-position
assertion: in scene35 the native net has already moved -2/-1pixels by the first
video sample after release. The final contract requires the candidate and
previous net to remain stationary, and permits only a first-frame displacement
in the old impulse direction, bounded by its velocity. The collider still must
stop in r13 and receive the solid-net response in the candidate. A partial matrix
started before that diagnostic finished was stopped and retained as aborted;
none of its receipts approves this release. The final complete matrix is separate.
