Installs into .claude/skills of the current project.
Are you the author of Finish?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/bravros-finish)
---
name: finish
core: true
description: Complete a feature — merge the approved PR, record plan completion, route the homolog→main decision. Use on `/finish` or "finish the feature".
---
# finish
Read [briefing.md](references/briefing.md) on demand for detailed context and instructions.
INTENT: land this feature — merge the PR into its base, record completion in `.planning/events.jsonl`, route the homolog→main decision. Git/project operation only; never touches application code.
## Quick Summary
1. **Resolve PR & Base**: Determine PR and target base (`homolog` or `main`), then drop a **stale review stamp** (Step 1b) — after a multi-round `/address-pr` it still names round 1's commit.
2. **Close Plan**: Record `completed` event in `.planning/events.jsonl`.
3. **CI Check**: `gh pr checks --watch --fail-fast` **redirected to a file**, then `RC=$?` — never piped. Then the readiness gate: merge only at `mergeStateStatus: CLEAN`.
4. **Merge & Verify**: Execute merge gate and post-merge blob verification.
5. **Sync & Clean**: Fast-forward local branches and sweep review stamps.
6. **Main Route**: Route the homolog→main decision with operator confirmation — the main PR repeats step 3 in full. Ask it under a **`Main merge`** header with all three options, and **never use the word "promote" toward the operator here**: this path merges through its own PR gate and needs no token — the police **staging lane** lets a `CLEAN` homolog→main PR merge — but the word sends them off to mint one (afterpay #395/#396 — minted mid-merge, expired unused). `/promote` belongs only in the *defer* option, where it is the real next path. A `✋🏽 Police Block` names its reason: relay it in one line and follow the table in `references/flow.md` Step 7 (UNKNOWN → wait, then retry the same command) — never `gh api`/raw HTTP (B-0036), never `/promote`.
7. **Merge hygiene**: the merge line carries the **literal** PR number (`gh pr merge 1234 --merge`) — the police hook reads raw command text, so a `$VAR` or backtick in the PR argument is unreadable → blocked; no `cd … &&` unless it targets the exact session cwd, never `| tail`; redirect to a file, capture `RC`, inspect. Lock-acquire / merge / `RC` / lock-release may share one Bash call.
8. **Main-merge preflight (before ANY `gh pr merge` into `main`)**: run `bravros police status` (read-only; always exits 0 — read the text: `Police token is MISSING or INVALID` = no token) and `gh pr view 1234 --json mergeStateStatus -q .mergeStateStatus` with the literal number. `CLEAN` + head `homolog` ⇒ the staging lane passes without a token. Not CLEAN (e.g. `UNSTABLE`) ⇒ name the failing check and stop — never attempt the merge. Head is not `homolog` (feature → main) and the token is missing ⇒ ONE ask: "run `bravros police unlock` in a separate terminal, then tell me"; wait — never run `merge-lock acquire … ; gh pr merge` hoping it passes.
9. **Last line, always**: `main @ <sha>` or `homolog only — production pending` — the operator asks "merged to main?" after every run.
Refer to [`references/flow.md`](references/flow.md) for full shell script flow details. Its bash
is copy-paste code, not illustration: a shell-trap table, the stamp-freshness block, the CI and
readiness gates, and the blob verification all have to run **verbatim**.