[BUG] 2.1.169: interactive sessions write no JSONL transcript (only ai-title stub) — reproduced on WSL2 + macOS; breaks --resume/history
Summary
In Claude Code 2.1.169, interactive sessions no longer write the
per-session conversation transcript to~/.claude/projects/<encoded-cwd>/<session-id>.jsonl. The file is created but
contains only a single ai-title stub record — zero user/assistant
records — and the conversation is persisted nowhere on disk.
This is a 2.1.169 regression (2.1.168 writes the full transcript on the
same machine — clean A/B, only the binary version differs). It is interactive
-only: headless claude -p writes a complete transcript even on affected
machines.
Reproduced independently on WSL2 and macOS (two reporters). Not observed
on Amazon Linux 2023 (EC2) in either pty or tmux testing — so the trigger is
environment-sensitive (likely a filesystem / write-flush assumption), not a
single platform.
It breaks --resume, the /resume picker, session history, and any tooling
that tails the transcript JSONL — for interactive sessions on affected systems.
Reproduction status (same prompt, MARKER repro)
| Environment | Mode | Version | Transcript | Persisted? |
|---|---|---|---|---|
| WSL2 (Ubuntu) | interactive (pty / tmux / no-tmux) | 2.1.169 | ~108 B (ai-title only) | ❌ no |
| macOS (fresh machine, tmux in Terminal.app) | interactive | 2.1.169 | ai-title only | ❌ no |
| WSL2 (Ubuntu) | interactive | 2.1.168 | ~26 KB | ✅ yes |
| WSL2 (Ubuntu) | headless -p | 2.1.169 | ~23 KB | ✅ yes |
| Amazon Linux 2023 (EC2) | interactive (pty and real tmux) | 2.1.169 | ~11–13 KB | ✅ yes |
| Windows | interactive | 2.1.169 | full | ✅ yes |
Affected so far: WSL2, macOS. Not reproduced: Amazon Linux 2023. The
core serializer is intact (headless writes on affected boxes); the break is in
the interactive-mode write/flush path, and only fires on some environments.
Environment (reporter 1)
- Claude Code 2.1.169 (native install),
autoUpdates: false - WSL2 (Ubuntu) on Windows; kernel
6.6.x-microsoft-standard-WSL2 - Reproduces in a clean throwaway dir, no MCP/plugins; reproduces driving a
bare claude binary through a pty (no wrapper/observer/hook in the loop)
Reporter 2 (see comments): fresh ~factory macOS, Claude Code in tmux in
Terminal.app — same ai-title-only stub.
Repro
mkdir /tmp/cctest && cd /tmp/cctest
claude # 2.1.169
# prompt: Reply with exactly: MARKER123
# then /quit
cat ~/.claude/projects/-tmp-cctest/*.jsonl # ~108 B, ai-title only
grep -r MARKER123 ~/.claude ~/.config ~/.cache ~/.local/share /tmp # finds nothing
Expected
The session JSONL contains the user prompt and assistant reply records (as
2.1.168 does, and as 2.1.169 itself does headless / on Amazon Linux / Windows),
so --resume and history work and the content is durable.
Actual (2.1.169 interactive, affected systems)
~108-byte JSONL containing only:
{"type":"ai-title","aiTitle":"...","sessionId":"<id>"}
No user/assistant records — 0 of each — even though the turn completes
normally (reply rendered; /quit prints the claude --resume <id> hint). The
marker is not found anywhere under ~/.claude, ~/.config, ~/.cache,~/.local/share, /tmp, /var/tmp, /dev/shm. Persists across graceful/quit (not a flush-on-exit race).
--resume / /resume broken (downstream)
/quit prints claude --resume <session-id>, but that command returnsNo conversation found with session ID: <session-id>. The interactive/resume picker lists the session but opens to an empty conversation. Both
work on 2.1.168.
Ruled out as causes
Reproduces with each removed/changed:
SessionStarthooks +statusLinecommand (stripped viaCLAUDE_CONFIG_DIR
clone) — still stubs.
- Any local wrapper/observer — reproduces with the bare binary via pty.
- tmux — controlled platform × tmux matrix: WSL stubs both in and out of
tmux; Amazon Linux writes both in and out of tmux. tmux (and --session-id
injection) is neither necessary nor sufficient.
- Disk / inodes — ample free space; 2.1.168 writes to the same FS.
- The binary/install — same 2.1.169 binary writes a full transcript headless on
the same machine.
Likely-related changelog entries (2.1.169)
2.1.169 lists two fixes touching session conversation persistence:
- "Fixed background sessions re-attached after overnight retire losing their
conversation and re-running the original prompt"
- "Fixed restoring a completed session from
claude agentsdropping chat
history and re-running the original prompt"
Both share the "re-running the original prompt" signature — a session
restored with its initial prompt but none of the subsequent conversation,
mirroring this bug (JSONL gets the start-of-session ai-title stub but no lateruser/assistant records). The save/restore rework that fixed those cases may
have broken interactive transcript writing on environments with different
filesystem/flush behavior. Pinning back to 2.1.168 fully restores it.
This issue has 5 comments on GitHub. Read the full discussion on GitHub ↗