Skip to content

Pro Bluetooth counter continuity: September 5, 2026

Observed failure

The running Desktop b65 lab logged VIIPER XboxOne feedback reader stopped at 09:48:44.703. The broker's preceding event at 09:48:44.701 says DS4Windows rejected canonical Xbox feedback; the broker then ended that stream and removed the virtual device after its five-second disconnect timeout. The socket error is a consequence, not the first failure.

A private, local-only heap snapshot of the exact running DS4Windows process 35472 retains the failed Bluetooth input owner, its ring buffer and mapper:

  • Pro/Common05 input: 94,738 published reports, zero queue overflows, one rejected notification, terminal reason SinkFailure.
  • Runtime sink: lastProMappingFailure = BackwardOrOutOfOrder.
  • Consecutive ring slots 5 and 6 contain the counter/host-completion pair below. Only these scalar timing values are reproduced here, not opaque reports, device identifiers, association data, or heap contents.
ring slot raw device counter host completion QPC
5 1,431,640 2,200,529,540,394
6 1 2,200,529,689,392

At 10 MHz this is a 14.8998 ms completion interval, with no host-time regression. The session retains the obsolete high counter after the rejected frame. The input-owner retirement also closes the feedback lifetime, so subsequent Xbox feedback is rejected. This is distinct from b64's output-switch queue overflow. The physical terminal-feedback retirement also reports TerminalDeliveryRejected and the owner is quarantined; fixing input admission does not prove that separate failure cleanup is correct.

Correction and reference

Extend the already hardware-evidenced Pro USB Common05 arrival-order policy to Pro Bluetooth Common05. Preserve the raw 32-bit modular classification as diagnostics, including BackwardOrOutOfOrder at the reset, but do not use that controller-clock field as a transport sequence fence. Advance the baseline after each valid arrival; live session, replay and profile mapper share the same policy. Do not assume an exact firmware clock modulus or reset period.

Switch2Connect commit 61ac6642ce12fe7217e38a860b14863b18ca7e28, src/controller.py, stores this field in ControllerInputData.time and its enable_input_notify_callback processes Bluetooth notifications without using that field as a monotonic admission fence. This is behavioral reference, not copied source. The new BLE observation supplies the evidence deliberately left open in the USB audit.

Exact GATT identity, current lease, device/transport generations, framing, calibration and host-QPC checks remain required. Joy-Con policies are unchanged. No new timer, queue, delay, rate cap, reconnect workaround or per-report logging is added. Host arrival timing is not a claim about end-to-end input latency.

Regression coverage

Switch2ProUsbCounterRolloverTests uses the observed scalar pair with synthetic buttons and a successor to prove release delivery and baseline advancement. Both transports cover replay/live agreement and rejected stale-generation and regressing-host-time observations without baseline mutation. Explicit tests keep Joy-Con outside the expanded policy.

Switch2BluetoothRuntimeOwnerTests.ProCounterResetDoesNotRetireTheLiveBluetoothRuntime uses the real drain/sink/mapper/runtime/table path and synthetic notifications, waiting for each publication so queue coalescing cannot hide the reset. It requires all reports, no unsubscribe or quarantine, and normal explicit cleanup.

Before the fix: three failures (mapper, replay, runtime), six passes. After: nine passes. Results are in _results/ble-pro-counter-reset-{red,green}-20260905.trx. The full suite passes 3,617 tests with three existing audio skips in ble-pro-counter-reset-full-green-20260905.trx. Raw calibration coverage now accepts Pro USB/BLE discontinuities while still rejecting those on either Joy-Con. Portable deployment and a real counter-boundary soak are separate acceptance gates, recorded in the dated validation ledger; automated tests alone are not hardware acceptance.