<?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: ForgeCoreAi</title>
    <description>The latest articles on DEV Community by ForgeCoreAi (forgecoreai).</description>
    <link>https://dev.to/forgecoreai</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%2Forganization%2Fprofile_image%2F15239%2F761ff3bc-eb01-4ede-8647-6faf61afdb86.png</url>
      <title>DEV Community: ForgeCoreAi</title>
      <link>https://dev.to/forgecoreai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/forgecoreai"/>
    <language>en</language>
    <item>
      <title>I built an agentic workforce where done means a command exited 0</title>
      <dc:creator>ForgeCoreAi</dc:creator>
      <pubDate>Sun, 11 Oct 2026 11:20:03 +0000</pubDate>
      <link>https://dev.to/forgecoreai/i-built-an-agentic-workforce-where-done-means-a-command-exited-0-475i</link>
      <guid>https://dev.to/forgecoreai/i-built-an-agentic-workforce-where-done-means-a-command-exited-0-475i</guid>
      <description>&lt;p&gt;Every failure I have had with coding agents looks the same at the end. The agent writes a summary that reads like&lt;br&gt;
success: the feature is implemented, the tests pass, the branch is ready. Then I open the thing, and half of it is not&lt;br&gt;
there.&lt;/p&gt;

&lt;p&gt;The interesting part is that the model is not lying. It has no way to check. It generated the most plausible&lt;br&gt;
continuation of the conversation, and "done, with a tidy summary" is an extremely plausible continuation. Nothing in&lt;br&gt;
the loop ever asked for evidence.&lt;/p&gt;

&lt;p&gt;So I stopped trying to make the model more honest and changed the shape of the loop instead. In the agentic workforce I run now, no&lt;br&gt;
model is allowed to say done. A command says done, and it has to exit 0.&lt;/p&gt;
&lt;h2&gt;
  
  
  The proof command gets written before the work exists
&lt;/h2&gt;

&lt;p&gt;When I type an ask, the first thing that happens is not work. It is a contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/crew add a pricing page with a monthly / annual toggle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The card that opens carries six things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;goal&lt;/strong&gt; - what this is, in my words&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;artifact&lt;/strong&gt; - the file or surface that changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;where it lands&lt;/strong&gt; - the branch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;done when&lt;/strong&gt; - the same thing, in plain language&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;proof command&lt;/strong&gt; - the exact command whose exit code decides&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;budget&lt;/strong&gt; - tokens, so a run cannot spin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The order is the point. The proof is frozen while the work does not exist yet. At that moment I am uninformed and&lt;br&gt;
honest, so I write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run &lt;span class="nb"&gt;test&lt;/span&gt;:e2e &lt;span class="nt"&gt;--&lt;/span&gt; pricing.spec.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and not "looks right to me". Later, with work already on the branch and the temptation to call it finished, the&lt;br&gt;
command is a fact from an earlier conversation. Neither I nor the agent can quietly move it. That is most of the value:&lt;br&gt;
not detection, but removing the option.&lt;/p&gt;
&lt;h2&gt;
  
  
  Done is decided by a tool, not by a model
&lt;/h2&gt;

&lt;p&gt;In the workforce, done is not a status an agent sets. It is the exit code of that command, run as a tool call, at the point&lt;br&gt;
where the card would otherwise close.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;worker&lt;/strong&gt; does the work&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;proof&lt;/strong&gt; runs, exactly as written when the card opened; a non-zero exit is the only failure signal that counts&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;coordinator&lt;/strong&gt; re-runs the proof before the card can close, so one lucky green run does not close it&lt;/li&gt;
&lt;li&gt;a card that asks for a stronger guarantee gets one independent verifier run instead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model writes the code and the summary. It never writes the verdict.&lt;/p&gt;
&lt;h2&gt;
  
  
  One owner per card, one writer per card
&lt;/h2&gt;

&lt;p&gt;The second failure mode is drift: three agents on the same branch, each doing something locally reasonable, together&lt;br&gt;
producing nothing. So a card has one writer, and a card has one owner - a coordinator that wakes on every card event&lt;br&gt;
with the whole record in hand and takes exactly one decision: retry, rescope, split, or ask me.&lt;/p&gt;

