[BUG] Desktop app forks a new session ID (full transcript copy) on every reopen; /resume shows many rows with the same title
Summary
Reopening a conversation from the Desktop app sidebar creates a new session ID and a full copy of the transcript every time, instead of appending to the existing session. After a day of use, one conversation with a user-set custom title exists as 7 separate .jsonl files in ~/.claude/projects/<project>/, and /resume in the terminal shows 5+ rows with the same title and different sizes. The user cannot tell which one is current.
The docs (sessions.md) say a plain resume reuses the session ID and only --fork-session / /branch create a new one. The Desktop app does not follow that.
Evidence (from transcript files on disk)
- 7 files share the same
customTitle, the same first user message, and the same first timestamp (2026-09-12T10:15:44Z). - Each later file contains nearly all message UUIDs of the previous one plus new ones (superset chain). Sizes: 1.5 MB → 1.6 → 2.2 → 2.3 → 3.1 → 3.1 → 4.6 MB.
- Each file's birth time is seconds after the previous file's last write (e.g. previous last write 14:34:02, next file created 14:34:17), i.e. one fork per reopen.
- Every record in all 7 files carries
"entrypoint":"claude-desktop". - The same conversation, once resumed from the CLI instead, was resumed ~32 times (32
permission-modeheader blocks in the last file) with no further fork. So the CLI resume path appends; the Desktop path forks. - Desktop sidebar shows the title with a
(2)suffix for one of the copies. - No
--fork-sessionwas used. No.superseded-*/.orphaned-*files exist, so this is not the documented set-aside mechanism.
Steps to reproduce
- In the Desktop app, start a local Code session and give it a custom title (
/rename). - Close it (or quit Desktop), then reopen the session from the sidebar. Repeat 2 or 3 times.
- In a terminal in the same directory run
/resume: several rows with the same title appear. ls -la ~/.claude/projects/<project>/*.jsonlshows one file per reopen, each a superset of the previous, all with"entrypoint":"claude-desktop".
Expected
Reopening a session from Desktop resumes the existing session ID, exactly like claude --resume in the terminal. One conversation = one transcript file = one row in /resume.
Environment
- Claude Code 2.1.269
- Claude Desktop 1.52386.3
- macOS 26.6.2 (Darwin 25.6.0)