Skip to content

Batch 43 · R2g control-preset compatibility

2026-10-26, dev-0.9.0-bootloader, starting HEAD 150e1e24. Implementation e948199b contains two modified C# files and one new Editor fixture plus metadata. This evidence/contract update is a separate documentation commit. No push or player build.

Change and boundary

GameSettings startup previously applied its four saved control presets through public setters that each saved config. It now calls ApplySavedControlPresets: resolve/validate all four saved records and catalog entries first, then apply the same preset metadata and nine authored role references. Loaded application does not save, mutate its snapshot or mark input ready. Explicit keyboard/joystick setters and Next retain their public UnityEvent signatures, existing preset choices and wrap behavior, with one existing legacy save per command. A shared validated plan removes duplicated role copying. Invalid/missing/ambiguous data rejects before partial runtime mutation. Graphics application and readiness logic are byte-preserved.

ConfigDocument.WithLegacyPreset explicitly accepts one of the four audited compatibility IDs, its expected current index and selected index (0/1). It rejects stale/malformed/unsupported records and patches only that selection in current and retained legacy records. Unknown root/record extensions and custom remaps survive. Explicit P1 keyboard choice also changes the new Wasd/Arrows preference; P2 keyboard remains retained compatibility data in the new model. Joystick preset indices do not pair devices. Revision-zero retained-data setup is explicit and does not replay P1's old layout while editing another record. Generic WithSettings still rejects legacy-list edits.

The new document command is not wired into production. Explicit public setters still use the old typed SaveService writer, which can discard inputBindings. Four audio load calls and locale load still save. This batch removes four preset startup saves only; it does not finish the writer handoff, startup verification, failure propagation or remapping rollout. Legacy gameplay input, player count, actors, movement, combat and authored balance are unchanged.

Executed evidence

Required Editor Unity 6000.2.8f1, revision c9992ac36c34; Input System 1.17.0, Both input handling. Direct Editor CLI uses -batchmode -nographics -tinyChaosTrace, explicit project/private-log paths, and -executeMethod TinyChaos.EditorTools.SettingsCompatibilityChecks.RunBatch43. The synchronous entry owns exit; no immediate -quit.

The first compatibility run logged 10/10. Its process handle was lost at a conversation handoff, so the recorded authoritative validation uses a bounded repeat: H01–H10, 10/10, process exit0. The unchanged existing persistence suite was also rerun because ConfigDocument gained a compatibility command: G01–G10, 10/10, process exit0. No new test assertion or compiler failure occurred in this batch.

Group Actual final result
H01 PASS: 16 initial legacy combinations × four target edits preserve current/retained selection, unknown extensions, other records and immutable source documents.
H02 PASS: only P1 keyboard changes new layout preference; P2 keyboard and joystick changes preserve profiles, including a P3 pad remap. No new-system device assignment is performed.
H03 PASS: invalid ID/index, stale expected choice and malformed/duplicate/missing compatibility records reject without source mutation. Already-rejected documents are not repaired.
H04 PASS: real temporary Linux file save/reload retains preset/layout; injected replacement failure preserves original bytes and dirty edits; retry succeeds.
H05 PASS: actual GameSettings loaded application, 16 combinations repeated three times, retains exact catalog role references/metadata, unchanged snapshots and readiness, with zero saves even when the save sink is absent.
H06 PASS: invalid last preset, missing/duplicate rows, null snapshot and invalid catalog roles reject before changing any of the four runtime bindings.
H07 PASS: actual public keyboard/joystick setters for both legacy players and both indices each issue exactly one old SaveService write; temporary legacy config reload sees the choices. This is not unknown-data retention through that old writer.
H08 PASS: actual Next commands preserve two-choice wrap; invalid player/index/missing row causes no partial runtime/config edit or save.
H09 PASS: explicit revision-zero retained-data initialization does not replay another legacy preference; unknown retained integer/extension survives later edits.
H10 PASS: new store load plus repeated actual loaded application stays read-only; explicit preset and volume patches compose, save/reload, and apply without the legacy sink.

