What happened
On PR #508, Review 1 examined commit a896335 and produced 4 findings (1 medium protected-path, 3 low). Review 2 examined commit 33e6bfb — which differed by only a one-line sanitization change in gha_echo — and surfaced 2 new medium-severity findings: (1) raw ISSUE_NUMBER interpolated in the comment body without sanitization (inline comment), and (2) stale RESULT_FILE edge case at no-op exit paths (inline comment). Both vulnerabilities existed in the original commit that Review 1 examined. The coverage gap triggered an extra fix cycle (run 30382926532) and a third review (run 30384841747), adding ~1 hour of wall time and ~$4 in agent compute.
What could go better
The review agent's dimension sub-agents (correctness, security, style-conventions, intent-coherence) are nondeterministic in their coverage — different runs examine different aspects of the same code, leading to findings that surface only on subsequent passes. This is high-confidence: the diff between the two reviewed commits was a single sanitization line addition, yet Review 2 found two entirely new medium-severity classes of issue that Review 1 missed.
The root cause is structural: each sub-agent independently decides what to focus on in a single pass, with no mechanism to ensure coverage of specific vulnerability classes (like input sanitization consistency or stale-state edge cases). The challenger pass filters findings but cannot add findings the sub-agents never surfaced.
Related issues #343 (scoped re-review) and #302 (coverage gap self-reporting) address adjacent concerns but not this root cause. Issue #380 (symmetric defensive pattern application) would catch one of the two missed findings but not the other (stale RESULT_FILE).
Proposed change
Add a coverage-stability verification step to the review orchestrator in agents/review.md or the review harness (harness/review.yaml). After the dimension sub-agents and challenger produce findings, run a targeted verification pass that checks a checklist of high-value vulnerability classes against the diff:
- Input sanitization symmetry — For every variable that is sanitized at one call site in the diff, verify it is sanitized at all other interpolation points in the same function/scope. (This would catch the
ISSUE_NUMBER injection.)
- Stale-state assumptions — For every file read or variable dereference, verify the value is guaranteed to be current at the point of use (not from a prior iteration or stale path). (This would catch the
RESULT_FILE concern.)
- Error-path coverage — For every new function called in a non-error path, verify equivalent handling exists when the function is reached via error/early-exit paths.
This checklist should be applied deterministically (not left to sub-agent discretion) as a post-processing step before the challenger. If the checklist surfaces findings the sub-agents missed, they should be added to the finding set. The checklist can be maintained in a dedicated file (e.g., skills/review-coverage-checklist.md) and extended as new gap patterns are identified through retros.
Validation criteria
Over the next 10 PRs that go through 2+ review rounds in fullsend-ai/agents, track whether re-reviews surface new medium+ findings on unchanged or minimally-changed code. The target is zero new medium+ findings on code that was present in the prior review's diff. If the checklist catches findings that sub-agents missed, log them for coverage analysis. Success: fewer than 1 in 10 re-reviews surfaces a genuinely new medium+ finding on unchanged code.
Generated by retro agent from #508
What happened
On PR #508, Review 1 examined commit
a896335and produced 4 findings (1 medium protected-path, 3 low). Review 2 examined commit33e6bfb— which differed by only a one-line sanitization change ingha_echo— and surfaced 2 new medium-severity findings: (1) rawISSUE_NUMBERinterpolated in the comment body without sanitization (inline comment), and (2) staleRESULT_FILEedge case at no-op exit paths (inline comment). Both vulnerabilities existed in the original commit that Review 1 examined. The coverage gap triggered an extra fix cycle (run 30382926532) and a third review (run 30384841747), adding ~1 hour of wall time and ~$4 in agent compute.What could go better
The review agent's dimension sub-agents (correctness, security, style-conventions, intent-coherence) are nondeterministic in their coverage — different runs examine different aspects of the same code, leading to findings that surface only on subsequent passes. This is high-confidence: the diff between the two reviewed commits was a single sanitization line addition, yet Review 2 found two entirely new medium-severity classes of issue that Review 1 missed.
The root cause is structural: each sub-agent independently decides what to focus on in a single pass, with no mechanism to ensure coverage of specific vulnerability classes (like input sanitization consistency or stale-state edge cases). The challenger pass filters findings but cannot add findings the sub-agents never surfaced.
Related issues #343 (scoped re-review) and #302 (coverage gap self-reporting) address adjacent concerns but not this root cause. Issue #380 (symmetric defensive pattern application) would catch one of the two missed findings but not the other (stale RESULT_FILE).
Proposed change
Add a coverage-stability verification step to the review orchestrator in
agents/review.mdor the review harness (harness/review.yaml). After the dimension sub-agents and challenger produce findings, run a targeted verification pass that checks a checklist of high-value vulnerability classes against the diff:ISSUE_NUMBERinjection.)RESULT_FILEconcern.)This checklist should be applied deterministically (not left to sub-agent discretion) as a post-processing step before the challenger. If the checklist surfaces findings the sub-agents missed, they should be added to the finding set. The checklist can be maintained in a dedicated file (e.g.,
skills/review-coverage-checklist.md) and extended as new gap patterns are identified through retros.Validation criteria
Over the next 10 PRs that go through 2+ review rounds in fullsend-ai/agents, track whether re-reviews surface new medium+ findings on unchanged or minimally-changed code. The target is zero new medium+ findings on code that was present in the prior review's diff. If the checklist catches findings that sub-agents missed, log them for coverage analysis. Success: fewer than 1 in 10 re-reviews surfaces a genuinely new medium+ finding on unchanged code.
Generated by retro agent from #508