[Remote Control] Inbound cloud-message delivery silently dead on second machine: per-account Cowork registration conflict (409) is never surfaced, behind a bridge-state.json bootstrap catch-22
Status Open
Reported on v2.1.247
Maintainer reply None cached
Activity 0 comments · opened Aug 30, 2026
Environment
- Windows 11 Pro (both machines), Claude Desktop app 1.40609.0, Claude Code CLI 2.1.247–2.1.250
- Same claude.ai account (Max) on two machines: Machine A (working) and Machine B (broken)
claude doctorclean on Machine B; no proxy, noANTHROPIC_API_KEY, no telemetry-disable env vars
Summary
On a two-machine account, messages queued with claude -p "<msg>" --cloud <session_01…> deliver into live desktop-session panes on Machine A within seconds, but NEVER deliver on Machine B — no error, no log line, nothing. Root cause chain (established over ~2 days of testing, full timeline below):
- The desktop sessions-bridge (the component that drains cloud-queued messages into local panes) only initializes if
%APPDATA%\Claude\bridge-state.jsonalready containsuserConsented: truefor the org:account — but that file is normally only written by the bridge's own start-up. A machine that loses the file (e.g. app reinstall) can never re-create it through any user-reachable path. Settings toggle off/on, full app restarts,/remote-control, and fresh-session creation were all tried; none mint the file. (Related: #86084.) - Once the file was hand-seeded with the minimal
{enabled: true, userConsented: true}object, the bridge initialized for the first time and immediately surfaced the real, previously-invisible blockers:
Cowork OAuth stale-session (session_stale_relogin); parking bridge until re-login: Session is not fresh enough to grant elevated access.— cleared by signing out/in of the desktop app.- Then, decisively:
Registration conflict (409): A Cowork agent is already registered on <Machine A>. Disconnect it there before registering this device.
- So inbound cloud-drain registration is a one-per-account singleton. Machine A registered first and works; Machine B can never receive cloud-queued messages while Machine A holds the slot. None of this is ever shown to the user — without the hand-seeded file the app fails 100% silently, and the drain simply doesn't happen.
Meanwhile, messages typed into the session's claude.ai/code web page DO deliver into Machine B's pane (live socket path), which is how we confirmed the rest of the pipeline is healthy.
Repro (condensed)
- Two Windows machines, one account, desktop app + Remote Control both apparently working ("Enabling remote control for session …",
bridge_state: connectedin main.log on both). - From Machine A:
claude -p "hello" --cloud <machine-B-session-id>→ CLI reports "Sent to cloud session." - Machine B: message never prints; no
queue-operationenqueue record in the session transcript; no error anywhere. - Machine B has no
%APPDATA%\Claude\bridge-state.json; Machine A has one (created at its most recent session start). Machine B's log contains no[sessions-bridge] Initializing bridge/Registering environmentlines, ever. - Seed the minimal file on Machine B, restart app → bridge finally initializes → stale-login park → re-login → 409 conflict naming Machine A.
Expected
- Either multi-machine inbound delivery works, or the limitation is surfaced: the 409 (and the stale-login park) should be shown in the UI, and the consent record should be creatable without hand-editing app state.
- At minimum: a machine whose bridge cannot start should log why at startup instead of nothing.
Log excerpts (Machine B, after seeding the file)
10:13:04 [info] [sessions-bridge] Initializing bridge { oauthEnv: 'production', apiHost: 'https://api.anthropic.com', ... }
10:13:04 [info] [sessions-bridge] Registering environment (fresh)...
10:13:04 [warn] [sessions-bridge] Cowork OAuth stale-session (session_stale_relogin); parking bridge until re-login: Session is not fresh enough to grant elevated access. Sign in again to continue.
-- after desktop re-login --
10:15:30 [info] [sessions-bridge] sessionKey rotated; restarting bridge after session_stale_relogin park
10:15:30 [info] [sessions-bridge] Registering environment (fresh)...
10:15:31 [error] [sessions-bridge] Registration conflict (409): Registration: Conflict (409): A Cowork agent is already registered on <Machine A>. Disconnect it there before registering this device. [request-id: req_011CeZ5EgCn5qy82MWFjDxA7]
Before seeding the file, none of these lines ever appear — the bridge never initializes and nothing is logged.
Related issues
- #86084 — enabled state never persisted to bridge-state.json (this report adds the bootstrap catch-22 mechanism and the reinstall-loses-file-forever consequence)
- #45946 — cloud messages never dispatched into local CLI pane (this report adds the root cause on multi-machine accounts: no bridge registration on the receiver)
- #86014 / #80311 — cross-machine session SendMessage success-but-no-delivery (reproduced here too: 8 sends, 8 success reports, 0 deliveries, transcript-verified both directions)
- #87777 / #69543 — session-level Remote Control enable skipped after app restart until first turn or manual
/remote-control(reproduced)
Notes
- Verified delivery by the receiver's transcript (
queue-operationenqueue records), never by sender success reports. - Machine B previously had a working bridge-state.json under an older install (April 2026); the app reinstall lost it, which is what stranded the machine permanently.