Skip to content

Fix Claude session cwd resume drift#2292

Merged
juliusmarminge merged 9 commits intomainfrom
cursor/fix-claude-cwd-resume-0c76
Apr 23, 2026
Merged

Fix Claude session cwd resume drift#2292
juliusmarminge merged 9 commits intomainfrom
cursor/fix-claude-cwd-resume-0c76

Conversation

@juliusmarminge
Copy link
Copy Markdown
Member

@juliusmarminge juliusmarminge commented Apr 22, 2026

Aims to fix #2256

What Changed

  • restart provider sessions when a thread's effective workspace cwd changes, so Claude does not keep running in a stale repo root or prior worktree
  • backfill the persisted cwd when ProviderService.startSession() resumes an existing Claude session without an explicit cwd
  • annotate provider/session start spans with the effective cwd and resume-source decision, and add a dedicated Claude adapter start-session span with the exact launch inputs passed to the Claude SDK
  • add regression tests for both workspace-switch restarts and trace-file visibility of Claude cwd/resume inputs
  • fix a ProviderService test isolation issue by using a unique thread id for the runtime-persistence assertion, avoiding cross-test reuse of persisted cwd
  • stabilize the Claude trace test by switching it from the real file/batch trace sink to an in-memory sink, avoiding CI timeout/flushing variance while still asserting the emitted span attributes

Why

Claude resume state currently reuses persisted session identity independently of workspace selection. That can leave an active Claude session bound to an outdated working directory, or replay a persisted resume cursor without the matching persisted cwd, which makes resume behavior unreliable for worktrees and subdirectory clones. The added span attributes make future regressions diagnosable from local trace files and exported OTEL spans.

Testing

  • bun run test src/provider/Layers/ClaudeAdapter.test.ts
  • bun run test src/provider/Layers/ProviderService.test.ts
  • bun run test src/provider/Layers/ClaudeAdapter.test.ts src/provider/Layers/ProviderService.test.ts -t "captures claude start-session span annotations for resume and cwd inputs|passes Claude resume ids without pinning a stale assistant checkpoint|uses an app-generated Claude session id for fresh sessions|reuses persisted cwd when startSession resumes a claude session without cwd input"
  • bun fmt
  • bun lint
  • bun typecheck

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes
Open in Web Open in Cursor 

Note

Fix Claude session cwd drift by restarting sessions on workspace change and preserving cwd across resumes

  • Provider sessions are now restarted when the effective working directory changes between turns; previously the session was reused even if the workspace had changed.
  • ProviderService.startSession now falls back to the persisted cwd from an existing session binding when no cwd is provided as input, ensuring resumed sessions use the correct working directory.
  • ClaudeAdapter no longer treats transient hook_started, hook_progress, or hook_response session IDs as durable thread identifiers; thread.started events and resume cursor updates are now gated on a durable session ID (e.g. from init).
  • Behavioral Change: sessions that previously survived a workspace path change will now be restarted, and the resume cursor is preserved across the restart.

Macroscope summarized 11d6b00.

Co-authored-by: Julius Marminge <juliusmarminge@users.noreply.github.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 22, 2026

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 0830e957-3a5b-46d7-b4cf-e4ab6fed91b6

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/fix-claude-cwd-resume-0c76

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions Bot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Apr 22, 2026
Co-authored-by: Julius Marminge <juliusmarminge@users.noreply.github.com>
@github-actions github-actions Bot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Apr 22, 2026
cursoragent and others added 2 commits April 22, 2026 14:09
Co-authored-by: Julius Marminge <juliusmarminge@users.noreply.github.com>
Co-authored-by: Julius Marminge <juliusmarminge@users.noreply.github.com>
@juliusmarminge juliusmarminge marked this pull request as ready for review April 23, 2026 04:30
Copy link
Copy Markdown
Contributor

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Potential infinite restart loop when effectiveCwd is undefined
    • Added an effectiveCwd !== undefined guard to the cwdChanged check so that an unresolved workspace (undefined) no longer triggers a spurious restart that would loop indefinitely due to the persisted cwd backfill in ProviderService.

Create PR

Or push these changes by commenting:

@cursor push 9974bfe8fa
Preview (9974bfe8fa)
diff --git a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts
--- a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts
+++ b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts
@@ -334,7 +334,7 @@
       thread.session && thread.session.status !== "stopped" && activeSession ? thread.id : null;
     if (existingSessionThreadId) {
       const runtimeModeChanged = thread.runtimeMode !== thread.session?.runtimeMode;
-      const cwdChanged = effectiveCwd !== activeSession?.cwd;
+      const cwdChanged = effectiveCwd !== undefined && effectiveCwd !== activeSession?.cwd;
       const sessionModelSwitch =
         currentProvider === undefined
           ? "in-session"

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit fcb4421. Configure here.

Comment thread apps/server/src/orchestration/Layers/ProviderCommandReactor.ts
@macroscopeapp
Copy link
Copy Markdown
Contributor

macroscopeapp Bot commented Apr 23, 2026

Approvability

A prior Macroscope approval was dismissed. Re-evaluating 4c5917b

No code changes detected at 11d6b00. Prior analysis still applies.

macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Apr 23, 2026
Co-authored-by: codex <codex@users.noreply.github.com>
@macroscopeapp macroscopeapp Bot dismissed their stale review April 23, 2026 16:10

Dismissing prior approval to re-evaluate 94af290

@juliusmarminge juliusmarminge force-pushed the cursor/fix-claude-cwd-resume-0c76 branch from 94af290 to fd7f5ce Compare April 23, 2026 16:12
macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Apr 23, 2026
@macroscopeapp macroscopeapp Bot dismissed their stale review April 23, 2026 16:43

Dismissing prior approval to re-evaluate 4c5917b

- Ignore transient hook session IDs when updating resume state
- Add regression coverage for Claude resume hooks

Co-authored-by: codex <codex@users.noreply.github.com>
@juliusmarminge juliusmarminge force-pushed the cursor/fix-claude-cwd-resume-0c76 branch from 4c5917b to 11d6b00 Compare April 23, 2026 16:43
@juliusmarminge juliusmarminge merged commit 188df6d into main Apr 23, 2026
12 checks passed
@juliusmarminge juliusmarminge deleted the cursor/fix-claude-cwd-resume-0c76 branch April 23, 2026 17:29
yazandabbas pushed a commit to yazandabbas/Presence that referenced this pull request Apr 23, 2026
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Julius Marminge <juliusmarminge@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
(cherry picked from commit 188df6d)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M 30-99 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Session context get's lost/forgotten if i leave it for a while

2 participants