Skip to content

Batch 38 · R2b owned action sessions and command contexts

Checkpoint update, 2026-10-26: implementation committed separately as 28fbaad1 at the owner's request. Documentation/evidence is kept in a separate commit; no push. The validation account below records the pre-commit work. Follow the per-batch commit workflow.

2026-10-26, dev-0.9.0-bootloader, HEAD remains dd0a666b. One bounded implementation after batch 37: four C# files, one action definition and five metadata files. No existing source, scene, prefab, settings or package file changed in this batch. No commit, push or player build.

Implemented boundary

GameplayPlayer.inputactions defines Move/Dash/Stats/Pause with WASD, arrows and gamepad binding groups. Its 29 stable IDs (one map, four actions, 24 bindings) are authored once and preserved in per-session copies. The input contract records controls, routing and the installed 1.17.0 SDK override shape. The asset remains disabled and is not assigned globally or referenced by production scenes.

PlayerInputSession associates one owned clone with its slot's existing InputUser; it does not create another pairing owner. PlayerCommandFrame supplies raw movement plus consumable command edges. Gameplay receives Move/Dash/Stats/Pause, Reward receives horizontal/Confirm, and Blocked receives nothing. This is command routing only: the old production reward UI, pause policy, shared menu input and actor consumers remain unchanged. No new Back/Tabs/Reroll shortcut is introduced.

Context changes discard queued presses. Held confirmation cannot become a dash; release then press re-arms the button, including when the map was disabled. Loss/reassignment requires a neutral event from the assigned device before admitting a new button edge. Raw movement remains available on resume. SessionRunParticipant prepares blocked input, admits gameplay only when its run activates, and blocks stopped/cancelled input. Once managed by a run, a session cannot reopen independently after release; a fresh run must activate it. Disposal disables/detaches/destroys only its action clone, leaving the roster's user intact. Global SDK hooks and action callbacks are removed.

Raw movement intentionally bypasses SDK stick processors and normalization. Digital diagonals remain (1,1); small analog values remain raw. This is not a legacy-feel adapter: old sensitivity/gravity/dead zones/normalization, physical button mapping and UI-repeat timing still need controlled comparisons before consumers move. No existing Player/AbilityHolder formula or gameplay path changed.

Executed evidence and excluded attempts

Required Unity Editor 6000.2.8f1, Input System 1.17.0, direct -batchmode -nographics -executeMethod TinyChaos.EditorTools.InputSessionChecks.RunBatch38, with explicit project/log paths and no immediate -quit. The retained Editor runner owns domain reload, Play Mode, watchdog, cleanup, scene restoration and process exit. Final authoritative process exit0, summary 8 passed / 0 failed.

Group Final actual result
A01 PASS: imported definition, 29 unique stable IDs, independent clones, disabled template and no additional user; duplicate action owner rejected.
A02 PASS: keyboard plus three pads remain isolated; unnormalized digital diagonals and raw partial stick values; each edge consumed once.
A03 PASS: WASD/arrows retain their specified roles, owned Dash/Stats/Pause edges and blocked-only layout editing; template unchanged.
A04 PASS: pending/held presses cannot cross Gameplay/Reward/Blocked contexts; real release/repress recovers confirmation/dash and held movement resumes.
A05 PASS: removal disables commands; reconnect/reassignment rejects held buttons until a neutral sample, survives context changes and ignores the old device.
A06 PASS: one player's in-memory South→North override leaves the other player/template unchanged; SDK JSON round-trips the same binding ID. No disk/profile write.
A07 PASS: actual shared host preparation blocks early input; three fresh runs retain player/user and held movement, without replaying old dash; stop/cancel blocks reopening; actual scene reload retains the session.
A08 PASS: invalid definitions clean up, worker-thread access is rejected, disposal is idempotent and destroys the clone without removing its user; unassigned input is neutral.

Initial attempts are retained separately: the first did not run behavior checks because a fixture constant shadowed the SDK Key enum (compile failure, exit1). After that correction, the next run passed 6/8; held-release tracking and an assumed held-input trace after reload needed correction. The next passed 7/8: stop could synchronously release its context and then allow caller-driven Gameplay input. It also logged a disconnected-control callback exception despite its reconnect assertion passing. The retained implementation now latches run management after release and avoids reading removed controls. The final same eight groups pass without those exceptions. Failed/trial runs are not counted as passing evidence.

The fixture explicitly queues held input after scene reload instead of assuming the SDK device cache preserves it. It clones input settings to give simulated devices deterministic focus behavior and restores the original settings object. These are simulated-device checks, not physical-controller reconnect or production gameplay. Final compilation retains existing-category CS8785 generator and CS0252 warnings; no compiler error or unexpected runtime exception was found.

Private local logs: /tmp/tinychaos-batch38-editor.log (compile failure), -editor-final.log (6/8), -editor-verified.log (7/8), and /tmp/tinychaos-batch38-editor-accepted.log (8/8), with corresponding stdout. Temporary logs/backups are outside Git and are not a portable evidence archive; retained checks reproduce the scenarios.

