skills/maintainer/review-prs/SKILL.md
A review here is a proposal the maintainer edits and posts, not a rubber stamp. The value is a fast, grounded read of the diff against the team's conventions.
Given a PR number or link, deliver a review the maintainer can post in seconds: a suggested verdict (approve / request changes / comment), the findings that back it grouped by severity so the important things aren't buried, and a paste-ready summary comment.
gh authenticated for googleapis/mcp-toolbox, plus the PR number(s). A GitHub MCP
server substitutes for gh if it isn't available: the gh commands below map to its
read/list tools.Read these live, not from memory. All three are symlinks to the repo-root
files, so they track main; cite them by their root names.
release candidate labeling.type table), keep-PRs-small, link-an-issue. Cite for title, description,
and process findings.GEMINI.md
(CLAUDE.md/AGENTS.md symlink to it), which only summarizes.gh pr view <n> --repo googleapis/mcp-toolbox --json number,title,body,author,labels,files,additions,deletions,commits,baseRefName,headRefName,state,isDraft,reviewDecision
gh pr diff <n> --repo googleapis/mcp-toolbox
gh pr checks <n> --repo googleapis/mcp-toolbox
Three shapes end the review early or change its bar:
renovate, release-please): the only question is whether checks are
green. If so, propose merge and stop.isDraft): review lightly and say so; the author isn't asking for a final pass.[UNVERIFIED].Skim for the shape, then dive into hunks. Three failure modes:
preinstall hook that hijacked git via GITHUB_PATH to exfiltrate an
RSA-encrypted GITHUB_TOKEN. Read every file in any PR touching .hugo/, package.json
lifecycle scripts, .github/workflows/, or .ci/. A file the title and description don't
account for is itself blocking.Keep this separate from Step 6: a PR can follow every convention and still implement the wrong
thing. Read the linked issue (gh issue view <n> --repo googleapis/mcp-toolbox --comments), then
ask three questions:
CONTRIBUTING.md, keep PRs small).file:line.With no linked issue the PR description is the spec: same three questions, and note that the intent is self-declared.
Skip a dimension when it doesn't apply: say so, don't invent a finding.
type(scope) per
CONTRIBUTING.md, plus !/BREAKING CHANGE for breaking
changes. Body follows .github/PULL_REQUEST_TEMPLATE.md: what, why, completed checklist,
Fixes #<n>. Note a missing issue link; don't block on it alone.file:line and name the failure case, never
"looks risky".
[]byte for decimals, nulls as nil/None). Require explicit
handling that maps to the tool's JSON schema; reject implicit casts and missing type switches.AgentError for
input/execution errors the agent can fix itself (HTTP 200, isError: true) versus
ClientServerError for infrastructure failures it can't.! in the title and a justification in the body,
blocking.refactor: PR must not change behavior. A bundled fix or default change
gets split into its own fix:/feat: PR so it's reviewable and revertable.internal/sources/<db>/ for a database wire-compatible
with an existing source. Same for a tool duplicating an existing tool under a new name.tools.BaseTool[Config], new sources follow
the registration pattern; reject re-declared interface methods (GetName, Manifest).
DEVELOPER.md lists what BaseTool provides.description: is an LLM prompt, not developer
documentation: could an agent pick this tool and fill its parameters from that text alone, at a
token cost worth paying? Flag ones that restate the field name, omit units/format/allowed
values, or run long without adding information..ci/integration.cloudbuild.yaml.tests/<db>/<db>_integration_test.go, never in the shared tests/common.go.t.Cleanup teardown, so resources are freed even when the test fails.time.Sleep.tests: run label or a /gcbrun comment.docs/en/. New sources/tools have CI-enforced page structure per DEVELOPER.md, enforced by
.ci/lint-docs-*.sh. A violation breaks the build, so it's blocking.file:line, not
generic warnings.go.mod entries so the maintainer can vet necessity,
maintenance, and license.Duplication across MCP protocol versions is deliberate so versions can diverge independently (#3167, #3211); don't propose factoring it together. A genuine bug in that code is still a finding.
Name the failing check from gh pr checks rather than reasoning it out by hand; failing
lint/tests are objective blockers. Never claim the linter passes on your own read.
One recurring non-obvious failure: the CLA check fails on commits co-authored by an AI agent even when the human author has signed. Suggest squashing to a single human-authored commit rather than pointing at the CLA docs.
Don't restate gemini-code-assist's points as your own. It's the highest-volume reviewer in the
repo and could be wrong. Verify anything you carry forward against the diff; drop
the rest.
!, missing tests on new logic, CI red,
docs that break the build) → request changes.When nothing is blocking, say so in those words. "No blockers, a couple of nits" tells the maintainer it's mergeable as-is.
Use the output format below. Never post it yourself.
gh pr review, gh pr comment, gh pr edit, gh pr merge,
or apply labels. Deliver the review in chat.file:line; a convention claim cites
CONTRIBUTING.md/DEVELOPER.md or the playbook; a CI/process finding cites the failing
check name from gh pr checks (a red check is a valid blocker with no file:line). If you
couldn't verify something (runtime behavior you can't trace, a URL you didn't fetch), mark
it [UNVERIFIED] rather than asserting it.## Review #<n>: <title>
**Suggested verdict:** <approve / request changes / comment>: <one-line reason>
**Title & issue:** <conventional-commit check; linked issue or "none, suggest linking">
**Spec (vs issue #<n>):** <implements it / what's missing, extra, or wrong; or "no issue linked">
**CI:** <passing / which checks failing, per gh pr checks>
**Blocking:**
- `file:line`: <finding + the failure case> [cite]
**Non-blocking:**
- `file:line`: <finding> [cite]
**Nits:**
- <typo/wording>
**Tests:** <added & adequate / what's missing>
**Docs:** <updated / what's missing, or n/a>
**Dependencies:** <new deps to vet, or none>
**release candidate:** <suggest label / not needed>
**Draft comment:**
<paste-ready summary the maintainer can post>