en un clic
review-issue
// Review an incoming external issue (and any gated-closed PR behind it) and decide whether to assign the contributor or decline. Use when the maintainer says "look at this issue", "review issue
// Review an incoming external issue (and any gated-closed PR behind it) and decide whether to assign the contributor or decline. Use when the maintainer says "look at this issue", "review issue
| name | review-issue |
| description | Review an incoming external issue (and any gated-closed PR behind it) and decide whether to assign the contributor or decline. Use when the maintainer says "look at this issue", "review issue |
FastMCP auto-closes external PRs unless the author is assigned to a referenced issue (see require-issue-link.yml). The practical effect: contributors open an issue, open a PR, get auto-closed, and ask to be assigned. The maintainer almost never sees the PR directly — the issue is the decision point, and assigning the author is the single action that reopens their PR and sends it into review.
This skill turns "look at this issue" into one of two outcomes:
Be opinionated about declining. The gate moved spam from junk PRs to junk issues; this skill is worthless if it just rubber-stamps assignment. Assignment is a commitment to review and likely merge, not a courtesy.
Fixes/Closes/Resolves #N and the author is
assigned to issue #N.gh issue edit N --add-assignee <login>. The assignment fires a
require-issue-link run; expect it to pass. If it fails, the gate itself misbehaved (not the
PR) — investigate the run, don't re-assign.trusted-contributor label exempts a contributor up
front. Reopening the PR or removing the missing-issue-link label applies a sticky
bypass-issue-check.martian-triage-issue (investigates +
recommends), marvin-dedupe-issues / auto-close-duplicates (dupes), auto-close-needs-mre
(missing MRE). Read their comments before re-deriving anything.Read the issue, its bot triage, and any PR behind it. Run these together:
gh issue view N --repo PrefectHQ/fastmcp \
--json number,title,state,author,body,labels,assignees,comments
# Find PRs the author opened that reference this issue (they're likely CLOSED):
gh pr list --repo PrefectHQ/fastmcp --state all --search "author:<login> #N in:body" \
--json number,title,state,url,labels
If a PR exists, pull its metadata and any review-bot comments (CodeRabbit, Codex). Treat the bot comments as leads, not conclusions — they often don't run on closed PRs at all, and even when they do you still owe the PR your own read:
gh pr view <pr> --repo PrefectHQ/fastmcp --json number,title,body,labels,files,additions,deletions
gh pr view <pr> --repo PrefectHQ/fastmcp --comments
main? Check the dedupe bot's comment and recent commits.A reproducible MRE is not the same as a bug. This is the trap that produces wrong verdicts: an MRE can demonstrate real, observable behavior that is nonetheless not a bug, because it violates no contract the framework intends to hold. The decisive question is not "does this reproduce?" but "does the demonstrated behavior violate the intended contract for this API?" A shared-mutable-state MRE only matters if callers are supposed to mutate that state; an ordering/timing MRE only matters if the framework promises an order; a "wrong" value only matters relative to what the API guarantees. An MRE that has to reach past the supported surface to trigger the behavior (mutating a field meant to be set only at construction, depending on an internal that isn't part of the public contract) is showing you a property, not a defect.
You usually cannot read the intended contract off the code — the code shows what it does, not what it promises. The maintainer is often the only authoritative source for the contract, so stopping to ask is legitimate and expected here. Ask "is X a supported pattern / does this API promise Y?" before sinking time into investigating a fix. If the behavior is in-contract correct, decline — no matter how cleanly the PR fixes it, and no matter how real the MRE looks.
The most common failure of this skill is judging a PR from the diff hunk and the PR description
alone. That is a cursory review and it produces wrong verdicts — a redundant-looking conditional
can be a real bug fix; a tidy-looking diff can patch the wrong layer. You cannot assess a PR
without reading the code it changes in context. Reading gh pr diff is necessary but never
sufficient.
Do all of this before forming any opinion on quality:
Read, not just
the patch). The hunk shows what changed; the file shows what it changed into.Write down, for yourself, a one-line answer to: what was broken, where, and does this change fix it there? If you can't answer from evidence you've actually read, you haven't investigated yet.
Then separate findings by severity: a cosmetic nit (style, a redundant-but-harmless line) is a review comment, not a blocker. A substantive defect (wrong layer, breaks an adjacent path, doesn't actually fix the MRE) changes the verdict. Don't let a cosmetic nit read as a reason to decline, and don't let a clean style read as evidence of correctness.
This is the gate CONTRIBUTING.md actually enforces. Map the change to a category:
Combine the category with the Step 3 investigation: does it fix the cause or paper over a symptom? Does it read like unedited LLM output (verbose body, speculative/shotgun changes)? CONTRIBUTING.md says we close those — a closed PR that reads that way is staying closed.
Present a short verdict to the maintainer before mutating anything: assign or decline, one or two sentences of reasoning, and the exact command you'll run. Wait for confirmation on borderline calls; for clear-cut ones you may proceed and report.
Assign (valid issue + appropriate external contribution + sound PR exists):
gh issue edit N --repo PrefectHQ/fastmcp --add-assignee <login>
That reopens the PR automatically. Then hand off to code review — invoke the code-review /
review-pr skills on the reopened PR. Assignment is not approval; the code still gets the normal
pass.
If a PR's head branch was deleted, assignment can't reopen it — the workflow comments asking the author to open a fresh PR. Don't try to force it.
Decline (invalid issue, wrong contribution type, or low-quality PR): leave it closed and
comment on the issue explaining the decision, pointing to the relevant CONTRIBUTING.md
section. Per repo rules, use --body-file, never inline --body, for any comment that could
contain $, backticks, or code:
gh issue comment N --repo PrefectHQ/fastmcp --body-file /tmp/triage-reply.md
Keep the reply short and point to the relevant CONTRIBUTING.md section. (If a github-reply
skill is available for maintainer voice/tone, use it — but it isn't required.)
trusted-contributor / bypass-issue-check — that's a
deliberate maintainer escalation, not a triage outcome.Monitor and respond to automated PR reviews (Codex bot). Use when pushing a PR, checking review status, or responding to bot feedback. Handles the full cycle of push -> wait for review -> evaluate comments -> fix -> re-push.
Review code for quality, maintainability, and correctness. Use when reviewing pull requests, evaluating code changes, or providing feedback on implementations. Focuses on API design, patterns, and actionable feedback.
Query and invoke tools on MCP servers using fastmcp list and fastmcp call. Use when you need to discover what tools a server offers, call tools, or integrate MCP servers into workflows.
Write and evaluate effective Python tests using pytest. Use when writing tests, reviewing test code, debugging test failures, or improving test coverage. Covers test design, fixtures, parameterization, mocking, and async testing.