pr-describe
Writes or updates a pull request description: a diagram-based outline with screenshots when the feature has a plan folder, otherwise a summary, why, how to verify, and risks. Use whenever a PR is open
SKILL.mdplugins/umbraco-devkit/skills/pr-describe/SKILL.md
GitHubDescribe a pull request
git-workflow never writes a PR body by hand — it always runs this skill instead, for every
PR. This skill decides, every time, which of its two styles fits: a diagram-based outline for a
feature-sized change, or a plain summary for everything else.
This skill only composes the description. Branch/push/PR-creation mechanics, force-push and
secret-scanning sanity rules, and the always-ask-before-touching-main rule all stay owned by
git-workflow — read that skill's "Pull requests" and "Sanity rules" sections and follow them
as-is; don't restate them here.
Workflow
Check for a plan folder. Does
docs/plans/<feature-slug>/exist for the current branch (the feature-* pipeline ran for this feature)? This decides which style you write in step 4 — aquick-fixor trunk-based commit won't have one, and that's expected, not an error.Gather context.
- Resolve
<base>first, usinggit-workflow's "Resolving the base branch" (branch prefix, remote existence check, and the stacked-PR check). A wrong base here means the diff below includes commits that were never really part of this PR. - Plan folder found: read
BRIEF.md,ARCHITECTURE.md/SPEC.md, andPLAN.mdfor the "why." Then invokedecision-review(via the Skill tool) — always, not only if it happens to have already run — and use its ranked output as-is for step 4's "Special things to note." The PR is the one checkpoint a fully autonomous run is guaranteed to get a human look at, so this step never skips it: don't fall back to readingDECISION-LOG.mdby hand and don't re-derive the list yourself. - No plan folder: read the branch's commit messages instead — there's no separate plan
artifact to draw on, and
decision-reviewneeds a plan folder to run against. - Either way, read the full diff against the resolved base (
git diff <base>...HEAD, orgh pr diff <number>if a PR already exists) — enough of it, and enough surrounding code, to explain behavior and ownership, not just line counts.
- Resolve
Find or create the PR.
gh pr view --json url,number,title,state,baseRefName,headRefNameon the current branch.- No PR yet: carry on and write the description first. Step 5 opens the PR with it, using
git-workflow's "Pull requests" section for the push, title and base branch. Don't duplicate those rules here.
Write the description, in the style step 1 decided. Either way, a stacked PR (step 2) opens with
Stacked on #<parent-pr-number>.ahead of everything else — the template's placeholder for it is omitted entirely when the PR isn't stacked.- Plan folder found — use
templates/pr-description.md:- Why the change — exactly one sentence.
- What it looks like — only when the PR adds or changes backoffice UI; omit the
whole section otherwise. In this order:
- Where to find it: the click path through the backoffice to each new or changed
screen, from its
BUILD-LOG.mdentry ("Settings › Webhooks › any webhook › Deliveries tab"). - Who can see it: the section, user group or permission that decides access, read
from the manifest
conditionsand the Management API authorization policy. "Anyone with access to the Settings section" beats quoting the condition alias. - Screenshots from the plan folder's
screenshots/: the built screen for a new one; a two-column table with<screen>-before.pngand<screen>.pngfor a changed one. No screenshots on disk means no screenshots in the PR. Never stand a mockup in for the built screen. - Image links in a PR body must be full URLs: a relative path renders as a broken
image. Use
https://github.com/<owner>/<repo>/blob/<sha>/<path>?raw=true, with<owner>/<repo>fromgh repo view --json nameWithOwnerand<sha>the pushed commit that contains the file (git rev-parse HEADafter pushing). Pinning to a commit keeps the image working after the branch is deleted.
- Where to find it: the click path through the backoffice to each new or changed
screen, from its
- Special things to note — led by whatever
decision-reviewflagged in step 2. Carry its recommended action through as a visible prefix, don't smooth it into plain prose:**Needs a decision:**or**Consider reverting:**for those two verdicts, no prefix for a plainLooks fine as documenteditem. EveryNeeds a decision/Consider revertingitem fromdecision-reviewgets a bullet, no exceptions. After those: a bullet each for migrations, compatibility constraints, or other deliberate omissionsdecision-reviewwouldn't have caught — no fixed count, but every one must be something the reviewer genuinely needs before approving, not a restatement of the diagram below or the diff itself. Write- None.if there's nothing at all — don't pad it out. - Change outline — the smallest set of diagrams that explains the implementation. See
references/diagram-conventions.mdfor which shape fits which kind of change and how to draw it. Only include a view that actually changed; skip the rest. Order them the way a reader would want the story told (a data structure or contract usually comes before the code that uses it), not in a fixed sequence. - Prefer a
diffblock for a change to an existing shape; show the whole thing only when most of it is new or the diff notation would obscure ownership or order.
- No plan folder — use
templates/pr-plain.md: Summary, Why, How to verify, Risk / rollback. A diagram-heavy outline on a five-line fix is noise, not help. - Either way, write it following
plain-writing: one person explaining a change to another, plain language, no jargon that isn't already in the codebase.
- Plan folder found — use
Save and publish.
- Plan folder found: save the draft to
docs/plans/<feature-slug>/PR-DESCRIPTION.mdfirst — this skill owns that file, the same wayfeature-buildownsBUILD-LOG.md. Thengh pr edit <number> --body-file docs/plans/<feature-slug>/PR-DESCRIPTION.md. - No plan folder: save the draft to a temporary file outside the repo, then
gh pr edit <number> --body-file <that file>. - No PR yet (either case): open it with
gh pr create --body-file <the saved draft>, followinggit-workflow's "Pull requests" section, instead ofgh pr edit. Always--body-file, never--body. - Confirm the update succeeded.
- Plan folder found: save the draft to
Report back, briefly: the PR URL, the saved description's path (if any), and a short list of changed files. Nothing else — the PR itself carries the full description.
Sanity rules
Inherited from git-workflow, not restated: no force-push, no --no-verify, re-check the diff
for secrets before it goes anywhere, and stop to ask before running git commit/git merge
straight against the default branch or a support/* branch.