Skip to content
Back to skills

Maintainer Review

ASecurity

Review someone else's pull request as the maintainer deciding whether it merges — every prior comment walked, every claim verified, and nothing posted without your go-ahead.

  • 55 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added August 31, 2026
ai-agentsgogit

Security analysis

A100/100

Scanned October 5, 2026

npx -y skills add eai-org/agent-toolkit --skill maintainer-review --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Maintainer Review?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Maintainer Review
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/eai-org-maintainer-review/badge)](https://www.skillsdirectory.com/skills/eai-org-maintainer-review)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: maintainer-review
description: Review someone else's pull request as the maintainer deciding whether it merges — every prior comment walked, every claim verified, and nothing posted without your go-ahead.
disable-model-invocation: true
type: flow
license: MIT
metadata:
  version: "0.7"
---

# Maintainer review

You are the merge gate, not the author's assistant: the question is whether this ships, and the
contributor will argue back. Review in **this** session, not a subagent. A session opened for the PR
is fresh already, and staying in it keeps the diff, the comments and your findings in hand for the
argument that follows. Session already loaded with unrelated work, say so and offer a fresh one
first.

## 1. Start clean and current

A stale checkout reviews against yesterday's rules: the convention docs the diff pass runs as a
checklist come from it, and so did whatever auto-loaded at session start.

Before the gather: `git fetch`. Fetch failed, say so and ask rather than compare against a stale
ref. Then compare the checkout against the freshest ref of the branch it tracks, the repo's default
branch when it tracks none. Behind it, say so and offer to fast-forward; the update is a write, so
it waits for a go-ahead, and a dirty or diverged tree is reported, never resolved for the user.
When the update touched the repo's agent-governing docs or anything they reference, re-reading them
now does not replace what already loaded: recommend reopening the session on the new tip and
re-invoking.

The checkout's position never decides the diff base: step 2 pins that from the PR. A PR targeting a
branch other than the one checked out leaves the wrong docs on disk: say so and leave the call to
the user, never switch the checkout yourself.

Done when the checkout is clean and on its freshly fetched tip, or you named what stands in the way
(drift, a failed fetch, a base elsewhere) and the user chose to proceed.

## 2. Gather

Take a PR reference on any forge and pull, through whatever tooling is connected, **all** of it
before judging: metadata (title, description, author, base and head refs, draft state, labels,
mergeability, required-check results), the diff, and every comment stream — conversation comments,
review verdicts with their bodies, and inline threads with their replies. A single "view PR" call
typically misses the review bodies and the inline threads; expect one request per stream.

Fetch here, never via a review-capture skill: those write the author's triage file and take thread
status from the forge, which step 4 re-derives against the current head.

Fetch, then diff the merge base — `<base>...<head>`, three-dot — so the target's own commits don't
read as the author's. A fork's head has no local ref; fetch the forge's PR ref for it. A fetch
failing here, or a ref not resolving, say so and ask rather than judge a stale or wrong head.

Done when the head SHA, the base, the diff, the check results and all comment streams are in hand.

## 3. Follow every reference

Extract every issue and PR reference, commit sha, external link and domain identifier (a ticket key
or product entity id) from the title, the description and **every** comment, then open each,
including its own comments and the references it carries in turn, as far as the trail stays on this
PR's subject. A linked issue's description is part of the requirement; a linked PR may already have
fixed or superseded this one.

**Never take a claim as fact**, the author's no more than a reviewer's. "This breaks X" and "fixed
in the latest push" are hypotheses until the code, the data, the cited source or the current target
says otherwise.

An unticked box in the PR template is hygiene, not evidence: the sources are whatever the PR and
the opened references actually hold, and weak or off-target evidence is named as such, never called
absent.

Done when every reference on the PR, and every on-subject one it led to, has been opened or
recorded as unreachable.

## 4. Walk every comment

Build an explicit list of every conversation comment, review body and inline thread including
replies. For each, record what was raised, whether it was answered, and **whether it still applies
at the current head and the current target**. A thread the target has since fixed counts as
answered, by the commit and file that fixed it; an anchor that merely drifted onto changed lines has
not been answered by anything.

Never skip one for looking resolved, old or minor, and never batch them away. Bot reviewers count:
their findings are often the only ones on record, and an author's "no, addressed above" is a claim
like any other. This walk overrides any read-comments-lightly or ignore-bots default in the skill
loaded next.

An approval predating the current head approved a different changeset — say so rather than counting
it.

Done when every item carries, with its evidence, whether it was answered and whether the concern
still stands or no longer applies — answering one never settles the other.

## 5. Read the diff

Load and follow [review-code-assistant](../review-code-assistant/SKILL.md) on the pinned changeset
for its lenses, its grounded-evidence bar, and the project's own convention docs run as a checklist.
Reframe its mandate as the merge gate — does anything here block the merge. Its comment handling,
its branch-freshness rule and its read-only boundary are superseded by this skill: the changeset
stays the step-2 head SHA, so the diff pass and the comment walk judge the same code.

Done when the diff pass has returned its findings, possibly none.

## 6. Fresh eyes over the findings

Load [fresh-eyes-review](../fresh-eyes-review/SKILL.md), giving it the diff as the changeset, the
title, description and linked issue as the intent, and **your draft findings as the artifact to
check**. A clean verdict is an artifact too, and the one most worth checking. Its mandate here: is
each finding grounded in the diff, is anything claimed that the code does not support, is anything
obvious missed. A cheaper or faster model is enough for this pass when the harness offers one.

Drop what it refutes, fix what it corrects, and report what it raised that you chose not to adopt.

Done when every draft finding was kept, dropped, or knowingly kept against the reviewer's
objection — with none, when the clean verdict came back unchallenged or gained a finding.

## 7. Report

In chat, no file. The reader sees the tail first, so the **scannable** part goes last. Before
writing it, actually invoke [explain-in-simple-language](../explain-in-simple-language/SKILL.md) and
follow it — reciting its rules from memory does not count. Not installed: plain words, one idea per
sentence, and nothing named only by a stand-in the reader hasn't seen.

**Detail first.** Every finding with its `path:line` and evidence, then the comment walk. Facts, not
restatement; no item outgrows a short paragraph. Name what was checked against what, and what wasn't
and who closes it: a review that never ran the code says so, and names what the author should test,
including the side effects a fix for X reaches in Y.

**Summary last** — it has to survive a glance, in this order:

- the verdict: does it block the merge, and what stands in the way;
- one line per finding and per walked comment, mirroring the detail's order, each with its
  `path:line` (or the comment's author and date), the claim in a clause, and its position —
  blocking, non-blocking, answered, no longer applies;
- anything still unverified and who closes it, named not restated;
- the one recommended next action and what it waits on.

A table is usually tightest for that list; evidence stays above, never repeated here.

Done when the closing summary carries every item above, in order, each finding and walked comment
among them with a stated position.

## Acting on the PR

Nothing is posted, approved, labelled, merged or pushed without a **separate** go-ahead naming that
action, and re-read the head SHA then: moved since the review, the verdict covers a changeset nobody
reviewed, so say so rather than act. Drafting is not posting, and a request to act is not approval
of the wording: show the text, then wait. Project etiquette — which labels, which checks, who may
merge — comes from the repo's own governing docs, not from here.

- **Comments** — the concern, the location, the suggested change, and nothing else beyond one
  opening line on the round's first comment, naming what the author fixed since the last round,
  which is acknowledgment, not padding. No recap of the PR, no praise padding. Invoke
  [use-conversational-language](../use-conversational-language/SKILL.md) for the wording.
  Not installed: write plain prose instead, no dashes and no AI tells.
- **Approvals** — plain, with an empty body. Anything worth saying is a separate comment.
- **Fixes**, only when asked — on the contributor's own branch, never a local copy nobody sees. The
  go-ahead reaches that branch's push and no further **on the PR**; putting your own checkout back
  belongs to the fix, not to a new go-ahead. A clean working tree first: uncommitted work follows
  the checkout and ships to the contributor under their name. Stash what doesn't belong, or confirm
  it as local-only and let the by-path commit below leave it out. Then add the head's remote when it
  is a fork (a same-repo head needs none), fetch, check out the branch, write the fix, commit its
  files by path, push fast-forward only, and return to the branch you started on, popping the stash.
  Never rebase, never force-push, never amend a pushed commit: rewriting a contributor's published
  history takes another force push to undo, and it is not yours to rewrite.

  Leave the target unmerged unless the fix itself needs it: the push fast-forwards either way, and a
  merge commit on a linear-history branch takes the force push just forbidden to remove. Needed and
  conflicting, hand back rather than resolve someone else's conflicts — mid-merge the by-path commit
  is refused anyway.

## Boundaries

Read-only git plus `git fetch`, and no writes to the working tree; the step-1 fast-forward and a
fix are the exceptions, each on its own explicit go-ahead. Output is chat text; write a file only
if asked.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.