# Division-only eight-game Mini — 2026-10-30-r9

jdc reported Edmonton playing Detroit during Mini and requested that all eight
regular-season games stay inside the club's own division. A division has eight
clubs including the player, so the schedule covers seven distinct rivals once
and repeats the round4 pairing in round8. There is no self-fixture. Consecutive
opponent choices always change the displayed opponent, including cursor wrap.

For Edmonton the default native sequence is SEA, LAK, CGY, VAN, SJS, ANA, VGK,
VAN. Single-player home/away alternates, giving four home and four away games.
The existing co-op behavior plays the user's games at home. First-game opponent
selection remains available, constrained to the eight Mini rounds; after the
first completed game that selection and other season settings remain locked.
Restart/slot switching and saved round masks retain their existing mechanisms.

## Code

`season/build_season.py` reads the ROM source's division map from standings.s,
asserts that table.s/playoffs.s agree and that each division has exactly eight
clubs, then generates minisched.inc. A standard seven-round eight-team circle is
built separately for each division; its fourth round is the return fixture.
This generates32x8 opponent bytes. Static membership is the ROM's own league
map. It does not fetch or silently substitute a different live NHL alignment.

The new374-byte helper at2DBE00 has stable exports+0 for a selected club/round
and+4 for the other15 simulated fixtures. The native menu's saved SLOTID, rather
than its boolean SLOTVIEW, selects Mini's opponent lookup. `opponents.s` bounds
Mini's persisted cursor/search at8 while Full/Light keep31. The shared season
recorder routes Mini through the same divisional fixture table; every non-user
club still plays exactly once per round. Mini's round-selection and first-game
locks remain. Full/Light use their preceding scheduling paths. Playoff brackets
and qualification keep the existing top-three/wild-card rules and single games
for Mini; this change concerns the regular season.

The20-byte increase in season.s relocates its later stats routines/table.
Generated symbolic references in simulate, goalie_season, goalie_offense and
postats are rebound to those symbols. Their logic is unchanged. The binary
scope check permits only season/menu/opponent modules, the helper, the four
native menu hook destinations and nine exact linked stats operands (all+20,
with the referenced routine/table prefixes checked identical). The regular AI,
puck physics, controller behavior, OT and momentum fixes remain.

`--legacy-mini-schedule --version 2026-10-30-r8` reproduces exact r8. Original-base
IPS reconstruction and an independent complete rebuild are required. The
no-hold/no-centered/no-plan/no-smart ablations are rebuilt from current sources.

## Validation

The new native 68000 fixture driver executes all256 club/round combinations and three legacy-fixture guards.
It verifies every actual opponent, all15 simulated pairs, all32 teams present
exactly once, same-division membership, seven distinct rivals plus one repeat,
and cursor-neighbor distinctions. The real-input all-club regression exercises
32 team choices and both opponent directions in Full/Light/Mini, One/co-op,
logos, first simulated round and locked continued-season choices.

A native first-opponent regression retains r8's saved round10 offset31 choice:
Edmonton faces Detroit on r8; the new bound normalizes it into an eligible
Pacific pairing on r9. A complete native-menu Mini run simulates eight games,
reboots the core after four and checks actual fixtures, saved round progression,
checksums and all32 teams' equal GP and scorer/keeper accounting after every
round. This is a simulated league test, not eight full input-only matches.

An old all-club fixture assumed the single-player "vs" label during co-op and
received a modern multi-slot seed instead of its required clean legacy seed.
The fixture now checks the actual established co-op text and explicitly clears
old season/bank metadata in its private preference copy. Initial failed runs
remain in private evidence; fixture corrections are not game fixes.

The full77-suite matrix and immutable-reference active-game audit are reported
in QA_STATUS.json and MINI_DIVISION_RESULT.json. The inherited finisher_hold
geometry failure remains a failed required check; the strict gate is not claimed
as passing. No new strength investigation is started.
ROM SHA256:29672052309b0bcad831716cd0edf35b498a265f0063d99173c70dff4df47c3a; CRC32:FD1A8A3A.

The fixture builder detects an already-running/captured legacy match that does
not match its new divisional pairing (or has an out-of-range old round). It
returns a negative count and the season recorder retains the original shuffle
of all30 remaining teams for that one legacy result. Every club therefore gets
one GP and valid scorer/keeper accounting even when replaying an old cross-
division state. New Mini menu matches always take the divisional path; they
never produce such a cross-division pairing. The unchanged captured native
keeper-goal regression also passes this compatibility path.

The synthetic2-2 shootout fixture originally wrote goalie GA/SA into roster
slot0. Seattle starts keeper1, so the fixture now assigns those values to the
actual native ending keeper (team+27). All statistics/result assertions stay.
Initial failed source/ROM runs remain private and do not approve this image;
the full77-suite matrix is rerun after both compatibility and fixture fixes.

Final exact-source matrix:76/77 pass, only unchanged inherited finisher_hold
geometry failure. All40 current raw no-B gameplay traces match40 fresh r8
controls exactly. Prior r6/r5 observations remain separately disclosed:
35 raw-exact traces and15 bounded video observations across5 scenes.
Rebuild, exact r8 rollback and original-base IPS reconstruction pass.