&lt;p&gt;The asks are bounded too. Before any work starts, the chat asks at most five questions in one batch, or none. After&lt;br&gt;
that I am out of the loop until the card ends, and it ends either with a verified result in the thread I asked from, or&lt;br&gt;
with one concrete question. Token budgets are per card, so a run that reaches its budget stops instead of burning&lt;br&gt;
through the rest of the night, and a worker that fails five tool calls in a row stops itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it looks like from the outside
&lt;/h2&gt;

&lt;p&gt;Illustrative card, from the demo board:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;16:12:04  /crew add a pricing page with a monthly / annual toggle
16:12:09  contract: artifact app/pricing/page.tsx
          proof    npm run test:e2e -- pricing.spec.ts
16:12:11  card opened - coordinator owns it, your turn ends
   ...
16:41:21  done - proof exit 0 - 2 runs, 1 fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last line is what reaches the chat: not a summary of feelings, the proof that passed and how many attempts it&lt;br&gt;
took. If the proof had failed twice, I would have got one question instead, with the two failure lines attached.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where this shape stops working
&lt;/h2&gt;

&lt;p&gt;Three honest limits, because a post about verification that only lists wins is its own kind of bullshit.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A proof proves what you wrote, not what you meant.&lt;/strong&gt; &lt;code&gt;test:e2e -- pricing.spec.ts&lt;/code&gt; can be green while the toggle
does nothing, if the test asserts the wrong thing. The leverage is all in writing the command well, and that is
human work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is bad for work where done is a judgement.&lt;/strong&gt; Naming, positioning, "write the launch post" - no command decides
those. The workforce falls back to a person, which is correct behaviour, but it means this shape only pays off on tasks
with a checkable end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proofs cost a minute each.&lt;/strong&gt; On trivial work that is a bad trade. On the work you would otherwise re-check at
23:00 anyway, it is the cheapest minute in the task.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is also a fourth thing I did not expect: because the proof fixes the artifact, "can you also just..." turns into&lt;br&gt;
a second card instead of a scope creep inside the first one. Annoying, and correct.&lt;/p&gt;
&lt;h2&gt;
  
  
  The pattern is the point, not my plugin
&lt;/h2&gt;

&lt;p&gt;The generalisable rule is not complicated:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;before the agent starts, write down an executable definition of done;&lt;/li&gt;
&lt;li&gt;let only that definition close the loop;&lt;/li&gt;
&lt;li&gt;let a tool run it, not the model that did the work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Any agent framework can do this. Most do not, because "done" is much easier to print than to prove.&lt;/p&gt;

&lt;p&gt;I built it as a plugin for Hermes Agent - Apache-2.0, self-hosted, runs on your own machine, no telemetry - and the&lt;br&gt;
whole thing is &lt;a href="https://github.com/macd2/Crew" rel="noopener noreferrer"&gt;github.com/macd2/Crew&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes plugins &lt;span class="nb"&gt;install &lt;/span&gt;macd2/Crew
python3 ~/.hermes/plugins/crew/install.py &lt;span class="nt"&gt;--profile&lt;/span&gt; NAME
hermes &lt;span class="nt"&gt;-p&lt;/span&gt; NAME plugins doctor crew
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you would rather watch it before installing anything - the 53 second launch film, one ask through to the verified&lt;br&gt;
result:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/uQcXAd70pFw" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crew.forgecoreai.com/" rel="noopener noreferrer"&gt;crew.forgecoreai.com&lt;/a&gt; is the same loop as a page, if you would rather read than watch.&lt;/p&gt;

&lt;p&gt;So the question I would actually like answered in the comments: &lt;strong&gt;what does done mean in your setup?&lt;/strong&gt; Do you have a&lt;br&gt;
command, or is it a feeling? I am collecting the ones people genuinely trust - a solo dev with &lt;code&gt;pytest&lt;/code&gt;, a team with a&lt;br&gt;
deploy smoke test, someone checking a number in a dashboard. A proof you cannot write is a task you cannot delegate,&lt;br&gt;
and the interesting stories are the tasks where you had to admit that.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drafted with an AI assistant and edited by me.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>showdev</category>
      <category>ai</category>
      <category>devtools</category>
      <category>hermes</category>
    </item>
  </channel>
</rss>
