3.5.1 (2026-05-28)
Internal Improvements
core/gates: backoff_time_gate + suppressed-hit counter (cc989c0), closes #244core/gates: streak_gate + keyed variants (748f419), closes #244devices: add charging indicator to wireless verse grip (6482bd6)devices: poll inverse3 motion state at 20 Hz (bfc160d)devices: use v3.1 serialization for ready snapshot debug log (0c59c26)http: allow exact-route GET on advanced/deprecated settings (2b5f037)http: gate GET /settings visibility by flag (4f013d8), closes #251modules::inverse-ux: expose paired_with.auto behind preview_mode gate (1f7f0e1), closes #230serialization: add preview_mode global flag for pre-release fields (422e822), closes #230serialization: add euler representation to v3.1 quaternions (c32dd6b), closes #239serialization: explicit quaternion ctor + core assign op (677ed6f)sessions: allow sub-millisecond streaming-reply throttle (9a42719)sessions: preview-gated /sessions v3.1 enrichment (6c1c8f2)settings: promote misc/deprecated as advanced setting (b3528d7)tutorials: prototype for streaming-reply frame check (6b57c39)Bug Fixes
command_processor: prevent mode-flip on Force/Position swap (d754ef1), closes #232command_processor: split one-shot inline drain from ZOH'd control (5960498), closes #117core::gates: keyed time-gate honours latest period per hit (c73b86a)detection: consolidate extra_ports first-injection log (57e21d7)detection: per-port log gating via keyed_gate (04b8d54), closes #243devices: only mark wireless verse grip ready after handle info (dfd7d5d)devices: rate-limit set_extension_data to the wireless verse_grip (011d5a0)http: device selector accept "#1234" and "1234" as device ID (1452c10)http: remove unused context field blocking macOS release build (-Wunused-private-field) (5345989)modules::inverse-ux: auto-pair when 1 Inverse3 + 1 grip are connected (41b3024), closes #227 #227modules::inverse-ux: drop auto-pairs when topology grows past 1↔1 (e4fb80c)modules::inverse-ux: honour force_attached override on Minverse calibration (e24bf84), closes #224modules::inverse-ux: paired_with attached always [secure] for Minverse and on first POST (cafb574)modules::inverse-ux: per-device Inverse3 ↔ VerseGrip pairing registry (ac63d2a), closes #224modules::inverse-ux: POST and DELETE paired_with routes return computed attached state (a751208)Prevent repeated warnings when the service tries to detect a non-WVG device as a WVG (17ad373)protocol::inverse3: handle variable-length 0xBA notification payloads (61f7b1f)service: apply device selector classes alongside index (2d6422a)service: keep device selector expression alive in 404 messages (d2c4626)sessions: apply_preset resets mount on defaults / arm_front (a333da8), closes #240sessions: fall back to self-target when cross-session id is unknown (14367ed), closes #239sessions: full-snapshot reply on cross-session force_render_full_state (8afc646)sessions: honor execute:[secure] on session.configure.serialization (3458af0)sessions: keep device mount cleared when applying defaults / arm_front presets (698008b), closes #252 #253sessions: reset mount to identity on defaults / arm_front presets (a0a2b29), closes #240sessions: restore WS reply on throttled streaming snapshot (787a656), closes #248sessions: tame WS RX hot path under sustained sim load (e4e55d0)Performance Improvements
command_processor: WS RX fast-path for control-only batches (92bb4e8), closes #241engine: converge adaptive dispatch rate with AIMD damping (b8fc1c8), closes #249main_loop: bound asio queue with in-flight tick cap (8d77823)serialization: cache preview options in static struct (8698636), closes #241sessions: reduce session::_mutex contention on hot paths (bf117c8), closes #241 #242sessions: tag Tracy ZoneScoped on session device calls (7404990)