<?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: anp0429</title>
    <description>The latest articles on DEV Community by anp0429 (@anp0429).</description>
    <link>https://dev.to/anp0429</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%2F4051738%2F292abc50-d751-4c7c-b2af-340311e564bb.png</url>
      <title>DEV Community: anp0429</title>
      <link>https://dev.to/anp0429</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anp0429"/>
    <language>en</language>
    <item>
      <title>I built a lie detector for code. Then it caught itself lying.</title>
      <dc:creator>anp0429</dc:creator>
      <pubDate>Wed, 29 Jul 2026 22:54:26 +0000</pubDate>
      <link>https://dev.to/anp0429/i-built-a-lie-detector-for-code-then-it-caught-itself-lying-1gn1</link>
      <guid>https://dev.to/anp0429/i-built-a-lie-detector-for-code-then-it-caught-itself-lying-1gn1</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Smash Stories&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every AI code reviewer has the same tell: it states a wrong finding in the exact confident tone it uses for a right one. Nothing in the delivery tells you which is which. Confidence isn't evidence.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/anp0429/edgeverdict" rel="noopener noreferrer"&gt;edgeverdict&lt;/a&gt; around one rule: the model never gets to decide. It proposes a test, a deterministic gate runs it, and a finding only counts if the test &lt;em&gt;executes and fails&lt;/em&gt;. The model guesses. Execution rules.&lt;/p&gt;

&lt;p&gt;A rule like that is only worth anything if it survives being pointed at itself. So before merging a big refactor, I let the tool review its own diff. Here's what it posted, on my own PR:&lt;/p&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%2F9j4v3d53n5msjpfll06x.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%2F9j4v3d53n5msjpfll06x.png" alt="edgeverdict's automated PR comment: a confirmed failing test, flagged as advisory for human judgment" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The actual comment it posted on my own PR (the tool was named agentboard back then; it's edgeverdict now).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read the last part closely. The tool found a real failing test &lt;strong&gt;and&lt;/strong&gt; flagged its own finding as probably not a real bug, in the same breath.&lt;/p&gt;

&lt;p&gt;That split is the whole point. The execution half said &lt;em&gt;"this test fails, here's the proof."&lt;/em&gt; The advisory half said &lt;em&gt;"but a human should decide if this is actually wrong."&lt;/em&gt; One is a fact. The other is a judgment. It never lets them blur into each other, because blurring them is exactly the confident-liar problem I built the thing to kill.&lt;/p&gt;

&lt;p&gt;But the sharpest catch came later, and it was worse, in the way that teaches you something.&lt;/p&gt;

&lt;p&gt;There's a function in the tool whose whole job is to decide &lt;em&gt;why&lt;/em&gt; a test failed, was this a real assertion failure, or just a crash? That call is load-bearing. Everything downstream trusts it. And here's how I'd written it: it checked whether the string &lt;code&gt;AssertionError&lt;/code&gt; appeared &lt;em&gt;anywhere&lt;/em&gt; in the failure report.&lt;/p&gt;

&lt;p&gt;Anywhere.&lt;/p&gt;

&lt;p&gt;So a test that crashed for some unrelated reason, whose output merely &lt;em&gt;mentioned&lt;/em&gt; that word somewhere in the noise, would get filed as a genuine bug in your code. A false finding, minted from a coincidence of text.&lt;/p&gt;

&lt;p&gt;Sit with where that lived. I'd built a tool whose entire thesis is &lt;em&gt;don't trust what merely looks true, make it prove itself&lt;/em&gt;, and buried in its verdict path, the one place the whole thesis rests on, was a line that trusted what merely looked true. My lie detector had a spot where it would believe a coincidence.&lt;/p&gt;

&lt;p&gt;I didn't catch it in review. I didn't catch it in testing. The tool caught it, by trying to break its own code. The fix classifies by the exception actually raised, not by grepping for a scary word, and the replacement now documents the bug it killed, right there in the source.&lt;/p&gt;

&lt;p&gt;Across a few rounds of reviewing itself, the tool found &lt;strong&gt;31 real defects in its own codebase&lt;/strong&gt;, each an executed, failing test, not an opinion. Seven were the serious kind that could produce a false verdict. I published all of them, with the run fingerprints, so nobody has to take my word for it.&lt;/p&gt;

&lt;p&gt;Which is the point. The tool exists so you don't have to trust a builder's confidence, only the execution. So I won't end by asking you to trust mine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;edgeverdict
edgeverdict demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;About fifteen seconds, no API key. Then point it at your own code and tell me where it lies to you.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/anp0429/edgeverdict" rel="noopener noreferrer"&gt;github.com/anp0429/edgeverdict&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: edgeverdict is mine and I wrote this up myself, with an AI assistant helping tighten the draft. Every number, fingerprint, and test here is real and in the repo.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>ai</category>
      <category>pr</category>
    </item>
  </channel>
</rss>
