<?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: Yash Agrawal</title>
    <description>The latest articles on DEV Community by Yash Agrawal (@kirito29).</description>
    <link>https://dev.to/kirito29</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%2F4087890%2F012be2a7-e97d-45c7-8c52-0ce646790924.jpg</url>
      <title>DEV Community: Yash Agrawal</title>
      <link>https://dev.to/kirito29</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kirito29"/>
    <language>en</language>
    <item>
      <title>Why a Green Check Isn't Proof</title>
      <dc:creator>Yash Agrawal</dc:creator>
      <pubDate>Fri, 21 Aug 2026 11:11:49 +0000</pubDate>
      <link>https://dev.to/kirito29/why-a-green-check-isnt-proof-a9d</link>
      <guid>https://dev.to/kirito29/why-a-green-check-isnt-proof-a9d</guid>
      <description>&lt;p&gt;A test going green is one of the most reassuring sounds in software. The CI bell rings, the checkmark turns, the PR merges. Everyone moves on.&lt;/p&gt;

&lt;p&gt;But a green check only proves one thing: the code you asserted on did what you asserted.&lt;/p&gt;

&lt;p&gt;It says nothing about the thousand things you didn't think to assert on. And when an agent is writing the code &lt;em&gt;and&lt;/em&gt; the tests, the set of things nobody thought about gets very large, very fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  The screenshot problem
&lt;/h2&gt;

&lt;p&gt;Most testing tools look at the surface. They render the page, take a picture, literally or figuratively, and compare it to what they expected.&lt;/p&gt;

&lt;p&gt;If the button is there and the text matches, the test passes.&lt;/p&gt;

&lt;p&gt;The trouble is that an app is not its screenshot.&lt;/p&gt;

&lt;p&gt;A checkout page can render perfectly while the charge silently returns a 500. A success toast can appear while the order never reaches the database. The DOM says one thing; the program is doing another.&lt;/p&gt;

&lt;p&gt;A picture can't see the difference.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A false green is the most expensive kind of bug: nothing flags it. It ships, and you find out from a user.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What "proof" actually requires
&lt;/h2&gt;

&lt;p&gt;To know an app works, you have to look at the app, not the picture of it.&lt;/p&gt;

&lt;p&gt;The network calls it made.&lt;/p&gt;

&lt;p&gt;The state it ended in.&lt;/p&gt;

&lt;p&gt;The errors it swallowed.&lt;/p&gt;

&lt;p&gt;The source line where the behavior diverged from intent.&lt;/p&gt;

&lt;p&gt;That's the difference between &lt;em&gt;it looks done&lt;/em&gt; and &lt;em&gt;it is done&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is the layer most tools skip, because reaching it is hard.&lt;/p&gt;

&lt;p&gt;It means running inside the program, not beside it.&lt;/p&gt;

&lt;p&gt;It means asserting on behavior and state instead of pixels.&lt;/p&gt;

&lt;p&gt;It means a verdict you can trace to a line of code, not a diff you have to eyeball.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trust, earned per run
&lt;/h2&gt;

&lt;p&gt;When green means "the page rendered," you learn to distrust green. You click through the flows yourself, just in case.&lt;/p&gt;

&lt;p&gt;That instinct is correct.&lt;/p&gt;

&lt;p&gt;And it's also unsustainable once an agent is shipping all day.&lt;/p&gt;

&lt;p&gt;The fix isn't more screenshots.&lt;/p&gt;

&lt;p&gt;It's a green that's earned: backed by the real signals the program emitted, reproducible on every run, and pointed at the exact place things broke when they break.&lt;/p&gt;

&lt;p&gt;A checkmark you don't have to second-guess.&lt;/p&gt;

&lt;p&gt;That's the whole game: making the green mean what everyone already assumes it means.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>ai</category>
      <category>webdev</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>How to use Claude Code for QA automation</title>
      <dc:creator>Yash Agrawal</dc:creator>
      <pubDate>Fri, 21 Aug 2026 08:34:55 +0000</pubDate>
      <link>https://dev.to/kirito29/how-to-use-claude-code-for-qa-automation-20p0</link>
      <guid>https://dev.to/kirito29/how-to-use-claude-code-for-qa-automation-20p0</guid>
      <description>&lt;p&gt;Claude Code will happily write your tests. It will also happily tell you they pass. Those are two different claims, and the gap between them is where most QA automation setups quietly break.&lt;/p&gt;

&lt;p&gt;This is a practical guide to wiring Claude Code into a QA loop that actually holds: what it does well unsupervised, the three failure modes you will hit, and how to close them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "write me some tests" is not QA automation
&lt;/h2&gt;

&lt;p&gt;The default move is to ask Claude Code to generate a test suite. It is fast and the output looks right. The problem is structural: &lt;strong&gt;the model writing the code is the model grading the code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When Claude writes both the feature and the test for the feature, the test encodes the model's understanding of what the code does. If that understanding is wrong, the test is wrong in exactly the same direction, and it passes. You have not verified behaviour. You have verified internal consistency.&lt;/p&gt;

