Skip to content

Cross-session send_message delivers to the target session's queue but never triggers a responding turn (regression in desktop 1.28929.0 / CC runtime 2.1.227, still broken in 2.1.231) #86385

Description

@RNPS

Environment

  • Claude desktop app (Windows, MSIX): 1.28929.0 (auto-updated from 1.26832.0 on 2026-08-12 ~10:10 local)
  • Claude Code runtime: broken on 2.1.227; retested after updating Claude Code to 2.1.231 (2026-08-13, app restarted) — still broken (session resumes and loads the transcript on delivery, but no responding cycle starts; no reply received). Release notes for 2.1.229/2.1.231 mention no related fix.
  • Windows 10 Pro 10.0.19045
  • Messages sent via the ccd_session_mgmt MCP send_message tool between local sessions

Summary

Since the 1.28929.0 update, a message sent from one local session to another with send_message is correctly enqueued into the target session (it appears in its transcript as a <cross-session-message> user turn), but the receiving agent never runs a turn over it. The queued message only surfaces when the user manually types anything into the receiving session — it then flushes into that turn together with the user's input.

On 1.26832.0 the receiving session responded to cross-session messages automatically. This broke agent-to-agent report delivery workflows.

Steps to reproduce

  1. Have two local sessions, A and B; leave B idle.
  2. From A, call ccd_session_mgmt send_message targeting B.
  3. Observe B: the message appears in B's transcript, but no response cycle produces output. main.log shows either no query cycle at all, or a delivery cycle that runs and ends with hadFirstResponse=false (observed: 65s and 235s cycles with zero output, one killed by warm-lifecycle/MCP-reconfig housekeeping).
  4. Type anything into B (even "."): the queued message is processed immediately in that turn.

Evidence from %APPDATA%\Claude\logs\main.log

  • Cross-session send to an unloaded session: Resuming session <id> fires (wake works), then LocalSessions.interrupt + healthy cycle … (235s, hadFirstResponse=false) — no output ever produced.
  • Same pattern on a loaded session: cycle ends (65s, hadFirstResponse=false).
  • User-typed input to the same session immediately afterward: LocalSessions.sendMessage → healthy cycle with hadFirstResponse=true, and the queued cross-session message is answered in the same turn.
  • Every send that produced a real response has a preceding LocalSessions.sendMessage (user-typed input); cross-session sends never do after the update.

What we ruled out

  • Not message loss — content always reaches the target's transcript/queue.
  • Not fixed by app restart — failures span a full relaunch.
  • Not session age — brand-new sessions (created after the update) fail identically.
  • Also reproduced between two sessions both created under CC runtime 2.1.231 (2026-08-13): send logged (Sending message to session <target>) at 16:22:43; no query-start or model activity follows.
  • UI side effect (2.1.231 repro): the receiving session's UI shows the message plus a pulsing Claude indicator and a running timer (kept counting past 11 minutes), without the usual token counter / activity verbs of a real query — a stalled "processing" state.
  • Smoking gun (2.1.231 repro): the incoming cross-session message is delivered as a held steer. When the user typed one character into the receiving session (16:34:05), main.log shows [LocalSessionManager] flushed held steers (1 steer(s)) for <target> (16:34:35), the model responded within seconds, and the cycle closed as healthy cycle … (718s, hadFirstResponse=true) — i.e. one cycle had been open since delivery (16:22:43) with the message held the whole time. The regression appears to be that cross-session messages are classified as steers that are held indefinitely; nothing flushes them until a user-typed message arrives.
  • Post-flush behavior is also degraded (2.1.231 repro): after the flush, the receiving agent replied only to the user's typed character ("the dot arrived, ready") and completely ignored the cross-session message's instruction (it was told to send a labeled ACK back via send_message; no ACK was ever sent, and the agent showed no awareness of the message). The message is visible in the session's transcript UI, but the model's flushed turn behaves as if it only received the user's character. In earlier repros on 2.1.227 the flushed message was answered in the same turn, so this may be a second regression or an intermittent variant.

Expected

The receiving session runs a responding turn over an incoming cross-session message automatically, as in 1.26832.0.

