SendMessage returns success but silently drops messages; Remote Control sessions should still do local inter-session messaging
Summary
Two related problems with cross-session messaging (SendMessage / ListAgents) when Remote Control is involved:
- Feature request: a session connected to Remote Control should still participate fully in local inter-session messaging.
- Bug (the damaging part): when messaging does break for a session,
SendMessagestill returns success. Nothing surfaces the failure, so both sides sit waiting on each other.
The silent-success part is what actually cost us time — roughly two hours of two agent sessions each believing the other had gone quiet.
Environment
- Claude Code 2.1.247,
entrypoint: claude-desktop, Windows 11 - 5–6 concurrent interactive sessions in the same working directory
- Two of them had
bridgeSessionIdset in~/.claude/sessions/<pid>.json(Remote Control connected)
What we observed
One session (call it S1) stopped exchanging messages entirely:
- Outbound: 8 consecutive
SendMessagecalls to 5 different peers all returnedsuccesswith amsg_id. None of them appear in any recipient's transcript. Verified by grepping each recipient's~/.claude/projects/<slug>/<sessionId>.jsonlfor<cross-session-messageuser turns. - Inbound: S1's last genuine inbound message was at 11:07 local time. Nothing after.
- Both directions stopped within ~3 minutes of each other, and within ~3 minutes of S1's registry entry being rewritten with a
bridgeSessionId. ListAgentscontinued to list peers normally the whole time, so nothing in the UI suggested a problem.
Meanwhile a second session that was also bridged (bridgeSessionId present) kept exchanging messages with an unbridged peer normally, in both directions, during the same window. So "bridged = broken" is not the rule — whatever the trigger is, it is narrower than that. We could not isolate it further from the client side.
Why this is hard to notice
There is no observable difference between "delivered" and "silently dropped":
- The tool result is
successplus amsg_id. ListAgentsstill shows the peer as alive and interactive.- The only way we found to check delivery was to read the recipient's transcript file directly and grep for the message.
Two sessions each concluded the other was unresponsive, and each wrote that into its own status reports. A blocked production promotion sat idle for ~50 minutes because an approval message was never delivered.
Suggested fixes, in priority order
- Do not report success for a message that was not delivered. Either await an ack from the recipient socket, or return a distinct result (
queued,undeliverable,unknown) so the caller can retry or escalate. - Surface bridge/transport state in
ListAgents. Today the annotation; it is also connected via Remote Controlappears on the recipient row, but there is no indication of the sender's own transport health. A row likemyproj-a1 · interactive · messaging: degradedwould have made this visible in seconds. - Let Remote Control sessions participate in local messaging (the original request). A session being reachable from claude.ai/code or mobile should not change its local peer connectivity.
- Optionally, a self-check — something like
/remote-controlreporting "local messaging: OK / not delivering" — would make this diagnosable without reading raw transcript files.
Reproduction
We could not reduce this to a deterministic repro; it appeared during a normal multi-session working day and persisted for hours. What we can say precisely:
- It is observable by comparing
SendMessageresults against the recipient's.jsonltranscript. - It correlates with
bridgeSessionIdappearing in~/.claude/sessions/<pid>.json, but that correlation has a counterexample on the same machine at the same time (n=1 for the failing case), so we are reporting the correlation rather than asserting causation.
Happy to provide more detail if useful.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