[BUG] Desktop app forks a new session ID (full transcript copy) on every reopen; /resume shows many rows with the same title

Status Open
Reported on v2.1.269
Maintainer reply None cached
Activity 0 comments · opened Sep 12, 2026

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-mode header 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-session was used. No .superseded-* / .orphaned-* files exist, so this is not the documented set-aside mechanism.

Steps to reproduce

  1. In the Desktop app, start a local Code session and give it a custom title (/rename).
  2. Close it (or quit Desktop), then reopen the session from the sidebar. Repeat 2 or 3 times.
  3. In a terminal in the same directory run /resume: several rows with the same title appear.
  4. ls -la ~/.claude/projects/<project>/*.jsonl shows 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)

View original on GitHub ↗