Skip to content

Stabilization batch 24

Scope: GAME-24's graphics startup preference loss, with GAME-01 timing evidence and SAVE-06 preservation/IO limits. Restore existing choices without new settings or a freeze-cause claim. The verified scope and remaining limits are recorded below.

Problem and ownership

GameSettings.LoadSettingsFirstTime called SyncGraphicsFromSystem after reading config, replacing saved resolution/fullscreen/VSync with the current system state. The previous batch observed saved VSync false becoming true in another process. Resolution width/height fields also retained monitor defaults after a user changed the resolution index.

SaveManager now records whether LoadConfig actually found an existing config. Fresh config dimensions come from the launch window rather than the monitor. GameSettings adopts fresh resolution defaults, then chooses a startup request: existing saved preferences ordinarily control resolution, fullscreen and VSync; explicit Unity size/mode launch switches retain their corresponding launch state for that session. These switches do not overwrite an existing config. The legacy resolution index remains authoritative when valid, since old width/height fields can be stale. An invalid index gets a read-only fallback; the UI can display the safe choice without rewriting the raw index at startup. User resolution edits or explicit Apply persist coherent existing dimension/index fields.

Startup and the existing Apply button share one asynchronous graphics operation. AppInitiator awaits completion before loading MainMenu and input readiness is released afterward. A structural change uses one Screen.SetResolution request with timing around that call, then observes subsequent frames with an unscaled three-second polling limit. VSync is restored after those frames. The model records actual reported dimensions/mode/VSync, rather than assuming the requested state immediately succeeded; Apply remains pending when actual dimensions differ. The polling limit does not interrupt a synchronous graphics-driver call or guarantee progress while the application is suspended in the background. No saved graphics values are replaced by the observed session state.

Unity's player argument reference defines screen size/fullscreen and popup/window-mode switches; window-mode is Windows-only and is policy-tested locally, not Windows-runtime verified. Screen.SetResolution documents deferred application. Awaitable.NextFrameAsync provides the main-thread frame boundary used here. The game delegates argument-value interpretation to Unity and preserves its resulting launch state for explicitly overridden dimensions/mode.

Editor checks

Original source: RunBatch24 fails 0/6 groups, terminal exit 1. Its first case invokes the original production synchronization with deliberately different saved choices and confirms config mutation. Other groups establish absent startup selection policy.

After the repair, the expanded final harness passes 9/9, terminal exit 0. It verifies saved/fresh selection, independent size/mode overrides, combined override preservation of preferences and VSync, invalid-index fallback without config mutation, exact-dimension pending state, actual temporary config creation/reload classification, and the existing settings value/listener/pending-choice regression. Temporary config IO uses an isolated resolver and restores service/singleton/audio/input references. These are policy/IO checks, not a substitute for a real display transition.

Existing RunBatch23 passes 7/7 with its model fixture supplying actual applied dimensions and checking that unchanged graphics do not show Apply. No scenes or persistent event bindings are changed in this batch. Runtime source changes are AppInitiator, GameSettings, SaveManager, GameConfig, SettingsInterface and the affected SplashUIController handshake; SettingsFlowChecks is updated and GraphicsStartupChecks plus metadata are new Editor-only additions.

Native validation

The first Linux IL2CPP build succeeds, terminal exit 0. Its fresh player completes graphics in 143.5 ms with correct 1280×720/windowed/VSync state, but the startup menu-load span never ends. Logo completion/input remains observable; this is an activation-readiness cycle, not evidence of the reported Steam freeze or a blocked graphics call. The owned launcher is deliberately terminated after preserving logs/screenshot, reason launcher-signal-15; cleanup exit 0 is not a confirmed quit or candidate pass. Trial artifact/profile/provenance remain separately under /tmp/tinychaos-batch24-trial*.

The asynchronous graphics wait exposes SplashUIController.LoadMainMenuAsync waiting for isDone while allowSceneActivation is false. Unity documents that activation-disabled loading stops at 0.9 and isDone stays false. Repair the affected caller coherently: cache one preload task, start loading after a frame boundary, finish preparation at 0.9, then allow and await activation before finding/activating MainMenu components or starting its transition. Scene entry controls still pass RunBatch11 5/5; logo cancellation controls pass RunBatch12 6/6, each terminal exit 0. Native cold entry/returns remain required; the fixtures do not prove that handoff.

The rebuilt candidate succeeds with terminal exit 0: Unity 6000.2.8f1, StandaloneLinux64 IL2CPP, UTC 2026-10-25 08:51:19.421 → 08:57:25.045. Source 5347e4600bb897ca1c9fa8cb80cb095f6ee0ce0a, dirty. Artifact /tmp/tinychaos-batch24-linux/TinyChaos.x86_64; provenance /tmp/tinychaos-batch24-provenance.json; GameAssembly SHA-256 b93f77f8dd970a53abb7c676b1ff5c503a92c0db13df7073ba79afcb31a504f8.

