<?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: Kidus Mesfin</title>
    <description>The latest articles on DEV Community by Kidus Mesfin (@kidus_m).</description>
    <link>https://dev.to/kidus_m</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%2F4092740%2Fc7f10f4c-1ba7-4a2a-bd21-0b5ae286ed55.png</url>
      <title>DEV Community: Kidus Mesfin</title>
      <link>https://dev.to/kidus_m</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kidus_m"/>
    <language>en</language>
    <item>
      <title>I Built an Open-Source QA Agent Because AI Shouldn’t Grade Its Own Homework</title>
      <dc:creator>Kidus Mesfin</dc:creator>
      <pubDate>Mon, 24 Aug 2026 17:23:47 +0000</pubDate>
      <link>https://dev.to/kidus_m/i-built-an-open-source-qa-agent-because-ai-shouldnt-grade-its-own-homework-454f</link>
      <guid>https://dev.to/kidus_m/i-built-an-open-source-qa-agent-because-ai-shouldnt-grade-its-own-homework-454f</guid>
      <description>&lt;p&gt;AI coding tools are getting ridiculously good.&lt;/p&gt;

&lt;p&gt;You can describe a feature, let an agent implement it, ask it to write tests, and sometimes have something working in minutes.&lt;/p&gt;

&lt;p&gt;But there’s a problem I kept thinking about:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happens when the same AI writes the code and then validates its own understanding of the requirement?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the model misunderstands the requirement once, it can easily carry that same misunderstanding into the tests.&lt;/p&gt;

&lt;p&gt;You end up with something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product requirement
        ↓
Coding agent
        ↓
Incorrect interpretation
        ↓
Implementation
        ↓
Same agent writes tests
        ↓
Tests validate the same interpretation
        ↓
Everything passes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test suite is green.&lt;/p&gt;

&lt;p&gt;The product is still wrong.&lt;/p&gt;

&lt;p&gt;That idea eventually became &lt;strong&gt;MaruCheck&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is MaruCheck?
&lt;/h2&gt;

&lt;p&gt;MaruCheck is an open-source QA and verification tool designed around AI-generated software.&lt;/p&gt;

&lt;p&gt;The goal is not to replace Playwright, Vitest, Jest, CI, or existing testing infrastructure.&lt;/p&gt;

&lt;p&gt;The goal is to create an &lt;strong&gt;independent verification layer&lt;/strong&gt; between the coding agent and the software being shipped.&lt;/p&gt;

&lt;p&gt;The basic idea looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             PRODUCT INTENT
                  │
          ┌───────┴───────┐
          ↓               ↓
    CODING AGENT       MARUCHECK
          ↓               ↓
        CODE        QUALITY CONTRACT
          │               │
          └───────┬───────┘
                  ↓
               VERIFY
                  ↓
             PASS / BLOCK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The coding agent builds.&lt;/p&gt;

&lt;p&gt;MaruCheck verifies.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quality Contracts
&lt;/h2&gt;

&lt;p&gt;One of the main ideas behind MaruCheck is something I call a &lt;strong&gt;Quality Contract&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of generating tests entirely from the implementation, the system keeps a persistent representation of what the feature is actually supposed to do.&lt;/p&gt;

&lt;p&gt;A simplified example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;feature&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;subscription-management&lt;/span&gt;

&lt;span class="na"&gt;requirements&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Free users get 10 generations per month&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Pro users have unlimited generations&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Successful upgrades take effect immediately&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Cancellation keeps Pro access until period_end&lt;/span&gt;

&lt;span class="na"&gt;invariants&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Failed payments must never activate Pro&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Client-controlled data cannot prove payment&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Replayed webhooks must be idempotent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now imagine an AI agent changes the subscription implementation.&lt;/p&gt;

&lt;p&gt;MaruCheck can compare that change against the expected behavior instead of assuming that the new implementation defines the truth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Semantic Drift
&lt;/h2&gt;

&lt;p&gt;This is one of the features I care about most.&lt;/p&gt;

&lt;p&gt;Suppose the approved behavior says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Free users can upload 5 files.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then an AI-generated change does this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- const FREE_LIMIT = 5
&lt;/span&gt;&lt;span class="gi"&gt;+ const FREE_LIMIT = 10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A test-generation system could potentially see the new implementation, regenerate the test, and now expect 10.&lt;/p&gt;

&lt;p&gt;Everything stays green.&lt;/p&gt;

&lt;p&gt;MaruCheck should not do that.&lt;/p&gt;

&lt;p&gt;Instead, it treats the mismatch as a semantic change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SEMANTIC CHANGE DETECTED

Expected:
5

Observed:
10

Was this intentional?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system can propose changing the contract, but it should not silently rewrite product behavior just to make the tests pass.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Risk-Based Verification
&lt;/h2&gt;

&lt;p&gt;Another thing I didn’t want was a tool that blindly runs every possible test after every change.&lt;/p&gt;

&lt;p&gt;Not every diff has the same risk.&lt;/p&gt;

&lt;p&gt;Changing a marketing page is not the same as changing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;billing-webhook.ts
authentication.ts
permissions.ts
subscription-state.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So MaruCheck analyzes the diff and tries to understand what is actually affected.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Changed:
billing-webhook.ts

Risk:
HIGH

Why:
+ payment-sensitive code changed
+ subscription state transition changed
+ related historical regression exists
+ critical Quality Contract affected
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That risk assessment can then influence what verification gets run.&lt;/p&gt;




&lt;h2&gt;
  
  
  QA Memory
&lt;/h2&gt;

&lt;p&gt;This became another part of the project that I really liked.&lt;/p&gt;