Fixtures use inactive preview objects, temporary singleton/input references and an uninitialized SaveService with only its resolver redirected to a unique temporary directory. Its normal constructor/folder initialization is not invoked. Scoped fixture disposal restores all substituted references/readiness and destroys preview objects. No production startup, normal profile initialization, Play Mode, hardware dispatch or player scene entry was exercised. No physical-device equivalence, Windows/IL2CPP or full playability claim follows from these method/file checks. Successful fixtures delete only their owned temporary directory. Actual file replacement is Linux evidence; failure cases are injected.

First import retained existing CS8785 generator and CS0252 legacy-check warnings. Final cached runs report no compiler warnings/errors or unexpected exception headings; the known TMP fallback font Units Per EM message remains. It produced no tracked font edit. Raw logs, exit records, source manifest, validation results and captured bytes stay private under /tmp/tinychaos-batch43-*; the repeated persistence log is /tmp/tinychaos-batch42-editor-compatibility.log. Raw logs are not committed.

Preservation and source baseline

Pre-run capture /tmp/tinychaos-batch43-preserve-0b19c4ea86/ holds 2,879 project files and 8,172 Unity/profile hashes with recoverable preference bytes. Exactly GameSettings and ConfigDocument changed; 2,877 existing project files match. Of 62 unique prior rebuild implementation paths, 61 match and only ConfigDocument is intentionally extended. GameSettings predates those rebuild manifests. The cumulative unique implementation-path count is 65 after this batch.

The original 608-source baseline CSV is unchanged: 605 pins match. Exceptions are the two already-recorded batch-37 SDK package changes and this batch's intentional GameSettings control-method change. Its original pin remains the comparison baseline. Existing scenes, prefabs, action IDs, catalog assets, other metadata, build settings and package bytes are unchanged. GameSettings retains CRLF in the working file; Git's configured normalization warning is not a separate content change. The unrelated audio deletions and Addressables Linux metadata remain excluded.

Unity added only the Linux native toolchain dependency to manifest/lock. After reviewing the generated JSON, generated copies were archived and exact pre-run package bytes restored, retaining Input System 1.17.0. Shared preferences changed only automatic Editor session count/ID keys; their generated version was archived and captured bytes restored after key-level comparison. The normal game profile's one prefs file is byte-unchanged, with no new save/config/profile file. Five external licensing/package/metrics bookkeeping files changed and remain; the entire Unity profile tree is not claimed unchanged. New fixture metadata has a unique GUID and no production serialized references.

Inventory now covers 255 scripts: two focused rows updated, 252 prior rows preserved and one Editor fixture appended. The legacy input consumer map updates only GameSettings and appends the Editor fixture (23 rows; 21 other rows preserved). Ten CP gates append to 105 earlier rows (115 total); all 27 workstream follow-ups remain open. All 53 issue IDs still route once and 813 local documentation links resolve. Staged source paths match the tested hashes; whitespace checks pass. ARCH-01 remains active; SAVE-05 is not closed.

Exact implementation manifest

Path Kind SHA-256
Assets/Script/TinyChaos/Services/Save/ConfigDocument.cs control-preset compatibility 9b64a8c17b07f1b61b4ac8dcc1b10e14869925234e58891ba8db712130cbe580
Assets/Script/App/Core/GameSettings.cs control-preset compatibility 3542f678d49af7d2897c407dfdaedc6bd5e29a5c1e50503988362aba5c6d7453
Assets/Script/External/Editor/SettingsCompatibilityChecks.cs Editor compatibility checks d70264e8147d1351823f1eadc6d68d874a5fa2f0d900edaede2076c5793d75d3
Assets/Script/External/Editor/SettingsCompatibilityChecks.cs.meta metadata 98d2de8c9ac426ee007c716bfc949be30b63b273a48e722b2f2923867b0b49e9

Next and commit boundaries

Next separate audio/locale loaded application from deliberate saving, preserving mixer conversion, locale readiness and public UI targets. Then integrate one production config caller through the full-document owner with pinned profile identity and visible failed/uncertain save handling. Do not send new remaps through the old writer or replace the full JSON root to bypass ownership. Windows replacement, recovery/stale locks, backup retention, setup/remap UI, legacy sampling equivalence, physical devices and actor integration remain gated. Shared released-stage loading stays R5b; Tutorial and GAME-01 stay deferred.

Code commit e948199b precedes documentation/evidence. No push. One bounded batch ends here; the whole R2/F1/gameplay rebuild is unfinished.