Five completed native cases share one isolated XDG profile/cache, with exact candidate executable/PID/window/active-focus and explicit physical-window geometry guards. Inputs use existing controls, and screenshots are inspected. No forced focus or injected gameplay/config mutation is used.

Case Verified graphics and flow Graphics completion Actual process outcome
Fresh, explicit 1280×720 window New defaults use the window; UI disables VSync and selects/applies existing 640×360 option. Config index/dimensions/fullscreen/VSync agree. Startup 124.9 ms; menu Apply 55.5 ms Confirmed quit, exit 0, 19.118 s
Existing config, no display flags Loads 640×360/windowed/VSync off without changing config bytes at startup. Enters Meadow, pauses at 00:04, applies fullscreen while paused, returns to pause, resumes, returns to MainMenu and quits. Startup 106.1 ms; paused fullscreen Apply 18.8 ms Confirmed quit, exit 0, 326.773 s including inspection/helper correction time
Saved fullscreen, no flags Loads 640×360 render size, FullScreenWindow and VSync off, reaches menu; config bytes unchanged. 73.6 ms Confirmed quit, exit 0, 13.511 s
Explicit 1280×720/windowed override Uses override dimensions/mode with VSync still off. UI retains saved 640×360/fullscreen choice and offers Apply; config bytes unchanged. Early logo skip and subsequent menu entry work. 80.9 ms Confirmed quit, exit 0, 14.517 s
No flags after override Restores 640×360/fullscreen/VSync off; config bytes unchanged. 75.5 ms Confirmed quit, exit 0, 13.512 s

Fullscreen's physical X11 window is 1920×1080 while Unity reports the requested 640×360 render size. Input/screenshot guards account for that distinction; the resolution is not incorrectly declared rejected because the physical window spans the desktop. All seven graphics completions report settled=True. Three synchronous display-request calls take 0.153, 0.347 and 0.156 ms in these samples. These timings are scoped observations, not a performance guarantee or proof about the reported Windows/Steam freeze.

The saved-run return helper misses its first corner/confirmation mouse attempt; a screenshot/log check shows the player still running at the menu. A follow-up probe is initially launched before that player has terminated, so the exact-one-candidate guard prevents any input. Stop and exclude that overlapping probe (launcher-signal-15, 64.267 s); add a launch guard that rejects a still-live candidate. Complete the saved player's quit through the observed dialog and verify its terminal result before subsequent launches. Later probes use explicit keyboard confirmation and authoritative terminal checks. The long saved-process duration includes this inspection time and is not a measured display stall.

Every completed player log has no exception message, locked-sequence warning or trace cap, one preload-ready/activation handoff, and one accepted quit. The saved-run arena return records one exit request/completion. Trials, excluded overlap, profiles, focus/input records, screenshots and logs stay outside Git under /tmp/tinychaos-batch24*. The logo Editor runner has package shutdown diagnostics from TMP and Plastic after its passing summary; those are tooling evidence, not a warning-free Editor claim or a game assertion failure.

Preservation and next work

Preserve the current dirty branch and exact pre-run source/package/settings/profile bytes. Restore only reviewed verification-generated edits after terminal Editor completion; retain the preexisting Addressables Linux.meta, unresolved audio deletion, Plastic evidence and nonempty index lock. No commit/push is attempted. Ordinary startup audio/input config writes remain; this batch does not coalesce IO or clear SAVE-06, malformed-save recovery, Windows/exclusive mode, or the reported Steam freeze.

Final preservation and continuation

After terminal Editor completion, restore the verified Linux toolchain-only package additions and TimeManager serialization conversion to their exact pre-run bytes. Preserve the preexisting unchanged Addressables Linux.meta; remove only newly generated link.xml/link.xml.meta. The empty-scene logo Play Mode check changes four normal-profile engine session keys (player session count/ID and Unity connection session IDs); review that exact key-only difference and restore the pre-run preference bytes. Normal player-profile paths/bytes then match the baseline exactly. Existing audio/Plastic deletions and nonempty 655,360-byte index lock remain untouched. Six runtime files and one existing check fixture change intentionally; GraphicsStartupChecks.cs and metadata are new. No scene/prefab data or save schema changes.

Next continue GAME-24's remaining callers/focus: inspect the exposed controller-refresh action and its missing popup destination, verify AskTutorial No reachability/caller ownership, and correct Tutorial's Yes-first return confirmation. Keep Database/later-stage migration focused afterward. Windows/exclusive-mode, multi-monitor/other resolutions, malformed data recovery, full gameplay/co-op and the reported freeze remain acceptance work. The three-second limit bounds frame polling, not synchronous driver calls or time spent suspended without focus. Stop after this verified batch; the release goal remains unfinished.

Final audits pass: 389 local documentation links, all 52 findings scheduled once, seven intended existing source/check deltas, new-file metadata/whitespace, preserved CRLF, exact normal-profile bytes, five natural exits and graphics/preload/activation markers. No Editor/player remains running. The canonical Unity skill records session-override versus persisted state, physical versus render dimensions, separate display timing, and activation-disabled preload readiness; validation passes and the installed symlink remains intact.