Install any skill in seconds. Free to start, no credit card required.
Get Started Free →name: branch-audit
.claude/skills/qf-studio-branch-audit-safe-stale-branch-investigation-and-pruning/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 29% | 0% |
name: branch-audit description: Audit local git branches for safe deletion with content-level verification (PR state + git cherry), flag-don't-delete discipline, and a mandatory user approval gate. Auto-invoke when user says "audit branches", "prune branches", "clean up branches", "stale branches", or "which branches can I delete".
This repo accumulates local branches fast: interactive sessions, the Pilot daemon (pilot/GH-*), recovery work, backups. A 2026-07-05 audit found 29 local branches; 21 were safely deleted — but only after content-level verification caught, among others, 15 unpushed commits on feat/aws-bench that existed nowhere else. Ancestry checks alone would have missed that.
Prime directive: a branch is never deleted without explicit per-branch user approval, and never on ancestry evidence alone.
bashgit branch --format='%(refname:short)' # never pipe through head — a truncated # list caused a missed-branch round git worktree list # branches checked out in worktrees # cannot be deleted and may be live sessions
Exclude from the audit: the current main checkout, any claude/* branch attached to a worktree (possibly a live session), and pilot-worktree-GH-* daemon worktrees (per CLAUDE.md, leave alone).
For each branch collect:
bashgit log -1 --format='%h %cd %s' --date=short "$b" # tip gh pr list --head "$b" --state all --json number,state # PR record git cherry main "$b" | grep -c '^+' # non-equivalent commits
git cherry is the ground truth, not --merged. This repo squash-merges: merged branches are never ancestors of main, and git branch --merged is useless. git cherry compares patch IDs — 0 non-equivalent commits means every change is content-identical to something on main.
| Class | Criteria | Action | |---|---|---| | SAFE | merged PR and cherry = 0 | propose deletion | | SAFE (ancestor) | no PR, cherry = 0, merge-base --is-ancestor = yes | propose deletion | | HOLDS-WORK | cherry > 0 | deep-check (Step 4) — never propose blind | | CHECKED-OUT | in a worktree | check worktree dirty state; live sessions untouchable |
bash git fetch origin "$b" git rev-list --count origin/"$b".."$b" # local-only commits = sole copy If local is ahead: push to origin as backup before anything else.
bash gh pr view <n> --json comments --jq '.comments[-2:][].body' Precedent: recover/TASK-300-ghost-sha-guard showed 2 "unique" commits, but PR #3189's closing comment named the superseding PR (#3193) and the guard was verified live in internal/executor/git_freshness.go — same logic, different patch IDs. Verify the supersession claim in main's code, not just the comment.
.agent/ files missingfrom main (graph nodes referencing nonexistent files are the tell): bash git diff --name-only $(git merge-base main "$b") "$b" | while read f; do [ -e "$f" ] || echo "MISSING: $f" done Salvage via a docs PR before considering deletion.
Present the full classification table with evidence. Deletion requires explicit user approval, per branch or per named group. Branches the user has flagged as sensitive (historically: feat/aws-bench, feat/openrouter-engine) stay untouched regardless of evidence.
git push origin <branch> for any sole-copy work)git branch -D <approved...>git remote prune origingh pr merge --delete-branch fails with "'main' is already used byworktree" in multi-worktree layouts — merge succeeds remotely; verify with gh pr view --json state, clean the local branch manually.
the worktree is removed — but confirm status --porcelain is empty first.
approval ask.
Other measured skills in the registry, with their headline benchmark lift.