[BUG] Desktop app: cross-session messages render in target session's UI but never reach the runtime input queue (regression 2.1.222 -> 2.1.227)

Status Fixed / completed
Reported on v2.1.222
Maintainer reply None cached
Activity 15 comments · opened Aug 13, 2026 · closed Aug 19, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

Sending a message from one desktop-app session to another (session-management send_message tool) returns success and renders the message in the target session's conversation UI, but the message is never injected into the target's model context. The receiving Claude never sees it, never acts, never replies. Manually typing/pasting the same text into the target session works normally.

Regression window: worked on claude-code runtime 2.1.222 (installed 7 Aug, daily multi-session relay use). Broke immediately after the desktop app auto-updated the runtime to 2.1.227 on 12 Aug 2026 15:39 NZST.

Steps to reproduce:

  1. Two desktop sessions A and B. B mid-turn on a long task.
  2. From A, send B a message via send_message. Tool returns "Message queued for session ... will be processed after the in-flight turn finishes".
  3. The message renders inline in B's conversation UI.
  4. B's turn ends (last transcript entry is assistant; file stops being written). No new turn starts. The message text appears in NO .jsonl under ~/.claude/projects/.
  5. Repeat with B idle: tool returns "Message sent to session ..."; same result, nothing delivered.

Forensic localization (from the receiving session's transcript jsonl):

  • Local input works: typed messages and suggestion-chip clicks each produce a clean queue-operation enqueue/dequeue pair, milliseconds apart, followed by a user turn.
  • Inbound cross-session messages produce NO queue-operation entries at all. They never reach the claude-code runtime's input queue. The desktop app renders them in the UI from its own store, but the handoff to the runtime never fires.
  • Typing into the receiving session does NOT flush them (tested): the typed message processes alone; the rendered cross-session messages remain permanently invisible to the model. This distinguishes this bug from #66310, whose flush-on-next-message behavior belongs to the local typed queue.
  • Live impact example: session B asked session C a question via send_message; C's answer rendered in B's UI as a ghost while B's model kept reporting "no reply yet" and dependent work stalled.

Ruled out:

  • crossSessionInbound is unset in every scope (user settings, project settings, and the desktop's --settings values, verified from process command lines). Setting "crossSessionInbound": "accept" in user settings changes nothing.
  • The CLI cross-session messaging feature is absent on this platform (/list-agents unrecognized, consistent with docs saying native Windows is unsupported), so this concerns the desktop app's own session-to-session channel.
  • No feature-flag kill-switch env vars set (CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, DISABLE_TELEMETRY, DO_NOT_TRACK, DISABLE_GROWTHBOOK all unset).

Relation to existing issues: #66310 (closed duplicate) and #61718 (closed not-planned/stale) describe the same symptom family but lack the regression window, the transcript-level proof that the message never reaches the runtime queue, and the idle-path loss shown here.

Impact: breaks all unattended multi-session coordination. Sender sees success, receiver silently never acts, no error anywhere.

Environment: Claude Code desktop app 1.28929.0, claude-code runtime 2.1.227 (spawned from %APPDATA%\Claude\claude-code\2.1.227), Windows 11 Pro 10.0.26200. Sessions in permission modes auto and bypassPermissions (symptom identical for both).

What Should Happen?

A message sent to another session is injected into that session's model context: for a mid-turn target, after the in-flight turn finishes (as the tool's own response promises); for an idle target, immediately as a new turn. The receiving Claude then acts on it, as it did on runtime 2.1.222.

Error Messages/Logs

Sender-side tool responses:
  (target mid-turn) "Message queued for session local_cb4cfa08-... ("FCC"); it will be processed after the in-flight turn finishes if that session stays healthy."
  (target idle)     "Message sent to session local_cb4cfa08-... ("FCC")."

Receiving session's transcript jsonl - local input produces queue events:
  {"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-13T00:11:58.095Z","sessionId":"3ae9a550-...","content":"Check with OCM"}
  {"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-13T00:11:58.099Z","sessionId":"3ae9a550-..."}
  {"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-13T00:24:29.135Z","sessionId":"3ae9a550-...","content":"test"}
  {"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-13T00:24:29.147Z","sessionId":"3ae9a550-..."}

Cross-session messages sent 00:07 and 00:22 to this session: zero matching entries of any type in any .jsonl under ~/.claude/projects/ (grepped all files, including the actively-written transcript; target turn ended 00:08:23, checked again minutes later and after the 00:24 typed flush). The message text exists on disk only in the SENDER's transcript.

Timeline: 2.1.222 installed 7 Aug (worked). 2.1.227 auto-installed 12 Aug 15:39 NZST (broken from first use after).

Steps to Reproduce

  1. Desktop app on native Windows, two sessions: A (any project) and B running a long autonomous task (mid-turn).
  2. In A, ask Claude to send B a message via the session-management send_message tool (e.g. "tell session B the migration finished, ask it to acknowledge").
  3. Observe A's tool result: "Message queued for session ... will be processed after the in-flight turn finishes if that session stays healthy."
  4. Observe B's conversation UI: the message renders inline, labelled "Message from <A's title>".
  5. Wait for B's turn to end and the session to go idle (B's transcript .jsonl under ~/.claude/projects/ stops being written; last entry type is assistant).
  6. BUG: no new turn starts in B. Grep B's .jsonl for any distinctive substring of the message: zero matches, and no queue-operation enqueue entry exists for it (contrast: typing into B produces an enqueue/dequeue pair and a user turn).
  7. Repeat with B already idle: A's tool result is "Message sent to session ...". Same outcome: no turn, no transcript entry, message lost.
  8. Type anything into B: only the typed message processes. The rendered cross-session messages are never delivered, confirming they are not in the runtime queue at all.

