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.