# Independent pass speed — 2026-10-31-r5

## Behavior

Brodeur30's [pass-only lift/speed proposal #217609](https://forum.nhl94.com/index.php?/topic/40511-2-guys-one-ai/#comment-217609)
now has a second menu choice: **Pass Speed Normal / Slow**. Normal is the default.
The existing Pass Height Normal/Low remains immediately above it. Each season
saves and locks the two choices after its first completed match; native exhibition/
playoffs retain their own independent preferences. Confirmed season restart resets
only that season to Normal speed and height. No legacy season is unlocked.

Slow asks the original intercept quadratic for a new time using floor(4/5of the
native nominal pass power), minimum1. It then keeps the native skater/keeper time
limits and never selects an earlier arrival than the original. The later native
lead, horizontal velocity and receiver/puck catch timers use that new time.
A receiver whose normalized speed meets/exceeds the lower power retains the
original timing: blindly slowing those cases could select another root and send
a faster or reversed pass. Short, bounded or guarded passes can remain unchanged.
The label describes lower nominal pass power, not a universal20%velocity reduction.

Lift uses the original clamped time, including its native fractional byte, before
applying Normal's12orLow's6integer cap. Thus changing speed does not silently
increase the chosen pass lift. Both teams, CPU/humans and skater/keeper targeted
B passes share the rule. A flips, C shots, blind passes, global gravity, ratings,
RNG and controller assignment receive no new hooks. Lower passes/longer arrivals
can change catches and interceptions; no human balance or completion-rate claim.
Directional/cone/hold-release passing and rebound proposals remain open.

## Code and records

`experimental/pass_speed.s` is at2DE600, under the unchanged label area2DE800.
+0wraps the original timing clamp; +4writes the menu preference. The copied
quadratic uses the same instructions as native BF04..BF52 and the same110BEsquare
root, with local saved normalized receiver velocities. It does not publish a
second pass or update any game state to fake an intercept. The actual native
horizontal solver still executes once, with the chosen D2time.

| Hook | r4 bytes | r5 bytes |
|---|---|---|
| BF54 |4EB9002EF00C|4EB9002DE600|

Normal/invalid speed values retain the original clamp's register/SR/stack contract.
`pass_height.s` at2DE400 has a fifth+16mapped combined-record writer when speed is
enabled. Its lift entry reads the cached original time for Slow and restores the
new D2before resuming unchanged native BF70. Both modules are bounded below512bytes.
Menu mapping/writer dispatch is in replaymenu.s/seasonplayers.s; tables are in
replaymenu.py; new-season clear is in season/slots.s. Normal/Slow is logical row28,
the fifteenth row; the existing icing and height rows retain their positions.

RAMF0E8..E9 is active speed0Normal/1Slow. F0EA..EB is a transient original-time word,
written before every Slow targeted pass and consumed immediately by its lift.
Existing Y control bytesF0E0..E7 and CritF0EC remain separate. The two-byte season
record at logical1EEE..1EEF now encodes50|(heightbit0)|(speedbit1), plus complement:
50AFNormal/Normal,51AELow/Normal,52ADNormal/Slow,53ACLow/Slow. Valid r4season records
therefore load Normal speed. Missing/corrupt records default both choices Normal,
without unlocking played games. Normal bank checksums remain required.

## Standalone storage correction discovered by the new test

The r4 global height record at logical2E20was outside the Full-bank excluded
profile gap2D20..2E1F. It aliased the first Full-season goalie record at bank2E20,
and slot copying or goalie updates could overwrite the preference. Conversely,
changing standalone height could overwrite those goalie bytes. r4's tests used
zero/default records and did not assert separation from goalie data.

The corrected combined standalone record is logical4D20..4D21, physical209A41/
209A43: an unused part of Light's excluded shared-profile gap4D20..4E1F. Native
mode writes checksum the Light bank at physical208001. Slot copies exclude that
gap in every bank. Full's existing native context/NC/Replay/Crit records retain
their locations and formats. The unsafe2E20record is not migrated because it
cannot be distinguished safely from goalie data; the user's new-release policy
starts fresh progress anyway. Exact r4 layout is retained only by rollback.

