The setup window between writeIsolationOwner and isoStart left the base
dir holding only the marker file and no `m` mount, so classifyDir
returned null and scanWorktrees classified it as a stray — which a
non-`--all` clear removes, defeating the ownership guard mid-setup.
classifyDir now treats the presence of the ownership marker as a
task-isolation signal (in addition to the mount dir), so an in-progress
sandbox with a live owner is preserved throughout backend setup.
Fixes#6761
`omp worktree clear` (without `--all`) removed every task-isolation dir
under the worktree base, including sandboxes owned by subagents running
right now, and the "no live task owns it" reason was asserted from the
mere presence of the `m` mount dir with no ownership check.
`ensureIsolation` now stamps each sandbox base dir with a pid-bearing
ownership marker before the backend materialises `m`, and the worktree
scanner classifies a sandbox as live while its owning process is alive,
so `clear` reclaims only crashed leftovers.
Fixes#6761
A context rebuild that recreated the failed turn's message object made the
identity-keyed active-context removal miss, so the scheduled retry
continuation rejected the terminal assistant error message locally
("Cannot continue from message role: assistant") before any provider
request. auto_retry_end never fired, retryPromise stayed pending, and the
in-flight prompt() plus the TUI retry indicator hung until a manual
follow-up.
The retry path now strips a still-failed assistant tail positionally after
the backoff (generation-guarded, never in preserveFailedTurn mode), and a
continuation that still fails locally closes the retry saga with a failed
auto_retry_end via the new scheduleAgentContinue onError hook.
Fixes#5382
The rewrite pipeline realpaths resolved dependency paths, so the expected
specifiers must be built from the canonical temp root (macOS /var vs
/private/var symlink).
A failed async submission can restore the draft while a nested ask prompt
(note/custom answer) is open, re-blocking the input guard; restoreAskDialog
mounted only the ask component, routing guarded input to an unmounted
editor. Restore now mirrors the initial presentation and remounts the
draft editor whenever the guard exists.
process.cwd() reports the physical path (/private/var/... on macOS) while
mkdtemp fixtures keep the /var symlink form; normalized both sides so the
runRootCommand cross-project resume regression passes on darwin.
The lock-race and EPERM regression tests compared injection predicates
against the uncanonicalized temp config path, but the atomic writer
resolves it via realpath; on macOS /var -> /private/var made the mocks
never fire and both tests failed. Compared against the realpath instead.
- Replaced parsed --cwd with the resumed project after explicit-id and picker project switches.
- Asserted session construction receives the destination cwd when resume starts with a launch-project --cwd.
Fixes#6752
- Warm the resumed project plugin roots before session creation instead of relying on the unawaited re-warm inside clearPluginRootsAndCaches.
- Assert the destination cwd is preloaded during the switch.
Fixes#6752
- Re-resolve settings-derived model scope once a resume switches projects.
- Extract resolveScopedModels shared across startup, explicit resume, and picker.
- Assert destination enabledModels drive the resumed scope.
Fixes#6752
- Removed the implicit fork branch from explicit session-id resume resolution.
- Re-scoped process cwd, settings, plugin roots, and capabilities before session creation.
- Preserved the missing-directory move flow and covered both paths with regression tests.
Fixes#6752