Stabilization batch 17¶
Scope: CONTENT-04's reproduced Steam-unavailable nickname/game-over failure, with the score-eligibility check required to avoid enabling anonymous uploads through the new fallback. No save-schema, encryption, SDK startup, service endpoint, menu design, or feature change.
Evidence and repair¶
Batch 14 already reproduces the actual player reaching death, then throwing in GameOver → Save.Nickname → SteamFriends.GetPersonaName before result animation/save completion. The nickname's existing callers already handle an empty name as NewPlayer. Save.Nickname now checks the existing SteamManager.Initialized flag before reading the client API and returns the existing empty-name fallback when unavailable.
Removing that exception alone would also remove the incidental block on Steam-unavailable score uploads. GameManager.PushLeaderBoardData now explicitly excludes an unavailable Steam API alongside the existing no-boss exclusion, while retaining prior-record cleanup and hiding the highscore notification. This is a local availability guard, not proof of server authentication or ownership validation; NET-01 remains open. The available-Steam nickname/API path is unchanged. Achievement syncing already has an availability guard and is not modified.
Focused regression¶
Use synchronous RunBatch17 in the existing Editor runner. An inactive SteamManager fixture supplies the false readiness flag without activating its Awake or initializing/restarting Steam; restore the previous singleton before destroying it. Inactive gameplay/leaderboard fixtures exercise actual score preparation. Their unavailable cache prevents any request path from being reached even in the original code. No services, save IO, online achievements, or outbound score requests are started.
| Check group | Original, final same harness | Repaired |
|---|---|---|
| Repeated nickname reads with Steam unavailable | Fail: Steamworks is not initialized | Pass: empty name; manager remains uninitialized |
| Boss-clear score path with Steam unavailable/cache absent | Fail: enters unavailable cache | Pass: excluded before cache/name/submission preparation |
| No-boss exclusion and old character-record cleanup | Pass | Pass |
| Total / CLI terminal exit | 1/3 / 6 (Editor 1) | 3/3 / 0 |
The initial nickname-only baseline is 0/1; the table uses the later expanded three-group harness before either production change. The score-cache failure establishes unsafe continuation on the unavailable path, not a reproduced network request. No initialized/online Steam session is available for integration validation. Logs remain outside Git under /tmp/tinychaos-batch17*.
Player and save verification¶
Unity 6000.2.8f1 builds StandaloneLinux64 IL2CPP successfully, CLI/Editor exit 0. UTC provenance: 2026-10-24 18:33:35.238 → 18:41:05.753. Source 5347e4600bb897ca1c9fa8cb80cb095f6ee0ce0a, dirty. Artifact /tmp/tinychaos-batch17-linux/TinyChaos.x86_64; GameAssembly SHA-256 30a16492886ebdde4e2010377802e643c47d918d12c7638a5673b6476f27a0b4.
The API-unavailable Linux player reaches a visible GAME OVER result after an ordinary stationary Meadow run: NewPlayer, level 1, 53 seconds, 25 kills, score 25, and 22 souls. The isolated encrypted save contains matching counters, best score 25, best level 1, and total play count 1. Its achievement dictionary contains 84 catalog entries, including false values; this does not mean 84 achievements were unlocked. File SHA-256: 98eb4507bc5cfcc1749e9a057d7d692603100cdf858919857539f58b8dead466. The screenshot and decoded observation remain under /tmp/tinychaos-batch17*, outside Git.
A second process uses the same isolated profile and logs New save detected → load; the saved bytes/counters remain unchanged. A second completed run and accumulation roundtrip were not verified before the owner's reward-flow report became the next priority. Native save writing and load-path entry are evidence here; full save compatibility, migration, malformed recovery, online Steam, and Windows remain unverified. Game-over button bindings still belong to GAME-24.
After completed build exit, restore only Unity's inserted Linux toolchain package entries to exact pre-run bytes and remove the generated Addressables Linux/linker metadata. The normal player profile matches its pre-run bytes; player launches use a temporary profile. Preserve the uncertain audio deletion, Plastic evidence, and nonempty Git index lock. No commit/push is attempted. Discord constructor errors and the changelog feed failure remain separate findings. The reported Steam/Windows freeze is unresolved.