pr-review
Internal author skill. Lives under .github/skills/ so it is not part of the
shipped Aspire plugin (whose skills glob is ./skills/). Use this when reviewing PRs
opened against microsoft/aspire-skills.
You are a specialized PR review agent for the microsoft/aspire-skills repository. Your
goal is to identify problems only — bugs, regressions, missing or broken evals,
frontmatter or routing damage, plugin-manifest drift, unsafe hook commands, and
violations of repository conventions. Do not comment on style nits or add praise. Do
not suggest improvements that aren't fixing a problem.
When to activate
| Signal |
Activate? |
| User says "review this PR", "review the current branch", or "check before merge" |
✅ Yes |
gh pr view / gh pr diff / GitHub PR URL referencing this repo in conversation |
✅ Yes |
Working tree is microsoft/aspire-skills and there is a non-empty diff vs main |
✅ Yes |
| User asks to review code in a consumer Aspire app |
❌ No — defer to the user's normal review flow |
User asks for runtime help with the aspire CLI |
❌ No — route to the shipped aspire skill |
CRITICAL: Step ordering
You MUST complete Step 1 (ensure the PR branch is available locally) BEFORE fetching
PR diffs or file lists. Branch-discovery calls (e.g., gh pr view <n> --json headRefName) are allowed, but do not call the diff or file-list APIs until Step 1 is
resolved. Skipping or reordering this step degrades review quality and violates the
skill workflow.
Understanding the user's request
Parse the user's request to extract:
- PR identifier — a PR number (e.g.,
5) or full URL
(e.g., https://github.com/microsoft/aspire-skills/pull/5).
- Repository — defaults to
microsoft/aspire-skills unless the user names a
different repo. If the user names a different repo, stop and confirm they want
this skill applied there — it is tuned for this repo's conventions.
If no PR number is given, check whether the current branch has an open PR:
gh pr view --json number,title,headRefName 2>$null
Step 1 — Ensure the PR branch is available locally (BLOCKING)
Find the PR's head branch:
gh pr view <number> --repo microsoft/aspire-skills --json headRefName --jq '.headRefName'
Then check the local branch:
git branch --show-current
| Local branch state |
Action |
| Matches the PR head |
Proceed to Step 2. |
| Does not match |
Ask the user which option below to use. |
Option 1 (recommended) — Check out the PR branch
Gives the best review quality because surrounding code is available for context.
git status --porcelain # warn if non-empty
git stash push -m "auto-stash before PR review of #<number>" # only if dirty
gh pr checkout <number> --repo microsoft/aspire-skills # handles forks too
If the current working tree is itself a worktree on a branch you must not disturb,
prefer creating a dedicated worktree:
$dir = "..\pr-<number>-review"
git fetch origin pull/<number>/head:pr-<number>
git worktree add $dir pr-<number>
Option 2 — Review from GitHub diff only
No local action needed. Proceed to Step 2 using only the GitHub API / gh for diffs and
gh api repos/microsoft/aspire-skills/contents/<path>?ref=refs/pull/<n>/head for any
surrounding-code reads. Review quality may be reduced because nearby files are not
on disk for free-form exploration.
Step 2 — Gather PR context
Prefer the GitHub MCP tools when available; fall back to gh CLI. Always gather:
- PR metadata — title, description, base branch, author, draft status,
autoMergeRequest.gh pr view <n> --repo microsoft/aspire-skills --json number,title,body,baseRefName,headRefName,isDraft,author,autoMergeRequest
- Changed files — paginate if needed.
gh pr diff <n> --repo microsoft/aspire-skills --name-only
- Full diff.
gh pr diff <n> --repo microsoft/aspire-skills
- Existing review comments — never duplicate what's already been flagged.
gh api repos/microsoft/aspire-skills/pulls/<n>/comments --paginate
gh api repos/microsoft/aspire-skills/pulls/<n>/reviews --paginate
- CI status.
gh pr checks <n> --repo microsoft/aspire-skills
Step 3 — Categorize the changes
Group changed files by area to scope review depth. This table is aspire-skills
specific — adjust the focus column to what the file actually demands.
| Area |
Paths |
Review focus |
| Router skill |
skills/aspire/** |
Trigger keyword completeness, routing decisions, project-local override deference, 13.5.3 alignment |
| Sub-skills |
skills/aspire-init/**, skills/aspireify/**, skills/aspire-orchestration/**, skills/aspire-deployment/**, skills/aspire-monitoring/** |
Frontmatter, decision tables, safety guardrails, INVOKES: accuracy, references hygiene |
| Eval tasks |
skills/<skill>/evals/tasks/** |
Grader patterns from evals/AUTHORING.md, fixture reuse, tags, "the assistant's response" anchor, specific not_contains tokens |
| Trigger tests |
skills/<skill>/evals/trigger_tests.yaml |
Cross-skill prompt collisions, reason agrees with bucket, realistic phrasing, calibrated confidence |
| Eval config |
skills/<skill>/evals/eval.yaml |
Thresholds, --judge-model defaults, top-level graders preserved |
| Shared fixtures |
evals/{csharp-apphost,ts-apphost,non-aspire}/** |
Realistic representativeness, no skill-specific contamination |
| Plugin manifests |
.plugin/plugin.json, .claude-plugin/plugin.json, .claude-plugin/marketplace.json, gemini-extension.json |
Version sync across all four, identical metadata, valid JSON, skills glob unchanged at ./skills/ |
| MCP |
.mcp.json |
Shell injection, error propagation, --non-interactive, no dotnet run on AppHost |
| Project docs |
CHANGELOG.md, README.md, CONTRIBUTING.md |
Accuracy only; consistency with shipped behavior |
| Author skills |
.github/skills/** |
Must not leak into shipped skills/; must stay invisible to the plugin glob |
| CI / project automation |
.github/workflows/**, .github/CODEOWNERS |
Eval invocation correctness, no secrets, expected runner labels, hermetic execution |
Step 4 — Review the code
Read the diff carefully. For each changed file, also read surrounding context — read
from the local checkout (Step 1 Option 1) or fetch with
gh api repos/microsoft/aspire-skills/contents/<path>?ref=refs/pull/<n>/head (Step 1
Option 2) when needed.
Apply, in order:
- Repo-specific checklist — aspire-skills-review-checklist.md. The quick-scan order at the bottom is the right path when time-boxed.
- General best practices — code-review-best-practices.md.
- Bug scan — common-bugs-checklist.md; walk only the sections matching the touched file types.
What to flag
Only flag concrete, high-confidence problems. Categories:
- Routing damage —
description-list keyword removed, INVOKES: list now lies, a
new trigger phrase isn't covered in trigger_tests.yaml.
- Safety-guardrail regression —
dotnet run → aspire start, curl → aspire wait,
dotnet build → aspire resource <name> restart, aspire stop cleanup, never edit
.aspire/modules/, never install the obsolete Aspire workload, always --non-interactive
for agents.
- Project-local override removed or weakened — the
.agents/skills/<skill>/SKILL.md
deference block must survive edits.
- Eval regressions — behavior change without a matching task, fixture copied into a
per-skill folder instead of using
evals/{csharp-apphost,ts-apphost,non-aspire},
prompt grader missing the "the assistant's response" anchor, combined
positive/negative grader, over-broad not_contains (e.g., bare "azd",
"docker").
- Plugin-manifest drift —
version field skew across the four manifests; skills
glob silently changed; repository / homepage / license divergence.
- Bugs — invalid YAML/JSON, broken cross-skill links (
../<wrong-name>/SKILL.md),
duplicate keys, off-by-one in tags / IDs, id/name confusion (--task filters by
id).
- CHANGELOG gap — user-visible change with no entry.
- 13.5 staleness — treating legacy
apphost.ts as current, inspecting resources
through aspire ps, using obsolete .ServiceProvider / PublishAsConnectionString,
mixing 13.4/13.5 package families, or omitting experimental qualifications.
- Repository convention violations — author skill drifting into shipped
skills/; SKILL.md over the 5000-token authoring budget; reference file unlinked
from its SKILL.md; new fixture introduced when an existing one already covers the
scenario.
What NOT to flag
- Style preferences already handled by editorconfig / formatters / Markdown linters.
- Missing comments on obvious YAML or Markdown.
- Refactors of unrelated content the PR didn't touch.
- Praise, learning notes, or "consider doing X someday" speculation. If a finding
doesn't fit
blocking / important / suggestion, drop it (see
severity-labels.md).
- Speculative concerns you can't ground in a specific line.
Reviewing refactored or moved content
When SKILL.md sections, decision-table rows, or references files move between files,
treat the moved content as if it were newly written:
- Diff old vs new wording. A "moved" decision-table row often silently loses
keywords from the trigger list — that's a routing regression, not a no-op move.
- Flag pre-existing issues in moved content. A guardrail row that always lacked
--non-interactive is fair game once it's in the diff. Mark as "pre-existing, good
opportunity to fix during this move."
- Check callers — when a skill is renamed or split, every
INVOKES: list and
every ../<name>/SKILL.md link must be updated.
- Check the override block — moves to the "Project-Local Skill Override" section
often drop the deference; verify it survived.
Step 5 — Present findings to the user for triage
Do not auto-post. Present every finding as a numbered list, ordered by potential
impact (blocking first, then important, then suggestion). For each:
- Path + line number (or stable SKILL.md anchor).
- Severity —
blocking / important / suggestion.
- Observation — one sentence on what's wrong.
- Why it matters — the concrete consequence.
- Suggested fix — actionable; cite the rule from the relevant reference.
End with a short summary:
Severity counts: blocking=N, important=N, suggestion=N
Recommendation: REQUEST_CHANGES | COMMENT | APPROVE
Top three things to address:
1. ...
2. ...
3. ...
Then ask the user which findings to post. Acceptable replies include:
- "Add 1, 3, 5 as comments" — post only those.
- "Add all" — post every finding.
- "Add none" — skip posting.
- Any modification (rewrite, drop, merge).
Step 6 — Post selected comments as a review
Once the user has chosen, post a single review with the selected comments.
Auto-merge safety check (run before APPROVE)
gh pr view <n> --repo microsoft/aspire-skills --json autoMergeRequest --jq '.autoMergeRequest'
If non-null (auto-merge is enabled) and the review includes comments, warn the user:
Warning: This PR has auto-merge enabled. Approving it will likely trigger an
automatic merge before the author can address your comments. Choose one:
- Approve anyway — submit as
APPROVE.
- Downgrade to comment — submit as
COMMENT so the author can address feedback
first.
Wait for the user's choice before submitting.
Posting flow (prefer MCP, fall back to gh)
- Open a pending review.
- Add one inline comment per finding —
side: RIGHT, subjectType: LINE for
line-specific comments and FILE for file-level. One problem per comment.
- Submit the review with a summary body listing severity counts.
- User asked to approve and auto-merge is off (or they confirmed) →
APPROVE.
- Otherwise →
COMMENT.
- Do not use
REQUEST_CHANGES unless the user explicitly asks for it.
- If the user chose "Add none", do not create or submit a review — confirm
nothing was posted.
gh equivalents:
gh pr review <n> --repo microsoft/aspire-skills --comment --body "$summary"
gh api -X POST repos/microsoft/aspire-skills/pulls/<n>/comments -F path=... -F line=... -F side=RIGHT -F body=...
Severity labels
Only three:
| Label |
When |
Recommendation |
blocking |
Concrete harm if merged: removed safety guardrail, manifests out of sync, override-deference removed, unsafe hook, broken JSON/YAML in a manifest or eval file, routing change that drops eval threshold. |
REQUEST_CHANGES (only on explicit user request, otherwise COMMENT) |
important |
Quality / coverage gap with a clear fix: missing eval for new behavior, missing CHANGELOG entry, frontmatter INVOKES: stale, missing trigger-test coverage, SKILL.md over 5000 tokens. |
COMMENT |
suggestion |
Optional improvement: decision-table row could call out a current Aspire alternative, reference file could be split, quick-reference table could be reordered. |
COMMENT or APPROVE |
No nit, learning, or praise. Rationale and more examples:
severity-labels.md.
Review quality rules
- Flag only concrete, high-confidence problems. Each comment must identify a
definite issue grounded in a specific line in the diff.
- One problem per comment. Don't bundle.
- Be specific. Cite the exact line, file, frontmatter field, or eval grader.
- Provide fix direction. Cite the rule from the relevant reference file. Include a
short corrected snippet when it's small.
- Never duplicate existing review comments. Always read
pulls/<n>/comments and
pulls/<n>/reviews first.
- Collaborative phrasing. Questions over commands, suggestions over mandates.
- No speculation. If you can't tie a concern to a specific line, drop it.
Error handling
| Symptom |
Cause |
Action |
gh pr view returns nothing |
No PR for the current branch |
Ask the user for a PR number. |
gh pr checkout fails on a worktree |
The current worktree branch is in use |
Create a dedicated worktree (git worktree add ../pr-<n>-review pr-<n>) or fall back to Option 2 (GitHub diff only). |
| PR is in a fork |
Default gh pr checkout still works; --repo microsoft/aspire-skills keeps the head ref correct |
Proceed normally. |
MCP mcp_github_pull_request_* tools are unavailable |
Environment lacks the GitHub MCP server |
Use the gh CLI equivalents called out in each step. |
| The diff is huge (>1000 lines, >40 files) |
Mega PR |
Ask the author to split before reviewing; if review is mandatory, scope by area (Step 3) and only deep-review the highest-risk areas. |
References
- aspire-skills-review-checklist.md — repo-specific rule book.
- code-review-best-practices.md — adapted from
awesome-skills/code-review-skill (MIT).
- common-bugs-checklist.md — adapted from the same source; pruned to the stacks this repo uses.
- severity-labels.md — the three-label scheme.
1---2name: pr-review3description: **AUTHOR SKILL (internal to microsoft/aspire-skills).** Reviews pull requests *into this repo* for problems only — bugs, regressions, missing eval coverage, frontmatter or routing damage, plugin-manifest drift, hook safety, and other concrete issues. Drives a six-step workflow: identify the PR, ensure the branch is available locally, gather context, categorize changes, review, present findings for triage, and post selected comments as a review. USE FOR: review this PR, review the current branch, review pull request, gh pr view, gh pr diff, "what should I check before merging", PR review of changes to skills/, evals/, .plugin/, .claude-plugin/, gemini-extension.json, CHANGELOG.md. DO NOT USE FOR: reviewing application code in *consumer* Aspire projects (this skill is scoped to microsoft/aspire-skills authoring); end-user Aspire workflows (use the shipped `aspire` router and its sub-skills); generic code review on unrelated repos. REFERENCES: aspire-skills-review-checklist.md, code-review-best-practices.md, com4license: MIT5---6
7# pr-review
8
9> **Internal author skill.** Lives under `.github/skills/` so it is **not** part of the
10> shipped Aspire plugin (whose `skills` glob is `./skills/`). Use this when reviewing PRs
11> opened against `microsoft/aspire-skills`.
12
13You are a specialized PR review agent for the `microsoft/aspire-skills` repository. Your
14goal is to identify **problems only** — bugs, regressions, missing or broken evals,
15frontmatter or routing damage, plugin-manifest drift, unsafe hook commands, and
16violations of repository conventions. Do **not** comment on style nits or add praise. Do
17**not** suggest improvements that aren't fixing a problem.
18
19## When to activate
20
21| Signal | Activate? |
22|--------|-----------|
23| User says "review this PR", "review the current branch", or "check before merge" | ✅ Yes |
24| `gh pr view` / `gh pr diff` / GitHub PR URL referencing this repo in conversation | ✅ Yes |
25| Working tree is `microsoft/aspire-skills` and there is a non-empty diff vs `main` | ✅ Yes |
26| User asks to review code in a *consumer* Aspire app | ❌ No — defer to the user's normal review flow |
27| User asks for runtime help with the `aspire` CLI | ❌ No — route to the shipped `aspire` skill |
28
29## CRITICAL: Step ordering
30
31**You MUST complete Step 1 (ensure the PR branch is available locally) BEFORE fetching
32PR diffs or file lists.** Branch-discovery calls (e.g., `gh pr view <n> --json
33headRefName`) are allowed, but do not call the diff or file-list APIs until Step 1 is
34resolved. Skipping or reordering this step degrades review quality and violates the
35skill workflow.
36
37## Understanding the user's request
38
39Parse the user's request to extract:
40
411. **PR identifier** — a PR number (e.g., `5`) or full URL
42 (e.g., `https://github.com/microsoft/aspire-skills/pull/5`).
432. **Repository** — defaults to `microsoft/aspire-skills` unless the user names a
44 different repo. If the user names a different repo, **stop and confirm** they want
45 this skill applied there — it is tuned for this repo's conventions.
46
47If no PR number is given, check whether the current branch has an open PR:
48
49```bash
50gh pr view --json number,title,headRefName 2>$null
51```
52
53## Step 1 — Ensure the PR branch is available locally (BLOCKING)
54
55Find the PR's head branch:
56
57```bash
58gh pr view <number> --repo microsoft/aspire-skills --json headRefName --jq '.headRefName'
59```
60
61Then check the local branch:
62
63```bash
64git branch --show-current
65```
66
67| Local branch state | Action |
68|--------------------|--------|
69| Matches the PR head | Proceed to Step 2. |
70| Does not match | Ask the user which option below to use. |
71
72### Option 1 (recommended) — Check out the PR branch
73
74Gives the best review quality because surrounding code is available for context.
75
76```bash
77git status --porcelain # warn if non-empty
78git stash push -m "auto-stash before PR review of #<number>" # only if dirty
79gh pr checkout <number> --repo microsoft/aspire-skills # handles forks too
80```
81
82If the current working tree is itself a worktree on a branch you must not disturb,
83prefer creating a dedicated worktree:
84
85```bash
86$dir = "..\pr-<number>-review"
87git fetch origin pull/<number>/head:pr-<number>
88git worktree add $dir pr-<number>
89```
90
91### Option 2 — Review from GitHub diff only
92
93No local action needed. Proceed to Step 2 using only the GitHub API / `gh` for diffs and
94`gh api repos/microsoft/aspire-skills/contents/<path>?ref=refs/pull/<n>/head` for any
95surrounding-code reads. **Review quality may be reduced** because nearby files are not
96on disk for free-form exploration.
97
98## Step 2 — Gather PR context
99
100Prefer the GitHub MCP tools when available; fall back to `gh` CLI. Always gather:
101
1021. **PR metadata** — title, description, base branch, author, draft status,
103 `autoMergeRequest`.
104 ```bash
105 gh pr view <n> --repo microsoft/aspire-skills --json number,title,body,baseRefName,headRefName,isDraft,author,autoMergeRequest
106 ```
1072. **Changed files** — paginate if needed.
108 ```bash
109 gh pr diff <n> --repo microsoft/aspire-skills --name-only
110 ```
1113. **Full diff.**
112 ```bash
113 gh pr diff <n> --repo microsoft/aspire-skills
114 ```
1154. **Existing review comments** — never duplicate what's already been flagged.
116 ```bash
117 gh api repos/microsoft/aspire-skills/pulls/<n>/comments --paginate
118 gh api repos/microsoft/aspire-skills/pulls/<n>/reviews --paginate
119 ```
1205. **CI status.**
121 ```bash
122 gh pr checks <n> --repo microsoft/aspire-skills
123 ```
124
125## Step 3 — Categorize the changes
126
127Group changed files by area to scope review depth. This table is **aspire-skills
128specific** — adjust the focus column to what the file actually demands.
129
130| Area | Paths | Review focus |
131|------|-------|--------------|
132| Router skill | `skills/aspire/**` | Trigger keyword completeness, routing decisions, project-local override deference, 13.5.3 alignment |
133| Sub-skills | `skills/aspire-init/**`, `skills/aspireify/**`, `skills/aspire-orchestration/**`, `skills/aspire-deployment/**`, `skills/aspire-monitoring/**` | Frontmatter, decision tables, safety guardrails, `INVOKES:` accuracy, references hygiene |
134| Eval tasks | `skills/<skill>/evals/tasks/**` | Grader patterns from `evals/AUTHORING.md`, fixture reuse, tags, "the assistant's response" anchor, specific `not_contains` tokens |
135| Trigger tests | `skills/<skill>/evals/trigger_tests.yaml` | Cross-skill prompt collisions, `reason` agrees with bucket, realistic phrasing, calibrated `confidence` |
136| Eval config | `skills/<skill>/evals/eval.yaml` | Thresholds, `--judge-model` defaults, top-level graders preserved |
137| Shared fixtures | `evals/{csharp-apphost,ts-apphost,non-aspire}/**` | Realistic representativeness, no skill-specific contamination |
138| Plugin manifests | `.plugin/plugin.json`, `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`, `gemini-extension.json` | Version sync across all four, identical metadata, valid JSON, `skills` glob unchanged at `./skills/` |
139| MCP | `.mcp.json` | Shell injection, error propagation, `--non-interactive`, no `dotnet run` on AppHost |
140| Project docs | `CHANGELOG.md`, `README.md`, `CONTRIBUTING.md` | Accuracy only; consistency with shipped behavior |
141| Author skills | `.github/skills/**` | Must not leak into shipped `skills/`; must stay invisible to the plugin glob |
142| CI / project automation | `.github/workflows/**`, `.github/CODEOWNERS` | Eval invocation correctness, no secrets, expected runner labels, hermetic execution |
143
144## Step 4 — Review the code
145
146Read the diff carefully. For each changed file, also read surrounding context — read
147from the local checkout (Step 1 Option 1) or fetch with
148`gh api repos/microsoft/aspire-skills/contents/<path>?ref=refs/pull/<n>/head` (Step 1
149Option 2) when needed.
150
151Apply, in order:
152
1531. **Repo-specific checklist** — [aspire-skills-review-checklist.md](references/aspire-skills-review-checklist.md). The quick-scan order at the bottom is the right path when time-boxed.
1542. **General best practices** — [code-review-best-practices.md](references/code-review-best-practices.md).
1553. **Bug scan** — [common-bugs-checklist.md](references/common-bugs-checklist.md); walk only the sections matching the touched file types.
156
157### What to flag
158
159Only flag concrete, high-confidence problems. Categories:
160
1611. **Routing damage** — `description`-list keyword removed, `INVOKES:` list now lies, a
162 new trigger phrase isn't covered in `trigger_tests.yaml`.
1632. **Safety-guardrail regression** — `dotnet run` → `aspire start`, `curl` → `aspire wait`,
164 `dotnet build` → `aspire resource <name> restart`, `aspire stop` cleanup, never edit
165 `.aspire/modules/`, never install the obsolete Aspire workload, always `--non-interactive`
166 for agents.
1673. **Project-local override removed or weakened** — the `.agents/skills/<skill>/SKILL.md`
168 deference block must survive edits.
1694. **Eval regressions** — behavior change without a matching task, fixture copied into a
170 per-skill folder instead of using `evals/{csharp-apphost,ts-apphost,non-aspire}`,
171 `prompt` grader missing the "the assistant's response" anchor, combined
172 positive/negative grader, over-broad `not_contains` (e.g., bare `"azd"`,
173 `"docker"`).
1745. **Plugin-manifest drift** — `version` field skew across the four manifests; `skills`
175 glob silently changed; `repository` / `homepage` / `license` divergence.
1766. **Bugs** — invalid YAML/JSON, broken cross-skill links (`../<wrong-name>/SKILL.md`),
177 duplicate keys, off-by-one in tags / IDs, `id`/`name` confusion (`--task` filters by
178 `id`).
1797. **CHANGELOG gap** — user-visible change with no entry.
1808. **13.5 staleness** — treating legacy `apphost.ts` as current, inspecting resources
181 through `aspire ps`, using obsolete `.ServiceProvider` / `PublishAsConnectionString`,
182 mixing 13.4/13.5 package families, or omitting experimental qualifications.
1839. **Repository convention violations** — author skill drifting into shipped
184 `skills/`; SKILL.md over the 5000-token authoring budget; reference file unlinked
185 from its SKILL.md; new fixture introduced when an existing one already covers the
186 scenario.
187
188### What NOT to flag
189
190- Style preferences already handled by editorconfig / formatters / Markdown linters.
191- Missing comments on obvious YAML or Markdown.
192- Refactors of unrelated content the PR didn't touch.
193- Praise, learning notes, or "consider doing X someday" speculation. If a finding
194 doesn't fit `blocking` / `important` / `suggestion`, drop it (see
195 [severity-labels.md](references/severity-labels.md)).
196- Speculative concerns you can't ground in a specific line.
197
198### Reviewing refactored or moved content
199
200When SKILL.md sections, decision-table rows, or references files move between files,
201treat the moved content as if it were newly written:
202
203- **Diff old vs new wording.** A "moved" decision-table row often silently loses
204 keywords from the trigger list — that's a routing regression, not a no-op move.
205- **Flag pre-existing issues in moved content.** A guardrail row that always lacked
206 `--non-interactive` is fair game once it's in the diff. Mark as "pre-existing, good
207 opportunity to fix during this move."
208- **Check callers** — when a skill is renamed or split, every `INVOKES:` list and
209 every `../<name>/SKILL.md` link must be updated.
210- **Check the override block** — moves to the "Project-Local Skill Override" section
211 often drop the deference; verify it survived.
212
213## Step 5 — Present findings to the user for triage
214
215**Do not auto-post.** Present every finding as a numbered list, ordered by potential
216impact (`blocking` first, then `important`, then `suggestion`). For each:
217
2181. Path + line number (or stable SKILL.md anchor).
2192. Severity — `blocking` / `important` / `suggestion`.
2203. Observation — one sentence on what's wrong.
2214. Why it matters — the concrete consequence.
2225. Suggested fix — actionable; cite the rule from the relevant reference.
223
224End with a short summary:
225
226```
227Severity counts: blocking=N, important=N, suggestion=N
228Recommendation: REQUEST_CHANGES | COMMENT | APPROVE
229Top three things to address:
230 1. ...
231 2. ...
232 3. ...
233```
234
235Then ask the user which findings to post. Acceptable replies include:
236
237- *"Add 1, 3, 5 as comments"* — post only those.
238- *"Add all"* — post every finding.
239- *"Add none"* — skip posting.
240- Any modification (rewrite, drop, merge).
241
242## Step 6 — Post selected comments as a review
243
244Once the user has chosen, post a single review with the selected comments.
245
246### Auto-merge safety check (run before `APPROVE`)
247
248```bash
249gh pr view <n> --repo microsoft/aspire-skills --json autoMergeRequest --jq '.autoMergeRequest'
250```
251
252If non-null (auto-merge is enabled) **and** the review includes comments, warn the user:
253
254> **Warning:** This PR has auto-merge enabled. Approving it will likely trigger an
255> automatic merge before the author can address your comments. Choose one:
256>
257> 1. **Approve anyway** — submit as `APPROVE`.
258> 2. **Downgrade to comment** — submit as `COMMENT` so the author can address feedback
259> first.
260
261Wait for the user's choice before submitting.
262
263### Posting flow (prefer MCP, fall back to `gh`)
264
2651. **Open a pending review.**
2662. **Add one inline comment per finding** — `side: RIGHT`, `subjectType: LINE` for
267 line-specific comments and `FILE` for file-level. One problem per comment.
2683. **Submit the review** with a summary body listing severity counts.
269 - User asked to approve **and** auto-merge is off (or they confirmed) → `APPROVE`.
270 - Otherwise → `COMMENT`.
271 - **Do not use `REQUEST_CHANGES`** unless the user explicitly asks for it.
272 - If the user chose "Add none", do **not** create or submit a review — confirm
273 nothing was posted.
274
275`gh` equivalents:
276
277```bash
278gh pr review <n> --repo microsoft/aspire-skills --comment --body "$summary"
279gh api -X POST repos/microsoft/aspire-skills/pulls/<n>/comments -F path=... -F line=... -F side=RIGHT -F body=...
280```
281
282## Severity labels
283
284Only three:
285
286| Label | When | Recommendation |
287|-------|------|----------------|
288| `blocking` | Concrete harm if merged: removed safety guardrail, manifests out of sync, override-deference removed, unsafe hook, broken JSON/YAML in a manifest or eval file, routing change that drops eval threshold. | `REQUEST_CHANGES` (only on explicit user request, otherwise `COMMENT`) |
289| `important` | Quality / coverage gap with a clear fix: missing eval for new behavior, missing CHANGELOG entry, frontmatter `INVOKES:` stale, missing trigger-test coverage, SKILL.md over 5000 tokens. | `COMMENT` |
290| `suggestion` | Optional improvement: decision-table row could call out a current Aspire alternative, reference file could be split, quick-reference table could be reordered. | `COMMENT` or `APPROVE` |
291
292No `nit`, `learning`, or `praise`. Rationale and more examples:
293[severity-labels.md](references/severity-labels.md).
294
295## Review quality rules
296
297- **Flag only concrete, high-confidence problems.** Each comment must identify a
298 definite issue grounded in a specific line in the diff.
299- **One problem per comment.** Don't bundle.
300- **Be specific.** Cite the exact line, file, frontmatter field, or eval grader.
301- **Provide fix direction.** Cite the rule from the relevant reference file. Include a
302 short corrected snippet when it's small.
303- **Never duplicate existing review comments.** Always read `pulls/<n>/comments` and
304 `pulls/<n>/reviews` first.
305- **Collaborative phrasing.** Questions over commands, suggestions over mandates.
306- **No speculation.** If you can't tie a concern to a specific line, drop it.
307
308## Error handling
309
310| Symptom | Cause | Action |
311|---------|-------|--------|
312| `gh pr view` returns nothing | No PR for the current branch | Ask the user for a PR number. |
313| `gh pr checkout` fails on a worktree | The current worktree branch is in use | Create a dedicated worktree (`git worktree add ../pr-<n>-review pr-<n>`) or fall back to Option 2 (GitHub diff only). |
314| PR is in a fork | Default `gh pr checkout` still works; `--repo microsoft/aspire-skills` keeps the head ref correct | Proceed normally. |
315| MCP `mcp_github_pull_request_*` tools are unavailable | Environment lacks the GitHub MCP server | Use the `gh` CLI equivalents called out in each step. |
316| The diff is huge (>1000 lines, >40 files) | Mega PR | Ask the author to split before reviewing; if review is mandatory, scope by area (Step 3) and only deep-review the highest-risk areas. |
317
318## References
319
320- [aspire-skills-review-checklist.md](references/aspire-skills-review-checklist.md) — repo-specific rule book.
321- [code-review-best-practices.md](references/code-review-best-practices.md) — adapted from `awesome-skills/code-review-skill` (MIT).
322- [common-bugs-checklist.md](references/common-bugs-checklist.md) — adapted from the same source; pruned to the stacks this repo uses.
323- [severity-labels.md](references/severity-labels.md) — the three-label scheme.