npx skills add ...
npx skills add warpdotdev/common-skills --skill write-pr-description
Writes the body of a pull request - the summary, the repository template sections, and reviewer guidance such as a recommended reading order and focus areas. Use whenever drafting or revising a PR description, filling in a repository's PR template, refreshing a description that no longer matches the branch, or preparing a branch for review. Use it even when the user only says "open a PR", "put this up for review", or "write this up" without naming the description.
npx skills add warpdotdev/common-skills --skill write-pr-description
A pull request description has one job: give the reviewer what the diff cannot.
The diff already states what changed. The description states why it changed, what it affects, which decisions were made along the way, and where the author wants attention. Everything below follows from that. When a rule here conflicts with what a specific reviewer needs, serve the reviewer.
create-pr covers the mechanics of opening the PR. This skill covers what goes in the body.
Usually you did the work and already know most of this. When you are describing a branch you did not write, or a PR you have just been handed, start here.
Read the commit bodies before the diff. They are usually the richest source of motivation. Then verify what they claim: a commit message saying "matches the existing pattern in this file" is an assertion about code, and it is often wrong. Do not forward a claim you have not checked.
Verify by looking, not by reasoning. The checks worth making are cheap and specific:
gcloud iam roles describe for a role's permission set, the provider or API schema for a resource's
fields, the parser for what a marker does.One check of this kind usually produces the best sentence in the description.
Gather what the diff cannot tell the reviewer:
Check the repository for a PR template. Where there are several, pick the one matching the change. Templates differ per repository, so check every time rather than reusing the shape from your last PR.
The template's own instructions outrank this skill. A template that says "remove this section if it is not relevant" is telling you what this repository's reviewers want. Follow it. The guidance below applies where the template is silent.
When no template exists, use this shape, which is the same shape a template would give you:
Why section.## Review guide, when step 4 calls for one.## What changed## ValidationThis shape collapses on a small change. A heading over a single line is the same ceremony step 4 warns about, so drop any section that would hold one and let the opening carry it.
Open with one to three sentences covering what the change does and why. A reviewer who reads only the first paragraph should be able to tell whether they are the right reviewer.
Where the repository has a template, this paragraph goes inside its first content section, whatever that section is called. Do not add a lead above the template's first heading, and do not repeat it once inside.
Then give the substance:
You normally ran the work, so report it: the command and what it showed.
Where you did not, or only partly did, these are the honest shapes. More than one can apply at once: you may have verified a fact yourself and still be waiting on CI for the rest.
Whichever apply, state each once. Repeating "this was not run" in three sections reads as hedging, and buries the one line that says what to run instead.
Never write intent as though it were a result.
Use ASD-STE100 as the baseline: active voice, one topic per sentence, sentences under about 25 words, simple tenses, one term per concept for the whole description. Code identifiers, command lines, and established repository jargon are technical names; leave them alone. See references/plain-language.md for the rules and the exemptions.
Add a review guide when the reading order is not obvious, when you have a specific place you want attention, or when the change can break things well beyond the files it touches. Skip it when a competent reviewer will know where to look without being told.
Put it high, directly after the summary. A reviewer should not have to scroll past
compliance checklists to find where to start. ## Review guide is a reasonable default
heading when the template does not supply one.
On a small PR, guidance is a sentence or two, not a section. Fold it into the opening rather than raising a heading over it. A heading on two paragraphs is ceremony, and so is a reading order for six files.
A review guide contains some or all of:
Write it for a competent engineer. Point at the code and the open question; never explain how to review code. See references/review-guide.md, which opens with a short map of which of its sections you need.
Drafts run long, and the excess is almost never in the thinking. It collects in the parts that feel obligatory: the checklist answers, the inventory of tests, the second statement of something you already said. Those parts are also the easiest to delete, which makes this pass cheap and worth doing every time.
Rough anchors for the whole body, before you start cutting:
These are anchors, not limits. Being over one means look harder at the list below; it never means cut a decision.
Then take each paragraph and name the decision it helps the reviewer make. If you cannot name one, delete it. The usual finds:
Co-Authored-By belongs in the commit, not in the PR body.Keep, even when cutting hard: the motivation, the behavior changes, the decisions and their rejected alternatives, the open questions, and the blast radius. These are the reason the description exists. When something has to go, cut mechanism before you cut a decision.
Narrating the branch's own history. The most common failure. Sentences like "this PR previously included unit tests, which were removed after review feedback", or "the description above overstated this and has been corrected", describe a transition that does not exist in the diff the reviewer is reading. The reviewer sees one state against the base. Describe that state.
Note what survives the rule: the reasoning usually still matters, only the transition goes. "The tests were removed because they only reasserted the match arms" becomes "there are no unit tests here, because a test at this layer would only reassert the match arms".
This holds however long the branch is. A branch with thirty commits still reaches the reviewer as one state against the base.
Restating the diff. A file-by-file inventory is the standard way to write something long that carries no information.
Unverified claims, about anything. Inflated test claims are the familiar case ("fully tested", "no regressions"), but a confident wrong claim about mechanism is more dangerous, because a reviewer is less likely to check it. Before asserting what a role permits, what a flag gates, or what a function guarantees, verify it.
Grading your own work. "Comprehensive", "robust", "clean", "properly". Padding that costs credibility.
Lecturing the reviewer. "Please check for edge cases and make sure the error handling is correct." A competent reviewer already does this, and it displaces the specific pointers only you can give.
Leaving a stale description. After a rework or a force-push, rewrite the body to describe the current branch. Do not append a revision log to the bottom.