claude-code - 💡(How to fix) Fix Plan mode shows stale plan from previous conversation after resume

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

Root Cause

  1. Slug persists across conversation resumes. All resumed conversations in a chain share the same slug, meaning they write to the same plan filename.
  2. Path resolution inconsistency. The plan file path can be either global (~/.claude/plans/) or project-local ({project}/.claude/plans/) depending on CWD at write time. When ExitPlanMode reads the plan file, it may resolve to a different path than where the model wrote — returning stale content.
  3. ExitPlanMode reads from disk, not from parameters. The tool schema confirms: "This tool does NOT take the plan content as a parameter — it will read the plan from the file you wrote." If the disk file has stale content, the user sees the old plan.

Fix Action

Fix / Workaround

Current Workarounds

Code Example

3191c857 → cbe71de7 → 5a933121 → ae423cab → e4f99d36 → 4c0ac95b
RAW_BUFFERClick to expand / collapse

Bug Description

When resuming a conversation (--continue, /resume, or conversation continuation), the new session inherits the original conversation's slug — which determines the plan file name (~/.claude/plans/{slug}.md). This causes ExitPlanMode to read stale plan content from a previous task, showing the user an old plan instead of the one they just created.

Root Cause

  1. Slug persists across conversation resumes. All resumed conversations in a chain share the same slug, meaning they write to the same plan filename.
  2. Path resolution inconsistency. The plan file path can be either global (~/.claude/plans/) or project-local ({project}/.claude/plans/) depending on CWD at write time. When ExitPlanMode reads the plan file, it may resolve to a different path than where the model wrote — returning stale content.
  3. ExitPlanMode reads from disk, not from parameters. The tool schema confirms: "This tool does NOT take the plan content as a parameter — it will read the plan from the file you wrote." If the disk file has stale content, the user sees the old plan.

Evidence

Traced a chain of 6 conversations (different tasks, different session IDs) all sharing slug can-you-recheck-if-playful-lamport:

3191c857 → cbe71de7 → 5a933121 → ae423cab → e4f99d36 → 4c0ac95b

The plan file exists at two paths with completely different content:

PathContentSizeModified
~/.claude/plans/can-you-recheck-if-playful-lamport.md"Pagination Dedup" fix plan3173 bytesMay 7 19:31
~/cli/naavim-labs-website/.claude/plans/can-you-recheck-if-playful-lamport.md"Email click tracking" fix plan3918 bytesMay 7 22:05

The final conversation in the chain (4c0ac95b) called ExitPlanMode 6 times — consistent with the user repeatedly rejecting a stale plan that kept reappearing.

Steps to Reproduce

  1. Start conversation A in project directory X, enter plan mode, complete planning for Task A
  2. Resume conversation A as conversation B (e.g., claude --continue)
  3. Optionally change to a different project directory Y
  4. Enter plan mode in conversation B for a completely different Task B
  5. ExitPlanMode shows conversation A's plan instead of Task B's plan

Why It's Intermittent

The bug only manifests when all three conditions are met:

  1. The conversation is resumed (not fresh) — so the slug is inherited
  2. The new task enters plan mode — triggering plan file read/write
  3. The Write path and ExitPlanMode read path differ (global vs project-local)

If both Write and ExitPlanMode resolve to the same path, the plan is correct (Write overwrites the stale content). The stale plan appears specifically when the path resolution differs between the write and the read.

Expected Behavior

Each new conversation (including resumes) should either:

  • Get a unique plan file slug, OR
  • ExitPlanMode should read from the exact path where the model wrote the plan (e.g., the path specified in the system-reminder), not inferred from slug + CWD

Current Workarounds

  • Start fresh conversations instead of resuming when switching tasks
  • Delete stale plan files: rm ~/.claude/plans/<slug>.md
  • Periodic cleanup: find ~/.claude/plans -name "*.md" -mtime +7 -delete

Environment

  • Claude Code CLI (latest as of May 7, 2026)
  • macOS (Darwin 25.3.0)
  • Affects both --continue and conversation resume flows

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING