Temporary-profile input continuity — 2026-09-21¶
Historical record. This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the documentation index.
Report and scope¶
The reporter describes input freezes on both pressing and releasing a Profile
special action with automatic return on trigger release. This change joins the
mouse ownership fixes in RC4.6.3. The starting point remains published main
62f206ab6a7d4e83d50387ed52cc5e967a076e48; earlier private haptics edits are excluded.
Established code defects¶
- While an activation was pending, the automatic-untrigger branch cleared the action latch on the next held frame. Subsequent frames resubmitted the same load with new revisions, superseding preparation already in flight.
- Release depended on committed
useTempProfile. A release before activation completed therefore failed to cancel that activation. - The asynchronous ordinary worker reset and repopulated live mappings without the publication boundary already used by guarded named/automatic selections. The profile mutation gate serialized writers, not report readers.
- Automatic activation directly released the switch trigger's keyboard mapping. If another source still held the same key, the next aggregate commit saw no count transition and did not reassert it.
- Every post-load event ran the full backend/audio reconciliation on the physical input queue, despite same-output switches already retaining their primary pad.
The historical 500 ms report-pause value was a maximum handshake wait, not a specified half-second activation delay. No fixed activation delay is introduced.
Corrections¶
- A per-slot automatic-return intent captures its original regular or temporary profile and retains one activation through the hold. Release supersedes pending activation and skips resetting an original profile that was never replaced.
- Automatic transitions use normal aggregate key ownership, not raw key-up calls.
- Queued requests capture source/registration identity. Preparation is cold; revision and intent are rechecked at a short publication/action admission boundary before live mapping mutation. Invalid destinations preserve the live mapping. Busy admission retries the same prepared object outside all pauses.
- Only bounded physical/mapping settings run on the source queue. Audio, backend and sidecar reconciliation use a per-slot latest-only cold consumer, exact registration/revision checks and nonblocking ordered gate admission. The overview refresh uses the same guarded path. Startup stays synchronous.
- Same-output primary pads remain connected. Switching output type is explicitly not promised to be instantaneous: it still needs a real virtual-device change.
Validation boundaries¶
TemporaryProfileIntentTests exercises real special-action dispatch and worker
completion. ProfileSwitchInputContinuityTests uses a synced registered synthetic
DS4 source, real report leases/base publication pause, real mapper and commit,
and recording virtual-pad/keyboard/mouse sinks. It exercises both regular and
temporary origins, held movement, and both press/release directions. Queued
hardware/audio work is retained but not executed against real devices.
ProfileMutationBoundaryTests covers final-boundary invalidation, admission and
registration generations. ProfileColdOptionsTests covers coalescing, retry,
stale admission and lock cleanup. These are deterministic software simulations,
not a claim that the reporter's machine/game or physical transport was tested.
Final local validation¶
The combined source passed 6,681 tests, 0 failed, 12 opt-in hardware cases skipped (6,693 total). Command:
dotnet test DS4WindowsTests/DS4WindowsTests.csproj -c Release -p:Platform=x64 --logger "trx;LogFileName=rc463-complete-final.trx"
The full-suite receipt is DS4WindowsTests/TestResults/rc463-complete-final.trx.
The five profile-focused classes contain 82 checks, and the three mouse-focused
classes contain 276. All 358 combined checks passed three consecutive runs,
recorded separately as rc463-combined-repeat-*.trx. Earlier profile-only snapshots passed 78 checks
and three repeats before the final four UI admission cases were added.
Independent reviews checked action/KBM/publication ordering, nonblocking cold admission, exact registration identity and neutral-retirement intent cleanup. The hosted MSI expected-version parameter contract also passed 17 native-free cases. CI, tagged release and final downloaded-package evidence are separate publication gates. No installer was run on the user's machine for validation.