Fix Claude session cwd resume drift#2292
Conversation
Co-authored-by: Julius Marminge <juliusmarminge@users.noreply.github.com>
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Co-authored-by: Julius Marminge <juliusmarminge@users.noreply.github.com>
Co-authored-by: Julius Marminge <juliusmarminge@users.noreply.github.com>
Co-authored-by: Julius Marminge <juliusmarminge@users.noreply.github.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
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 !== undefinedguard to thecwdChangedcheck so that an unresolved workspace (undefined) no longer triggers a spurious restart that would loop indefinitely due to the persisted cwd backfill in ProviderService.
- Added an
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.
ApprovabilityA prior Macroscope approval was dismissed. Re-evaluating 4c5917b… No code changes detected at |
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Dismissing prior approval to re-evaluate 94af290
94af290 to
fd7f5ce
Compare
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>
4c5917b to
11d6b00
Compare
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)


Aims to fix #2256
What Changed
cwdchanges, so Claude does not keep running in a stale repo root or prior worktreecwdwhenProviderService.startSession()resumes an existing Claude session without an explicitcwdcwdand resume-source decision, and add a dedicated Claude adapter start-session span with the exact launch inputs passed to the Claude SDKcwd/resume inputsProviderServicetest isolation issue by using a unique thread id for the runtime-persistence assertion, avoiding cross-test reuse of persistedcwdWhy
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.tsbun run test src/provider/Layers/ProviderService.test.tsbun 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 fmtbun lintbun typecheckChecklist
Note
Fix Claude session cwd drift by restarting sessions on workspace change and preserving cwd across resumes
ProviderService.startSessionnow falls back to the persistedcwdfrom an existing session binding when nocwdis provided as input, ensuring resumed sessions use the correct working directory.ClaudeAdapterno longer treats transienthook_started,hook_progress, orhook_responsesession IDs as durable thread identifiers;thread.startedevents and resume cursor updates are now gated on a durable session ID (e.g. frominit).Macroscope summarized 11d6b00.