Stabilization batch 21¶
Scope: GAME-24's MainMenu corner Exit, quit No/Back/focus, and confirmed Yes flow. Finish the existing owner/caller migration; no new menu design or gameplay feature.
Repair and ownership¶
The three persistent button actions have null targets. No also names removed OpenPanel. Rebind corner Exit to current MenuController.PopPage, No to MainMenuManager.CancelQuitConfirmation, and Yes to MainMenuManager.QuitGame, preserving void-call data and each button's navigation fields. Add the existing No object as the owner's safe first-focus reference.
MainMenuManager owns confirmation entry, safe No selection, initiating-focus restoration with a Play fallback, cancellation, and guarded quit. Both No and keyboard Back remove the page through the same controller lifecycle, and the owner handles the resulting page-pop notification after parent input has been restored. Repeated initialization does not push another root or register duplicate listeners. Confirmed quit shares the existing leaving-menu transition guard, disables further dialog input, emits one quit-request trace, and calls Application.Quit. Missing confirmation configuration no longer silently quits from an unconfirmed Back action.
MenuController now notifies OnPagePopped instead of calling an empty MainMenu-specific MenuView stub; remove that unused stub. Configure replaces its previous configured root/gate callbacks while preserving other event observers. Exit-page pushing refuses an empty stack or duplicate exit page. Generic controller behavior remains separate from MainMenu-specific quit/focus policy.
Correction to previous migration¶
Review finds batch 20's event-mode replacement also changed navigation mode on six Meadow result buttons. Restore their authoritative pre-batch-20 values: two Automatic result actions and four Explicit confirmation controls. Preserve explicit navigation references and all other result data. The first repair script stops before writing this scene because it incorrectly assumes all six original modes were Automatic; inspect the snapshot, correct that assumption, and verify the actual mixed modes. No new candidate player is built or launched from that intermediate state.
Regression evidence¶
New Editor-only RunBatch21 uses imported preview scenes and scoped EventSystem registration. It clears animation lists/nulls page audio temporarily, invokes actual button events and navigation methods, and restores globals without saving the scene. Guarded Yes dispatch suppresses actual application exit in the Editor. Real player termination remains mandatory evidence.
Original routing/ownership harness: 1/5 groups pass, Editor exit 1. Broken bindings, actual corner/No dispatch, root duplication on reinitialization, and accumulating configured callbacks fail; existing result/pause control passes. The extended control additionally checks the restored navigation modes. An intermediate run passes 4/5 while that restoration is incomplete. Final extended harness passes 5/5, Editor terminal exit 0. This includes No/Back focus, repeated menu initialization, configured-owner replacement with observer preservation, actual page-pop ordering, and existing result/pause dispatch plus restored navigation metadata. Preview dispatch does not verify native animations, scene handoffs, or actual process exit. Build/player validation follows below; final workspace audit remains pending.
Linux player validation¶
Unity 6000.2.8f1 builds StandaloneLinux64 IL2CPP successfully, terminal exit 0. UTC provenance: 2026-10-25 05:04:20.356 → 05:10:00.470. Source 5347e4600bb897ca1c9fa8cb80cb095f6ee0ce0a, dirty. Artifact /tmp/tinychaos-batch21-linux/TinyChaos.x86_64; GameAssembly SHA-256 bf8a5c5c6c1e4d800a919b82e1d9642d641757a29f767d90abf9cab47f69aef9.
Two owned trace-enabled processes share an isolated child XDG profile/cache, with exact executable/PID/window/active-focus/1280×720 checks before each input/screenshot. Neither is forcibly focused. Prompt input waits for the existing background fade/input gate.
The fresh launch verifies mouse corner Exit opening, safe No focus, mouse No cancellation with restored corner focus, keyboard Back opening and Return submitting No, corner Exit toggling an open dialog closed, and Escape cancellation. Trace counts are five opens, four cancels, and exactly one accepted quit request. Clicking Yes then exits the actual player/wrapper with code 0 after 49.124 seconds, reason player-exited; no timeout/termination substitute is used.
The second process reloads that temporary profile and enters Meadow/Soldier/Normal. Ordinary stationary gameplay reaches results at 00:28, score/kills 12, souls 11. The result confirmation's restored Explicit navigation follows A from No to Yes; Left arrow is not mapped by the existing Horizontal_Menu axis, whose configured keyboard controls are A/D. Inspect the Yes-highlight screenshot rather than treating the unmapped first key as a failure of those restored links. Escape cancels and restores the result; reopening, A, and Return confirms MainMenu return. Exactly one arena-exit request/completion occurs and the second menu initialization succeeds.
After that return, mouse corner/No and keyboard Back/cancel work with focus restored. A final corner-open, A-to-Yes and Return requests quit once and exits the actual player/wrapper with code 0 after 206.671 seconds, reason player-exited. This process records three quit-dialog opens, two cancels, and one quit request. Thus scene-entry handoff and both actual application exits are verified separately from the guarded Editor dispatch.
No exception messages, locked-sequence warning, or trace cap are observed in these player logs. NET-02 remains open: no Discord code is changed, and absence in these runs is not a general integration clearance. Windows, physical controllers, other menu flows, full stage clears, save migration/recovery, and the reported Steam freeze remain acceptance work. Logs, screenshots, input/focus records, and terminal/provenance files stay under /tmp/tinychaos-batch21*, outside Git.
Preservation and remaining work¶
After terminal build exit, restore only inserted Linux toolchain dependency entries and the reviewed TimeManager serialization conversion to exact pre-run bytes; remove generated Addressables Linux/linker metadata. The normal game-profile paths/bytes remain identical to their pre-batch snapshot; no engine preference restoration is needed in this batch. Both player processes use only the temporary profile.
Five of 556 snapshotted paths change intentionally: MainMenu, the six restored navigation modes in Meadow, MainMenuManager, MenuController, and MenuView. MainMenuQuitChecks.cs and metadata are new Editor-only additions. MainMenu changes only three persistent action records and one owner focus reference; its navigation/layout/object IDs remain unchanged. Meadow changes only the six navigation modes; event bindings, explicit links, and IDs remain unchanged. Existing CRLF, unresolved audio deletion, Plastic evidence, and the nonempty Git index lock remain preserved. No commit/push is attempted. Final audits pass: 377 local documentation links, 52 uniquely scheduled findings, whitespace/new metadata, five intended source/scene deltas, exact normal profile, native event/exit counts, and no remaining Editor/player. The canonical Unity skill records safe serialized-event editing and configured-owner/observer handling, passes validation, and retains its installed symlink.
Next address the existing Settings navigation/application flow, then Database and remaining scene migrations under GAME-24. This batch does not implement those interfaces or declare the whole menu stable.