Desktop app: assistant text blocks intermittently never written to session transcript JSONL (permanent omission; VS Code writes them correctly)

Open 💬 0 comments Opened Jul 11, 2026 by kitepon-rgb

Environment

  • Claude Code Desktop 2.1.205 (macOS, Darwin 25.5.0, arm64, CLAUDE_CODE_ENTRYPOINT=claude-desktop)
  • Contrast: VS Code extension 2.1.195–2.1.207 (claude-vscode) on the same machine

Summary

On the Desktop app, assistant text blocks are intermittently never written to the session transcript JSONL (~/.claude/projects/<munged>/<session>.jsonl). The omission is permanent — the text is not merely delayed, it never lands. Short turns (single request→response) always land; the loss happens to intermediate text blocks in long, tool-heavy turns. The VS Code extension writes the same content to the same JSONL correctly.

Actual behavior

Measured on one Desktop session (2026-07-12), reproduced twice in the same session:

  • Window 12:44–13:15 (a long tool-heavy stretch): ~8 assistant text blocks were spoken; only 1 landed in the JSONL, and it arrived ~16 minutes late; the rest never appeared.
  • Window 15:20–15:35: ~8 assistant text blocks spoken, only 5 landed; intermediate analysis text missing.
  • Across that session's assistant entries: 48 thinking / 36 tool_use / 9 text — the text blocks are the ones dropped, thinking/tool_use are retained.
  • Short turns in the same session (single round-trip) landed 100%.

The transcript JSONL is the only local record — and it is incomplete

A read-only sweep of every local Claude store (App Support Local Storage/IndexedDB/Session Storage LevelDB, SQLite files, claude-code-sessions/*.json) across UTF-8 / UTF-16LE / UTF-16BE found zero occurrences of the missing text — and zero occurrences of even a control string that IS present in the JSONL. The claude-code-sessions/*.json files hold only metadata (title, completedTurns, model, …), not body text. So ~/.claude/projects/*.jsonl is the sole local conversation store, and on Desktop it is being written incompletely. The dropped text exists only server-side; there is no local recovery path.

Impact

Every hook receives transcript_path pointing at this JSONL. Any tool that reads the transcript to reconstruct the conversation — memory/continuity tools, summarizers, analyzers — silently gets an incomplete record on Desktop while working correctly under the VS Code extension. Because the loss is permanent (not a flush delay), backfilling from the file later cannot recover it.

Repro

  1. In the Desktop app, run a long turn with several tool calls interleaved with assistant commentary text.
  2. After it completes, read the session JSONL and count type:"assistant" entries whose message.content[] contains a text block.
  3. Compare against what was actually shown in the UI — intermediate text blocks are missing.
  4. Run the same kind of turn under the VS Code extension — the text blocks are all present.

Note

Likely related to the client-side transcript writer on Desktop. This is distinct from #76704 (which is about /clear label metadata), but both point at the Desktop client's transcript/session handling diverging from the VS Code extension.

View original on GitHub ↗