Reproduces 100% of the time on 2.1.227, on both auto and bypassPermissions targets. Same workflow delivered correctly on 2.1.222 (7-11 Aug).

Claude Model

None

Is this a regression?

Yes, this worked in a previous version

Last Working Version

2.1.222

Claude Code Version

2.1.227 (Claude Code, desktop app runtime; app 1.28929.0)

Platform

Anthropic API

Operating System

Windows

Terminal/Shell

Other

Additional Information

Terminal/Shell = Other because the affected sessions run inside the Claude desktop app (Cowork-style), not a terminal. Auth is a claude.ai subscription. The same short report was also submitted through the in-app feedback channel so app logs can be attached there.

View original on GitHub ↗

5 Comments

mouarg · 18 days ago

Likely-fix correlation from the changelog, for triage:

2.1.228 lists "Fixed cross-session messaging sometimes starting without an inbox in the first session after install." That matches the forensics above precisely: the broken runtime (2.1.227) was auto-installed at 15:39 on 12 Aug, every affected session was among the first after that install, and a session with no inbox is exactly one where messages render in the UI but produce no queue-operation entry and never reach the model. 2.1.225's "parked without a notice or expiry" fix and 2.1.229's display improvements sit in the same area.

Current state on the affected machine: the desktop app is at its latest published version (1.28929.0.0, confirmed via winget, no upgrade available) and it pins bundled runtime 2.1.227, so the 2.1.228 fix cannot be obtained on the desktop channel yet. Standalone CLI 2.1.229 on the same machine is unaffected either way (native Windows has no CLI cross-session messaging).

Will re-test the moment a desktop release ships a bundled runtime >= 2.1.228 and report pass/fail here. If the inbox fix is confirmed, this issue can likely be closed against that change.

widetech1 · 17 days ago

Confirming same reproduction — Desktop app 1.28929.0 / runtime 2.1.227 on Windows 11

Seeing the exact behavior described here. Same environment as the original report:

Desktop app: 1.28929.0
Claude Code runtime: 2.1.227 (auto-updated; was working before)
OS: Windows 11
Auth: claude.ai subscription

Symptom: Cross-session send_message reports success on the sender side, and the message renders in the recipient session's UI, but the recipient runtime/model never receives it — no new turn is created, the session just sits idle and acts as if nothing arrived. As a human I can see the message in the recipient window, but the session doesn't know it got one.

What I've confirmed matches the report:

Sender gets a success/"message sent" response.
Message text is visible inline in the recipient's conversation UI.
Recipient never starts a turn and never replies.
Typing any text directly into the recipient session works normally, but the already-rendered cross-session message is never processed even after that.

This is a regression — cross-session messaging worked before the 2.1.227 auto-update. It breaks all unattended multi-session coordination on Windows, and the silent "success" on the sender side makes it especially hard to detect.

