SendMessage to a cloud session says "one-way for now … do not ask it to reply here", but the cloud session can reply via Remote send_message
Status Open
Reported on v2.1.286
Maintainer reply None cached
Activity 9 comments · opened Oct 2, 2026
Summary
When a local Claude Desktop (Code tab) session sends a message to a cloud session with the built-in SendMessage tool, the tool result says the route is one-way and tells the model not to ask for a reply:
… a Claude session running in the cloud; not confirmed read — that session may hold it (different permission mode: its user must approve first) or refuse it, and this route reports nothing back; one-way for now: a cloud session cannot message other sessions back yet — do not ask it to reply here; its response appears in its own transcript at claude.ai/code
In practice the cloud session can and does reply: it uses the Claude Code Remote MCP send_message tool, and the reply arrives in the local session as a normal user turn wrapped in <cross-session-message from-session="session_…">. So the instruction "do not ask it to reply" is misleading — models that follow it stop requesting replies that would in fact arrive, and they report the channel to the user as one-way.
Steps to reproduce
- Have a local Claude Desktop Code session (Remote Control connected) and a cloud session (claude.ai/code) on the same account.
- From the local session, call
ListAgents, thenSendMessageto the cloud session's name (listed with kindcloud). - Observe the tool result text quoted above.
- In the cloud session, reply with the Claude Code Remote MCP
send_messagetool addressed to the local session. - The reply is delivered to the local session as a user turn (
<cross-session-message from-session="session_…">).
Observed
- 2026-10-02 16:03 KST: local → cloud
SendMessagereturned the "one-way for now … do not ask it to reply here" text. At 16:04 the cloud session's reply arrived in the same local session as a user turn. - Same round trip observed several times between 2026-10-01 and 2026-10-02 across four different local sessions (the reply woke idle local sessions as well).
- The wording caused repeated wrong conclusions: models wrote "cloud is one-way, do not attach reply requests" into shared instructions and reports, which then had to be corrected by hand.
Expected
The tool result should describe what is actually true, for example:
- "A reply cannot come back over this same route; the cloud session can reply through its own Remote tools, and that reply will arrive here as a cross-session message", or
- drop the "do not ask it to reply here" instruction when the target cloud session has the Remote
send_messagetool available.
Environment
- Claude Code 2.1.286 inside the Claude desktop app (Code tab), Windows 11
- Local session: Remote Control enabled; target: cloud session on the same account
- Tools involved: built-in
ListAgents/SendMessage(local → cloud), Claude Code Remote MCPsend_message(cloud → local)
9 Comments
Follow-up from the same day, to keep the report accurate: the cloud → local direction is not reliable either.
send_messagetool to a local Claude Desktop Code session (Remote Control connected, idle, same account). None of the three arrived in the local session's conversation. The targetsession_…id matched the local session's current (most recent) bridge session id.So there are two separate problems:
SendMessagetool result text says replies are impossible ("one-way for now … do not ask it to reply here"), which is wrong when delivery works.send_messagesometimes silently does not reach an idle local session, with no error on either side.For (2), a delivery status the sender can check (delivered / queued / held for approval / dropped) would let sessions fall back to another channel instead of waiting.
More detail on the cloud → local non-delivery, checked from the cloud side with the Remote session event listing (2026-10-02, times UTC):
queued_notification, originmcp_send_message, prioritynext— at 07:37:38, 07:43:46, 07:45:05, 08:02:13 and 08:16:09.ReadNotificationscall in the local session two minutes after the fourth one returned "No queued notifications". On the local machine the text does not appear in any transcript file.['queued_notifications'](seen with CLI 2.1.284 and with 2.1.286 at 03:31 UTC); the non-working period shows['queued_notifications', 'third_party_notification_caution'](2.1.286, bridge object created 05:46 UTC).SendMessagefrom the local session to the cloud session was shown to the user in the app only as a "message received from another session" card and did not enter the cloud session's conversation.So the messages are not lost or misrouted; they sit in the queue of the right session and are never handed to the conversation. If
third_party_notification_cautionis meant to hold third-party notifications for user confirmation, then (a) the sender gets no signal that the message is being held, (b) the receiving model cannot see or drain the held items (ReadNotificationsreports none), and (c) it was not obvious on the local Desktop side that anything was waiting (whether a confirmation card was shown there has not been confirmed yet). Local-to-local messages between Desktop sessions on the same machine kept working normally during the same period.Follow-up: the user reports seeing no confirmation card or prompt for these queued third-party notifications in the receiving session's window (casual check, not exhaustive). So the notifications appear to stay queued without any visible surface to approve or read them.
More data, narrowing this down: the problem is not specific to cloud → local. The affected local desktop session does not take in messages from another local session on the same machine either.
send_messagetool targeting the affected session while it was idle. Tool result:Message not delivered to session local_… : "that session gave no sign of starting on it within 20s (it may be waiting for approval there, or slow to start); it can still pick it up later". (delivery: undelivered).Message delivered … its turn has started on it. (delivery: delivered). So the sender and the tool work; only this one receiving session does not pick messages up.ReadNotificationsin that session returned "No queued notifications."/clearmany times (same session id, new conversation each time). Earlier the same day it received messages normally from both local and cloud senders; a fresh/cleardid not restore delivery.Desktop app on Windows 11, Claude Code 2.1.286.
Root cause found on our side, correcting my previous comments: the receiving session was in bypass permissions mode. While a desktop session is in that mode, messages from other sessions (cloud
send_messageand local session-managementsend_messagealike) are not taken into the conversation.Evidence — per-turn
permissionModein the receiving session's transcript, matched against delivery:| Receiving session mode | Inbound messages |
|---|---|
|
auto(early afternoon) | 3 local messages delivered normally ||
bypassPermissions(about 4 hours, across a/clear) | 5 cloud messages + 1 local message: none delivered || switched back to
auto| next cloud message delivered within seconds, as its own turn |Details:
delivery: undelivered … gave no sign of starting on it within 20s (it may be waiting for approval there, or slow to start); cloud sender sees the message sit asqueued_notification.ReadNotificationsreturns "No queued notifications."auto; only messages sent afterwards did.third_party_notification_cautioncapability mentioned earlier was presumably just a consequence of this mode.If blocking cross-session messages in bypass mode is intentional (it seems a reasonable safety choice), the gaps are in the surfaces:
Desktop app on Windows 11, Claude Code 2.1.286.
One refinement to my previous comment. The SendMessage tool description already says: "a session running in a different permission mode than yours holds cross-session messages for its user's approval (and may let them expire)". So the condition is probably "sender and receiver are in different permission modes" rather than bypass mode specifically (I did not test bypass → bypass), and holding the messages looks intentional.
What remains is narrower: in the desktop app the receiving session's window showed no surface where the user could approve or even see the held messages (checked twice by the user), and the held messages were gone after the mode was switched back. So "held for its user's approval" was, in practice, a silent drop.
Final correction after controlled tests (same machine, two desktop sessions, local session-management
send_message, modes confirmed from each session's state file before every send). My "probably different permission modes" guess above was wrong.| Sender → Receiver | Result |
|---|---|
| auto → auto | delivered |
| auto → default (manual) | delivered, no approval prompt for the message itself |
| bypass → bypass | delivered |
| auto → bypass | held (also cloud → bypass) |
| default → bypass | held |
So the only failing case we could find is: receiver in bypass permissions mode, sender not in bypass mode.
What "held" looks like on the receiving side (screenshots available if useful):
isRunning: false; stopping it returns "idle; nothing to stop"). The transcript has no record of the message.delivery: undelivered … gave no sign of starting on it within 20s (it may be waiting for approval there, or slow to start); it can still pick it up later.Release / expiry:
Requests, if holding in this case is intended:
Desktop app on Windows 11, Claude Code 2.1.286.
Correction to request 3 in my previous comment: the rule is documented, I just had not found it.
crossSessionInbound/dialogExpiryin https://code.claude.com/docs/en/settings-reference).dialogExpiry, five minutes by default; a class change while held re-applies the rule) matches every result in my table above, including the 2-minute message being released and the 9-minute-plus ones being gone.So this narrows to one defect plus two wording issues:
Plus the original item of this issue (the "one-way for now" wording).
Same wording observed on macOS, in a local Claude Desktop (Code tab) session that has Remote Control on — and the reply route the cloud session suggests is not available on the local side.
Environment
claudeCLI on PATH reports 2.1.287 (the desktop app's own version not checked separately)auto, Remote Control on (session management reportsremoteControlActive: true,remoteControlState: "on")What happened
send_messagetool. It arrived as across-session-messagewithfrom-session="session_01…"and asked the receiver to reply by "calling the send_message tool of the Claude Code Remote MCP server with session_id set to the from-session value".send_messagewithsession_id: "session_01…"→Message not delivered: session session_01… not found. (delivery: undelivered)SendMessagewithto: "session_01…"→No agent named 'session_01…' is reachable. Use ListAgents to see everyone you can message.ListAgentslisted the cloud session by name (<name> [ref] · cloud · idle).SendMessageto that name succeeded, but the result again said: "one-way for now: a cloud session cannot message other sessions back yet — do not ask it to reply here" — although this session is connected to Remote Control, which the docs say gives the message a reply address (https://code.claude.com/docs/en/cross-session-messaging#message-sessions-on-other-machines).Suggestions
from-session(or haveSendMessageresolve it), or put the target'sListAgentsname into the incoming envelope; today the reply instruction in the incoming message points to a tool that local sessions don't have.