From 788ea796a436dbe6aba5b401b42b4551d3257be6 Mon Sep 17 00:00:00 2001 From: "[._.]/ Adam Eivy" Date: Sat, 15 Aug 2026 08:34:00 -0700 Subject: [PATCH 1/2] fix([issue-4284]): return canonical worktree ownership reasons --- server/services/worktreeManager.js | 8 +------- server/services/worktreeReap.test.js | 4 ++-- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/server/services/worktreeManager.js b/server/services/worktreeManager.js index 91c5990792..75f450e140 100644 --- a/server/services/worktreeManager.js +++ b/server/services/worktreeManager.js @@ -1114,13 +1114,7 @@ export async function reapMergedWorktrees(sourceWorkspace, { requireKnownLiveness: true, }); if (ownershipReason) { - const reason = { - 'worktree-human-claim': 'human-claim', - 'worktree-active-agent': 'active-agent', - 'worktree-locked': 'locked', - 'worktree-unmanaged-location': 'unmanaged-location', - }[ownershipReason] || ownershipReason; - skipped.push({ path: wt.path, reason }); + skipped.push({ path: wt.path, reason: ownershipReason }); continue; } if (isClaudeTree && !includeClaudeTrees) { skipped.push({ path: wt.path, reason: 'claude-tree-excluded' }); continue; } diff --git a/server/services/worktreeReap.test.js b/server/services/worktreeReap.test.js index bd3d3aec9e..ac28d2a2fc 100644 --- a/server/services/worktreeReap.test.js +++ b/server/services/worktreeReap.test.js @@ -199,7 +199,7 @@ describe('reapMergedWorktrees', () => { const result = await reapMergedWorktrees(dir, { includeClaudeTrees: true }); expect(result.reaped.map(r => r.branch)).not.toContain('locked-br'); - expect(skipReason(result, path)).toBe('locked'); + expect(skipReason(result, path)).toBe('worktree-locked'); expect(existsSync(path)).toBe(true); }); @@ -213,7 +213,7 @@ describe('reapMergedWorktrees', () => { }); expect(result.reaped.map(r => r.branch)).not.toContain('active-br'); - expect(skipReason(result, path)).toBe('active-agent'); + expect(skipReason(result, path)).toBe('worktree-active-agent'); expect(existsSync(path)).toBe(true); // The main repo checkout is never reported as reaped or skipped-with-branch. expect(result.reaped.find(r => r.branch === 'main')).toBeUndefined(); From 44d43c5024640a2126e63c3e94f07ffcddd7981f Mon Sep 17 00:00:00 2001 From: "[._.]/ Adam Eivy" Date: Sat, 15 Aug 2026 08:34:04 -0700 Subject: [PATCH 2/2] docs([issue-4284]): log issue #4284 --- .changelog/next/fixed-issue-4284.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changelog/next/fixed-issue-4284.md diff --git a/.changelog/next/fixed-issue-4284.md b/.changelog/next/fixed-issue-4284.md new file mode 100644 index 0000000000..c2233203d3 --- /dev/null +++ b/.changelog/next/fixed-issue-4284.md @@ -0,0 +1 @@ +- [issue-4284] Worktree cleanup now reports canonical ownership reasons consistently.