Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Triage the review feedback on a pull request — fetch every review comment, judge which points are valid vs. not (against the repo's own conventions and platform/scope constraints), pause for the user to confirm, then implement the agreed fixes and post a summary comment back to the PR. Use this whenever the user wants to evaluate / triage / address / respond to PR review comments, "see what the bot said", decide which review feedback to act on, or reply to a reviewer — even if they don't say the
.claude/skills/miguelaperez-pr-review-respond/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 96% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 81% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 86% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 38% | 0% |
This captures the repeatable loop for turning reviewer feedback (often from a review bot, sometimes a human) into a decision, a set of fixes, and a reply — without blindly "fixing" everything a reviewer flags. Many review comments are wrong for this particular repo, and acting on them would make the code worse. The skill's point is to separate signal from noise, get the user's sign-off, then close the loop on the PR.
The guiding principle: the user decides what's valid. You do the legwork — gather the comments, form a reasoned recommendation on each — but you stop and wait before changing code, and you never reply on the PR until the fixes are in.
Before starting, identify the project's remote platform from the git remote URL and confirm you have the right tooling available. Check the platform-specific docs for the exact API calls — e.g. see working-with-gitea if the remote is Gitea.
PR review feedback typically lives in three places — pull all of them, because the real substance often lives in per-line comments even when a review's summary body is empty:
Consolidate these into one readable list, keyed by comment id (you'll reference these ids when triaging and resolving). Use a table like this:
| ID | Source | File | Line | Status | Body | |----|--------|------|------|--------|------| | 42 | inline | src/foo.ts | 12 | open | "Consider using X instead of Y" | | 43 | review summary | — | — | open | "Missing error handling throughout" | | 44 | discussion | — | — | open | "Is this change intentional?" |
If the user didn't give a PR number, infer it from the current branch or ask.
Go through the comments one at a time and classify each as valid (worth fixing) or not valid (decline), with a one-line reason grounded in evidence — not vibes. Read the code each comment points at before judging.
The reasoning that matters most is fit with this repo, because a review bot doesn't know the project's constraints. Before accepting any "you should do X":
CLAUDE.md /README for declared constraints. Comments about platforms, runtimes, or environments the project doesn't target are usually invalid — fixing them adds dead code. (Worked example: an iOS-only app has no macOS build, so review comments about macOS/visionOS/AppKit/`NSPasteboard`, or "wrap `import UIKit` in `#if canImport(UIKit)`", are invalid — there's no build where they matter.)
opposite of what the comment asks, on purpose, the new code matching that pattern is correct, not a defect. Cite the precedent. (Example: if existing files import `UIKit` unconditionally and clipboard helpers are `#if os(iOS)`-only, a new file following that pattern is right — not a defect.)
regardless of scope are valid even when minor (e.g. not stripping \r from a CRLF string before rendering). Cheap, real fixes are worth it.
code change. If the change was the explicit goal of the PR, say so plainly.
Present the verdict grouped by bucket — e.g. Not valid / won't fix, Valid / worth fixing, Confirmed intentional — each item with its reason, a file:line link, and the comment #<id> from the fetched comments. End with a clear recommendation of what to actually do.
Do not edit code yet. The user reviews your evaluation and says which items to act on. They may overrule you in either direction — respect that.
Make the changes, then build/test to confirm using whatever gate the repo uses (check CLAUDE.md for the build command). Commit and push to the existing PR branch. Match the repo's commit-message convention, including any required trailer.
Default: reply in-thread — not one PR-wide summary. After pushing fixes, post a reply on every review thread you triaged — one response per comment id from step 1. Match the bucket from your triage:
| Bucket | Reply should say | |--------|------------------| | Fixed | What changed, why, commit <sha>, and that build/tests passed | | Won't fix | Why it doesn't apply here — cite the repo constraint or precedent | | Confirmed intentional | Yes, intentional — brief why |
Use the platform's in-thread reply API (not a top-level PR comment). Check the platform-specific docs for the exact call — e.g. on Gitea, pull_request_review_write(method: "reply_comment", comment_id, body, ...).
For top-level discussion comments (not tied to a review thread), reply on that comment thread if the platform supports it; otherwise @-mention the reviewer in a direct reply.
Keep each reply factual and brief. Do not also post a consolidated "Review follow-up" summary on the PR — per-thread replies are the closed loop reviewers expect.
Only if the user explicitly asks for one comment (e.g. "just post a summary", "single comment is fine") — skip per-thread replies and post one consolidated top-level comment instead:
markdown## Review follow-up ### Fixed - **<short title>** — <what changed and why>. (commit `<sha>`) ### Won't fix (not applicable to this project) - **<comment>** — <reason it doesn't apply here, citing the precedent/constraint>. ### Confirmed intentional - **<comment>** — yes, intentional: <why>.
If the user hasn't opted into this fallback, use per-thread replies even when there are many comments.
After in-thread replies are posted (or the user-opt-in summary, if used), mark only the review threads that landed in the Fixed bucket (and that the user confirmed) as resolved. Do not resolve every open thread on the PR — especially not items classified as Won't fix or Confirmed intentional. Those should stay open so the decision stays visible on the diff.
List the exact comment IDs from the Fixed bucket in your triage before resolving, and confirm them with the user. Use the platform's API to resolve each thread — check the platform-specific docs for the exact call and any quirks.
Reviewers (especially bots) optimize for catching possible issues, not for knowing your project. Treating every comment as a mandate produces churn and dead code; ignoring them loses the real bugs they do catch. The valuable work is the judgment in step 2 — which is exactly why step 3 hands that judgment to the user before anything ships.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 19,514 | 31,962 | +64% | 1 | 1 | 0% | 396 | 1,995 | +404% | 0 | 0 | — |
case-02 | fail→fail | 12,542 | 14,671 | +17% | 1 | 1 | 0% | 1,129 | 2,053 | +82% | 0 | 0 | — |
case-03 | fail→fail | 15,691 | 16,458 | +5% | 1 | 1 | 0% | 133 | 1,965 | +1377% | 0 | 0 | — |
case-04 | fail→fail | 14,029 | 16,927 | +21% | 1 | 1 | 0% | 535 | 2,058 | +285% | 0 | 0 | — |
case-09 | fail→pass | 18,060 | 10,522 | -42% | 1 | 1 | 0% | 1,718 | 2,508 | +46% | 0 | 0 | — |
case-05 | fail→fail | 22,635 | 12,780 | -44% | 1 | 1 | 0% | 390 | 2,112 | +442% | 0 | 0 | — |
case-06 | fail→fail | 18,935 | 19,783 | +4% | 1 | 1 | 0% | 481 | 2,078 | +332% | 0 | 0 | — |
case-07 | fail→pass | 12,772 | 8,984 | -30% | 1 | 1 | 0% | 1,147 | 2,246 | +96% | 0 | 0 | — |
case-08 | fail→pass | 9,528 | 10,518 | +10% | 1 | 1 | 0% | 1,323 | 2,398 | +81% | 0 | 0 | — |
case-10 | pass→pass | 13,748 | 8,787 | -36% | 1 | 1 | 0% | 1,371 | 2,219 | +62% | 0 | 0 | — |
case-11 | pass→pass | 12,032 | 9,162 | -24% | 1 | 1 | 0% | 999 | 2,424 | +143% | 0 | 0 | — |
case-12 | pass→pass | 40,552 | 13,453 | -67% | 1 | 1 | 0% | 1,669 | 2,736 | +64% | 0 | 0 | — |
case-13 | pass→pass | 13,512 | 17,017 | +26% | 1 | 1 | 0% | 1,256 | 2,758 | +120% | 0 | 0 | — |
case-14 | pass→pass | 16,023 | 18,436 | +15% | 1 | 1 | 0% | 1,520 | 2,484 | +63% | 0 | 0 | — |
case-15 | pass→pass | 10,366 | 5,733 | -45% | 1 | 1 | 0% | 703 | 2,181 | +210% | 0 | 0 | — |
case-16 | fail→pass | 14,323 | 4,354 | -70% | 1 | 1 | 0% | 1,228 | 2,288 | +86% | 0 | 0 | — |
case-17 | pass→pass | 16,521 | 13,667 | -17% | 1 | 1 | 0% | 1,729 | 2,884 | +67% | 0 | 0 | — |
case-18 | pass→pass | 13,768 | 5,059 | -63% | 1 | 1 | 0% | 1,086 | 2,295 | +111% | 0 | 0 | — |
case-19 | pass→pass | 7,663 | 2,778 | -64% | 1 | 1 | 0% | 1,007 | 2,126 | +111% | 0 | 0 | — |
case-20 | pass→pass | 14,067 | 8,051 | -43% | 1 | 1 | 0% | 1,891 | 2,723 | +44% | 0 | 0 | — |
case-21 | fail→pass | 10,895 | 10,034 | -8% | 1 | 1 | 0% | 1,786 | 2,469 | +38% | 0 | 0 | — |
case-22 | fail→pass | 12,370 | 9,712 | -21% | 1 | 1 | 0% | 1,703 | 2,067 | +21% | 0 | 0 | — |
case-23 | pass→pass | 16,987 | 4,883 | -71% | 1 | 1 | 0% | 1,670 | 2,466 | +48% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 17 counted toward the lift figure. The other 6 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +26 percentage points is the difference between those two pass rates over the 17 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/4/2026 | +18% |
Other measured skills in the registry, with their headline benchmark lift.