How to Reduce AI Code Review Noise on Pull Requests
Why AI reviewers over-comment on pull requests, how to measure signal with resolution rates, and three patterns that cut the noise.
Published 9 min readBy the Warpway team
AI code review gets noisy when the reviewer comments on everything it sees and gives a renamed variable the same weight as a broken authorization check. To reduce the noise, first measure how many of the bot's comments actually lead to a code change. Then change what the reviewer is allowed to post: nothing when it found nothing, a finding only when it can show evidence, and one specific question when it can't decide on its own.
Why AI reviewers over-comment
Most of the noise comes from four mechanisms, and each needs a different fix.
The reviewer sees the diff, not the system. A model that reads only the changed hunks can't tell whether a function it calls "unused" is imported by other files. Octopus uses this as its example of a context-blind false positive: a function flagged as unused "because it can't see the three files that import it." CodeAnt's write-up lists context blindness alongside three other failure modes: volume without severity calibration, findings without reproduction steps, and comments that repeat rules your linter already enforces. Some tools now read beyond the diff. GitHub's docs say Copilot code review's full project context gathering "analyzes your entire repository" through GitHub Actions. But more context fixes only this first problem.
Every change gets the same weight. A diff carries no sense of risk. Left alone, a reviewer spreads its attention evenly, so a 40-line cleanup of log formatting draws as many comments as a 4-line change to session handling. When a style nit looks as urgent as a security flaw, engineers start treating everything as optional. Octopus calls this the "cry wolf" effect.
Saying nothing looks like failure. A reviewer that posts "looks good, but consider…" on a clean pull request seems to have done its job. A reviewer that posts nothing seems broken, unless it can show what it checked. If a tool has no way to report a clean result, it fills the space with suggestions.
Automatic triggers multiply everything. Reviewing on every push raises the same points again. In a GitHub community discussion from August 2026, a user describes each new commit adding about five automated Copilot comments that bury the human conversation. They wrote that the reviews were good and they didn't want to turn them off. The problem was the volume.
Measure signal before you change anything
You can't tell whether a tuning change helped unless you measured before it. Three measures are worth tracking, listed from most to least reliable.
Resolution rate
Resolution rate is the share of AI comments that are followed by a code change addressing them before merge. It's the closest proxy for "was this worth reading?" Two published reference points:
- An arXiv study of 16 AI code review GitHub Actions covered more than 22,000 review comments in 178 repositories. It found that 60% of valid human review comments led to code changes, compared with 0.9% to 19.2% of valid AI comments, depending on the tool. Higher addressing rates were associated with concise comments, comments that include code, comments attached to hunks rather than whole files, and manually triggered reviews. The authors note that these are associations, not causal effects.
- Cursor measures Bugbot's resolution rate by using AI to determine, at merge time, which flagged bugs the author actually resolved in the final code. Its January 2026 post reports the rate rising from 52% to over 70%, and calls the metric "a much clearer signal than anecdotal feedback or reactions on comments." Cursor measured this for its own tool.
Reactions and resolved threads
Thumbs up, thumbs down and "Resolve conversation" clicks are cheap to collect, but they record mood and housekeeping, not fixes. A resolved thread can mean "fixed" or "go away." Use them to spot comment categories people dislike, not as your main number.
Signal ratio from a hand-labeled sample
Jet Xu's framework sorts comments into three tiers:
- Critical signal, such as runtime errors, breaking changes and exploitable vulnerabilities.
- Important signal, such as architectural inconsistencies and measurable performance regressions.
- Noise, such as style and subjective opinions.
Signal ratio is tiers 1 and 2 divided by total comments. His thresholds (above 60% is good, above 80% is great) are his own, and he builds one of the tools he compares. The labeling exercise is still worth doing on its own. CodeAnt suggests a similar exercise: take 20 to 30 dismissed findings and sort them by failure mode.
Pulling the data from GitHub
In GitHub's GraphQL reference, each pull request review thread reports whether it has been resolved (isResolved) and whether it "was outdated by newer changes" (isOutdated). "Outdated" is only a rough proxy for "the author fixed it": the field doesn't say whether the newer changes addressed the comment. Read a sample before you rely on it.
# Review threads started by your AI reviewer on one merged PR.
# Copy the bot's exact login from one of its comments first.
gh api graphql -F owner=acme -F repo=api -F pr=1234 -f query='
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
reviewThreads(first: 100) {
nodes {
isResolved
isOutdated
path
comments(first: 1) { nodes { author { login } } }
}
}
}
}
}' --jq '.data.repository.pullRequest.reviewThreads.nodes[]
| select(.comments.nodes[0].author.login == "your-review-bot")
| [.path, .isOutdated, .isResolved] | @tsv'Run it across 30 to 50 merged pull requests, then label each comment:
| Label | Meaning | Usual cause |
|---|---|---|
| Fixed | Code changed at the comment, and the change addresses it | Real signal |
| Dismissed | The author replied that it's wrong | Missing context |
| Ignored | No reply and no change | Style, nits, low severity |
| Duplicate | Repeats a linter, CI or an earlier AI comment | Tool overlap, re-review on push |
| Vague | "Consider whether…" without a concrete claim | A question the tool couldn't answer |
Teams tend to overlook the last row, and it points to the third fix below.
Three alternatives to commenting on everything
1. Stay silent when nothing is found
A clean investigation should produce one status, not a compliment or a list of optional ideas. Silence can only be trusted if the tool also says what it checked and reports clearly when it couldn't finish. A reviewer that crashed and a reviewer that found nothing must not look the same.
2. Clear findings with evidence
A finding earns a line comment when it says what goes wrong, where, and why the reviewer believes it. The evidence should be concrete: the caller that passes the bad value, the test that fails, or the code path that skips a check. Anything that can't meet that bar should either not be posted or appear as collapsed, non-blocking advice. Severity should decide what blocks, and findings below your threshold shouldn't interrupt anyone.
3. Ask one bounded question
Much of the "Vague" row is real uncertainty: the diff changes behavior, and nothing the tool can read says whether that behavior is intended. Posting it as a soft suggestion to everyone on the pull request is noise. Asking it once, as a specific question with defined answers, to the person who knows, turns it into a decision.
| Noisy comment | Bounded question |
|---|---|
| "Consider whether caching permissions could cause stale access." | "Must revoking an administrator role end active sessions immediately? The new code caches authorization results for 15 minutes. Immediate / Up to 15 minutes is acceptable / Needs discussion." |
Worked example: Warpway's lens end states and human tasks
Warpway is built around these three patterns, so it works as a concrete reference. It investigates every eligible GitHub pull request through lenses such as Correctness, Security and Testing. Each lens uses read-only tools on a snapshot of the head commit: reading files, finding references, history and blame, related tests and CI results. Every lens ends in exactly one of four states:
| State | Pattern | What appears on the pull request |
|---|---|---|
| Cleared | Silence, with coverage stated | "Passed" in the check, with no line annotation |
| Issue found | Finding with evidence | A line annotation, backed by code locations and evidence |
| Human decision required | One bounded question | A question routed to the person most likely to know (at Assist and above), shown as "Waiting on" in the check |
| Incomplete | Report clearly when work couldn't finish | "Couldn't finish" with the reason; never turned into Cleared |
Each result also states its coverage: what was investigated, what wasn't, and a level from strong to incomplete. Warpway doesn't present a lens's internal confidence as a probability that the change is safe.
On GitHub you get one Warpway / Review check and one summary comment that's edited in place as the review progresses. When a question goes to someone on GitHub, Warpway also posts a comment that mentions them with the question, and later questions get a new notifying comment. Concrete findings appear as line annotations, and uncertainty never does. By default, the Architecture and Performance lenses warn but don't block.
Uncertainty becomes a human task, which must have seven parts before it reaches anyone:
- The question.
- Why it matters.
- Why AI couldn't resolve it.
- The evidence gathered.
- The relevant code.
- The expected kind of answer.
- The effect of each answer.
A task missing any part is rejected, so a request like "Security confidence is 61%. Please inspect." doesn't go out. Routing sends each task to the person most likely to know, with an explanation of why they were picked. Answers are checked too: a reply of "Sounds fine" gets one concise follow-up and isn't recorded as a yes.
Two behaviors deal with repetition across pushes. When new commits arrive, a lens whose files didn't change keeps its previous result, unless that result was Incomplete or the lens or policy changed. An earlier answer is reused as long as the code its question depended on is unchanged, so nobody is asked the same unchanged question twice.
You can also tell Warpway what to skip and what should never block. Configuration as code requires the Team plan and is read from the base branch:
version: 1
review:
ignore_paths:
- "**/generated/**"
- pnpm-lock.yaml
ignore_authors:
- "renovate[bot]"
lenses:
architecture:
blocking: none
merge_gate:
block_on_severities:
- critical
- highFeedback such as marking a finding as a false positive, or flagging that "AI should have resolved this," is used to measure and improve review quality. It never changes your policy by itself.
For an example of a finding with evidence, see the requests 2.32 SSLContext case study. It's a replay: on 2026-10-07, the merged pull request was run through Warpway as it stood before merge, and Warpway flagged the client-certificate mix-up later reported as #6726.
Some limits to know:
- Warpway works with GitHub only.
- Repositories start at the Assist trust level by default, where the check never blocks a merge.
- Blocking merges requires the Gate level and the Team plan. The Free plan caps the trust level at Assist. See merge gating.
Tune the reviewer you already have
If you're not switching tools, these steps target the mechanisms above:
- Measure for two weeks first with the labels above, so you can tell whether each change helps.
- Stop reviewing every push if your tool allows it. GitHub's docs, for example, describe a "Review new pushes" setting for Copilot code review. Without it, Copilot reviews a pull request once, and you can re-request a review later. In the arXiv study, manually triggered comments were addressed more often.
- Exclude what nobody reads, such as generated code, lockfiles and snapshots.
- Remove linter overlap. If ESLint or your SAST tool already enforces a rule, tell the AI reviewer not to comment on it.
- Write down what not to comment on in the tool's instructions: naming, formatting, and "consider adding tests" without a named test case.
- Gate by severity. Let only high-severity findings interrupt people, and collapse or suppress the rest.
- Measure again. If the resolution rate doesn't move, the configuration probably isn't the problem; what the tool is allowed to post is. That's the point to evaluate a different approach. The Greptile alternative guide and how to review AI-generated pull requests cover that next step.
Frequently asked questions
What is a good resolution rate for an AI code reviewer?
There is no agreed benchmark. In one arXiv study of AI review GitHub Actions, 60% of valid human review comments led to code changes, against 0.9% to 19.2% of valid AI comments depending on the tool. Cursor reports over 70% for Bugbot, measured by Cursor itself. The most useful comparison is your tool against its own earlier numbers and against human review comments in the same repositories.
Should I turn off Copilot code review if it is too noisy?
Try narrowing it first. GitHub's docs describe settings for reviewing new pushes and draft pull requests, and Copilot follows repository custom instructions, so you can control when it runs and what it comments on. Automatic review runs if either your personal setting or an applicable ruleset turns it on, so check repository and organization rules as well as your own setting.
Does giving the AI reviewer full codebase context fix the noise?
It fixes one cause: false positives that come from not seeing callers, imports or conventions outside the diff. It does not stop a reviewer from giving every change equal weight or from posting suggestions on clean code. You still need severity gating and a way to report a clean result without commenting.
How many AI review comments per pull request is too many?
No fixed number applies, because what matters is how many comments get resolved, not how many get posted. As a reference point, Cursor's January 2026 post reports Bugbot flagging about 0.7 bugs per run on average, with about 0.5 resolved per pull request. A reviewer can still be useful while flagging fewer than one bug per run on average.
Will a quieter AI reviewer miss more bugs?
It can, if quieter only means a higher threshold for posting. Cursor's post describes the opposite problem too: after a redesign its reviewer became over-cautious, and the team adjusted it to flag more. A safer approach is to keep investigating every change but change what gets posted, and to require that a clean result says what was checked.
Sources
- Drowning in AI Code Review Noise? A Framework to Measure Signal vs. Noise
- CodeAnt AI: The AI code review noise problem
- Your Team Is Ignoring AI Review Comments (Octopus)
- Does AI Code Review Lead to Code Changes? A Case Study of GitHub Actions
- Building a better Bugbot
- About GitHub Copilot code review
- Copilot reviews spam the Conversation tab in PRs, Discussion #206277
- Pull requests - GitHub GraphQL API reference