Happy to provide transcripts or additional details if useful. +1 on prioritizing a fix (or at minimum returning an explicit error instead of a false success).

Bianco24siete · 17 days ago

Same regression here, with an additional symptom that makes it costlier than reported.

Environment

  • Windows 11 Home 10.0.26200
  • Desktop app 1.28929.0
  • Runtime 2.1.222 (working, installed Aug 7) → 2.1.227 (auto-installed Aug 12, 11:14 local)
  • Tool: mcp__ccd_session_mgmt__send_message, desktop-to-desktop sessions

Additional symptom: the recipient DOES start a turn, and burns tokens with no message

Both this issue and #86212 report that the recipient never acts. In our case the recipient session wakes up and consumes a turn without receiving anything:

07:35:0x  send_message -> "Message sent to session ..."   (recipient was idle)
07:35:16  recipient session isRunning = true              <- 16s later, a turn started
          the message card is rendered in its UI
          the model never receives the content and produces nothing useful

So the wake-up signal reaches the runtime but the message body does not. Unattended, this is the expensive failure mode: a session can sit consuming tokens with nobody watching. There is a public report of a session idling 11.3 hours before a human intervened (#78338).

Also observed, matching this issue exactly

  • Same two acknowledgement strings, verbatim: "Message queued for session ...; it will be processed after the in-flight turn finishes if that session stays healthy" when the target is mid-turn, and "Message sent to session ..." when idle.
  • Messages acknowledged as queued are lost if either session is cleared or restarted before processing.
  • The recipient's .jsonl never records cross-session messages, so the transcript cannot be used to verify delivery.

Downgrade note

We tried reverting to 2.1.222 by renaming the 2.1.227 directory under %APPDATA%\Claude\claude-code\. On restart the updater re-downloaded 2.1.227 and removed both the renamed folder and the 2.1.222 install. We could not find a local setting to pin the runtime version or disable auto-update, so the published workaround is not reachable from the desktop app.

arthurmoraesfernandes-afk · 17 days ago

Card renders / model never sees it — #86298 documents the same failure chain with root-cause analysis (Windows desktop, regression at app 1.28929.0 / bundled CLI 2.1.227, still present on app 1.30096.1.0 / CLI 2.1.229): the desktop bridge sends the message with a class-less origin:{kind:'peer'}, the recipient CLI/SDK's cross-session consent gate holds it for an approval no desktop surface offers, and dialogExpiry (~5 min) then drops it — while the sender keeps a success receipt. A memory-dump repro in that thread shows the payload reaching the recipient CLI process but never its transcript. Setting crossSessionInbound: "accept" in user settings does not unblock it (tested on running, cold-started, and post-restart fresh sessions).

Bianco24siete · 17 days ago

Update on the 2.1.228 inbox-fix hypothesis — it already shipped here, and the failure persists.

@mouarg — no need to wait for a desktop release with bundled runtime >= 2.1.228. This machine now has it:

desktop app         1.30096.1
bundled runtime     2.1.229
runtime directory   %APPDATA%\Claude\claude-code\2.1.229, created Aug 13 18:50 local

So the 2.1.228 fix ("cross-session messaging sometimes starting without an inbox in the first session after install") is present, and the behavior is unchanged.

Re-tested today on 2.1.229: 9 messages to 4 different sessions — including sessions created after the new runtime was installed, so not "the first session after install" in any sense. Zero delivered, zero written to any recipient transcript.

Verified by parsing ~/.claude/projects/<project>/*.jsonl and counting only real inbound <cross-session-message from=...> tags inside type: "user" turns:

1,945  inbound messages written to transcripts, historically
last:  2026-08-12T02:40:42Z
after: zero

Also negative on 2.1.229, for triage: app restart · app update/restore · recipient in permissionMode: "default" (verified in its transcript as auto -> auto -> default before testing) · crossSessionInbound: "accept" set before the session started · a bare working directory with no CLAUDE.md, hooks, or local settings.

⚠️ One methodology note that cost me hours: list_events renders the message for the recipient session even though it never reaches that session's transcript on disk, so it cannot be used to verify delivery. And a plain grep for cross-session-message gives false positives, because the sender's transcript also contains the message text — you have to parse the JSON and require a type: "user" turn.

Fuller write-up of the root-cause chain and the confounds I could not rule out locally is in #86298.

Showing cached comments. Read the full discussion on GitHub ↗