&lt;p&gt;This is not a knock on the model. A human who writes a function and then writes a test from memory of that function has the same blind spot. The difference is that the human usually opens the app and clicks the thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude Code is genuinely good at
&lt;/h2&gt;

&lt;p&gt;Used deliberately, it is very strong at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Turning a spec into test cases you review.&lt;/strong&gt; Ask for the case list first, in plain English, before any code. You catch the missing edge cases at the cheapest possible moment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Writing the mechanical parts.&lt;/strong&gt; Fixtures, factories, setup and teardown, parameterised variants of a case you already approved.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Explaining a failure.&lt;/strong&gt; Paste a stack trace and it will usually find the cause faster than you will.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maintaining tests through refactors.&lt;/strong&gt; Renames and signature changes are exactly the drudgery you want automated.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of those require it to judge its own work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three failure modes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. It reports success it did not verify
&lt;/h3&gt;

&lt;p&gt;The most common one. Claude says "fixed and tested" when it edited the file and never ran anything, or ran something that did not cover the change. Users have documented this at length: incomplete code, untested implementations, placeholders, and confident summaries on top.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix is structural, not a better prompt.&lt;/strong&gt; Define the verification command up front, and make the command the source of truth rather than the summary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before you tell me anything is done, run:

npm run build &amp;amp;&amp;amp; npm test

Paste the actual output. If it fails, keep going. Do not summarise.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. It tests the screen, not the program
&lt;/h3&gt;

&lt;p&gt;Ask an agent to check that checkout works and it will look for a success message. That is the check a screenshot tool can do, and it is exactly the check that misses the expensive bugs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The page renders perfectly and &lt;code&gt;POST /api/order&lt;/code&gt; returned a 500.&lt;/li&gt;
&lt;li&gt;The toast says "Order placed" and the cart still has three items in it.&lt;/li&gt;
&lt;li&gt;One click fired the charge request twice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of those renders green. The DOM is not the program, and a passing visual assertion says nothing about what happened underneath.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Flake makes the signal worthless
&lt;/h3&gt;

&lt;p&gt;An LLM re-driving a browser flow is non-deterministic by construction. Run it three times and you may get three answers. Once a suite flakes, people stop reading it, and an unread suite is worse than no suite because it still costs money to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  A setup that holds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Give it acceptance criteria, not goals.&lt;/strong&gt; "Make checkout work" is unverifiable. "A logged-in user with one item can complete checkout; the order appears in the DB; the card is charged exactly once" is a checklist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Work on a branch or a worktree.&lt;/strong&gt; Give the agent room to be wrong without it costing you a revert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate the author from the grader.&lt;/strong&gt; Whatever grades the work should not be the thing that produced it. That can be a human, a second agent with no context, or an out-of-band observer that reads the running app directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assert on program truth, not pixels.&lt;/strong&gt; The check that catches the bugs above is not "is the success text present" but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the request succeed, or did it 500?&lt;/li&gt;
&lt;li&gt;Did the store actually update?&lt;/li&gt;
&lt;li&gt;Did anything throw into the console?&lt;/li&gt;
&lt;li&gt;Did exactly one charge request fire?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Make the check cheap enough to run every time.&lt;/strong&gt; A verification step that costs a dollar and ninety seconds gets skipped. One that costs a fraction of a cent and runs in a second becomes a habit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Reticle fits
&lt;/h2&gt;

&lt;p&gt;Reticle is the out-of-band grader in that list. It is a free, open-source SDK that runs inside your app in development. Your agent asks it for proof; it opens the running app, drives the flow, and reads the network calls, the internal state, the console, and the React commits, then returns a pass or fail with the failing file and line.&lt;/p&gt;

&lt;p&gt;Because it reads the program rather than a screenshot, it catches the silent class: the 500 behind a clean page, the UI that disagrees with the store, the double charge. Because it replays a recorded flow deterministically instead of re-driving it with a model, the same input gives the same verdict every time, at roughly 47 tokens for a suite.&lt;/p&gt;

&lt;p&gt;The point is not that you stop using Claude Code for QA. It is that you stop asking it to be both the author and the judge.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @reticlehq/server init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then tell your agent to verify with Reticle before it reports anything as done. It will start catching its own mistakes, which is the only version of QA automation that survives contact with an agent that writes faster than you can read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep Playwright
&lt;/h2&gt;

&lt;p&gt;None of this replaces your release gate. Playwright and hand-written end-to-end tests still gate the release: they run in CI, they cover the browsers you support, and they catch pixel regressions Reticle deliberately does not. Reticle gates the edit, in the loop, while the agent is still working.&lt;/p&gt;

&lt;p&gt;Most teams that get this right run both, and are clear about which one answers which question.&lt;/p&gt;

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