<?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: Zubair Khalid</title>
    <description>The latest articles on DEV Community by Zubair Khalid (@zubair_khalid_e44298e6f0f).</description>
    <link>https://dev.to/zubair_khalid_e44298e6f0f</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%2F4101962%2F3b9e6d64-c649-4dd0-9869-9b2dd1b0fdda.png</url>
      <title>DEV Community: Zubair Khalid</title>
      <link>https://dev.to/zubair_khalid_e44298e6f0f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zubair_khalid_e44298e6f0f"/>
    <language>en</language>
    <item>
      <title>Why your agent says it finished when it didn't</title>
      <dc:creator>Zubair Khalid</dc:creator>
      <pubDate>Mon, 31 Aug 2026 01:47:37 +0000</pubDate>
      <link>https://dev.to/zubair_khalid_e44298e6f0f/why-your-agent-says-it-finished-when-it-didnt-2g0n</link>
      <guid>https://dev.to/zubair_khalid_e44298e6f0f/why-your-agent-says-it-finished-when-it-didnt-2g0n</guid>
      <description>&lt;p&gt;&lt;em&gt;I created this article for the purposes of entering the All Things Agentic Hackathon.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ask an agent to do ten things and it will tell you it did ten things.&lt;br&gt;
You cannot tell whether that is true. The transcript reads the same either way: every click "succeeded", no errors appeared, the summary is green. The agent is not malfunctioning when this happens. It is reporting its &lt;strong&gt;intentions&lt;/strong&gt; and calling them results — and the two are indistinguishable from the outside.&lt;/p&gt;

&lt;p&gt;I found this the expensive way. A mission reported &lt;em&gt;"Applied to 10 jobs. Task complete."&lt;/em&gt; having submitted zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape of the problem
&lt;/h2&gt;

&lt;p&gt;An agent loop produces a stream of actions and a stream of claims, and nothing structural connects them. A click fires — that's an action. "I submitted the application" — that's a claim. The loop treats the second as following from the first, because in the happy path it does.&lt;/p&gt;

&lt;p&gt;The failure is not that models lie. It is that &lt;strong&gt;"I did X" and "X happened" are different propositions&lt;/strong&gt;, and most agent architectures have no place to put the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built instead
&lt;/h2&gt;

&lt;p&gt;Laspoh Proof runs a mission, then a &lt;strong&gt;separate verifier&lt;/strong&gt; decides what actually happened. It never sees the planner's reasoning or the executor's opinion. It gets the criterion — written &lt;em&gt;before&lt;/em&gt; the step ran — and the evidence, and it must quote the evidence to say yes.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Proven 7 of 8. The rest is reported unproven, not counted.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Seven were proven. One was not, and the receipt says which and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things I got wrong, which are the interesting part
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. A citation nobody checks is not a citation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The verifier had to quote evidence for any "proven" verdict. For a long time nothing checked the quote was &lt;em&gt;in&lt;/em&gt; the evidence. A model can invent  , and the verdict stands on it — defeating the isolation, the disbelief default and the pre-committed criterion at once.&lt;/p&gt;

&lt;p&gt;The fix is mechanical on purpose: does this string appear in what the verifier was shown? Asking a model whether a model's quote is fair just moves the problem up a level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Self-certification can launder itself through an independent component.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each step's proof criterion is written before the step runs, so success cannot be redefined afterwards. But a criterion like &lt;em&gt;"the button was clicked"&lt;/em&gt; hands that redefinition back — the verifier is now asked to confirm the &lt;strong&gt;action&lt;/strong&gt;, not the outcome. And it answers &lt;em&gt;correctly&lt;/em&gt;, about the wrong question.&lt;/p&gt;

&lt;p&gt;Every component behaves as designed and the central claim dies anyway. Those are the failures worth hunting: not the ones where something breaks, but the ones where everything works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Evidence has to be able to contain the answer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fills kept coming back unproven and I assumed the verifier was harsh. It wasn't. An input's value never appears in a page's visible text, so the verifier was judging a criterion against material that structurally could not confirm it. Being strict about evidence is worthless if you are strict about the wrong evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture, briefly
&lt;/h2&gt;

&lt;p&gt;Gemini 3.5 through Genkit on Cloud Run, mission state in Firestore. Three flows — plan, repair, verify. A narrow executor interface separates reasoning from browser actuation, so the agent does not depend on any one automation stack. Recovery is pure code: an LLM asked "are you stuck?" says no and tries again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The principle
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No proof, no done.&lt;/strong&gt; The system is permitted to report less than it achieved. It is never permitted to report more.&lt;/p&gt;

&lt;p&gt;Under-claiming is honest. Over-claiming is the only failure.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Repository: &lt;a href="https://github.com/zubairkhaliduk-create/laspoh-proof" rel="noopener noreferrer"&gt;https://github.com/zubairkhaliduk-create/laspoh-proof&lt;/a&gt; — includes the full engineering programme, the adversarial self-review, and a disclosure of pre-existing work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: Laspoh, a pre-existing browser-automation platform of mine (June 2026), is a disclosed, optional, off-by-default execution dependency and is not presented as hackathon work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published as my content-publication entry for the All Things Agentic Hackathon.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
