Worktree triage panel (RT-271) - #429
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ec and boards Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…d timeout (RT-271) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… dash (RT-271) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ume test (RT-271) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
classifyDirtForTriage sorts a tree's uncommitted state into none, junk, lockfile or real, so later dispose tasks know what discard: classified may remove. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
pnpm-lock.yaml has no workspace-own version line, so a version-only diff there is always a dependency bump. Drop it from LOCKFILES; bun.lock stays the only lockfile the classifier can call lockfile. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The handler's deps() omitted fetch, so containmentOf defaulted to a real fetch --no-tags origin <sha> (60s timeout) for every stuck merged tree on every poll, including the tray's 10s cycle. Pass a no-network fetch from the handler so containment reads none instead of blocking. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…reap Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…tention and no live cwd Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Registers worktree_triage in NOTIFICATION_TYPES and settings-kit's mirrored NOTIFICATION_EVENTS, keeping notification-shape-parity.test.ts green. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sources/NotificationManager.swift gains the showWorktreePanel case so the exhaustive Route switch there still compiles. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
TriageFingerprint now hand-writes encode(to:) so a nil mrState serializes as JSON null instead of an omitted key. sameFingerprint on the daemon side treats an absent or undefined mrState the same as null, since a decoded payload that skipped the key would otherwise never equal one carrying null and every MR-less row would compare as changed forever. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…nd polls Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… cap Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…counts Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A failed load no longer reads as no changes, and Commit and push and Discard and dispose stay disabled until a load succeeds. The sheet also notes files past the daemon's 50-file cap, parses each diff once and lays lines out lazily. The snapshot harness exits non-zero on bad arguments or unreadable fixtures. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Also: no leading divider in the row menu, a More label on it, static date formatters, and the menu badge fed straight from the needs-decision count. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…er and PR/MR noun Fixtures carry the real wire form. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e unreadable trees A broken tree is now gone or unlinked, and an unlinked one's verdict says the folder still has files. An incomplete run scan holds the row as waiting on the run. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…pe banners A forced dispose refuses runs-unreadable, running-run, in-use and cwds-unreadable. triage-remove refuses mount-unavailable when the gitdir's repo root and its parent are both gone. push-branch refuses not-pushable outside only-copy and look. Banners come from repos with claimed trees, as worktree:list's do. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ve trash path Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Warning Review limit reachedNext included review available in 10 minutes. View limit detailsLimit details: You’ve used the included review currently available. Your 83 included PR review attempts over the past 7 days set your current allowance at 1 review per hour. Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab. Review configuration: ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: ⛔ Files ignored due to path filters (10)
📒 Files selected for processing (59)
Comment |
Keeps both notification categories (member_joined from main, worktree_triage from this branch) across the notifier, settings-kit and rt-client lists, the tray route and category registry, and the checks registry. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
rename TriageLabels.progressive to inFlightLabel and reword the plan's busy-label prose so the purity gate's banned-term list stays clean; pass childEnv() into the patch-id spawn in containment.ts so spawn-env.test.ts passes Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Worktree triage panel
A tray Worktrees… panel for the trees the merge reactor leaves behind. Each row says why the tree is stuck, whether its work is safe somewhere else, and offers one guarded action. The menu item carries a count, and a once-a-day summary notification points you at the panel. Also fixes RT-271: dispose now accepts a branch that was rebased into its merged MR.
Spec:
docs/superpowers/specs/2026-09-24-worktree-triage-panel-design.md. Boards:docs/design/worktrees/.What changed
Daemon (
lib/worktree/triage/,lib/daemon/handlers/worktree-triage.ts)worktree:triage(agent-safe, no network) returns rows, banners and counts.triage-dispose,keep,unkeep,push-branch,triage-diff,triage-remove,stop-holders. Each verb checks a fingerprint under the tree lock.rt.worktrees.junkglobs and version-onlybun.lockchanges.disposeTreegainsacceptDirty(skips only the dirty guard) andrequireRetention(refuses rather than reaping immediately).worktree_triage.CLI
rt worktree triage [--repo] [--json].Tray (
rt-tray/Sources/Worktree*,Sources-core/Worktree/Triage.swift)DaemonClient.--render-worktree-snapshotsharness (DEBUG only). Its renders were compared against every board in light and dark before this PR.Follow-up
Testing
rt-tray/Tests/stub-rt, caused by earlier tests dropping bun from PATH. That already happens on main and reproduces with branch-untouched files alone.mattstack-checks: 355/355.tsc: clean.🤖 Generated with Claude Code