# Optional overtime shootout roster and spin rules — 2026-11-01-r2

ROM SHA256:984854649bb9528f9dfc2200d43237cb2a3ab2cbe5cc847fde1ef10d375e660f; CRC32:95D98D33.

## Menu and rule scope

**OT SO Rules: Off/On**, default **Off**, is the22nd start-menu choice(row42).
It applies only to the project's tied-overtime shootout extension (F090=1).
Standalone native Arcade Shootout retains its existing roster selection. Native
and Full/Light/Mini preferences are independent and lock after match one.
This is a bounded NHL94 alternative, not a claim of literal full NHL parity.

Official reference: [NHL2026–27 rulebook, rules24.2 and84.4](https://media.d3.nhle.com/image/private/t_document/prd/i9yumvyaojps5kixzaxz.pdf).
Rule24.2 forbids a completed360-degree spin before shooting. Rule84.4 requires
eligible shooters before reuse and allows both clubs to reuse after the smaller
eligible group has shot. An ordinary minor penalty does not exclude its player.
The native game has no corresponding ten-minute misconduct category; no invented
misconduct mapping or modern extra roster slots are introduced.

On captures each native roster before the existing shootout lineup clears its
occupancy array. It excludes every actual goalkeeper according to roster-derived
GK_TAB, plus injury sentinel states-3/-4. Positive ordinary penalty timers remain
eligible. The real roster size must be at most26 and the active club-header pointer
must equal its ROM team-table entry. Invalid, stale, corrupt or empty pools take
a bounded native preferred-five fallback; no division by zero or invalid roster
is forced. Current Edmonton and Montreal each have three actual goalkeepers.

Each club keeps its eligible native preferred-five order, skips duplicates, then
uses eligible bench indices in roster order. Own-attempt modulo the smaller
eligible count determines the choice. Thus an unequal pool may leave an extra
eligible skater unused once both clubs are permitted to reuse. No RNG is added.
The complete original FC4C0 setup runs first, including its real native RNG draw
and presentation-path update. Only D40A is overridden; native1592C/15AA4 loads
the actual selected actor, roster identity and attributes.

The pre-shot observer samples the actual complete16.16 body angle at actor+54.
Shortest unambiguous changes accumulate in a signed long; crossing +8 or-8
native octants is a completed turn and enters the existing single native miss
path. Exact half-turn samples have no observable turn direction and reset the
history. Fractional values matter: a7.1-octant turn must not be treated as8 just
because its integer facing crosses zero. Ordinary cuts and oscillations do not
accumulate an arbitrary unsigned distance. A shot already in native flight keeps
its existing flight/retouch/goal behavior. Pauses, announcements, invalid actors,
already-ended attempts and foreign contexts retain their guards.

Existing automatic60-update start, forward loose-puck recovery, progress/still
limits, one-shot/retouch behavior and physical controller routing remain in place.
No score, goal, keeper or roster-stat write is added. No Hard strength claim.

## Hooks, RAM and persistent records

- Module222000..223000, eight fixed four-byte exports: capture(+0),setup(+4),
  spin(+8),fresh(+12),load(+16),put(+20),reset(+24),pick(+28).
- Shootout expiry captures before FC47C and shot_line normalize occupancy;
  setup wraps FC4C0, preserving all its outputs/SR/GPR except selected D40A.
- Existing shootout_rules pre-shot PHASE1 invokes spin; a full turn uses the
  existing PHASE3/C2F2bit4 miss. No normal-match per-frame hook is added.
- Persistent optionF046, after actual opponent-cache fields endingF045.
  F0F8/F0FA were rejected (keeper record/overtime flag); F670 was rejected
  because actual Season Standings writes its seed workspace throughF69F.
- F820..F83F,32bytes after keeper-attack counters: MAGICF820; masksF822/F826;
  commonLIMITF82A;lastActorF82C;fullAngleF82E; signedRotationF832;
  teamsF836/F838; checksumF83A/inverseF83C; packedroster/keepercountsF83E.
  Eight static checksumwords exclude mutable actor/angle/rotation. Team IDs,
  context, enum, magic, complement and1..26limit must all be valid.
- Logical SRAM4D3A..4D41, native physical209A75, tags74/8BOff75/8AOn.
  Native/Full/Light/Mini remain separate; selected restart clears only its own
  pair plus Light shared-gap checksum. Existing preference bytes stay exact.
- Menu label2E1350, values2E154A..2E1576. Builder flag --legacy-strict-so
  reproduces exact Nov1 when built with version2026-11-01.

## Qualification and practical limits

All95 suites execute:94 pass. **Strict gateFAILED** retains the inherited
finisher_hold geometry failure in the user-accepted38-win tactical base.
No new failure or missing coverage is waived. The first complete matrix and its
maintenance-scope failure remain retained: the test used2F2E00 for the existing
shootout_rules module actually assembled at2DAA00. Only that new interval is
corrected, with the unrelated wrong interval removed. The entire affected
maintenance suite is rerun in an isolated final-source tree on this unchanged
ROM. Two older menu drivers also assumed twenty Down presses reached the menu
bottom; the expanded list disproved that assumption. Exact sixteen/seventeen
Down presses in seasons now reach actual row32/34; fifteen/sixteen in native
New Playoffs because its row6 is skipped at nativeF77AE. A read-only native
cursor observer independently confirms15Down reaches32. Alt Goalies similarly
uses20Down in seasons and19 in that native context. The compensating Up presses
are removed. The entire pass-mode, penalty-rate and Alt Goalies suites are rerun with
all original input, menu, persistence, foul and lock criteria unchanged. Only
these four test files change; every other manifest hash stays exact. An initial
corrected scope run checked all40 current scenes raw-exact but serialized the
current layer before older layers, allowing its headline to be overwritten by
the r11 comparison. The report layer now follows the entire older chain; the
whole maintenance suite is rerun, retaining that first aggregation failure too. All40
raw-exact scenes and the
complete earlier comparison chain remain required. Independent isolated rebuild,
exactNov1 rollback, five matched AI controls, native-net control and independently
applied original-base IPS pass. All40 ordinary600-frame scenes match freshNov1
raw-exact, and the complete earlier audit/difference chain is retained separately.

All nine new sections execute:

- 187 actual all32-club capture contexts cover every actual keeper count,
 injury/minor availability, invalid pointers/contexts and complete native ABI,
 other RAM and RNG preservation.
- 1736 preferred/bench selection contexts cover complete cycles, unequal pools,
 duplicates, invalid preferences, large attempts, fallback and pure ABI/RNG.
- 168 full16.16 spin sequences plus20 outer native enforcer boundary/guard cases
 cover both rotations, every actor, legal cuts, fractional just-short/exact turns,
 the rejected integer-only false positive, displaced native ABI and single native
 miss queue. These declared angle fixtures are not natural controller spin goals.
- 108 full original FC4C0 setup comparisons include actual native RNG/presentation;
 only selected D40A may differ.
- 1040 persistent record/ABI validations and four entire64KB separated writes.
- 30 actual menu/render/boot/slot/corruption/restart/first-match lock flows.
- Eight long native shootouts,52 attempts each, verify actual bench actor loading,
 unique selection before reuse, native preferred-five Off cycles, result/stats/save
 and restoration of four cooperative pads. These declare timeout misses and one
 physical goal-line puck; they are lifecycle fixtures, not AI strength matches.
- 52 real input scenes cover both rink ends and On/Off movement, idle, reverse,
 stop, shots, shot mashing and direction circles, plus actual no-input starts.
 No actor/puck/score/RNG writes occur after the initial declared clock/side setup.
 Native direction circles often end through the pre-existing forward-puck rules
 before a full body rotation; no new spin-only natural-input positive is claimed.
- Eight On lifetime contexts preserve actual shootout metadata through pause/resume
 and ordinary allocation canaries through real Season Standings, Scoring Leaders,
 Player Cards and other pause views. Shootout pause has fewer choices; unentered
 statistics views are not falsely counted as entered there.

Private first failures remain retained. A copied battery-test slice initially
shrunk eight bytes and its new inverse tag was wrong; only fixture construction
was corrected. The input driver initially skipped its own frame100 presses;
restoring original frame100 dispatch covers every original movement criterion.
No production ROM change was made to accommodate those test mistakes. A private
integer-only spin prototype was corrected to the complete native fractional angle
before any public release. Older private prototype evidence is not substituted
for this exact final image/source matrix.

See STRICT_SO_RESULT.json, QA_STATUS.json, named hook/hex exports and source ZIP.
Bodin connection/delivery remains separately reported; human retests remain human.
