Batch 44 · R2h audio/locale loaded application¶
2026-10-26, dev-0.9.0-bootloader, starting HEAD 68e0b502. Implementation 1500ff94 contains three modified runtime files and one new Editor fixture with metadata. Documentation/evidence is committed separately. No push or player build.
Change and compatibility¶
GameSettings startup used four AudioService Change methods, each saving config while applying loaded values. It now calls ApplySavedVolumes(GameConfig), applying the same direct values to AudioListener, music, effects and all four footstep sources without saving or mutating the snapshot. Existing deliberate Change methods retain their signatures, values and one old SaveService write per command. There is no mixer/dB conversion, new range policy, playback or gameplay rule change.
The locale save-ready callback now calls ApplySavedLocale rather than the saving ChangeLocale path. Both use the same initialization-yield/selection/notification iterator with explicit persistence intent. Loaded application does not change or save the stored selection; a deliberate choice still saves before the game notification. Invalid indices reject before selection. A finally block releases the busy flag after completion, exception or iterator disposal, so a bad index/save/observer cannot permanently lock later requests. Busy requests are still ignored; no queue or fallback language was added. Repeated Initialize replaces only its own save-ready subscription, retaining other observers. CoroutineRunner lifetime and real SDK readiness remain unchanged.
Removing audio saves exposed an implicit dependency: first-run resolution/dimension initialization relied on those saves to reach disk. That initialization now explicitly saves a changed initial choice, skips existing profiles, and becomes a no-op when initial values match. SaveManager's initial default-file creation remains separate. This preserves the first-run choice while removing save-on-loaded-application. The later graphics request/application/readiness code and all preset methods are byte-identical to the previous batch.
The production typed config writer is still active and can discard inputBindings. A save/observer failure does not roll back already-applied audio/locale or mutable typed settings. The full-document caller handoff and write-outcome policy are next. This batch does not certify startup or fix GAME-01; fewer incidental writes are ownership evidence, not freeze-cause evidence.
Executed evidence and limits¶
Required Unity 6000.2.8f1, revision c9992ac36c34, Input System 1.17.0, Both handlers. Direct Editor CLI uses -batchmode -nographics -tinyChaosTrace, explicit project/private-log paths, -executeMethod TinyChaos.EditorTools.LoadedSettingsChecks.RunBatch44, no immediate -quit; the synchronous entry owns exit.
Initial seven focused groups passed, process exit0. Source review then found the first-run graphics persistence dependency; the final expanded suite passes 8/8, process exit0. Existing TinyChaos.EditorTools.StabilizationChecks.RunBatch23 settings checks also pass 7/7, process exit0, covering loaded refresh/listener ownership, hidden-tab focus, settings Back/pause and guarded existing menu/result dispatch. No test assertion or compiler failure occurred. Existing CS8785 generator/CS0252 legacy-check warning categories and the TMP fallback-font Units Per EM message remain; these are not new passing-gameplay evidence.
| Group | Final actual result |
|---|---|
| AL01 | PASS: four supported volume patterns applied three times each preserve direct listener/music/effect/four-footstep values, the complete typed snapshot and zero writes, including with no save sink. |
| AL02 | PASS: each actual deliberate volume method saves once to a disposable path; actual source/listener values match config and typed file reload matches the settings. |
| AL03 | PASS: null audio snapshot rejects before changing audio or saving. |
| AL04 | PASS: actual locale iterator manually stepped for three disposable locales over three cycles waits at its initialization yield, selects through the SDK and notifies while busy, then releases busy; zero writes/config mutation. |
| AL05 | PASS: actual deliberate locale iterator selects, updates and writes the choice to a disposable path before each game notification, once per request over three choices. |
| AL06 | PASS: invalid low/high index, disposed waiting iterator, injected missing save sink and throwing observer all release busy; a later loaded request completes. No rollback is claimed. |
| AL07 | PASS: three actual Initialize calls retain one owned load callback plus an external observer; public load/edit requests while busy do not start another runner or save. The save-ready callback is dispatched under that busy guard. |
| AL08 | PASS: actual first-run helper skips an existing profile, explicitly persists a changed initial resolution/dimensions to a disposable file, and does not save again when unchanged or when loaded audio applies. No graphics request is issued by this check. |
Audio fixtures use real AudioSources on inactive preview objects and an uninitialized AudioService; the normal audio constructor, sound output, stacking behavior and playback are not exercised. Locale fixtures use the SDK SelectedLocale API against a disposable LocalizationSettings subclass, three in-memory locales and completed initialization, with localization databases disabled. The actual production iterator is manually stepped: actual coroutine scheduling, asynchronous packaged locale/catalog readiness, localized strings/assets, listener rendering and full startup are not verified. AL07 tests busy admission, not an idle public coroutine launch. The real locale list/order is unchanged on disk. First-run helper tests do not invoke the complete GameSettings startup method.
Actual SaveManager data/public saving methods and SaveService file writes are exercised only through injected disposable paths without constructing normal SaveService or initializing normal profiles. Fixtures restore singleton/event/busy/audio references and Editor locale preference, release owned SDK operations/locales, destroy preview objects and delete only their temporary directories. Reflection fixture state is restored even on setup failure. No physical-device, Play Mode, full player run, Windows or IL2CPP validation occurred. Passing older unchanged input/config suites are reused; their source/definitions and the preset methods are unchanged.
Private initial/final logs and exit records stay under /tmp/tinychaos-batch44-*: editor.log records 7/7; regression-44.log records expanded 8/8 and regression-23.log records 7/7 settings groups. Raw logs/preferences/payloads are not committed. No measured speed or frame-freeze improvement is claimed.
Preservation and coverage¶
Pre-run capture /tmp/tinychaos-batch44-preserve-d296e0862c/ contains 2,881 project files, 8,172 Unity/profile hashes and recoverable preferences. Only the three intended runtime files changed; 2,878 pre-existing project files match. Of 65 previous unique rebuild implementation paths, 64 match; GameSettings is intentionally extended. AudioService and LocalizationManager were existing project files outside that rebuild manifest. The cumulative implementation-path count is 69.
The immutable selected 608-source baseline CSV is unchanged: 605 pins still match, with the same two package and GameSettings exceptions already documented. AudioService/LocalizationManager are not among those selected pins; their pre-batch bytes are captured independently rather than pretending the pin list covers every source. Existing scenes, prefabs, catalogs, input assets/IDs, build settings, package bytes and old metadata match. All three modified runtime files preserve their working CRLF endings. New fixture metadata has one unique GUID and no production serialized reference. Unresolved audio deletions and untracked Addressables Linux metadata remain excluded.
Unity inserted only the native Linux toolchain dependency in manifest/lock; generated copies were archived and exact captured bytes restored, keeping SDK 1.17.0. The settings regression regenerated TimeManager's old fixed-step serialization as version 2, changed line endings and added a final blank line. Reviewed generated bytes were archived and the captured file restored exactly. Shared prefs changed only automatic Editor session count/ID keys after fixtures restored the locale key; captured bytes were restored after key-level comparison. The normal game's one prefs file is byte-unchanged, with no new profile/save/config. Five external licensing/package/metrics bookkeeping files changed and remain; the entire Unity profile tree is not claimed unchanged.
Inventory now covers 256 scripts: three focused rows updated, 252 earlier rows preserved and one Editor fixture appended. Eight LA gates append to 115 earlier rows (123 total), retaining all 27 open workstream follow-ups. The 23-row legacy input consumer map and source-baseline CSV are byte-unchanged. All 53 issues still route once; 824 local documentation links resolve. The five source paths match tested hashes and whitespace checks pass. ARCH-01 and SAVE-05 remain open.
Exact implementation manifest¶
| Path | Kind | SHA-256 |
|---|---|---|
| Assets/Script/App/Core/GameSettings.cs | loaded-application ownership | 454eeac455afc1b6e160e350319f5f75dcfee0dc7379fbafebada280a5c431c6 |
| Assets/Script/TinyChaos/Services/Audio/AudioService.cs | loaded-application ownership | a6d659100be38a66c10fde7830dcd2c93d9dea8021df50200902a6c8df024fca |
| Assets/Script/App/Managers/LocalizationManager.cs | loaded-application ownership | 2e08f411db2b889e3ad82b54c8cf30fbe2bbb1e247029f010ec372bc7fef1770 |
| Assets/Script/External/Editor/LoadedSettingsChecks.cs | Editor load/edit checks | a28135f875b8cd01eda2fe15295019186aa20f0af272df7c73dbe46693e7f339 |
| Assets/Script/External/Editor/LoadedSettingsChecks.cs.meta | metadata | 8b0d1e6ddc1758e56b243ad8c2364fd6a6a8b81fc1cd512d4d3a4c0a41c42e1d |
Next and checkpoint¶
Next integrate one config owner at the existing save boundary after tracing all writers. Preserve resolved profile/environment paths and the legacy typed caller view without making it an independent authority; retain unknown data/remaps and route deliberate preset edits through the explicit compatibility command. Verify temporary-path missing/invalid/unsupported/current files, explicit initialization, scalar/preset edits, repeated load and failed/uncertain publication before enabling normal-profile writes. Do not leave a typed writer that can silently discard the new section. Keep player/progression saving and optional services outside that slice.
Windows replacement, recovery/stale-lock/backup retention, real locale scheduler/catalog/rendering, audio playback, remapping/setup UI, legacy sampling, physical devices and actor integration remain gated. Shared released-stage loading stays R5b; Tutorial and dedicated GAME-01 work stay deferred. The reusable lesson is to identify initialization that relied on an incidental save before removing saving setters from load paths.
Code 1500ff94 and this documentation/evidence are separate commits. No push. This check-in ends one bounded batch; R2/F1/gameplay completion remains unfinished.