Quick answer: False suspicions are expected from an AI review, and the skill is dismissing them quickly with evidence rather than fixing every flag or letting them pile up. For each suspicion, confirm whether the trigger can really fire, check whether an earlier guard already handles it, and resolve the actual symbols, since many false alarms come from misreading a name or a branch. A suspicion that cannot be reproduced is marked false with the reason, keeping the review focused on real defects.

Why false alarms happen

A static review reasons about the code without running it, so it can flag a line that looks risky while a guard elsewhere always blocks the trigger. Renames and shadowed variables can make a symbol look like new logic, and a branch that the application cannot currently reach can still be flagged as dangerous.

None of that means the tool is useless. It means every output is a hypothesis that needs a quick confirmation, and a reviewer who can clear false alarms fast keeps the real findings from drowning in noise.

The common false-alarm patterns

Pattern Why it looks wrong How to confirm it is false
Existing guard An earlier check blocks the trigger Trace the branch and show the guard
Reachable-only-in-theory The branch cannot currently be entered Confirm no caller passes the value
Misread symbol A name suggests different logic Resolve the real definition
Duplicate concern Another finding covers the same path Link the two and keep one
Intentional behavior The change matches the requirement Cite the task and the expected result

The first three are settled by reading code, and the last two are settled by the task context, which keeps the triage grounded rather than subjective.

A fast triage routine

  1. Read the flagged line and restate the trigger precisely.
  2. Check the enclosing block for a guard that stops the trigger.
  3. Resolve the symbols to their real definitions rather than trusting names.
  4. Follow the callers to see whether any path passes the triggering value.
  5. If the trigger cannot fire, mark the suspicion false and record the reason.
  6. If it can fire, keep it and move to confirmation with a real request.

Take a flag that says a filter removes archived notes. The reviewer follows the block and finds an earlier condition that returns before the filter runs when archived notes are present, so the trigger never fires on that path. The suspicion is marked false with the guard cited, and no code changes. A second flag on a different file has no such guard and a caller that passes the triggering value, so it stays and gets confirmed.

Keeping the record honest

A dismissed suspicion should still carry the reason it was false, so the same flag is not re-litigated on the next review and the reviewer can distinguish a real miss from a deliberate dismissal. Mark a misreport rather than deleting it, and keep the evidence attached.

The inline review returns priority, evidence, and a recommendation, and the reviewer independently assesses each one rather than accepting the batch.

AI code review showing a flagged finding next to the source diff

Powerduck keeps the dismissed and confirmed findings in the same review record, so the reason for each decision stays visible.

When triage stays ambiguous

Some suspicions cannot be cleared from the static code, and forcing a fast dismissal then is the wrong move. If the guard depends on a value you cannot trace, or the caller analysis shows a path that might pass the trigger, the suspicion moves from triage to a real confirmation rather than being marked false. Send the smallest request that reaches the uncertain branch, and let the observed behavior decide. Keep a clear line between a false alarm, which has evidence that the trigger cannot fire, and an unverified one, which simply lacks the evidence either way. Conflating the two is how a real defect gets dismissed as noise, and the distinction is worth the extra request.

Honest limits

Triage can itself be wrong if a dynamic entry point reaches a branch the local callers do not show, and static analysis can miss dynamic loading and external consumers. No incoming reference does not make a file safe to delete, and the AI never runs the app.

When the static view cannot confirm or dismiss a suspicion, send a real request rather than guessing, and keep an AI-only claim as a hypothesis until a runnable check backs it.

Frequently asked questions

What makes a suspicion a false alarm? A guard that blocks the trigger, no caller that passes the value, or a misread symbol that resolves to different logic.

Should I delete false findings? No. Mark them false with the reason so the decision is auditable and not repeated.

How fast should triage be? The guard and symbol checks are quick reads; anything that cannot be settled fast becomes a real confirmation, not a guess.

The bottom line

Treat every suspicion as a hypothesis and clear the false ones quickly: confirm the trigger, find the existing guard, and resolve the real symbols, then mark false alarms with the reason rather than fixing or deleting them. Anything the static code cannot settle goes to a real request instead of a guess. A review that dismisses noise with evidence keeps its attention on the defects that actually fire. Read more in the AI code review guide.