Explainer
Why review bots get ignored, and what a grounded review does instead
The three habits that train engineers to mute a security bot, and the mechanical rules a review needs before it is allowed to speak.
Tristan Roth,
Most engineers have muted a security bot. Not because the flaw classes were wrong, and not because the checks were worthless, but because of how the tool spoke: constant comments, no evidence attached, nothing to separate a real finding from a pattern match that does not apply to this codebase. This page is about the publication posture, not the detection engine, because the posture is what earns or loses the reader.
A review tool that publishes nothing unless it can prove its claim, quotes the code it accuses, and stays silent when it has nothing, gets read. A tool that comments on every run gets muted within a month, and then the real finding is muted with it.
Three habits that get a bot muted
One: comments without evidence. A finding that names a class but cannot point at the file, the line, and the code it accuses is a rumor, and an author with fifteen minutes will not chase it. Two: noise on clean pull requests. A bot that posts the same boilerplate on every run trains the reader that the comment carries no information. Three: unverifiable severity. When a low-confidence pattern match and a traced, reachable vulnerability arrive in the same shape, the reader cannot triage, so both get ignored.
Say nothing unless you can point at the line
The rule that fixes the first habit is mechanical, not aspirational: a finding publishes only when its quoted snippet matches, verbatim and uniquely, lines the pull request actually added, checked against the diff by code, not by judgment. A paraphrased or misplaced quote discards the finding, even a real one. Pre-existing code beside a touched line can never publish, because the author is answerable for their diff, not for the whole repository.
That is why the inline comment sits on the added line: the reader sees their own code, the accused statement, and the missing control in one glance, with the attacker, the input they control, the path to the sink, and the consequence written out. Two minutes of reading, no archaeology.
Silence is a result
A clean pull request gets one advisory Check and no comment, because silence on an uncertain change is a correct outcome, not a failure. A new review, which is what sends the author a notification, goes out only for new findings at medium severity or above, and inline comments only at high or above. The same finding is never announced twice. Nothing blocks a merge; the review is a signal, not a gate.
Unverified is not published
When a review cannot prove a lead but cannot dismiss it either, the lead is listed in the Check as unverified, at most five, never posted as an inline comment, and never counted as a clean result. At most five findings publish per review, most severe first, and the Check says when more were held back. A partial read is disclosed as partial, with the files not read and the reason, because a partial review sold as complete is the fastest way to lose a reader.
Publish the record
The last habit is the rarest: publishing the tool's failed runs next to its hits. ${RECEIPTS_CLEAN_LINE} The receipts page keeps the full transcript, every run appended as it happens, so the reader can check the posture instead of trusting the pitch.
Sources
OWASP Code Review Guide; How Aevral reviews a PR; Aevral receipts.
Read next
PR security review and SAST are different questions; Handing a security finding to your coding agent; How Aevral reviews a PR; Is Aevral SAST?.
More guides
- What a whole-repo authorization scan reads
- PR security review and SAST are different questions
- Handing a security finding to your coding agent
- The Aevral launch-updates list, explained
- Reviewing a pull request for access control
- Working a scan report of access-control leads
- How IDOR happens in multi-tenant code
- Where access control hides in business logic
- Reviewing a pull request that wires in an LLM
- Security review priced per pull request, explained
- Reviewing pull requests for IDOR with a GitHub app
- Spotting a missing tenant check in a pull request
- Next.js and Supabase: the authorization check before launch
- Security review for pull requests written by Claude Code
- Vibe coding security: who reads the diff