<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[burn0]]></title><description><![CDATA[burn0]]></description><link>https://burn0.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>burn0</title><link>https://burn0.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 08:00:11 GMT</lastBuildDate><atom:link href="https://burn0.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I caught my AI agent lying to me]]></title><description><![CDATA[Last week I gave an AI agent a simple job: look at a sales pipeline and tell me what it is worth. It answered in seconds, confident, well formatted, numbers included. My eval script graded the respons]]></description><link>https://burn0.hashnode.dev/i-caught-my-ai-agent-lying-to-me</link><guid isPermaLink="true">https://burn0.hashnode.dev/i-caught-my-ai-agent-lying-to-me</guid><category><![CDATA[ai agents]]></category><category><![CDATA[Testing]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[llm]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[SYED RAFI]]></dc:creator><pubDate>Thu, 17 Sep 2026 19:25:45 GMT</pubDate><content:encoded><![CDATA[<p>Last week I gave an AI agent a simple job: look at a sales pipeline and tell me what it is worth. It answered in seconds, confident, well formatted, numbers included. My eval script graded the response and gave it a PASS.</p>
<p>Then I looked at what the agent actually did. Nothing. It never touched the data. It guessed.</p>
<p>That is the moment I stopped trusting text-based evals for agents, and the reason I have been playing with <a href="https://silo.burn0.dev">Silo</a> since.</p>
<img src="https://cdn.hashnode.com/uploads/covers/678b9941424f06bce5661307/0f5381bf-8cb7-444e-9204-1f4869ec180e.png" alt="" style="display:block;margin:0 auto" />

<h2>Your eval grades essays. Your agent does surgery.</h2>
<p>Here is the thing nobody says out loud: most agent evals are essay grading. You show the agent a prompt, it writes something back, and you (or an LLM judge) score how good the writing looks. That was fine when agents were chatbots.</p>
<p>Modern agents are not chatbots. They call tools, update records, move inventory, change the state of systems. An agent can write a beautiful summary of a pipeline while leaving every deal in the wrong stage. If your eval only reads the transcript, that failure is invisible. You ship it, and production finds out for you.</p>
<p>There are roughly three levels to this:</p>
<ol>
<li><p><strong>Unit tests.</strong> Does the code work?</p>
</li>
<li><p><strong>Prompt evals.</strong> Does the answer look right?</p>
</li>
<li><p><strong>Actually watching what the agent did.</strong> Did the world end up in the right state?</p>
</li>
</ol>
<p>Silo is a tool for level 3. It is open source (MIT), local-first, TypeScript-first, and it gives your existing agent a realistic simulated world to work in: tools, seeded data, tasks, and verifiers that grade outcomes deterministically. Nothing leaves your machine.</p>
<h2>The five-minute version</h2>
<p>You need Node 22+ and <code>"type": "module"</code> in your package.json. Then:</p>
<pre><code class="language-bash">npm i @burn0/silo
npx @burn0/silo init demo --template crm
npx @burn0/silo env validate --env demo
</code></pre>
<pre><code class="language-plaintext">OK   demo
data=9 tasks=6 tools=42 verifiers=6
</code></pre>
<p>You now have a realistic simulated B2B sales pipeline on your laptop: 9 data collections, 6 tasks, 42 tools an agent can call, 6 verifiers that decide pass or fail. Small enough to hold in your head, which is exactly why it is the best template to start with. (There is also an ERP template with 185 tools and deliberately messy seed data. An invoice that bills more than was received. A payment that failed on stale bank details. Someone on the Silo team has seen things.)</p>
<p>Write an agent. Anything that default-exports a function counts, any framework or a raw API loop:</p>
<pre><code class="language-js">// silo.agent.js
export default async function agent({ callTool }) {
  const forecast = await callTool("forecast_report", {});
  const { weightedAmount } = forecast.output;

  return { output: `Open pipeline is worth $${weightedAmount.amount}` };
}
</code></pre>
<p>Run it against a real task:</p>
<pre><code class="language-bash">npx @burn0/silo run --env demo --task TASK-004 --agent ./silo.agent.js
</code></pre>
<pre><code class="language-plaintext">  Task          TASK-004 — Report the weighted value of open pipeline
  Result        PASS
  Reward        1.00

  Tool calls    1
  Checks        3 / 3
  Required      1 / 1

  Run saved: .silo/runs/run_20260915012734_4t01
</code></pre>
<p>Fine. Now here is the part that got me.</p>
<h2>The verifier does not read your agent's essay</h2>
<p>In Silo, your agent never sees the world state. It gets the task instruction, the tool schemas, and cloned tool output. If it wants to know something, it has to call a tool for it, exactly like production.</p>
<p>Grading works the same way in reverse. A task passes because the world changed correctly, never because the agent said the right words. Remember my lying agent from the top of this post? Under Silo it fails loudly: zero tool calls, checks unmet, done. No partial credit for a confident tone.</p>
<p>Two design rules keep this honest:</p>
<ul>
<li><p><strong>Time is simulated.</strong> <code>state.now</code> is the only clock. Nothing reads <code>Date.now()</code>, so a run from Tuesday reproduces exactly on Friday.</p>
</li>
<li><p><strong>Every run leaves evidence.</strong> Each rollout writes a directory: <code>trace.jsonl</code> (every event, append-only), <code>result.json</code> (checks, reward, tool errors), <code>state-diff.json</code> (exactly what changed), <code>run.json</code> (task, verifier, timings).</p>
</li>
</ul>
<img src="https://mintcdn.com/srn/EsyJ_ClWCcI_vDLA/silo/images/how-it-works.png?w=2500&amp;fit=max&amp;auto=format&amp;n=EsyJ_ClWCcI_vDLA&amp;q=85&amp;s=f0ec7c0deae5545d7a66d0d67ffb6833" alt="How Silo works: your agent acts inside an isolated runtime, and the outcome is inspected with traces, state diffs, and run artifacts" style="display:block;margin:0 auto" />

<p>My favorite detail: <code>result.json</code> and <code>state-diff.json</code> contain no timestamps or run ids. That makes them an exact regression oracle. Diff two runs and any difference is a genuine behavioral change, not clock noise. And when your agent is non-deterministic, <code>--runs 5</code> repeats the task so you see the real distribution instead of the lucky run you would have screenshotted.</p>
<h2>The honest caveats</h2>
<p>Silo is early, v0.4.0, and the maintainers say plainly to expect breaking changes before 1.0. Packaged adapters for LangChain, Vercel AI SDK, OpenAI, Anthropic, and Mastra are still roadmap, as are an MCP server and LLM judges to sit alongside the deterministic checks. If you need those today, you will be writing some glue.</p>
<p>But the core loop works right now, and it rearranged how I think about agent testing in about an afternoon. Stop asking "did it write a good answer" and start asking "is the world right." Those are different questions, and only one of them protects production.</p>
<p>Links, since you will ask:</p>
<ul>
<li><p>Site: <a href="https://silo.burn0.dev">silo.burn0.dev</a></p>
</li>
<li><p>Docs: <a href="https://docs.burn0.dev/silo/introduction">docs.burn0.dev/silo/introduction</a></p>
</li>
<li><p>Repo: <a href="https://github.com/burn0-dev/silo">github.com/burn0-dev/silo</a></p>
</li>
</ul>
<p>Start with the CRM template. Then try to make your agent lie to the verifier. It is harder than you think, and that is the point.</p>
]]></content:encoded></item></channel></rss>