&lt;p&gt;Imagine six months ago your application had this bug:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BUG #143

A user could access another user's invoice
by changing the invoice ID.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bug gets fixed.&lt;/p&gt;

&lt;p&gt;Everyone moves on.&lt;/p&gt;

&lt;p&gt;Months later, a coding agent modifies invoice authorization again.&lt;/p&gt;

&lt;p&gt;A normal testing tool mostly sees the current code.&lt;/p&gt;

&lt;p&gt;MaruCheck can remember:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This area previously caused an authorization regression.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and bring the relevant regression checks back into the verification plan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ cross-account invoice checks
✓ IDOR verification
✓ ownership tests
✓ authorization boundary tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea is that QA knowledge should accumulate over time instead of disappearing into old tickets and forgotten incidents.&lt;/p&gt;




&lt;h2&gt;
  
  
  What MaruCheck Currently Includes
&lt;/h2&gt;

&lt;p&gt;Some of the functionality built so far includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quality Contracts&lt;/li&gt;
&lt;li&gt;Repository and stack scanning&lt;/li&gt;
&lt;li&gt;Git diff and change-impact analysis&lt;/li&gt;
&lt;li&gt;Risk-based verification&lt;/li&gt;
&lt;li&gt;Automated test orchestration&lt;/li&gt;
&lt;li&gt;Semantic drift detection&lt;/li&gt;
&lt;li&gt;QA Memory for historical regressions&lt;/li&gt;
&lt;li&gt;CLI workflows&lt;/li&gt;
&lt;li&gt;MCP integration for coding agents&lt;/li&gt;
&lt;li&gt;GitHub / CI verification&lt;/li&gt;
&lt;li&gt;Evidence-based findings and release checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is designed to work with existing testing tools rather than trying to reinvent all of them.&lt;/p&gt;

&lt;p&gt;The interesting part, to me, is the reasoning and orchestration layer around those tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  MCP and Coding Agents
&lt;/h2&gt;

&lt;p&gt;I also wanted MaruCheck to fit directly into the workflow developers already have with coding agents.&lt;/p&gt;

&lt;p&gt;So an agent like Codex, Claude Code, Cursor, or another MCP-compatible tool can eventually follow a workflow like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Implementation complete.

&amp;gt; maru_verify_feature("subscription cancellation")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MaruCheck performs an independent verification.&lt;/p&gt;

&lt;p&gt;If it finds something:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BLOCKING ISSUE

SUB-004 violated.

Expected:
Pro access remains active until period_end.

Actual:
Account becomes FREE immediately.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The coding agent can fix the implementation and ask MaruCheck to verify it again.&lt;/p&gt;

&lt;p&gt;That creates a loop where the builder and verifier have separate responsibilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the Name MaruCheck?
&lt;/h2&gt;

&lt;p&gt;The name is inspired by the &lt;strong&gt;Kobayashi Maru&lt;/strong&gt; idea.&lt;/p&gt;

&lt;p&gt;Not because I wanted to make a Star Trek-themed testing tool, but because I liked the underlying concept:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don’t only test what happens when everything goes according to plan.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Test what happens when assumptions break.&lt;/p&gt;

&lt;p&gt;That maps nicely to the kind of QA I want MaruCheck to do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What if the webhook fires twice?

What if the payment succeeds but the database update fails?

What if two requests happen at the same time?

What if permissions change during the workflow?

What if an old regression comes back?

What if the implementation passes its tests
but still violates the original product requirement?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hence:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MaruCheck — Test what your AI didn’t.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Open-Sourced It
&lt;/h2&gt;

&lt;p&gt;I initially thought about keeping the project more closed, but I eventually decided that open source made much more sense.&lt;/p&gt;

&lt;p&gt;This kind of developer infrastructure gets better when developers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run it against real projects&lt;/li&gt;
&lt;li&gt;Inspect how it works&lt;/li&gt;
&lt;li&gt;Break it&lt;/li&gt;
&lt;li&gt;Challenge its assumptions&lt;/li&gt;
&lt;li&gt;Contribute integrations&lt;/li&gt;
&lt;li&gt;Report false positives&lt;/li&gt;
&lt;li&gt;Add test adapters&lt;/li&gt;
&lt;li&gt;Improve the architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m especially interested in seeing how it behaves against real projects being built heavily with AI coding agents.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marucheck.dev" rel="noopener noreferrer"&gt;https://marucheck.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Core repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Kidus-M/MaruCheck" rel="noopener noreferrer"&gt;https://github.com/Kidus-M/MaruCheck&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Kidus-M/MaruCheck-Web" rel="noopener noreferrer"&gt;https://github.com/Kidus-M/MaruCheck-Web&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the idea sounds interesting, I’d really appreciate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ Starring the repository&lt;/li&gt;
&lt;li&gt;🐛 Reporting bugs&lt;/li&gt;
&lt;li&gt;🛠 Trying it on a real project&lt;/li&gt;
&lt;li&gt;💡 Suggesting features&lt;/li&gt;
&lt;li&gt;🤝 Contributing code, tests, integrations, or docs&lt;/li&gt;
&lt;li&gt;🔁 Sharing it with developers working heavily with AI coding tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the feedback I want most is technical criticism.&lt;/p&gt;

&lt;p&gt;Does the independent-verifier model make sense?&lt;/p&gt;

&lt;p&gt;Would you actually keep Quality Contracts inside your repository?&lt;/p&gt;

&lt;p&gt;What would a tool like this have to catch before you trusted it enough to run on every pull request?&lt;/p&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What am I getting wrong?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>ai</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
