[BUG] VS Code extension: remote session from another machine shows "Couldn't load earlier messages" / "New messages start a new conversation", and each sent message silently forks a NEW local session
Environment
- Claude Code CLI: 2.1.251 (originating machine, DAVOR-DESKTOP); secondary machine version unknown (same auto-update channel, presumed 2.1.x)
- VS Code extension: anthropic.claude-code 2.1.251
- OS: Windows 10 Pro (both machines)
- Sessions run under a custom
CLAUDE_CONFIG_DIR(secondary-account setup,%USERPROFILE%\.claude-team2); both the originating terminal session and the connecting VS Code extension use the same custom config dir. Untested whether the default~/.claudeconfig dir is also affected.
Describe the bug
Opening a remote-control session that was started on a different machine in the VS Code extension loads no history at all: the view shows "Couldn't load earlier messages" and "New messages start a new conversation". Worse, sending a message does not error — it silently creates a brand-new local session in the current workspace folder (with its own fresh bridge session), so the message never reaches the original session. Repeated attempts left 4 such "zombie" sessions in the workspace.
Steps to reproduce
- Machine A: start an interactive session with remote control enabled (
remoteControlAtStartup: true), under a customCLAUDE_CONFIG_DIR, and exchange several messages. - Machine B: open VS Code (extension running under the same custom
CLAUDE_CONFIG_DIR), open that session from the sessions list. - Observe: no history loads — "Couldn't load earlier messages" / "New messages start a new conversation".
- Send a message → a new local session is created in the current workspace folder; the original session on Machine A never receives it.
Expected behavior
The extension attaches to the existing remote session (full history + live two-way sync), as claude.ai/code does — confirmed working: the same session opened in the browser shows full history and two-way messaging.
Actual behavior
No history is fetched, and each send forks a new local conversation. Transcript forensics on the affected machine confirm the mechanism: the extension-created session file (entrypoint: "claude-vscode") begins with its own newly minted bridge-session record (bridgeSessionId: cse_…, lastSequenceNum: 0) instead of attaching to the original session's existing bridge id — i.e., it falls back to "new local session + new bridge" rather than resuming the remote one. The silent fork is the damaging part: messages appear sent but land in a dead-end session.
Additional context
- Original session's transcript lives only on the originating machine (
<config-dir>/projects/...jsonl), but the data clearly exists server-side since claude.ai/code renders it fully. - Possibly related to #26908 / #41269 (resume: undefined → new session), but here the session does open a UI and accepts input, making the failure silent.
3 Comments
Same failure on a single machine with the default config dir, which answers the
"untested whether the default
~/.claudeconfig dir is also affected" note in the report:it is.
Environment
anthropic.claude-code2.1.261 (win32-x64)CLAUDE_CONFIG_DIRunset — default~/.claudeWhat differs from the original report
The sessions that fail here were never remote sessions at all. They are ordinary local
conversations created days-to-weeks before Remote Control was ever enabled, with no
server-side counterpart to attach to. So the failure isn't limited to "extension fails to
re-attach to a session started elsewhere" — once Remote Control is active, any
pre-existing local session opened from the history droplist fails the same way.
That suggests the fallback path is unconditional: the extension mints a fresh bridge for
whatever it opens, rather than only doing so after a remote attach attempt fails.
Symptom
The droplist lists sessions with correct titles. Selecting one renders a blank chat with
"Couldn't load this conversation earlier messages. New messages start a new conversation."
and "Remote Control is active" beneath it. The title then displays as "Untitled".
The split is informative: titles resolve, bodies don't. The extension reads the title
from the local
.jsonl(which is why the droplist looks healthy) but delegates the messagebody to the bridge, which has nothing.
Transcript forensics — same
lastSequenceNum: 0signatureAll four local sessions in the affected workspace,
~/.claude/projects/X--dev/:| session | entrypoint | bridge | lastSequenceNum |
|---|---|---|---|
|
4b9c4644|claude-vscode| none | — ||
57b6c090|claude-desktop|cse_01NyYoVxKjVejX2DwKk4j1up| 0 ||
58ecd281|cli,claude-vscode|cse_0136UewYjtLfAKA9befsB54r| 0 ||
9040a6cf|claude-desktop|cse_01G95LziXH1FDj1kuAtqUH7j| 0 |Every
bridge-sessionrecord carries"lastSequenceNum": 0— the bridge replays nothing.~/.claude.jsonaccumulated fourreplBridgePlaceholdersentries (cse_…) over the courseof the failed attempts.
Two clarifications that may narrow the diagnosis
the transcript —
{"type":"custom-title","customTitle":"Passkey system limitations",…}is still present and unmodified. "Untitled" is a UI placeholder for the empty bridged
conversation, not a write. The original report doesn't claim otherwise, but it's worth
recording that the local file is not damaged by a failed open.
here — the workspace still holds exactly 4 transcripts — because the failed load was
observed without sending anything afterward. This is consistent with the original
report's step 4 and bounds it: opening alone appends bridge/title metadata but creates
no new session; the fork happens on send.
Workaround
claude --resume <session-id>from the CLI loads full history correctly, bypassing thebridge. Turning Remote Control off restores the extension's history droplist.
Follow-up to my earlier comment, same machine (CLI + extension 2.1.261, Windows 11,
default
~/.claudeconfig dir, single machine). The silent fork reproduces here too,so it is not specific to a custom
CLAUDE_CONFIG_DIRor to the cross-machine case.Reproduced fork, with timestamps
Two sessions were created in the
OblivionRemastered_ItemCloneproject folder during theRemote Control window:
| session | created | size | content |
|---|---|---|---|
|
61c0b757| 14:50:21 | 221 B |custom-title+modeonly — zero messages ||
14a42a99| 14:56:12 | 231 KB | 2 user records, 0 assistant |14a42a99's first user record, at2026-09-05T19:56:12Z:Its second and final user record is
[Request interrupted by user]. The message never gota reply in that session.
82 seconds later, at
2026-09-05T19:57:34Z, that same opening message began session9040a6cfin a different project folder (X--dev), where it ran normally. So onetyped message produced a dead session in one project folder and a live one in another.
The forks inherit a title, which is what makes the droplist misleading
Both zombies carry
{"type":"custom-title","customTitle":"Handoff review: Oblivion— a title belonging to that workspace's earlier work. The resultRemastered item clone"}
in the droplist is two entries with an identical, plausible-looking recent title holding 0
and 2 messages, while the session with the actual work (
427941d4, 325 user / 591assistant) sits under an unrelated older title. To the user this reads as "my recent
sessions are gone" even though nothing was lost.
Partial workaround, and one that does NOT work
remoteControlAtStartup: falserestores sessions in the extension **only if theywere never opened while Remote Control was active**. Sessions touched during the RC
window still render blank afterwards — now without the "Remote Control is active" badge,
but with the same "Couldn't load this conversation's earlier messages" text and the same
"Untitled" display.
bridge-sessionandatis-latchrecords from the affected transcripts doesnot fix those sessions. Worth recording as a negative result: the stuck state is not
(or not only) in the transcript. Sessions that load correctly also contain
atis-latchrecords, and the extension re-appends
atis-latch+modeon open — two previouslyworking transcripts each grew ~166 bytes simply from being browsed.
claude --resume <session-id>from the CLI loads full history correctly in every case,including sessions the extension cannot render. That is the reliable workaround.
Minor note for anyone debugging transcripts: titles are stored as
aiTitleonai-titlerecords andcustomTitleoncustom-titlerecords — there is notitlekey.Scanning for the wrong key makes fully-titled sessions appear untitled.
Personal note: this is why I don't trust new features added to the developer tools. Your UX is a hot mess. With so many features that don't work across different tools or that break other existing features within a tool, the bugs pile up and become a pattern of negligence, leading to erosion of customer confidence. You sold me an easy feature to enable that instantly damaged my progress and derailed me for hours. Marketing a feature in the tool that breaks what the user is working on without warning or any way to revert is the worst move you could possibly make here.