# Season settings stay locked — 2026-10-28-r3

## Icing On default restored — 2026-10-30-r7

jdc clarified that **Icing must default On**, despite Off in the previous menu
screenshot. Fresh boot, empty Full/Light/Mini formats and explicit restarts now
use On. All other r6 menu defaults and keeper/current-skater outlet behavior stay
unchanged. Manually chosen saved settings and played-season locks still apply.

Only three default immediate bytes change1→0 outside version/checksum fields;
all other game code is byte-identical to r6. The 75 shared checks ran:74pass,
only the known inherited finisher_hold geometry failure; strict gate FAILED.
All40 current raw no-B scenes match fresh r6 controls exactly. The older r6/r5
observation audit remains separately disclosed. Rebuild, exactr6 rollback and
original-base IPS reconstruction pass. See ICING_DEFAULT_R7.md and QA_STATUS.json.
SHA256 48af31f9f7c85766951bf42745360571d6e7bf025bdce936363a58a178ab05f6; CRC32 273334B0.

## Keeper catch handoff and requested defaults — 2026-10-30-r6

A keeper already selected before catching the puck now returns to CPU control
on the accepted catch, and that pad receives an eligible free skater. The native
AI marker follows this ownership change. P1–P4 request an outlet to their current
skater; pass no longer switches that requester first. Explicit Y after the catch,
CPU-only keepers, opposing human teams and special modes retain their rules.

Fresh defaults follow jdc's latest screenshot: Auto lines, Fighting Off, Hard,
Auto Replays Off, Crit Shots Off and Icing Off; Edmonton remains the default club.
The screenshot's Icing Off supersedes the earlier r5 On request in this release.
Existing valid saved choices and played-season locks remain readable.

All75 shared checks ran:74pass,only the inherited finisher_hold geometry failure.
Strict gate remains FAILED. New coverage includes44 native ABI/object guards,
148 four-pad keeper cases (68 added handoff/current-requester cases),5 branches
of the reported r5 catch and6 native default/menu-render cases. All40 current puck/clock/action timelines match fresh controls.35 raw traces
are exact;15 isolated position/cache/render observations across5 traces are
recorded separately with exact whole rows before and after each difference. Rebuild, exactr5 rollback and original-base IPS reconstruction pass.
No new Hard win-rate series. See GOALIE_CATCH_R6.md and QA_STATUS.json.
SHA256 74f099b10459e000b4b50870e41617983641445f83c813328dba019b6b02fd7d; CRC32 25BBB406.

## Current extension — 2026-10-30-r5

Icing is now part of the frozen match rules, default On. The U record adds
Icing at logical1FFD, folds it into the existing XOR at1FFC and preserves the
native checksum at1FFE/1FFF. S/T records still load under their old validation
with Icing On; played legacy seasons remain locked. New records use U.
See ICING_MENU_R5.md for current code, tests and exact-build limitations.

User requirement: a season's match settings must remain locked after the first
completed match, including across cold boots. Legacy migration must never open
the settings rows. Players remains editable for the established 1–4-player mode.

## What was wrong

The October 28 settings fix intentionally set NOSET for an older save lacking
the new settings record. seasonmenu.s then allowed rows 8..16 to change until
the next match. jdc rejects that behavior: Continue Mini must stay locked.

A separate persistence error affected Auto line changes: the native Start path
copies D058 to D072 and converts Auto (2) to in-game On (0), with its Auto flag
elsewhere. The old crowd.s initialization captured D058 after this conversion,
so Auto could become On after a reboot.

## Change

- Remove the seasonmenu.s open-row exception entirely. The compatibility export
  seasonplayers +56 always returns locked. Existing team/opponent locks stay.
- Add seasonplayers +60, called by finished.s's main Start entry before native
  match preparation. A new season captures all five menu values before Auto is
  normalized. An already played season restores its frozen values before play.
- Capture versioned **T** records at the existing logical SRAM 1FF6..1FFC:
  marker, period, goalie, penalties, line changes, fighting, XOR with 5A.
  Old **S** records remain readable. Validate the XOR and every option's range.
- Later crowd/roster initialization retains a valid settings record instead of
  overwriting it with in-game values. Difficulty keeps its per-slot complement
  record; a missing legacy difficulty falls back to Normal, not another slot.
- Older saves without a valid record recover period/goalie/penalties and the
  original line-change value D072 from the existing per-slot D046..D087 snapshot
  at logical 1EAC. They stay locked throughout recovery. The old S/Auto case can
  recover Auto from that snapshot and is promoted to T on the next Start.
- An explicit season restart clears the old settings marker. New choices remain
  editable before game 1, are captured before that match and become locked when
  the first result is recorded. No schedule/player/keeper/statistics layout changes.

**Historical-data limit:** the older slot snapshot never contained Fighting
(F004). Without an S/T record or a contemporaneous savestate its old value cannot
be reconstructed. The explicit legacy fallback is Off; jdc was asked whether
his old Mini used On or Off. No permanent unlock is introduced for that missing
field. Missing/corrupt older snapshot fields use fixed documented defaults
(5 minutes, manual keeper, penalties on, Auto lines), rather than another
season's live RAM. New T records preserve all selected values exactly.

## Implementation

seasonplayers.s at 2EB000 is 1,982 bytes. It adds no new persistent RAM region;
the old NOSET flag is unused. Its exported entry offsets 0..56 stay compatible,
+60 is new. store/diffstore share an expanded, matching saved-register frame;
settings validation preserves the checksum compare flags. seasonmenu.s becomes
smaller; build_season.py relinks its four existing native call operands.
finished.s calls the new entry before the displaced Start prologue; slots.s
clears the old record only during a confirmed clear/restart.

## Verification

Private evidence: work/season-settings-lock-20261028/.

- **36 targeted cases / 261 native observations**: real Left/Right attempts on
  all six settings rows in Full/Light/Mini; cold boots, native-mode detours,
  valid records, missing records, invalid XOR, invalid enums and old S/Auto.
- All **4 period lengths × 3 line-change choices**, with alternating goalie,
  fighting and difficulty values: native Start captures the menu values, the
  game starts, Auto stays Auto in the record, cold boot restores all choices.
- A native first game ends by an actual OT puck crossing. After the recorded
  result and cold boot every attempted settings edit is blocked, with original
  values and checksums intact.
- A private copy of jdc's actual Continue Mini save: seven observations show
  five-minute periods, Manual goalie, penalties on, Auto lines and no editable
  settings. His live save is untouched by the test.
- All **16 existing suites** pass: menus/fonts/teams, completed/independent
  seasons, 34 shootout results, 80 four-pad goalie cases, 41 ordinary requests,
  14 lifecycle games/cold boots, 682 forum cases, critical velocity and HUD/trail.
  The inherited legacy fixture limits remain documented in FORUM_FIXES.md.
- Exact rebuild; guarded changes confined to settings/slot/menu/finished modules,
  four relinked menu call operands and version/header checksum. Original-base
  IPS reconstruction verified. Full CPU match and delivery reports in evidence.

Release: **2026-10-28-r3**, SHA256
`c0bb6213131a4ce2daf763a3bfa06b740fe9a81e8dc252b6e2b32b78e0159738`,
CRC32 `68A92922`. Standing replacement policy applies to Downloads, site and
Bodin's existing entry. jdc's later instruction in the same session requires
fresh progress on every release: battery saves and savestates are cleared on
both machines, starting with r3. Controller mappings are retained. Consequently
the question about the old Mini's Fighting preference is no longer needed for
local delivery; its historical-data limitation still applies to externally
imported older saves.
