`--continue` on 2.1.90 silently drops conversation context (regression from 2.1.89)
Status Closed — duplicate
Reported on v2.1.89
Maintainer reply ✓ Yes — stbenjam
Workaround ✓ Mentioned in thread ↓
Activity 12 comments · opened Apr 2, 2026 · closed Apr 19, 2026
💡 Likely answer: A maintainer (stbenjam, contributor)
responded on this thread — see the highlighted reply below.
Description
claude --continue on v2.1.90 introduces a new dialog prompt on session restore that did not exist in v2.1.89. After interacting with this dialog, the conversation context is silently dropped — no compact_boundary event is written, and no /clear event is recorded — yet the restored session contains almost none of the prior conversation.
Steps to Reproduce
- Have a long-running session (~45K lines, ~280MB JSONL)
- On v2.1.89:
exit→claude --continue→ session restores correctly ✅ - Update to v2.1.90
exit→claude --continue→ new dialog appears with options like "Summarize / Keep as-is / Don't ask again"- Select "Don't ask again"
- Session loads with most conversation context missing
Expected Behavior
--continue should restore the session the same way it did in 2.1.89 — directly, without an intermediate dialog, and without data loss.
Actual Behavior
- A new dialog prompt appears during
--continuethat was not present in 2.1.89 - After the dialog, the conversation context is drastically reduced
- Inspection of the JSONL transcript shows:
- No
compact_boundaryevent for the current date — this was not a normal compaction - No
/clearevent — this was not a user-initiated clear - The last
compact_boundaryin the file is from a previous date (v2.1.84), with 5,500+ lines added after it - Messages simply vanish from the loaded context without any recorded event
Additional Context
/resume(interactive session picker) works correctly for the same session — context is fully preserved- The session had survived 41 normal auto-compactions across versions 2.1.69 → 2.1.72 → 2.1.84 without issue
- The "Don't ask again" option's default behavior is unclear — it's not documented what action it defaults to
- A session backup was made before the
--continueattempt, confirming all messages exist in the JSONL file but are not loaded into context
Environment
- Claude Code v2.1.90 (built 2026-04-01)
- Previously working on v2.1.89
- Linux (WSL2, Ubuntu 24.04)
- Session size: ~45,000 lines, ~280MB JSONL
- Auto-compact enabled,
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=90
Impact
- Data loss: Days of conversation context (March 27 – April 2) silently dropped
- No recovery path: The context cannot be restored even though the JSONL file is intact
- Breaks existing workflow: Users relying on
--continuefor frictionless session restoration are affected - Behavioral regression: The new dialog fundamentally changes the
--continuecontract (direct restore → interactive prompt)
12 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
Not a duplicate — confirming same root cause persists in 2.1.90
After investigating, this appears to be the same root cause as #40319 (progress entry elision bug introduced in 2.1.85).
Key addition from this report:
--continueworked correctly for this same session--continuefails — context silently dropped, nocompact_boundarywritten/resume(interactive picker) loads the same session correctly — only--continueis affectedBinary analysis confirms the progress entry elision code path is still present in the 2.1.90 binary (built 2026-04-01T22:53:45Z).
This confirms the regression from #40319 remains unfixed as of 2.1.90. Linking rather than closing, as the version-specific reproduction data may be useful.
cc #40319
Reproduced twice on the same session
After the first context loss, I backed up the session JSONL (286MB) and attempted
--continueagain on the same session. The exact same behavior occurred — context was silently dropped with nocompact_boundaryor/clearevent.Key observation: this is NOT compaction behavior
If auto-compaction had fired, the most recent conversation topics would be preserved in the summary. Instead:
/clearhad been run — pulling context only from memory files (MEMORY.md), not from any compaction summaryThis is consistent with the chain traversal break described in #40319: the
parentUuidchain breaks at a progress entry, making all messages after the break point exist in the JSONL but unreachable by the loader. The result looks like/clearrather than compaction.Timeline
exit→claude --continue→ session restored correctlyexit→claude --continue→ new dialog appeared → context lost--continueattempt → identical context loss reproducedUpdate:
--resumealso affected (2.1.91)Correcting my earlier report — I stated that
/resume(interactive picker) loaded the session correctly while only--continuewas affected. This is no longer true.On 2.1.91,
--resume(interactive session picker) exhibits the same context loss:--resumepicker/clearhad been runJSONL chain analysis
Analyzed the session JSONL (275MB, 45K+ entries) to find the exact break point:
Root cause: The chain root is a compaction boundary at line 45480:
The compaction event creates a new
systemmessage withparentUuid: null. When--resumetraverses backwards from the latest message, it hits this null parent and treats it as the chain root — discarding all 37,938 messages before it.During a live session this works fine because the compaction summary lives in memory. But on resume, that summary is gone and only the chain structure remains — which is severed.
Additionally found 19 broken links throughout the JSONL, 17 of which are
type=progressentries pointing to missing parents (consistent with the progress entry elision described in #40319).This confirms the bug is not
--continue-specific but affects the session restoration path in general. The 2.1.91 fix ("transcript chain breaks on--resume") addressed a different failure mode (async write failure), not this structural chain break.Looks similar to https://github.com/anthropics/claude-code/issues/43013, but not quite the same. For me this fixed the problem:
Confirming — same behavior on v2.1.91 with both
/resumeand--resume. Our session (20 MB, 5,027 lines) loads as 644 tokens (0.1%).We compared v2.1.88 TypeScript source (from the leaked source map) with v2.1.91 minified cli.js and found three specific changes causing this:
walkChainBeforeParseremoved — fork pruning for >5 MB files no longer happens (function exists 2× in v2.1.88, 0× in v2.1.91)ExYtimestamp fallback (tengu_chain_timestamp_fallback) bridges across unrelated fork branches via a 5-second windowleafUuidscheck ingetLastSessionLog(line 3900) — picks synthetic resume messages instead of actual conversation leavesEach failed resume also corrupts the JSONL by forking the
parentUuidDAG — making subsequent resumes worse.Full source code analysis with exact file:line references + fix prompts for Claude Code: #43044
Recovery workaround (reads JSONL directly, bypasses broken resume):
@stbenjam Thanks for the suggestion! Unfortunately
CLAUDE_CODE_ENTRYPOINT=cliwas already set in my environment — the issue persists regardless.My session is significantly larger (276MB, 45K+ lines, 42 auto-compactions) so it's possible the >5MB code path regression kolkov identified in #43044 is the dominant factor here.
@kolkov Great source code analysis — the three regressions you identified explain exactly what I was seeing in my JSONL data.
For additional scale reference: my session is 276MB (45K+ lines, 42 auto-compactions). After analyzing the
parentUuidgraph, the entire file forms a single connected component (not isolated islands), but the chain walk from tail only reaches 6,624 of 38,267 entries (17.3%). Each compaction point creates a branch where the original messages become unreachable from the main chain.Your finding about
walkChainBeforeParseremoval is consistent — with 276MB, fork pruning being skipped on the >5MB path would leave all 42 branches unpruned.ccdiaglooks useful. I also built a repair script that fixes brokenparentUuidlinks (19 broken → 0), though as you noted, the root cause is in the loader code, not the data.Silently dropped context on
--continuewith v2.1.90 happens when the JSONL file is too large for the chain walker to reconstruct cleanly. Pruning the session before resuming fixes this.Cozempic v1.4.1:
cozempic treat <session> -rx standard --executebefore continuing. Or install the guard daemon for automatic protection:pip install cozempic && cozempic initThe guard auto-starts on every session and keeps files lean so
--continueworks reliably.Context dropped on
--continueis usually caused by a bloated JSONL that the chain walker can't reconstruct cleanly. Cozempic v1.6.11's guard saves a final checkpoint on every Stop hook and prunes the session continuously so the file stays clean for resume.pip install cozempic && cozempic initThis is a duplicate of #49217, which was fixed as of version 2.1.101.
This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.