<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: César Pereiro</title>
    <description>The latest articles on DEV Community by César Pereiro (@ces107).</description>
    <link>https://dev.to/ces107</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4196076%2Fd7d16a41-9a44-46e4-a93c-7f2b3da18c7b.jpg</url>
      <title>DEV Community: César Pereiro</title>
      <link>https://dev.to/ces107</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ces107"/>
    <language>en</language>
    <item>
      <title>I benchmarked AI code-review skills on 18 seeded-bug PRs. Detection was a tie. Trust wasn't.</title>
      <dc:creator>César Pereiro</dc:creator>
      <pubDate>Tue, 20 Oct 2026 11:41:29 +0000</pubDate>
      <link>https://dev.to/ces107/i-benchmarked-ai-code-review-skills-on-18-seeded-bug-prs-detection-was-a-tie-trust-wasnt-f7b</link>
      <guid>https://dev.to/ces107/i-benchmarked-ai-code-review-skills-on-18-seeded-bug-prs-detection-was-a-tie-trust-wasnt-f7b</guid>
      <description>&lt;p&gt;I build correctness-critical software for a living (hospital integrations: HL7, DICOM, FHIR, under EU medical-device rules). When I started using AI agents to review code, the question I cared about was not "can it find bugs?" but "can I act on what it says without re-checking everything myself?"&lt;/p&gt;

&lt;p&gt;So I built a small benchmark and measured it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;18 pull requests, each a real git repository with a &lt;code&gt;main&lt;/code&gt; and a &lt;code&gt;feature&lt;/code&gt; branch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;14 with seeded production bugs&lt;/strong&gt; of the kind that sail through a green test suite: an idempotency check-then-act race that double-charges a card, an invoice download with no ownership check, a page count that drops the last partial page, &lt;code&gt;forEach(async ...)&lt;/code&gt; that never awaits, an &lt;code&gt;except Exception: return 0&lt;/code&gt; that silently zeroes bank amounts (plus the test that was weakened to hide it), SQL built with an f-string, a naive vs aware datetime comparison that crashes every password reset, a "simplification" that breaks a caller outside the diff, a cross-tenant cache leak, an open redirect through an unanchored regex, a rounding split that no longer sums to the total, a connection leak on the error path, an inclusive date range filtered with &lt;code&gt;&amp;lt;&lt;/code&gt;, and &lt;code&gt;override || default&lt;/code&gt; treating &lt;code&gt;0&lt;/code&gt; as unset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 clean PRs&lt;/strong&gt;, two of them deliberately tempting to flag (retrying a POST that receivers deduplicate; a shared index in a concurrency helper that is actually safe).&lt;/li&gt;
&lt;li&gt;Every bug was confirmed at runtime. Every feature branch passes its own tests.&lt;/li&gt;
&lt;li&gt;8 of the cases were written by a separate agent that never saw the review skill I was testing, so I could not teach to the test.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two reviewers, same model, same instructions ("review this PR"), each on a fresh copy of every repo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A prompt-only reviewer&lt;/strong&gt;: the most-installed code-review skill on the marketplace I sell on. A solid checklist: bugs, security, performance, maintainability, severity buckets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proven Code Review&lt;/strong&gt;, the skill I wrote. It maps every caller of the changed code (including files the PR never touched), tries to refute each suspicion before reporting it, and must prove every Critical and High finding with a failing test or command it actually runs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A third agent judged every pair of reviews &lt;strong&gt;blind&lt;/strong&gt; (anonymised as X and Y, randomised per case) against a written answer key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result 1: detection is a tie
&lt;/h2&gt;

&lt;p&gt;Both reviewers found &lt;strong&gt;15/15 seeded bugs&lt;/strong&gt;, on Claude Opus &lt;em&gt;and&lt;/em&gt; on Claude Haiku, and both gave 18/18 correct verdicts.&lt;/p&gt;

&lt;p&gt;I did not expect that. Current models find this class of bug no matter which skill wraps them. If someone tells you their review prompt "finds more bugs", ask for the benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result 2: trust is not a tie
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fif759gcb96ohozepvl5f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fif759gcb96ohozepvl5f.png" alt="Same bugs found, far less noise, far more proof" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Opus: prompt-only&lt;/th&gt;
&lt;th&gt;Opus: proven&lt;/th&gt;
&lt;th&gt;Haiku: prompt-only&lt;/th&gt;
&lt;th&gt;Haiku: proven&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real findings backed by a run&lt;/td&gt;
&lt;td&gt;43%&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;78%&lt;/strong&gt; (19/19 Critical+High)&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;76%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precision (real / reported)&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;74%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;94%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nits to read past&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;False positives&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On the fast, cheap model the gap is about 5x on both noise and proof. That is the setting most people actually run reviews in, at scale, in CI.&lt;/p&gt;

&lt;p&gt;What "proof" looks like in practice: on the open-redirect PR, the review did not say "the regex might be too permissive". It wrote a test, ran it, and pasted four URLs that land the user on &lt;code&gt;evil.test&lt;/code&gt; after login, plus a second bypass (&lt;code&gt;https://app.example.com//evil.test&lt;/code&gt;) that was not even in my answer key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where my skill was wrong
&lt;/h2&gt;

&lt;p&gt;On Haiku it reported one false positive (it called deliberate, already-tested cent rounding a Critical under-billing bug) and inflated one severity. Version 1.1 adds two rules: behaviour that a test explicitly asserts is intended unless the PR or spec says otherwise, and when torn between two severities, pick the lower one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;18 cases is small. They are short, mostly single-module PRs in Python and JavaScript. The judge is a model scoring against an answer key. Everything is public so you can check or extend it: cases, answer keys, the raw 72 reviews, the blind scores and the scripts are in the repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Benchmark and raw data: &lt;a href="https://github.com/Ces107/agent-forge/tree/main/bench/code-review" rel="noopener noreferrer"&gt;https://github.com/Ces107/agent-forge/tree/main/bench/code-review&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The skill is free. In Claude Code: &lt;code&gt;/plugin install agent-forge --marketplace Ces107/agent-forge&lt;/code&gt;. Any SKILL.md agent: &lt;code&gt;npx skills add Ces107/agent-forge&lt;/code&gt;. Also on Agensi: &lt;a href="https://agensi.io/skills/proven-code-review-every-serious-bug-comes-with-a-failing-test" rel="noopener noreferrer"&gt;https://agensi.io/skills/proven-code-review-every-serious-bug-comes-with-a-failing-test&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The thing I would take away even if you never use my skill: &lt;strong&gt;stop grading review tools on what they find and start grading them on what you can act on without re-checking.&lt;/strong&gt; Proof is cheap now. Ask for it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codereview</category>
      <category>testing</category>
      <category>claude</category>
    </item>
  </channel>
</rss>
