the skill
Ship
Use when a feature branch is finished and should land on main — when the user says "ship", "ship it", "merge and push", "finish this branch", or invokes /ship.
Overview
Warren's standard finish flow: squash-merge the feature branch to main as one commit, push, delete the branch, and confirm the deploy is actually live. Invoking this skill authorizes the whole flow; the merge style is settled convention, so don't ask about it. Stop only at the gates below.
Preflight (stop and report if any fails)
git statusis clean. Uncommitted work stops the flow; never stash silently.- Currently on a feature branch, not main.
- Checks are green: run the project's typecheck/tests/build now unless they ran green this session with no edits since.
git fetch origin. If origin/main moved since branching, review the new commits before merging.
The flow
git log origin/main..HEAD --oneline # scope — report this before pushing
git checkout main && git pull origin main
git merge --squash <branch>
git commit -m "<summary written from the actual diff — the why, not the what>"
git push origin main
git push origin --delete <branch> # only if the remote branch exists
git branch -d <branch> # -d, never -D
Report the scope (commit count, files touched, one-line summary) just before the push so the user can interrupt.
Deploy confirmation — shipping is not pushing
If the project deploys from main (most of Warren's do, via Vercel): confirm the new deployment built and is live — Vercel MCP list_deployments/get_deployment, or vercel ls, or fetch the production URL and check the change is present. Some projects have no GitHub auto-deploy and need vercel --prod run manually (payments-atlas is one); check the repo's CLAUDE.md. Report "shipped" only after the deploy is verified; a failed build after push gets surfaced immediately, not smoothed over.
Stop and ask, don't proceed
- Merge conflict during the squash.
- Local main already holds unpushed commits.
- The branch contains commits not made in this line of work and never discussed.
Common mistakes
- Reporting "shipped" when you mean "pushed" — the deploy can still fail.
- A generic commit message ("ship it", the branch name) instead of a summary from the diff.
- Force-deleting with
-Dwhen-drefuses: the refusal means something is unmerged, so investigate instead.