Stabilization batch 15¶
Scope: GAME-24's live Meadow pause/back ownership and UI animation clock. Preserve existing visuals and MainMenu root behavior. Later-stage scene migration, stale arena button events, settings content, confirmation/retry/return, reward flow, and Steam-unavailable game-over handling remain separate unfinished work. No features or scene assets are added.
Failing checks and repair¶
Extend the existing Editor-only MenuStartupChecks runner with RunBatch15. Five synchronous fixtures exercise actual MenuController/GameMenuManager methods with inactive objects, in-memory state, empty Page elements, and null audio clips. A scoped uninitialized AudioService permits null-clip early returns without constructing services or starting save/SDK paths. Every fixture restores the service/singleton/time-scale state. A separate empty Play Mode scene runs the six actual AnimFunc routines first at time scale 1, then at zero, checking endpoints, input ownership, delayed slide completion, and exactly-once callbacks. The runner owns bounded timeouts and terminal exit; use the matching Editor directly without -quit.
| Check group | Before | After |
|---|---|---|
| Three repeated empty-stack pause/root-resume cycles | Fail: empty stack ignores Back | Pass |
| Close an already-open pause root | Fail: page remains open after redispatch | Pass |
| Child Back restores pause root without resuming | Pass | Pass |
| Main-menu-shaped root delegates Back and remains in stack | Pass | Pass |
| Reward/game-over states block opening pause | Pass | Pass |
| All six UI animation methods, normal-time control | Pass | Pass |
| All six methods at time scale zero, including delayed slide | Fail: first zoom never completes | Pass |
| Total / terminal Editor exit | 4/7 / 1 | 7/7 / 0 |
The old root-close path first unpaused, then called PopPage, redispatching the root handler with an inconsistent open-but-unpaused state. It leaves the page open; an infinite recursive stack overflow was not reproduced or asserted. MenuController now delegates empty-stack Back to its configured owner, exposes explicit CloseCurrentPage for that owner's root close, and safely handles the last page being removed. GameMenuManager closes the page before resuming. MainMenu's root-delegation behavior remains intact.
All AnimFunc consumers are UI Pages or root-menu presentation. Their six tweens now use unscaled update, and the optional slide delay uses real time. This allows the existing pause UI to animate while the game clock is stopped; shapes, durations, eases, methods, and event bindings are preserved.
The fixture checks are not a complete player test. Both Editor runs also report existing Version Control configuration/shutdown errors and a Localization Editor GameViewLanguageMenu NullReferenceException while opening Play Mode. These are Editor/package diagnostics, not a gameplay exception or a failed routing/animation assertion; TOOL-01 retains the limitation. Raw logs remain outside Git at /tmp/tinychaos-batch15-before.log and /tmp/tinychaos-batch15-after.log.
Player verification¶
Unity 6000.2.8f1 builds StandaloneLinux64 IL2CPP successfully; terminal CLI/Editor exit 0. UTC provenance on 2026-10-24: 15:03:23.920 → 15:11:06.306. Source is committed revision 5347e4600bb897ca1c9fa8cb80cb095f6ee0ce0a, dirty. Artifact /tmp/tinychaos-batch15-linux/TinyChaos.x86_64; GameAssembly SHA-256 6461aa08225864d371126efa03413b2f19bcfcf844be9487644e5f0ab8e42d7b, native build ID 2beb14c0647d5b95e64ef7a2aa3702d94e4d4353.
Run with fresh child profile /tmp/tinychaos-batch15-profile, the temporary development-only Steam app-ID file, and matching native symbols. Exact executable/PID/window/1280×720/focus guards protect each X11 input/screenshot. The candidate is a debugger child; only managed state fields are read, without invoking game/Unity functions. Record debugger interruptions as probe effects, not frame-stall measurements. Raw input, focus, screenshots, logs, and state samples stay outside Git under /tmp/tinychaos-batch15*.
| Actual player action/state | Evidence |
|---|---|
| MainMenu Escape → exit confirmation → Escape | Existing confirmation appears, Cancel returns to usable MainMenu, and Play/character/stage navigation remains usable. |
| Default Soldier → Meadow → Normal | Existing run-start path still works; HUD/enemies/combat are visible. |
| First gameplay Escape | At 15:12:36.574 UTC the visible GAME PAUSED screen opens. Native state is paused true, rewarding/game-over false; all three timer-active flags remain true. |
| Clock while paused | Two native samples report identical run/spawner/gameplay values, all 3.460394. Between resumed debugger execution and the second interruption, an explicitly recorded 15:13:40.499–15:13:42.906 UTC interval allows actual UI/player frames and a guarded Settings click. Active timer flags alone do not mean the game clock is advancing. |
| Settings click | The button gains selection/highlight, but no settings page opens. Its old GameMenuManager.OpenPanel event remains unmigrated. This is an open part of GAME-24, not a passing settings check. |
| Resume → move → pause again → resume | Two visible pause openings and two closures; resumed screenshots show active combat/timer progression. Logs at 15:13:53.834, 15:13:56.024, and 15:13:57.374 UTC confirm first resume, second pause, second resume. Later native state is paused/rewarding/game-over false and all timers active at 14.160348. |
| Error/focus boundary | 237/237 sampled focus records belong to the candidate. Zero player NullReferenceExceptions, Steam-unavailable game-over errors, missing-script warnings, or old empty-stack warnings. Existing Discord constructor failure and two pre-entry closing-sequence warnings remain NET-02/GAME-23. |
No boss clear, leaderboard submission, full run, physical controller interaction, game-over/retry/arena return, or later-stage migration was validated. This run ends before game over and therefore does not clear CONTENT-04. The fixture child-page check validates stack/time ownership, not missing settings content in the actual arena.
Preservation and next work¶
The two Editor Play Mode runs alter four engine-owned session preference keys: unity.player_session_count, unity.player_sessionid, unity_connect.mega_session_id, and unity_connect.session_id. Compare the XML entries, confirm no other profile paths/keys changed, and restore the original byte backup after the Editor exits. The standalone probe uses its isolated profile and leaves the restored normal profile unchanged. No real player save/config is changed.
After completed build exit, review/restore only the auto-added Linux toolchain manifest/lock entry to pre-run bytes and remove only the newly generated Addressables Linux/linker metadata. Of 835 snapshotted paths, only the three intended production files and existing Editor runner differ; all other 831 retain pre-run bytes. Production CRLF and metadata identities are preserved. The uncertain audio deletion, Plastic evidence, and nonempty 655360-byte Git index lock remain untouched. No commit/push was attempted.
The owned candidate receives deliberate SIGTERM and exits normally; debugger/focus sampler also finish. No Editor/candidate remains. The canonical Unity stabilization skill now records root-Back versus explicit close ownership, paused UI animation checks, and timer-value interpretation; validation passes and the installed skill remains its symlink.
GAME-24 remains open for Meadow's stale button events/settings/confirmation/retry/return and later-stage scene migration. Its core pause/back ownership and UI clock are repaired and player-verified here. Next work restores those existing menu routes with serialized-identity evidence, then verifies transitions and repeated runs; GAME-23 and CONTENT-04 must be handled where those routes expose them. Full stabilization, Windows/Steam freeze acceptance, and all other unchecked cases remain unfinished. No features were added.