packages/pr-description-skill/SKILL.md
Use this skill to write the PR description (PR body) for any pull request opened against microsoft/apm. Produces one self-sufficient GitHub-Flavored Markdown artifact: TL;DR, Problem (WHY), Approach (WHAT), Implementation (HOW), 1-3 validated mermaid diagrams, explicit trade-offs, validation evidence, and a How-to-test section -- with every WHY-claim backed by a verbatim quote from PROSE or Agent Skills. Activate when the user asks to "write a PR description", "draft a PR body", "open a PR", "fill in the PR template", or any equivalent.
npx skillsauth add microsoft/apm pr-description-skillInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Trigger this skill on any of the following intents:
Reusable for any PR against microsoft/apm. The output is one
markdown file that the orchestrator pastes into
gh pr create --body-file or surfaces to the maintainer.
The repo-wide encoding rule at
.github/instructions/encoding.instructions.md constrains
source files and CLI output to printable ASCII because Windows
cp1252 terminals raise UnicodeEncodeError on anything else. PR
comments are NOT source code and NOT CLI output -- they are rendered
by GitHub's Primer engine, which expects UTF-8 GitHub-Flavored
Markdown.
Two distinct rules therefore apply:
SKILL.md, assets/*) MUST
stay ASCII. They live in the repo and are subject to
.github/instructions/encoding.instructions.md.A previous version of this skill incorrectly required ASCII in the PR body. That made the output unreadable: no alerts, no collapsibles for long evidence, no em dashes, no smart quotes. Reviewers had to scroll through hundreds of flat lines instead of scanning a body shaped by GFM features.
The skill aims for 150-220 lines for a typical PR body. 300+ lines is a smell, not a virtue. If your draft exceeds 250 lines, run a tightening pass: every sentence that does not change the reviewer's understanding must be cut.
Per-section ceilings (enforced by assets/section-rubric.md):
| Section | Ceiling | |---|---| | TL;DR | 2-4 sentences | | Problem (WHY) | max 6 bullets, max 3 quoted anchors total | | Approach (WHAT) | a table OR 3-7 bullets; may be skipped if PR is purely additive (say "additive: see Implementation") | | Implementation (HOW) | one short paragraph per file, OR a table; no prose walls | | Diagrams | 1-3 mermaid blocks; every diagram preceded by a one-sentence legend | | Trade-offs | 3-5 bullets; mechanical PRs may be 1-2 | | Benefits | 3-5 numbered items, each measurable | | Validation | copy-paste real command output; do not narrate | | How to test | max 5 numbered steps |
Long verbatim quote blocks, full file listings, and full validation
transcripts SHOULD live inside <details> so the body stays
scannable.
Each rule the skill enforces is backed by a verbatim quote from one of the two reference docs. If a rule below cannot be backed by a quote, it is downgraded to a "should" with the reason given.
Self-sufficient body. A reviewer must be able to read the PR body and form an opinion without opening any other doc, issue, or chat. Every WHY-claim cites the source doc inline; every named file is qualified with what changed in it; every diagram has a one-sentence legend.
Anchor: Agent Skills, "agents pattern-match well against concrete structures".
Anchored: every WHY-claim cites its source. Every claim of the form "this violates X" or "this satisfies Y" is followed by a verbatim quoted phrase wrapped in a hyperlink to the source page. Reproduce quotes character-for-character; do not paraphrase inside link text.
Anchor: PROSE, "Grounding outputs in deterministic tool execution transforms probabilistic generation into verifiable action.".
Cite-or-omit. If a WHY-claim cannot be backed by a verbatim quote, drop it or soften to a tradeoff statement. Never invent justification.
Anchor: Agent Skills, "Add what the agent lacks, omit what it knows".
Visual aid where structure is non-trivial. Any change that touches more than one file or alters control flow SHOULD include at least one mermaid diagram. Add a second only when the relationships are non-trivial. Never add a third unless it earns its place. Each diagram MUST be preceded by a one-sentence legend.
Anchor: Agent Skills, "agents pattern-match well against concrete structures".
Trade-offs explicit. Address every non-obvious decision (option chosen vs option rejected). For mechanical PRs this section may be 1-2 bullets. For cross-cutting changes, surface the rejected alternatives.
Anchor: PROSE, "Favor small, chainable primitives over monolithic frameworks.".
Single artifact, no fluff. One markdown file. No marketing tone, no self-congratulation. TL;DR is at most four sentences.
Anchor: Agent Skills, "When you find yourself covering every edge case, consider whether most are better handled by the agent's own judgment.".
The PR body is rendered by GitHub's Primer engine. Use the features that engine provides; do not flatten the output to plain text.
Alerts for high-signal callouts:
> [!NOTE], > [!TIP], > [!IMPORTANT], > [!WARNING],
> [!CAUTION]. Reference:
https://github.com/orgs/community/discussions/16925.
Collapsible sections for long diffs, full validation output, or appendix material:
<details><summary>Full audit output</summary>
...content...
</details>
Use <details open> only when the content answers the most
likely first reviewer question.
Task lists for "How to test" sections:
- [ ] Apply label, observe X.
Tables with alignment: | col | :---: | ---: | for matrices.
Permalink references to specific lines in the diff:
https://github.com/microsoft/apm/blob/<sha>/path#L12-L34.
Long verbatim quote blocks, full file listings, and full validation
transcripts SHOULD live inside <details> so the body stays
scannable.
| # | Section | Purpose |
|---|---------|---------|
| 1 | Title line | Imperative summary; first line <verb>(<scope>): <summary>, max 100 chars |
| 2 | TL;DR | 2-4 sentence executive summary |
| 3 | Problem (WHY) | Observed failure modes; max 6 bullets, max 3 quoted anchors |
| 4 | Approach (WHAT) | Table or 3-7 bullets; may say "additive: see Implementation" |
| 5 | Implementation (HOW) | One short paragraph per file or a table |
| 6 | Diagrams | 1-3 validated mermaid blocks, each with a legend; diagram type chosen per intent (assets/mermaid-conventions.md) |
| 7 | Trade-offs | 3-5 bullets (1-2 if mechanical) |
| 8 | Benefits | 3-5 numbered, measurable items |
| 9 | Validation | Real command output, ideally inside <details> if long; MUST include the Scenario Evidence subsection (assets/scenario-evidence-rubric.md) for any behavior-change PR -- maps each user-promise scenario this PR touches to the test that proves it works, tagged with the APM principle the scenario serves |
| 10 | How to test | Max 5 numbered or task-list steps |
The Trade-offs (7) and How to test (10) sections are non-skippable for any PR that changes more than docs.
Before invoking this skill, the orchestrator MUST have collected all of the following. The skill MUST NOT invent facts not present in these inputs.
| Input | Source | Required |
|-------|--------|----------|
| Branch name (head) | git rev-parse --abbrev-ref HEAD | yes |
| Base ref | usually main; ask if unclear | yes |
| List of files changed | git diff --name-status <base>...HEAD | yes |
| Actual diff | git diff <base>...HEAD | yes |
| Commit messages on the branch | git log --no-merges <base>..HEAD --oneline | yes |
| CHANGELOG entry, if any | inspect CHANGELOG.md Unreleased section | yes |
| Linked issue / motivation | user-provided or referenced in commits | yes |
| Validation evidence | output of apm audit --ci, uv run pytest, or equivalent | yes |
| Scenario-test mapping | author-supplied or derived from diff: per user-promise scenario the PR touches, the test path proving it, plus the APM principle the scenario serves (taxonomy in assets/scenario-evidence-rubric.md) | conditional (required for any behavior-change PR; may be skipped for docs-only / asset-bump / pure-refactor per the rubric's skip clause, with the skip case stated in trade-offs) |
| Mirror parity check, if applicable | apm install --target copilot output | conditional |
If any required input is missing, the orchestrator MUST stop and
collect it. This is a Progressive Disclosure boundary:
"Context arrives just-in-time, not just-in-case.".
Do not load assets/pr-body-template.md until the table above is
complete.
Run these steps in order. Tick each before moving on.
.apm/instructions/linting.instructions.md). If lint is red,
STOP, fix, re-run; a PR body claiming green CI while lint fails
is a credibility tax we refuse to take on.assets/pr-body-template.md. This is the only point
at which the template enters context. Progressive Disclosure
in action:
"store them in assets/ and reference them from SKILL.md so they only load when needed.".assets/mermaid-conventions.md to pick the right
diagram type per intent (sequenceDiagram for execution flow,
flowchart LR for pipeline / architecture, stateDiagram-v2 for
state machines) and apply the boxing convention for NEW
behavior. Add a one-sentence legend above each diagram.assets/section-rubric.md and run the self-check pass.
Validation loop pattern from Agent Skills:
"do the work, run a validator (a script, a reference checklist, or a self-check), fix any issues, and repeat until validation passes."..git/PR_BODY.md or
session-state-relative). Return the path; do not paste the
body inline unless explicitly asked.Run every mermaid block in the draft through mmdc and refuse to
save until all pass.
# Extract mermaid blocks and validate each one.
# Requires: npx --yes -p @mermaid-js/mermaid-cli mmdc (one-shot, no global install needed)
awk '/^```mermaid/{n++; f=outdir"/diag"n".mmd"; getline; while($0 != "```") {print > f; getline}}' outdir=/tmp/mermaid-check pr-body-draft.md
for f in /tmp/mermaid-check/diag*.mmd; do
npx --yes -p @mermaid-js/mermaid-cli mmdc -i "$f" -o "${f%.mmd}.svg" --quiet || { echo "INVALID: $f"; exit 1; }
done
If mmdc reports any error, fix the diagram and re-run. The skill
MUST NOT save the draft until every mermaid block validates.
The full diagram-type-by-intent table, canonical templates, and the
GitHub-renderer gotcha list (mmdc does NOT always catch GitHub
rejections) live in assets/mermaid-conventions.md. Load it whenever
a PR body needs a mermaid block.
Critical drift-known gotcha (the one most likely to bite, captured
inline because it is not obvious from mmdc output):
A -->|[EXEC] work| B parses on mmdc but is rejected by
GitHub's renderer (Expecting 'TAGEND', ..., got 'SQS'). Quote
the label: A -->|"[EXEC] work"| B. The same rule applies to
parentheses, colons, slashes, and pipes in edge labels.For everything else (semicolons in classDiagram links, note right of closing rules, round brackets in node labels, inline
:::cssClass failing in classDiagram on GitHub), see
assets/mermaid-conventions.md.
mmdc and renders
without error.Co-authored-by: Copilot <[email protected]>mmdc.<details>. Reviewers should be
able to read the whole body in a single screen-and-a-half scroll
and expand evidence on demand.Co-authored-by: Copilot [email protected]
testing
Use only as the composed drive-to-merge stage of an APM batch orchestrator (batch-bug-shepherd, apm-issue-autopilot) that has already selected ONE open pull request in microsoft/apm. Do NOT use for user-facing requests to triage issues, sweep a queue, or open PRs -- the parent orchestrator owns those. Spawn one shepherd-driver subagent per PR: it classifies copilot-pull-request-reviewer[bot] inline review, runs the apm-review-panel, folds (by default) every recommendation inside the PR's stated scope, pushes to the head branch or a superseding PR that preserves authorship via commit trailers, watches CI to green, and iterates under fixed caps until ready-to-merge, advisory-with-deferred, superseded, or blocked. Also provides the cross-PR conflict-resolution and mergeability-gate phase. This is NOT a standalone entrypoint.
testing
Use this skill to triage a single newly opened, reopened, or `status/needs-triage`-labelled issue in microsoft/apm. Emit one synthesized comment with a triage decision, label set, milestone, and suggested next action.
tools
Use this skill to run a multi-persona expert advisory review on a labelled pull request in microsoft/apm. The panel fans out to five mandatory specialists plus a test-coverage specialist (active on every PR that touches src/) plus three conditional specialists (auth, doc-writer, performance-expert), all running in their own agent threads, and a CEO synthesizer. The orchestrator is the sole writer to the PR: ONE recommendation comment, no verdict labels, no merge gating. The panel is advisory -- it surfaces findings, prioritizes follow-ups, and renders a ship-recommendation that the maintainer and author weigh. Activate when a non-trivial PR needs a cross-cutting recommendation (architecture, CLI logging, DevX UX, supply-chain security, growth/positioning, optionally auth, docs, perf, and test coverage, with CEO arbitration).
tools
An example skill from the mock plugin