Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create or update a GitHub PR following Penpot conventions.
.claude/skills/penpot-create-pr/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -27% | 0% |
| case-05 | ✓→✗ | ▼ Worse | 164% | 0% |
| case-06 | ✓→✗ | ▼ Worse | 13% | 0% |
| case-08 | ✓→✗ | ▼ Worse | 3% | 0% |
Two modes. Open mode takes the current task branch to a new, validated PR. Update mode rewrites an existing PR's title or description. Gather information, validate, and act in one pass. If validation fails, STOP with a single coherent message that lists every problem and states exactly what information is missing — never fix or work around problems silently.
Both modes require an authenticated gh CLI (gh auth status) and never push — the user pushes from their own shell.
any phrasing ("open a PR", "create the pull request", "put this up for review") — or runs /create-pr. → Open mode.
match conventions. → Update mode.
If the running agent cannot write (for example, the plan agent), say so and stop — this skill needs the build agent.
git rev-parse --abbrev-ref HEAD../scripts/detect-target-branch from the repo root.It prints the nearest ancestor branch of HEAD (exit 0) or fails (exit 1).
git log --oneline <base>..HEAD.git rev-parse --verify origin/<branch> and comparewith HEAD. It reads the local remote-tracking ref — no network, no SSH. It reflects the last push or fetch this clone knows about.
issue-NNNNmaps to issue NNNN; recover its title and body with gh issue view NNNN.
Run all checks before reporting, then report every failure together:
after stripping an optional remotes/origin/ prefix — is not one of the canonical branches (develop, staging, main), stop and ask the user to re-run with more context — for example, passing the base branch explicitly in their invocation. An explicit base given by the user overrides the script's output.
stop.
branch name has no issue-NNNN pattern (or gh issue view finds nothing) — say so and stop. Exception: the user's invocation says no issue / without issue — then continue without an issue reference.
origin/<branch> ismissing, or git rev-parse origin/<branch> differs from HEAD — the branch was never pushed, or has commits the remote does not have. Never push yourself; ask the user to push and to run /create-pr again afterwards, then stop.
Check whether a PR already exists for this branch (gh pr list --head <branch>). If one exists, report its URL and stop — do not create a second one. Title or description fixes belong to Update mode.
Write the title and body following mem:workflow/creating-prs (title format, description structure, writing principles) and mem:workflow/creating-commits (commit type emojis). Derive the title and body from the commits and, when there is one, from the issue body. Reference the issue with Closes #NNNN.
Repeat the AI-assisted-by: trailer in the body, once per model that worked on the branch, so the PR states the assistance where a reviewer reads it. The branch commits keep their own trailers, and a squash merge carries every one of them into the landed message.
Before offering or accepting a draft PR, warn that CI doesn't run on them. Add --draft only when the user agrees to that.
bashgh pr create --repo penpot/penpot --base "<BASE>" --title "<TITLE>" \ --project "Main" --body-file /tmp/pr-body.md
--base is the branch resolved in step 1: without it the PR opens against the repository default, which is wrong for a branch cut from staging. --project "Main" is required by mem:workflow/creating-prs.
Report the PR URL and stop.
<branch>.
mem:workflow/creating-prs.bashgh pr edit <NUMBER> --repo penpot/penpot --title "<TITLE>" --body-file /tmp/pr-body.md gh pr view <NUMBER> --repo penpot/penpot --json title,body
Extra context in the user's invocation (the message that triggered this skill) plays the role command arguments play elsewhere: overrides such as no issue / without issue, an explicit base branch (from origin/staging), a PR number for Update mode, and so on.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 9,320 | 7,236 | -22% | 1 | 1 | 0% | 1,417 | 1,590 | +12% | 0 | 0 | — |
case-02 | fail→fail | 3,863 | 7,791 | +102% | 1 | 1 | 0% | 301 | 1,704 | +466% | 0 | 0 | — |
case-03 | fail→fail | 4,659 | 6,124 | +31% | 1 | 1 | 0% | 128 | 1,587 | +1140% | 0 | 0 | — |
case-04 | fail→fail | 5,883 | 6,560 | +12% | 1 | 1 | 0% | 143 | 1,556 | +988% | 0 | 0 | — |
case-05 | pass→fail | 134,331 | 9,523 | -93% | 1 | 1 | 0% | 682 | 1,802 | +164% | 0 | 0 | — |
case-06 | pass→fail | 9,740 | 9,660 | -1% | 1 | 1 | 0% | 1,425 | 1,610 | +13% | 0 | 0 | — |
case-07 | fail→pass | 9,786 | 4,890 | -50% | 1 | 1 | 0% | 1,396 | 1,808 | +30% | 0 | 0 | — |
case-08 | pass→fail | 9,811 | 7,926 | -19% | 1 | 1 | 0% | 1,529 | 1,579 | +3% | 0 | 0 | — |
case-09 | fail→fail | 12,669 | 6,179 | -51% | 1 | 1 | 0% | 1,746 | 1,670 | -4% | 0 | 0 | — |
case-10 | fail→fail | 6,530 | 8,074 | +24% | 1 | 1 | 0% | 836 | 1,666 | +99% | 0 | 0 | — |
case-11 | fail→pass | 37,203 | 6,677 | -82% | 1 | 1 | 0% | 2,099 | 1,541 | -27% | 0 | 0 | — |
case-12 | fail→fail | 4,622 | 8,152 | +76% | 1 | 1 | 0% | 712 | 1,602 | +125% | 0 | 0 | — |
case-13 | fail→fail | 6,905 | 8,408 | +22% | 1 | 1 | 0% | 850 | 1,860 | +119% | 0 | 0 | — |
case-14 | fail→fail | 16,167 | 8,814 | -45% | 1 | 1 | 0% | 494 | 1,665 | +237% | 0 | 0 | — |
case-15 | fail→fail | 7,640 | 6,999 | -8% | 1 | 1 | 0% | 962 | 1,559 | +62% | 0 | 0 | — |
case-16 | fail→fail | 11,148 | 3,669 | -67% | 1 | 1 | 0% | 1,778 | 1,624 | -9% | 0 | 0 | — |
case-17 | pass→pass | 4,583 | 9,367 | +104% | 1 | 1 | 0% | 391 | 1,839 | +370% | 0 | 0 | — |
case-18 | fail→fail | 7,192 | 8,034 | +12% | 1 | 1 | 0% | 856 | 1,667 | +95% | 0 | 0 | — |
case-19 | fail→fail | 6,911 | 22,450 | +225% | 1 | 1 | 0% | 866 | 3,918 | +352% | 0 | 0 | — |
case-20 | pass→pass | 7,197 | 23,518 | +227% | 1 | 1 | 0% | 482 | 5,053 | +948% | 0 | 0 | — |
case-21 | pass→fail | 6,715 | 7,103 | +6% | 1 | 1 | 0% | 856 | 1,589 | +86% | 0 | 0 | — |
case-22 | pass→pass | 6,643 | 3,560 | -46% | 1 | 1 | 0% | 893 | 1,596 | +79% | 0 | 0 | — |
case-23 | fail→fail | 3,688 | 9,534 | +159% | 1 | 1 | 0% | 485 | 1,549 | +219% | 0 | 0 | — |
case-24 | pass→pass | 4,635 | 3,307 | -29% | 1 | 1 | 0% | 583 | 1,619 | +178% | 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. 24 cases were attempted, and 9 counted toward the lift figure. The other 15 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 -8 percentage points is the difference between those two pass rates over the 9 comparable cases. 10 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.