git:20260403.1cfff41 to git:20260508.4bfaa6f
93 added, 42 removed. Audit A to A.
---
name: finishing-a-development-branch
description: Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
---
# Finishing a Development Branch
## Overview
Guide completion of development work by presenting clear options and handling chosen workflow.
- **Core principle:** Verify tests → Verify UML model alignment → Present options → Execute choice → Clean up.
+ **Core principle:** Verify tests → Verify UML model alignment → Detect environment → Present options → Execute choice → Clean up.
**Announce at start:** "I'm using the finishing-a-development-branch skill to complete this work."
## The Iron Law
```
NO UML MODEL ELEMENTS OR DIAGRAMS THAT DO NOT MATCH THE CODE
```
If the UML model element or diagram is inconsistent with the code, it must be brought into alignment with the code.
## The Process
### Step 1: Verify Tests
**Before presenting options, verify tests pass:**
```bash
# Run project's test suite
npm test / cargo test / pytest / go test ./...
```
**If tests fail:**
```
Tests failing (<N> failures). Must fix before completing:
[Show failures]
Cannot proceed with merge/PR until tests pass.
```
Stop. Don't proceed to Step 2.
**If tests pass:** Continue to Step 2.
### Step 2: Verify UML Model Alignment
**Use Astah Pro MCP tools to verify that the implementation is consistent with the model and diagrams:
- Compare the model and diagrams with the actual source files.
- Check that model elements (classes, interfaces, enumerations, attributes, operations, relationships, and dependencies) are consistent with the structural definitions in the code.
- Check that use case diagrams reflect functionality actually provided by the code.
- Check that class diagrams reflect the class structure and relationships in the code.
- Check that sequence diagrams reflect the method call order in the code.
- Check that activity diagrams reflect the code logic.
- Check that state machine diagrams reflect the state transitions in the code.
- Check that note contents in diagrams are consistent with the code.
- Check that UML diagrams conform to the diagram layout guide.
**If mismatches found:**
```
UML model alignment issues found:
- [list each mismatch with file:code line and model-element/diagram reference]
Cannot proceed until resolved. Update model, then re-run verification.
```
Stop. Don't proceed to Step 3.
**If aligned:** Continue to Step 3.
- ### Step 3: Determine Base Branch
+ ### Step 3: Detect Environment
+ **Determine workspace state before presenting options:**
+
```bash
+ GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
+ GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
+ ```
+
+ This determines which menu to show and how cleanup works:
+
+ | State | Menu | Cleanup |
+ |-------|------|---------|
+ | `GIT_DIR == GIT_COMMON` (normal repo) | Standard 4 options | No worktree to clean up |
+ | `GIT_DIR != GIT_COMMON`, named branch | Standard 4 options | Provenance-based (see Step 6) |
+ | `GIT_DIR != GIT_COMMON`, detached HEAD | Reduced 3 options (no merge) | No cleanup (externally managed) |
+
+ ### Step 4: Determine Base Branch
+
+ ```bash
# Try common base branches
git merge-base HEAD main 2>/dev/null || git merge-base HEAD master 2>/dev/null
```
Or ask: "This branch split from main - is that correct?"
- ### Step 4: Present Options
+ ### Step 5: Present Options
- Present exactly these 4 options:
+ **Normal repo and named-branch worktree — present exactly these 4 options:**
```
Implementation complete. What would you like to do?
1. Merge back to <base-branch> locally
2. Push and create a Pull Request
3. Keep the branch as-is (I'll handle it later)
4. Discard this work
Which option?
```
+ **Detached HEAD — present exactly these 3 options:**
+
+ ```
+ Implementation complete. You're on a detached HEAD (externally managed workspace).
+
+ 1. Push as new branch and create a Pull Request
+ 2. Keep as-is (I'll handle it later)
+ 3. Discard this work
+
+ Which option?
+ ```
+
**Don't add explanation** - keep options concise.
- ### Step 5: Execute Choice
+ ### Step 6: Execute Choice
#### Option 1: Merge Locally
```bash
- # Switch to base branch
- git checkout <base-branch>
+ # Get main repo root for CWD safety
+ MAIN_ROOT=$(git -C "$(git rev-parse --git-common-dir)/.." rev-parse --show-toplevel)
+ cd "$MAIN_ROOT"
- # Pull latest
+ # Merge first — verify success before removing anything
+ git checkout <base-branch>
git pull
-
- # Merge feature branch
git merge <feature-branch>
# Verify tests on merged result
<test command>
- # If tests pass
- git branch -d <feature-branch>
+ # Only after merge succeeds: cleanup worktree (Step 7), then delete branch
```
- Then: Cleanup worktree (Step 6)
+ Then: Cleanup worktree (Step 7), then delete branch:
+ ```bash
+ git branch -d <feature-branch>
+ ```
+
#### Option 2: Push and Create PR
```bash
# Push branch
git push -u origin <feature-branch>
# Create PR
gh pr create --title "<title>" --body "$(cat <<'EOF'
## Summary
<2-3 bullets of what changed>
## Test Plan
- [ ] <verification steps>
EOF
)"
```
- Then: Cleanup worktree (Step 6)
+ **Do NOT clean up worktree** — user needs it alive to iterate on PR feedback.
#### Option 3: Keep As-Is
Report: "Keeping branch <name>. Worktree preserved at <path>."
**Don't cleanup worktree.**
#### Option 4: Discard
**Confirm first:**
```
This will permanently delete:
- Branch <name>
- All commits: <commit-list>
- Worktree at <path>
Type 'discard' to confirm.
```
Wait for exact confirmation.
If confirmed:
```bash
- git checkout <base-branch>
- git branch -D <feature-branch>
+ MAIN_ROOT=$(git -C "$(git rev-parse --git-common-dir)/.." rev-parse --show-toplevel)
+ cd "$MAIN_ROOT"
```
- Then: Cleanup worktree (Step 6)
+ Then: Cleanup worktree (Step 7), then force-delete branch:
+ ```bash
+ git branch -D <feature-branch>
+ ```
- ### Step 6: Cleanup Worktree
+ ### Step 7: Cleanup Workspace
- **For Options 1, 2, 4:**
+ **Only runs for Options 1 and 4.** Options 2 and 3 always preserve the worktree.
- Check if in worktree:
```bash
- git worktree list | grep $(git branch --show-current)
+ GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
+ GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
+ WORKTREE_PATH=$(git rev-parse --show-toplevel)
```
- If yes:
+ **If `GIT_DIR == GIT_COMMON`:** Normal repo, no worktree to clean up. Done.
+
+ **If worktree path is under `.worktrees/`, `worktrees/`, or `~/.config/superpowers/worktrees/`:** Superpowers created this worktree — we own cleanup.
+
```bash
- git worktree remove <worktree-path>
+ MAIN_ROOT=$(git -C "$(git rev-parse --git-common-dir)/.." rev-parse --show-toplevel)
+ cd "$MAIN_ROOT"
+ git worktree remove "$WORKTREE_PATH"
+ git worktree prune # Self-healing: clean up any stale registrations
```
- **For Option 3:** Keep worktree.
+ **Otherwise:** The host environment (harness) owns this workspace. Do NOT remove it. If your platform provides a workspace-exit tool, use it. Otherwise, leave the workspace in place.
## Quick Reference
| Option | Merge | Push | Keep Worktree | Cleanup Branch |
|--------|-------|------|---------------|----------------|
- | 1. Merge locally | ✓ | - | - | ✓ |
- | 2. Create PR | - | ✓ | ✓ | - |
- | 3. Keep as-is | - | - | ✓ | - |
- | 4. Discard | - | - | - | ✓ (force) |
+ | 1. Merge locally | yes | - | - | yes |
+ | 2. Create PR | - | yes | yes | - |
+ | 3. Keep as-is | - | - | yes | - |
+ | 4. Discard | - | - | - | yes (force) |
## Common Mistakes
**Skipping test verification**
- **Problem:** Merge broken code, create failing PR
- **Fix:** Always verify tests before offering options
**Open-ended questions**
- - **Problem:** "What should I do next?" → ambiguous
- - **Fix:** Present exactly 4 structured options
+ - **Problem:** "What should I do next?" is ambiguous
+ - **Fix:** Present exactly 4 structured options (or 3 for detached HEAD)
- **Automatic worktree cleanup**
- - **Problem:** Remove worktree when might need it (Option 2, 3)
+ **Cleaning up worktree for Option 2**
+ - **Problem:** Remove worktree user needs for PR iteration
- **Fix:** Only cleanup for Options 1 and 4
+ **Deleting branch before removing worktree**
+ - **Problem:** `git branch -d` fails because worktree still references the branch
+ - **Fix:** Merge first, remove worktree, then delete branch
+
+ **Running git worktree remove from inside the worktree**
+ - **Problem:** Command fails silently when CWD is inside the worktree being removed
+ - **Fix:** Always `cd` to main repo root before `git worktree remove`
+
+ **Cleaning up harness-owned worktrees**
+ - **Problem:** Removing a worktree the harness created causes phantom state
+ - **Fix:** Only clean up worktrees under `.worktrees/`, `worktrees/`, or `~/.config/superpowers/worktrees/`
+
**No confirmation for discard**
- **Problem:** Accidentally delete work
- **Fix:** Require typed "discard" confirmation
## Red Flags
**Never:**
- Proceed with failing tests
- Merge without verifying tests on result
- Delete work without confirmation
- Force-push without explicit request
+ - Remove a worktree before confirming merge success
+ - Clean up worktrees you didn't create (provenance check)
+ - Run `git worktree remove` from inside the worktree
**Always:**
- Verify tests before offering options
- - Present exactly 4 options
+ - Detect environment before presenting menu
+ - Present exactly 4 options (or 3 for detached HEAD)
- Get typed confirmation for Option 4
- Clean up worktree for Options 1 & 4 only
-
- ## Integration
-
- **Called by:**
- - **subagent-driven-development** (Step 7) - After all tasks complete
- - **executing-plans** (Step 5) - After all batches complete
-
- **Pairs with:**
- - **using-git-worktrees** - Cleans up worktree created by that skill
+ - `cd` to main repo root before worktree removal
+ - Run `git worktree prune` after removal