Preservation and review boundary

Pre-run backup /tmp/tinychaos-batch38-preserve-5275e6b595/ captured exact bytes/hashes for 2,847 project files and 8,160 inspected Unity/profile files. All 2,847 project files match after review, including all 30 prior batch-35/36/37 implementation paths and the intended Input System package pins. The original 608-pin baseline is unchanged: 606 pins still match and only batch 37's two documented package exceptions differ. No build-list, PlayerSettings, old scene, development host or production input consumer changed. The unresolved two audio deletions and untracked Addressables Linux metadata remain untouched.

Unity inserted its Linux toolchain dependency in manifest/lock during checks. JSON comparison proved that sole generated addition; generated copies were archived and exact captured package bytes restored, retaining Input System 1.17.0. Normal game prefs changed only four automatic Unity connection/player-session keys; shared engine prefs changed three Editor/session keys. Those differences were attributed, archived and restored from captured bytes. Normal game profile coverage was one prefs file; no new save/config file appeared. Five external package/licensing/metrics bookkeeping files changed and remain, so the whole Unity profile tree is not claimed unchanged. Preference values, IDs and raw logs are not committed.

Only the five new metadata files had empty-field trailing spaces trimmed, preserving GUIDs/content. Prior metadata was untouched. New GUIDs are unique. Inventory appends four reviewed scripts (243 total), preserving the prior 239 rows; gates append eight verified groups (67 total), preserving the prior 59 rows and all 27 open follow-ups. The 22-row legacy input consumer map is unchanged. ARCH-01 remains active.

Exact ten-path implementation manifest (source of IDs is the authored asset; hashes identify these reviewed bytes):

Path Kind SHA-256
Assets/Script/Game/GameSystem/Input/PlayerCommandFrame.cs runtime input session/commands 5e1547e60d96e18cf87e0c8edf49fef3ca60d7d2ff7635ae7bed49337756b0f1
Assets/Script/Game/GameSystem/Input/PlayerCommandFrame.cs.meta metadata 94e73af4101587ce3aefe87a3f26265c100199bf580c74b217394428da948520
Assets/Script/Game/GameSystem/Input/PlayerInputSession.cs runtime input session/commands b40d65e7169a3be0495f07ac9842dfca26eef3a31a76daf2f31fa15c6b041e18
Assets/Script/Game/GameSystem/Input/PlayerInputSession.cs.meta metadata 4c2fd99b24a8bb56eba6d8c9a678bdbd52573ee3a697917f9cdc03c98a599db7
Assets/Script/Game/GameSystem/Input/SessionRunParticipant.cs runtime input session/commands cc7a1f2eea1a611c8f8470c4ffb3bab71afce22db71a3eb78bcb384a70899fd0
Assets/Script/Game/GameSystem/Input/SessionRunParticipant.cs.meta metadata 83867987f56f867d36805863854a0522cb28a9415444d5ab97dd808608367b47
Assets/Script/External/Editor/InputSessionChecks.cs Editor checks 63961a1575d93fc76eaa3e1fb50f4f6d980b1cb4e2b5bc4e2a28806dfeb88f1d
Assets/Script/External/Editor/InputSessionChecks.cs.meta metadata 5cb17cc2b9885cc7bdca8b916de6df70cbf4cca18fa154a2161fea62a42ff43d
Assets/Settings/GameplayPlayer.inputactions action definition 458bff1c2ab04572a59e7ca8a8e93807b0cacb0b15d403f18b54620336df3d7b
Assets/Settings/GameplayPlayer.inputactions.meta metadata c069a6589a97ca61209dbc582f7f7a693e947b70b7c598617bfcdf530b0f0efd

Final static review passes: 719 local documentation links resolve, whitespace checks pass, all 53 issue IDs route once, and all new IDs/GUIDs are unique in their scope. Disposable-index reviews separately cover 40 combined implementation paths and 18 documentation/evidence paths. HEAD and the real index remain unchanged. No ordinary profile save/config was created.

Next and commit boundaries

Next is a bounded binding-profile/legacy-conversion slice with disposable data: versioning, stable binding/group validation, preservation of unknown/non-input fields, idempotent import and per-profile round trips. It must pass before normal-profile writes or remap rollout. Capture/cancel/reset/conflict and recovery/setup UI remain later bounded R2 slices; legacy sampling equivalence must pass before redirecting actors/UI. PS-03 and the other 26 workstream follow-ups remain open. No four-player gameplay, physical-device, Windows/IL2CPP, full-playthrough or release acceptance is claimed.

Keep this ten-path implementation group separate from documentation/inventory/gate/evidence changes. The 40 implementation paths are now saved as four distinct commits in dependency order, with documentation committed separately. Commit each subsequent verified implementation batch before starting the next; push only on request. GAME-01 and Tutorial remain deferred.