Skip to content

fix(#38): controller_monitor must exclude the evsieve proxy virtuals (MCSS-slot*) - #149

Merged
aradanmn merged 1 commit into
mainfrom
fix/38-monitor-exclude-mcss-virtuals
Jul 25, 2026
Merged

fix(#38): controller_monitor must exclude the evsieve proxy virtuals (MCSS-slot*)#149
aradanmn merged 1 commit into
mainfrom
fix/38-monitor-exclude-mcss-virtuals

Conversation

@aradanmn

Copy link
Copy Markdown
Owner

Found by the on-Deck real-launch validation (2026-07-25). With the proxy on, a 4-up session launched fine and isolated correctly, but a live controller reconnect failed — the returning pad's slot never recovered input.

Root cause

The per-slot evsieve virtuals advertise the physical pad's real vendor:product (device-id=054c:…, so Controlify shows DS4 glyphs). So controller_monitor's raw enumeration — which drops the 28de Steam vendor but not 054c — enumerated the 4 MCSS virtuals as real DS4 pads. It counted "5 external raw pads," warned about shared 054c VID:PIDs, and emitted spurious CONTROLLER_REMOVE/ADD for the virtual nodes. The real pad's physical drop therefore never marked its slot disconnected, so the reconnecting pad hit slot_claimREJECT (known MAC, still "connected") instead of RESUMEproxy_repoint_slot never fired → evsieve sat reopening the stale old node (EACCES).

Fix

step 3b in _list_raw_external_pads drops any device whose Name matches MCSS-slot* (set via evsieve --output name=MCSS-slotN), exactly as step 3 drops the 28de virtuals — the vendor gate can't catch them because they intentionally carry the pad's 054c id. With them excluded the monitor sees only physical pads, so REMOVE/ADD flow cleanly → slot_releaseslot_claim RESUME → repoint.

Test

T2.22 — a physical DS4 + its MCSS-slot3 virtual (both 054c) → only the physical is eligible. Mutation-verified. test_controller_monitor 21 → 22; no new shellcheck warnings.

MCSS_CONTROLLER_PROXY stays default 0 — re-validate the live reconnect on the Deck with this fix before flipping.

Refs #38, #112, #142.

🤖 Generated with Claude Code

…(MCSS-slot*)

Found by the on-Deck real-launch validation (2026-07-25): with the proxy on, a
4-up session launched fine and isolated correctly, but a live controller
reconnect FAILED — the returning pad's slot never recovered input.

Root cause: the per-slot evsieve virtuals advertise the PHYSICAL pad's real
vendor:product (device-id=054c:…, so Controlify shows DS4 glyphs). So
controller_monitor's raw enumeration — which drops the 28de Steam vendor but not
054c — enumerated the 4 MCSS virtuals as if they were real DS4 pads. It counted
"5 external raw pads", warned about shared 054c VID:PIDs, and emitted spurious
CONTROLLER_REMOVE/ADD for the VIRTUAL nodes (misrouted to wrong slots). The real
pad's physical drop therefore never cleanly marked its slot disconnected, so when
that pad reconnected, slot_claim saw a known MAC on a still-connected slot →
REJECT (dup add) instead of RESUME → proxy_repoint_slot never fired → evsieve sat
reopening the pad's stale old node (EACCES) and input never resumed.

Fix: step 3b in _list_raw_external_pads drops any device whose Name matches
MCSS-slot* (the name controller_proxy sets via evsieve --output name=MCSS-slotN),
exactly as step 3 drops the 28de Steam virtuals. The vendor gate can't catch them
because they intentionally carry the pad's 054c id. With them excluded the
monitor sees only physical pads, so the reconnect's REMOVE/ADD flow cleanly →
slot_release → slot_claim RESUME → repoint.

Test: T2.22 — a physical DS4 + its MCSS-slot3 virtual (both 054c) → only the
physical is eligible. Mutation-verified (disabling the gate makes both enumerate,
failing T2.22). test_controller_monitor 21 → 22; no other suite affected; no new
shellcheck warnings.

The MCSS_CONTROLLER_PROXY default stays 0 — re-validate the live reconnect on the
Deck with this fix before flipping it.

Refs #38, #112, #142.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UZuoMpX28CbtGJbigVTv5H
@aradanmn
aradanmn merged commit c012dce into main Jul 25, 2026
4 checks passed
@aradanmn
aradanmn deleted the fix/38-monitor-exclude-mcss-virtuals branch July 25, 2026 12:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant