Desktop app: session fork fails silently with ENOTDIR when ~/.claude/projects/<project> is a symlink (regression between ~Jul 30 and Aug 5 builds)
Environment
- Claude desktop app 1.40609.0 (macOS, Darwin 25.6.0, Apple Silicon)
- Bundled Claude Code: 2.1.247
~/.claude/projects/<project-dir>is a symlink to a directory on the same volume (used to keep session transcripts inside a synced repository)
Summary
Forking a session from the desktop app UI fails silently whenever the per-project session directory under ~/.claude/projects/ is a symlink. The LocalSessions.forkSession IPC handler throws ENOTDIR, the UI swallows the error, and the user either gets nothing or a blank new session with no parent history. The CLI fork path (claude --resume <id> --fork-session) handles the identical symlink correctly and produces a valid fork file, so this is specific to the desktop app's fork implementation.
Regression window
This setup (symlinked project session dir, created 2026-04-25) worked with desktop-app forking for over three months. Logs show error-free fork operations on Jun 16–23, Jul 15–17, Jul 21, Jul 23, Jul 28, and Jul 30, 2026. The first failure is 2026-08-05, and every fork attempt since (Aug 5, 10, 17, 24, 26, 31) fails identically. So the regression shipped in a desktop app / bundled CLI update between ~Jul 30 and Aug 5, 2026 — the fork code appears to have started opening the project directory in a mode that refuses to follow symlinks.
Error (from ~/Library/Logs/Claude/claude.ai-web.log)
[REACT_QUERY_CLIENT] QueryClient error: {"name":"Error","message":"Error invoking remote method
'$eipc_message$_..._$_claude.web_$_LocalSessions_$_forkSession':
Error: ENOTDIR: not a directory, open '/Users/<user>/.claude/projects/<project-dir>'
[ccdErrorCategory:unknown]"}
The main process log (main.log) records LocalSessions.forkSession: parentSessionId=... and nothing after it — no error surfaced there.
Steps to reproduce
- Move a project's session directory elsewhere and symlink it back:
mv ~/.claude/projects/<project-dir> /some/other/place/ && ln -s /some/other/place/<project-dir> ~/.claude/projects/<project-dir>
- Open the desktop app, start or open a session in that project.
- Use the fork/branch action in the UI.
- Nothing happens (or a blank new session opens). The renderer log shows the ENOTDIR error above.
Expected
Fork succeeds — the path is a valid symlink to a directory, and every other session operation (create, resume, write transcript, rewind display) works fine through it. The CLI's own --fork-session also works through it: tested on the same machine, it creates the forked .jsonl with the parent's history inside the symlinked directory.
Impact / notes
- Fails silently: no error dialog or toast, which makes it look like the fork button is simply broken.
- Rewind-based forks appear to go through the same handler and fail too.
- Likely fix: resolve/realpath the project directory (or open it without
O_NOFOLLOW-style semantics) inLocalSessions.forkSession, matching the CLI's behavior.