Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create a GitHub pull request with a drafted title and description. Use when the user asks to "create a PR", "create a pull request", "open a PR", or "submit a PR".
.claude/skills/tobihagemann-create-pr/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✓→✗ | ▼ Worse | 124% | 0% |
| case-07 | ✓→✗ | ▼ Worse | 183% | 0% |
| case-09 | ✓→✗ | ▼ Worse | 50% | 0% |
| case-20 | ✓→✗ | ▼ Worse | 23% | 0% |
| case-10 | ✓→✗ | ▼ Worse | -18% | 0% |
Draft a concise and descriptive title and a body for a PR. Explain the purpose of the changes, the problem they solve, and the general approach taken. When the changes involve clear runtime flows or state transitions, include Mermaid diagrams.
If git is in a feature branch, examine all commit messages and the full diff to understand the overall changes. Analyze the diff for framing and diagram opportunities.
Source every claim about prior behavior from the base branch itself, by reading its code with git show origin/<base>:<path>. A long session leaves the working tree carrying intermediate states that were never the state this PR is measured against, and describing one of those as the prior behavior misleads the reviewer.
Before writing that two pull requests must land together, check whether the consumer uses what changed: git grep <symbol> in its checkout, or the other repository's working copy when the dependency crosses repositories. When it does, name the actual cause. When it does not, drop the landing-order claim and keep any reference to the related pull request as plain context. State the claim as unverified when the consumer is not reachable.
$github-voice SkillRun the $github-voice skill to load writing style rules.
Pick a framing, then draft a title and description in it, embedding any diagrams in the body. Output the drafted title and description as chat text so the user can review it.
Use request_user_input for confirmation only. Generate a random tag so the body file is unique across sessions:
bashhead -c 4 /dev/urandom | xxd -p
Write the drafted body to .turbo/pr/<tag>-body.md (using the printed tag) with apply_patch, then create the PR with gh pr create --body-file:
bashgh pr create --title "<TITLE>" --body-file .turbo/pr/<tag>-body.md
Do not set --assignee unless the user explicitly asks to assign someone.
Every body says what the change does and why. How it is organized past that follows from what the change is: pick the framing that carries the most user-visible meaning, and combine two when the change genuinely has both shapes.
The default. Use when the PR makes one coherent change with one purpose.
Use when the PR carries several distinct changes and the reviewer needs the inventory. One item per change, ordered by what matters most.
Use when the change delivers capability someone can name. Write each as As a <persona>, I want <capability> so that <outcome>.
Use when the reviewer's question is what changed rather than what exists: several distinct fixes, or behavior that reads as a feature description unless the delta is spelled out. Give each item a Before line and an After line.
Write Before lines in the past tense, with two exceptions. A sentence describing code the PR leaves alone stays present tense. A claim about what was merely possible stays modal ("could post"), never simple past, which asserts it happened.
GitHub renders Mermaid natively in PR descriptions via mermaid code blocks. Include diagrams only when they add clarity a text description can't — skip for trivial changes or obvious flows.
Include when the changes introduce or modify a clear runtime flow: API endpoints, event handlers, pipelines, multi-service interactions, webhook flows.
`markdown
sequenceDiagram Client->>API: POST /payments API->>PaymentService: processPayment() PaymentService->>StripeClient: charge() StripeClient-->>PaymentService: confirmation PaymentService->>DB: save()
Include when the changes add or modify entity states, status enums, workflow transitions, or lifecycle hooks.
`markdown
stateDiagram-v2 ] --> Draft Draft --> Pending: submit() Pending --> Approved: approve() Pending --> Rejected: reject() Approved --> []
## Flow or ## State Machine heading.turbo/ content (filenames, acceptance criteria, step numbers, headings) in the title or body. .turbo/ is gitignored, so these references would be opaque to anyone reading without local copies.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 3,977 | 34,650 | +771% | 1 | 1 | 0% | 633 | 1,268 | +100% | 0 | 0 | — |
case-02 | fail→fail | 3,199 | 34,777 | +987% | 1 | 1 | 0% | 390 | 1,392 | +257% | 0 | 0 | — |
case-03 | fail→fail | 7,651 | 4,265 | -44% | 1 | 1 | 0% | 647 | 1,259 | +95% | 0 | 0 | — |
case-04 | fail→fail | 3,040 | 10,892 | +258% | 1 | 1 | 0% | 342 | 1,287 | +276% | 0 | 0 | — |
case-05 | fail→fail | 4,909 | 4,999 | +2% | 1 | 1 | 0% | 869 | 1,312 | +51% | 0 | 0 | — |
case-06 | pass→fail | 3,402 | 6,418 | +89% | 1 | 1 | 0% | 631 | 1,413 | +124% | 0 | 0 | — |
case-07 | pass→fail | 3,099 | 4,950 | +60% | 1 | 1 | 0% | 500 | 1,413 | +183% | 0 | 0 | — |
case-08 | fail→fail | 34,261 | 4,492 | -87% | 1 | 1 | 0% | 302 | 1,369 | +353% | 0 | 0 | — |
case-09 | pass→fail | 4,514 | 3,532 | -22% | 1 | 1 | 0% | 816 | 1,222 | +50% | 0 | 0 | — |
case-20 | pass→fail | 5,208 | 9,460 | +82% | 1 | 1 | 0% | 1,059 | 1,307 | +23% | 0 | 0 | — |
case-10 | pass→fail | 8,612 | 3,723 | -57% | 1 | 1 | 0% | 1,567 | 1,283 | -18% | 0 | 0 | — |
case-11 | pass→fail | 4,395 | 5,392 | +23% | 1 | 1 | 0% | 794 | 1,519 | +91% | 0 | 0 | — |
case-12 | pass→fail | 8,947 | 3,905 | -56% | 1 | 1 | 0% | 1,865 | 1,239 | -34% | 0 | 0 | — |
case-13 | pass→fail | 5,014 | 5,100 | +2% | 1 | 1 | 0% | 891 | 1,344 | +51% | 0 | 0 | — |
case-14 | pass→fail | 5,739 | 4,400 | -23% | 1 | 1 | 0% | 1,200 | 1,222 | +2% | 0 | 0 | — |
case-15 | pass→fail | 8,626 | 3,729 | -57% | 1 | 1 | 0% | 1,736 | 1,273 | -27% | 0 | 0 | — |
case-16 | fail→fail | 9,224 | 4,253 | -54% | 1 | 1 | 0% | 1,960 | 1,305 | -33% | 0 | 0 | — |
case-17 | fail→fail | 5,092 | 3,816 | -25% | 1 | 1 | 0% | 314 | 1,272 | +305% | 0 | 0 | — |
case-18 | pass→pass | 9,357 | 3,968 | -58% | 1 | 1 | 0% | 1,716 | 1,771 | +3% | 0 | 0 | — |
case-19 | fail→fail | 5,023 | 15,552 | +210% | 1 | 1 | 0% | 965 | 1,242 | +29% | 0 | 0 | — |
case-21 | pass→fail | 11,433 | 5,568 | -51% | 1 | 1 | 0% | 1,914 | 1,494 | -22% | 0 | 0 | — |
case-22 | fail→fail | 11,884 | 3,567 | -70% | 1 | 1 | 0% | 2,151 | 1,260 | -41% | 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. 22 cases were attempted, and 1 counted toward the lift figure. The other 21 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. A headline lift is not published for this run.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/21/2026 | +5% |
Other measured skills in the registry, with their headline benchmark lift.