[BUG] 2.1.169: interactive sessions write no JSONL transcript (only ai-title stub) — reproduced on WSL2 + macOS; breaks --resume/history

Resolved 💬 5 comments Opened Jun 9, 2026 by Devail1 Closed Jun 9, 2026

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 recordzero 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 returns
No 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:

  • SessionStart hooks + statusLine command (stripped via CLAUDE_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 agents dropping 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 later
user/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.

View original on GitHub ↗

This issue has 5 comments on GitHub. Read the full discussion on GitHub ↗