A paired real native-menu test seeds Full goalie bytes123456789A. Changing r4's
standalone height turns them into51AE56789A; r5 leaves all five bytes exact. New
height/speed choices survive a complete native→Mini→Light→Full→native circle,
a cold boot and both pad adapters, with all four bank checksums valid. Every
actual menu writer preserves the other setting. These tests cover the earlier
gap and are not a reinterpretation of r4's historical QA as a success.

## Qualification

`verify_pass_speed.py` runs120paired direct BF54clamp ABI contexts, including both
CCR extremes and native boundary/invalid timing inputs.192synthetic native solver
contexts cover both ends, keeper/skater, moving/diagonal/transverse receivers,
three native powers, and both height choices across six profiles.1152Normal/
invalid comparisons preserve complete15register/SP/CCR and physics/timer outputs.
384Slow comparisons execute the original r4solver with the lower input power,
fast-receiver guard and original-time floor; horizontal velocity, target and time
must match it, vertical velocity/fraction must match the original-height parent,
and no fixture may produce a faster absolute puck velocity. No selected output
or outcome is fabricated. Native min/max/guard cases are retained, not skipped.

34controller-driven menu/lifecycle tests include both ordinary and4-Way Play,
rendered values, slot isolation, restart, corrupt records, lock across boot and
actual native first-game completion. The explicit final-goal fixture supplies
puck/clock inputs; it never writes fake scores or completed-game headers. Four
cold-boot co-op input games cover both speeds and both heights. A private preserving
probe records actual passes; only its counter is initialized. Game positions,
owners, velocities, settings, clock, RNG and outcomes are not injected. Every
Slow input game must show human passes with later arrival estimates. These are
automated pad inputs, not physical-controller recordings or human playtests.

The first unguarded prototype matched lower-power native arithmetic but produced
six faster extreme diagonal-receiver cases, so it was rejected. The magnitude
guard retains native timing in those cases. A later menu test exposed the r4
storage alias. Two host navigation errors (assuming Down wraps and overlooking
native skipped rows) were corrected without changing ROM behavior. Failed builds
and logs remain private; no unsuccessful run is relabelled as qualification.
The first full86-suite run also exposed the older height test selecting the new
Speed row in native mode. Its original assertions are retained; only navigation
now selects bottom then Up to Height. The failed first report and exact243-source
snapshot remain recorded. The native ROM did not change between full matrices.

All86shared checks execute against one exact ROM/source set;85pass and the
retained finisher_hold geometry failure remains, so the strict gate is FAILED.
All40current ordinary600-frame scenes run against fresh exactr4controls; new
instructions can shift native HV-counter choices even at Normal. Divergences are
recorded, not called identical: 21raw-exact scenes and 19with differences in this run.
Fresh parents retain every older strict comparison
and disclosed timing difference. Rebuild, exactr4rollback, original-base IPS and
matched AI/gap/net controls are verified. No Hard win-rate search resumes.
Build normally with --version2026-10-31-r5. `--legacy-pass-speed --version
2026-10-31-r4` reconstructs the exact previous image. Exact counts and hashes are
in PASS_SPEED_RESULT.json and QA_STATUS.json; sources and full hex exports are
linked from the site's forum tracker. No forum reply was posted.

## Delivery

The new dated r5replaces the current ROM/IPS in Downloads, canonical workspace and
website. Fresh progress follows the user's release policy, with remap/config/
history hashes preserved. An active RetroArch is never closed; cleanup waits for
normal exit. Bodin receives the same ROM in his existing playlist when reachable.
PASS_SPEED_RESULT.json records actual local and remote state; queued sync is not
reported complete. Independent remote verification is required after connection.
