Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Ship a change as a pull request the safe way — branch off main, stage only the relevant files, sanity-check the diff, run the repo's build/tests, and open the PR via the project's remote platform. Use this whenever the user wants to "ship it", "open a PR", "make a PR", "push this up for review", or otherwise turn working-tree changes into a reviewable PR — even if they don't say the word "ship".
.claude/skills/miguelaperez-ship/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | -48% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -34% | 0% |
| case-17 | ✗→✓ | ▲ Improved | -29% | 0% |
| case-04 | ✓→✗ | ▼ Worse | -19% | 0% |
| case-05 | ✓→✗ | ▼ Worse | -36% | 0% |
The point of this skill is to get a change onto a branch and into a PR without the classic footguns: committing to main, sweeping up stray files (.env, build artifacts, unrelated edits), or pushing something that doesn't build. Go through the steps in order and don't skip the diff review — that's the step that catches the expensive mistakes.
Before opening the PR, identify the project's remote platform from the git remote URL and use the appropriate tooling. Check the project's platform docs for the exact API calls — e.g. see working-with-gitea if the remote is Gitea.
mainCheck the current branch first. If you're on main, branch before anything else:
bashgit branch --show-current git checkout -b <type>/<short-description> # e.g. refactor/commit-flat-sections
Name it for the change, matching the conventional-commit type (feat/, fix/, refactor/, chore/…).
Stage explicitly by path — never git add -A / git add ., which is how .env, local config, and unrelated edits leak in:
bashgit add <path1> <path2> git status # confirm nothing unexpected is staged git diff --cached # read the actual diff before committing
Scan for: secrets or .env files, build artifacts / caches, debug leftovers, and edits unrelated to this change. If something doesn't belong, unstage it (git restore --staged <path>). Then commit with a conventional message and any trailer the repo requires (check CLAUDE.md — e.g. a Co-Authored-By: line).
Use whatever gate the repo defines — check its CLAUDE.md / README for the canonical command — and proceed only when it passes. Don't invent a test command; if the repo has no test/build gate, say so and continue.
Example (a SwiftUI iOS app):
bashxcodebuild -project MyApp.xcodeproj -scheme MyApp -configuration Debug \ -destination 'platform=iOS Simulator,name=iPhone 17' build 2>&1 | tail -4
Push the branch:
bashgit push -u origin "$(git branch --show-current)"
Then open the PR using the platform's tooling. The PR body should have a ## Summary and a ## Test plan section. Derive owner and repo from the git remote (git remote get-url origin). Report the PR number and URL back to the user.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-12 | fail→pass | 10,132 | 2,006 | -80% | 1 | 1 | 0% | 1,930 | 1,010 | -48% | 0 | 0 | — |
case-01 | fail→fail | 7,844 | 5,355 | -32% | 1 | 1 | 0% | 1,429 | 831 | -42% | 0 | 0 | — |
case-02 | fail→fail | 3,545 | 5,657 | +60% | 1 | 1 | 0% | 585 | 961 | +64% | 0 | 0 | — |
case-14 | pass→pass | 2,167 | 1,825 | -16% | 1 | 1 | 0% | 400 | 944 | +136% | 0 | 0 | — |
case-03 | fail→fail | 9,670 | 4,223 | -56% | 1 | 1 | 0% | 1,409 | 866 | -39% | 0 | 0 | — |
case-04 | pass→fail | 5,225 | 3,939 | -25% | 1 | 1 | 0% | 998 | 804 | -19% | 0 | 0 | — |
case-05 | pass→fail | 6,539 | 3,931 | -40% | 1 | 1 | 0% | 1,259 | 809 | -36% | 0 | 0 | — |
case-06 | fail→fail | 5,064 | 4,830 | -5% | 1 | 1 | 0% | 866 | 937 | +8% | 0 | 0 | — |
case-13 | pass→pass | 5,649 | 3,055 | -46% | 1 | 1 | 0% | 986 | 1,200 | +22% | 0 | 0 | — |
case-07 | pass→pass | 6,280 | 4,679 | -25% | 1 | 1 | 0% | 1,239 | 1,601 | +29% | 0 | 0 | — |
case-08 | fail→fail | 2,390 | 2,150 | -10% | 1 | 1 | 0% | 487 | 1,032 | +112% | 0 | 0 | — |
case-09 | fail→pass | 7,978 | 1,869 | -77% | 1 | 1 | 0% | 1,449 | 952 | -34% | 0 | 0 | — |
case-10 | pass→pass | 8,539 | 5,778 | -32% | 1 | 1 | 0% | 1,570 | 1,808 | +15% | 0 | 0 | — |
case-11 | pass→fail | 5,869 | 2,339 | -60% | 1 | 1 | 0% | 1,096 | 1,066 | -3% | 0 | 0 | — |
case-15 | pass→pass | 4,801 | 2,057 | -57% | 1 | 1 | 0% | 939 | 958 | +2% | 0 | 0 | — |
case-16 | pass→pass | 6,302 | 1,746 | -72% | 1 | 1 | 0% | 1,268 | 950 | -25% | 0 | 0 | — |
case-17 | fail→pass | 6,838 | 1,848 | -73% | 1 | 1 | 0% | 1,293 | 924 | -29% | 0 | 0 | — |
case-18 | fail→fail | 8,995 | 1,216 | -86% | 1 | 1 | 0% | 1,559 | 845 | -46% | 0 | 0 | — |
case-19 | pass→fail | 3,664 | 1,210 | -67% | 1 | 1 | 0% | 632 | 774 | +22% | 0 | 0 | — |
case-20 | pass→pass | 8,539 | 3,639 | -57% | 1 | 1 | 0% | 1,657 | 1,303 | -21% | 0 | 0 | — |
case-21 | pass→pass | 7,502 | 4,291 | -43% | 1 | 1 | 0% | 1,409 | 1,415 | +0% | 0 | 0 | — |
case-22 | pass→pass | 7,074 | 2,725 | -61% | 1 | 1 | 0% | 1,358 | 1,139 | -16% | 0 | 0 | — |
case-23 | pass→pass | 5,867 | 2,114 | -64% | 1 | 1 | 0% | 1,060 | 915 | -14% | 0 | 0 | — |
case-24 | pass→pass | 5,652 | 2,792 | -51% | 1 | 1 | 0% | 1,041 | 1,161 | +12% | 0 | 0 | — |
case-25 | pass→pass | 4,638 | 1,880 | -59% | 1 | 1 | 0% | 831 | 971 | +17% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 19 counted toward the lift figure. The other 6 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of -4 percentage points is the difference between those two pass rates over the 19 comparable cases. 5 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.