Activity

  1. MilkyWay008 commented on Aug 13, 2026

    @MilkyWay008

    Solid writeup \u2014 and the fact it survives the runtime bump to 2.1.231 points at the desktop shell rather than CC itself. Worth testing a rollback of the MSIX to 1.26832.0, the last known-good, and disabling auto-update while you're there; that at least unblocks agent-to-agent delivery until a fix lands. The held-steer evidence you captured should make this easy for them to reproduce.

  2. Blackthornes commented on Aug 14, 2026

    @Blackthornes

    Still broken on desktop app 1.30096.1.0 + runtime 2.1.229 — and the recipient hard-freezes

    Confirming this on the newest desktop build, which extends the regression window past 1.28929.0. Adding one detail that I don't see stated elsewhere in the thread and that changes the severity: the recipient does not just fail to respond — it wedges, and stays wedged until manually stopped.

    Environment

    OS | Windows 11 Home, 10.0.26200 -- | -- Desktop app | 1.30096.1.0 (MSIX, auto-updated from 1.28929.0.0 on 2026-08-13) Bundled runtime | 2.1.229 (both sender and recipient) Transport | mcp__ccd_session_mgmt__send_message, two local desktop sessions, same project directory

    Both sessions were created fresh after the app update, so this is not a stale-session artifact.

    Repro

    Two idle sessions in one project. Sender asked the recipient to reply with a single line confirming receipt — no tools, no file access, nothing but a text reply.

    1. Sender receives Message sent to session ….
    2. Recipient's lastActivityAt advances, and the message lands on the recipient side — it renders in its window and is present in its transcript. Delivery itself is real; the break is entirely on the receiving end.
    3. The recipient's working indicator starts spinning and never stops. No thinking trace, no output, no error, no timeout.
    4. It stays in that state indefinitely. The only way out is stopping the turn manually, which returns the session to a normal prompt.
    5. Typing the same text directly into the recipient's input box immediately afterwards works first try.

    Why this is worse than a silent drop

    The thread so far reads as "messages don't arrive" or "the recipient stays quiet." In practice each send costs a manual intervention and puts the recipient's in-flight state at risk:

    • Messaging cannot be used unattended at all. A send to an idle session parks it until a human notices and intervenes.
    • The success receipt makes it invisible from the sending side, so a coordinating session believes the handoff landed and keeps going.
    • It retroactively explains earlier confusion in multi-session workflows: sessions that appeared to ignore a relay were most likely hung on it the whole time — not declining the work, not missing it.

    We run a multi-session setup where roles hand findings to each other, and we've had to disable cross-session messaging entirely and route every handoff through a shared markdown file. That workaround is stable, but it means the feature is currently unusable for its main purpose here.

  3. arthurmoraesfernandes-afk commented on Aug 14, 2026

    @arthurmoraesfernandes-afk

    This looks like the "wedge" mechanism documented in the follow-up comment on #86298, with app-log evidence: an injected cross-session message that the CLI holds (consent gate) gets drained into the CLI at a turn boundary and is never "echoed" back as a user turn; the app then logs isRunning held by unechoed input at result … pendingEchoUuids: […] and treats the session as busy indefinitely — phantom turn, watchdog kills, and the user's own typed prompts queue/stall behind a turn that never ends until a priority=next send (typing another message force-flushes) or a restart reclaims it. Matches the queue-delivery-without-responding-turn you describe.

  4. RNPS commented on Aug 15, 2026

    @RNPS
    Author

    Retested on 2.1.233 + the new crossSessionInbound setting — still broken; the setting is not the fix

    Retest after today's desktop update (Windows 10, MSIX app, runtime 2.1.233 on both ends, full app restart, two freshly created sessions):

    • Set "crossSessionInbound": "accept" in user settings.json before launching either session (the new /config row from 2.1.232 didn't render in our build — appears feature-gated — but the setting itself is honored from settings.json).
    • send_message returns success and the message lands in the receiver's transcript as a user turn within seconds. Delivery is fine.
    • The receiver flips to "running" immediately and never produces a turn: no thinking trace, no output, for 6+ minutes, after which the UI eventually surfaces a "Claude Code stopped responding — Try sending your message again" error card. Identical wedge with old (pre-update) sessions and with brand-new ones.
    • The wedge is universal on our machine: a third session that received only a two-line summary via send_message wedged the same way, and only recovered when the user typed into it.

    So even with the new inbound setting explicitly on "accept", the receiving side wedges. This closes off "configure accept" as a workaround; the break looks like it's in the receiver's turn-start path, matching the held/un-echoed-input mechanism described above. We remain on file-based handoffs as the only reliable channel.

  5. bcherny commented on Aug 15, 2026

    @bcherny
    Collaborator

    Closing as a duplicate of #86237 — please follow and 👍 that issue instead so we can track it in one place. If you think this was closed in error, comment here and we'll reopen.

    🤖 Generated with Claude Code

  6. added
    duplicateThis issue or pull request already exists
    on Aug 15, 2026
  7. github-actions commented on Sep 30, 2026

    @github-actions

    This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.

  8. locked as resolved and limited conversation to collaborators on Sep 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions