Review PR Threads
Handle the open review conversations on a pull request: for each unresolved
thread, decide whether it warrants a code change, make and verify the fix (or
explain why not), reply, and resolve it. This is a single sweep over the
threads that are unresolved right now — it does not wait for new reviews to
arrive. The caller (you, or /watch-pr) decides whether to run it again after a
push triggers a fresh review.
Repo is adamayoung/TMDb. GitHub reads (find the PR, fetch threads), the
reply, and the resolve all use the GitHub MCP (mcp__github__*):
get_review_comments exposes each comment's numeric REST id in its html_url
(the #discussion_r<id> anchor — verified 2026-08-07), which is exactly the id
add_reply_to_pull_request_comment takes. gh is authenticated and kept as
the reply fallback (gh api graphql with the thread node id) on a 401/403
or if the anchor is ever absent.
Principles
- One sweep, then return. Process every thread that is unresolved at
invocation, then stop and report. Do not loop waiting for re-reviews — pushing
a fix re-triggers the
claude-review bot and CI, and that convergence loop
belongs to the caller.
- Fix test-first and verify before you reply. A code change in response to a
thread follows the project's discipline: reproduce/capture with a test where
applicable, then fix, then verify with the delegated skills. Never claim a fix
you haven't verified.
- Don't change code you disagree with — reply instead. Out-of-scope,
incorrect, already-handled, or question-only threads get a reasoned reply and a
resolve, not an edit.
- Dedup via the run ledger. Keep (or reuse the caller's) ledger of handled
thread IDs and a topic signature (
path:line + gist) per thread. If a thread
repeats a topic you already fixed this run, reply pointing at the earlier commit
SHA and resolve — do not re-edit.
- The
claude-review bot's summary comment is advisory. It posts inline
threads only for Critical/High; its Medium/Low summary bullets are not threads
and are not work items — don't turn them into code changes.
0. Find the PR
Find the open PR for the current branch with mcp__github__list_pull_requests
(owner/repo from the origin remote, head: <owner>:<branch>, state: open), or
read a specific one with mcp__github__pull_request_read method get
(pullNumber: <n>). Take number/html_url/state/head.ref from the result.
- An explicit PR number in the skill arguments overrides the current branch.
- No PR for the current branch → stop and tell the user (suggest
/pr).
- State not
open → stop and report.
1. Fetch unresolved threads
Use mcp__github__pull_request_read method get_review_comments (owner/repo from
origin, pullNumber: <n>). It returns review threads, each with metadata
(isResolved, isOutdated, isCollapsed), the thread node id (PRRT_…, used to
resolve in §2), path/line, and the grouped comments — each comment carrying an
html_url whose #discussion_r<id> anchor is the numeric comment id §2's reply
needs. Paginate with
perPage/after (the endCursor from the previous page's pageInfo) if needed.
Process each thread where isResolved is false and whose thread id is not already
in the ledger.