<?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: Alberto Clemente</title>
    <description>The latest articles on DEV Community by Alberto Clemente (@albertoclemente).</description>
    <link>https://dev.to/albertoclemente</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%2F3940310%2F771f297f-c006-47d9-a1c2-cded1ba4e7e2.png</url>
      <title>DEV Community: Alberto Clemente</title>
      <link>https://dev.to/albertoclemente</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/albertoclemente"/>
    <language>en</language>
    <item>
      <title>Every AI coding agent tracker is a self-report system</title>
      <dc:creator>Alberto Clemente</dc:creator>
      <pubDate>Thu, 13 Aug 2026 10:50:20 +0000</pubDate>
      <link>https://dev.to/albertoclemente/every-ai-coding-agent-tracker-is-a-self-report-system-53nm</link>
      <guid>https://dev.to/albertoclemente/every-ai-coding-agent-tracker-is-a-self-report-system-53nm</guid>
      <description>&lt;p&gt;On 27 July I opened a project I'd been building with Claude Code and found three things true at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a card had carried a null commit for two days&lt;/li&gt;
&lt;li&gt;the spec held nine false statements&lt;/li&gt;
&lt;li&gt;five hundred lines had been written against a card still sitting in Backlog, because nobody called &lt;code&gt;start&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that was the agent writing bad code. The code was fine. It was the agent's &lt;strong&gt;record&lt;/strong&gt; of the code that had quietly come apart, and I hadn't noticed because there was nothing to notice with.&lt;/p&gt;

&lt;p&gt;I'd been blaming the wrong thing for weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape every one of these tools has
&lt;/h2&gt;

&lt;p&gt;I tried the obvious fixes. A stricter &lt;code&gt;CLAUDE.md&lt;/code&gt;. A tracker with better prompts. Hooks that nagged. They all helped a little and none of them touched the actual problem, which is structural:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The agent does the work, and the agent writes its own report card.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's it. That's the whole failure mode. Your tracker is a filing cabinet: the agent says "done, tests pass", the board stores the string "done, tests pass", and nothing anywhere asks &lt;em&gt;is that true?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So the only thing standing between a claim and your project's memory is you, reading the diff. &lt;strong&gt;You are the verification step.&lt;/strong&gt; That's why you can't walk away while it works, and it's why the board and the repo drift apart the moment you stop watching.&lt;/p&gt;

&lt;p&gt;Advice doesn't fix this. I know because I wrote the advice. The entire MCP server for this project was built without &lt;code&gt;start&lt;/code&gt; ever being called — the card sat in Backlog while five hundred lines were written against it. &lt;strong&gt;If the author of the protocol drifts inside one session while holding it in context, the protocol isn't a mechanism. It's a wish.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;I stopped trying to make the agent more reliable and started asking a different question about every fact on the board: &lt;strong&gt;who has the authority to assert this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did the command pass? The machine says so.&lt;/strong&gt; When the agent hands a card back, the tracker runs your project's check &lt;em&gt;first&lt;/em&gt;, and only grants the status if it exits zero. Crucially the check is an argv array declared by a human in project config — no tool the agent can reach may write it. The agent can &lt;em&gt;select&lt;/em&gt; a declared check; it cannot &lt;em&gt;define&lt;/em&gt; one. An agent that could write the command that grades it would just be grading itself with extra steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did the work land? Git says so.&lt;/strong&gt; If a card's commit is already an ancestor of &lt;code&gt;main&lt;/code&gt;, the board is corrected at session start without being asked. Forward only: it fills blanks and confirms landed work, and never overrules a decision you made — because no commit records intent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this note still true? The diff says so.&lt;/strong&gt; Every note records the sha it was true of. Later the board tells you how far the tree has moved since, and distinguishes &lt;em&gt;"nothing has landed"&lt;/em&gt; from &lt;em&gt;"I can't check"&lt;/em&gt;. Everywhere else, a note from three weeks ago looks exactly like one from this morning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do two things contradict? The board says so, unprompted.&lt;/strong&gt; A view for claims git contradicts, branches no card owns, and cards closed without a check ever running.&lt;/p&gt;

&lt;p&gt;Storing your board in git is &lt;strong&gt;storage&lt;/strong&gt; — several tools do that. Letting git &lt;em&gt;overrule&lt;/em&gt; your board is &lt;strong&gt;arbitration&lt;/strong&gt;. That's the difference, and it's the whole product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I got wrong, twice
&lt;/h2&gt;

&lt;p&gt;Two things I'd tell anyone building in this space.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification is about which surface may establish a command, not about escaping it.&lt;/strong&gt; I made checks argv arrays, ran them with &lt;code&gt;shell: false&lt;/code&gt;, and thought I was done. Then I found that the local web UI's &lt;code&gt;PUT&lt;/code&gt; replaced the whole document — including the checks map — and it's unauthenticated by design. So anything that could reach that port could install &lt;code&gt;["/bin/sh", "-c", "…"]&lt;/code&gt; as the check, and the next hand-back would run it. I reproduced it end to end: &lt;code&gt;200 OK&lt;/code&gt;, schema-valid, payload executed. &lt;code&gt;shell: false&lt;/code&gt; is no defence when the argv &lt;em&gt;is&lt;/em&gt; a shell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And "measured" means "measured on my machine" until CI exists.&lt;/strong&gt; A grace window for capturing a check's trailing output was measured carefully — a hundred bytes to a million, ten runs each, plus deliberate CPU saturation. All of it on one 8-core laptop. The first 2-core CI runner it ever met dropped a line on the first job. Three separate timing assumptions in this project have now failed that way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest limits
&lt;/h2&gt;

&lt;p&gt;A pass proves a declared command exited zero on a named tree. &lt;strong&gt;It does not prove the work is correct.&lt;/strong&gt; An agent that writes a passing test for broken code defeats this completely, and the tool says so on the card rather than in a footnote.&lt;/p&gt;

&lt;p&gt;Until you declare a check, it proves nothing at all — cards move on the agent's word, like everywhere else. There are no dependency graphs. And it's one developer, one machine: no accounts, no permissions, no team features.&lt;/p&gt;

&lt;h2&gt;
  
  
  It was built using itself
&lt;/h2&gt;

&lt;p&gt;Every feature was used to build the next one, and the board in the repo is the real one — &lt;strong&gt;75 cards and 274 notes, about 43,000 words&lt;/strong&gt;, written by the agent as it worked, including the mistakes. A locking bug that silently lost writes. A safety check whose error handling turned a crash into total silence. A test that passed against a file the tracker itself had just modified — caught by the feature that had shipped hours earlier, which promptly caught its own author.&lt;/p&gt;

&lt;p&gt;That last one is my favourite thing in the project. The tool's first real catch was the tool catching me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/albertoclemente/shipward" rel="noopener noreferrer"&gt;github.com/albertoclemente/shipward&lt;/a&gt;&lt;/strong&gt; — MIT, zero dependencies, no build step, Node 20+. 547 tests.&lt;/p&gt;

&lt;p&gt;If you run coding agents, I'd genuinely like to know whether this happens to you too: an agent closing something that later turned out not to hold. I don't know yet whether I'm unusual.&lt;/p&gt;

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