<?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: SYED-RAFI-NAQVI</title>
    <description>The latest articles on DEV Community by SYED-RAFI-NAQVI (@syedrafinaqvi).</description>
    <link>https://dev.to/syedrafinaqvi</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%2F559203%2Fe43d6951-3b84-4c4e-8b53-ad7ffdd77a7d.jpeg</url>
      <title>DEV Community: SYED-RAFI-NAQVI</title>
      <link>https://dev.to/syedrafinaqvi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/syedrafinaqvi"/>
    <language>en</language>
    <item>
      <title>I gave a 10-line agent a CRM world and asked it for one number</title>
      <dc:creator>SYED-RAFI-NAQVI</dc:creator>
      <pubDate>Fri, 18 Sep 2026 13:49:14 +0000</pubDate>
      <link>https://dev.to/syedrafinaqvi/i-gave-a-10-line-agent-a-crm-world-and-asked-it-for-one-number-32ep</link>
      <guid>https://dev.to/syedrafinaqvi/i-gave-a-10-line-agent-a-crm-world-and-asked-it-for-one-number-32ep</guid>
      <description>&lt;h1&gt;
  
  
  I gave a 10-line agent a CRM world and asked it for one number
&lt;/h1&gt;

&lt;p&gt;Last week I wanted to know whether my agent could do sales operations, not just talk about them. Asking it "what is the weighted pipeline?" and checking the answer by eye is a vibe check, not a test. So I built a small test world for it instead. Here is the full loop: ten lines of agent, one number, a failure I could actually debug, and a pass that meant something.&lt;/p&gt;

&lt;h2&gt;
  
  
  The world
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://silo.burn0.dev" rel="noopener noreferrer"&gt;Silo&lt;/a&gt; is a local-first simulation layer for testing AI agents. You bring your own agent (any framework, even a raw API loop), and Silo drops it into a realistic simulated business environment with tools, seeded state, tasks, and deterministic verifiers that grade what the agent did, not what it said. It is TypeScript-first and open source, at v0.4.0, early and pre-1.0, so breaking changes are expected.&lt;/p&gt;

&lt;p&gt;Setup took about two minutes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @burn0/silo
npx @burn0/silo init demo &lt;span class="nt"&gt;--template&lt;/span&gt; crm
npx @burn0/silo &lt;span class="nb"&gt;env &lt;/span&gt;validate &lt;span class="nt"&gt;--env&lt;/span&gt; demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validation came back clean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OK   demo
data=9 tasks=6 tools=42 verifiers=6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One honest gotcha: my scratch project's &lt;code&gt;package.json&lt;/code&gt; was missing &lt;code&gt;"type": "module"&lt;/code&gt;, and the verifier typecheck failed with a cryptic complaint about top-level exports in a CommonJS module. Adding &lt;code&gt;"type": "module"&lt;/code&gt; fixed it. The CRM template ships with 6 tasks, 42 tools (listing leads, converting them, reassigning opportunities, running pipeline forecasts), and 6 verifiers. Everything lives as plain TypeScript and JSON inside &lt;code&gt;.silo/environments/demo&lt;/code&gt;, so you can read and edit all of it.&lt;/p&gt;

&lt;p&gt;The task I picked was &lt;code&gt;TASK-004&lt;/code&gt;: &lt;em&gt;"Amara Osei needs a single number for the board: the probability-weighted value of everything currently open across the whole team, in US dollars. Report that figure."&lt;/em&gt; Easy difficulty, a question rather than a mutation. A good first blood.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent
&lt;/h2&gt;

&lt;p&gt;Silo does not give you an agent. It gives you a world and a boundary. Your agent is one ordinary file that default-exports a function. Silo calls it with the task, the tool list, and a &lt;code&gt;callTool&lt;/code&gt; function, and your function returns &lt;code&gt;{ output }&lt;/code&gt;. Mine has no LLM in it at all. It is deliberately dumb:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;callTool&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;summary&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pipeline_summary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;weighted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalWeightedAmount&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`The probability-weighted value of open pipeline is $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;weighted&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; USD.`&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten lines. It asks the world for the pipeline summary and reports the weighted total. The point of testing a dumb agent first is that when something fails, you know it was the agent, not the prompt.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npx @burn0/silo run &lt;span class="nt"&gt;--env&lt;/span&gt; demo &lt;span class="nt"&gt;--task&lt;/span&gt; TASK-004
&lt;span class="go"&gt;
  Task          TASK-004 - Report the weighted value of open pipeline
  Result        FAIL
  Reward        0.33

  Failed
  ✗ The reported weighted total is correct
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things made this failure worth having. First, the verifier did not grade my vibes. It compared my answer against a number it derived from the seeded world itself: &lt;em&gt;"answered 0, expected 507500"&lt;/em&gt;. I had guessed the wrong shape for the tool output, so my agent reported $0. The correct figure was $507,500, and it was not written down anywhere for the agent to peek at.&lt;/p&gt;

&lt;p&gt;Second, the failure left a legible trail. Every run saves a directory with &lt;code&gt;result.json&lt;/code&gt;, &lt;code&gt;trace.jsonl&lt;/code&gt;, and &lt;code&gt;state-diff.json&lt;/code&gt;. The trace showed the exact tool call, the exact tool result, and my exact output in sequence. I found the bug in about thirty seconds: &lt;code&gt;callTool&lt;/code&gt; returns &lt;code&gt;{ output, isError }&lt;/code&gt;, not the raw output, and the weighted total sits at &lt;code&gt;totalWeightedAmount.amount&lt;/code&gt;. I also noticed something instructive in &lt;code&gt;result.json&lt;/code&gt;: even while failing, my agent scored 0.33, because an optional check still passed. Partial credit is explicit here, which is a good property in an eval.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pass
&lt;/h2&gt;

&lt;p&gt;Two-line fix, rerun:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Task          TASK-004 - Report the weighted value of open pipeline
  Result        PASS
  Reward        1.00

  Checks        3 / 3
  Required      1 / 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is what actually got checked, straight from the verifier labels:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The reported weighted total is correct.&lt;/strong&gt; My answer matched the world: $507,500.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The total is the figure the answer closes on.&lt;/strong&gt; The answer has to end on the number, not bury it in a paragraph. A small thing, but it is exactly the kind of sloppy answer an LLM would give that an eye-test would forgive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answering left the world unchanged.&lt;/strong&gt; &lt;code&gt;state-diff.json&lt;/code&gt; confirmed nothing mutated. This is the one that sold me. A question task should never change the CRM. If my agent had helpfully "tidied up" an opportunity while reading it, that check would have caught it, and an answer-only eval never could.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every rollout starts from a fresh copy of the world, so runs cannot contaminate each other. The same agent on the same task is deterministic here, which makes the number a real regression gate rather than a flaky metric.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the medium one
&lt;/h2&gt;

&lt;p&gt;If you run this yourself, &lt;code&gt;TASK-002&lt;/code&gt; is the more interesting homework: &lt;em&gt;"Tomas Bergstrom has left the company and his account is deactivated, but his open deals are still sitting under his name. Move every one of his open opportunities to Priya Nair (USR-003)... Deals he already closed stay as they are."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is the task where an agent can name the right rep, sound completely confident, and still forget to reassign half the deals, or reassign the closed ones too. The verifier checks the world afterward, so confidence does not score. &lt;code&gt;state-diff.json&lt;/code&gt; will show you exactly which deals moved and which did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is going
&lt;/h2&gt;

&lt;p&gt;Silo is at v0.4.0 with CRM and ERP templates, a blank template for your own domain, and finance, support, and project-management worlds marked as coming soon. Everything runs on your machine: no account, no API key, nothing leaves your laptop.&lt;/p&gt;

&lt;p&gt;If you are shipping an agent that touches a CRM, an ERP, or anything with state that matters, stop grading answers and start grading worlds. The repo is &lt;a href="https://github.com/burn0-dev/silo" rel="noopener noreferrer"&gt;github.com/burn0-dev/silo&lt;/a&gt;, docs are at &lt;a href="https://docs.burn0.dev/silo/introduction" rel="noopener noreferrer"&gt;docs.burn0.dev/silo&lt;/a&gt;, and &lt;code&gt;npm install @burn0/silo&lt;/code&gt; is the whole install.&lt;/p&gt;

&lt;p&gt;My next run: wire a real LLM into that 10-line agent and watch &lt;code&gt;TASK-002&lt;/code&gt; go sideways. I will report back with the trace.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>testing</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I caught my AI agent lying to me</title>
      <dc:creator>SYED-RAFI-NAQVI</dc:creator>
      <pubDate>Thu, 17 Sep 2026 13:49:14 +0000</pubDate>
      <link>https://dev.to/syedrafinaqvi/i-caught-my-ai-agent-lying-to-me-5h0e</link>
      <guid>https://dev.to/syedrafinaqvi/i-caught-my-ai-agent-lying-to-me-5h0e</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Then I looked at what the agent actually did. Nothing. It never touched the data. It guessed.&lt;/p&gt;

&lt;p&gt;That is the moment I stopped trusting text-based evals for agents, and the reason I have been playing with &lt;a href="https://silo.burn0.dev" rel="noopener noreferrer"&gt;Silo&lt;/a&gt; since.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4tw7zul83hlqixxz6mus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4tw7zul83hlqixxz6mus.png" alt="The Silo landing page: the simulation layer for AI agents" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Your eval grades essays. Your agent does surgery.
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;There are roughly three levels to this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unit tests.&lt;/strong&gt; Does the code work?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt evals.&lt;/strong&gt; Does the answer look right?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actually watching what the agent did.&lt;/strong&gt; Did the world end up in the right state?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five-minute version
&lt;/h2&gt;

&lt;p&gt;You need Node 22+ and &lt;code&gt;"type": "module"&lt;/code&gt; in your package.json. Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @burn0/silo
npx @burn0/silo init demo &lt;span class="nt"&gt;--template&lt;/span&gt; crm
npx @burn0/silo &lt;span class="nb"&gt;env &lt;/span&gt;validate &lt;span class="nt"&gt;--env&lt;/span&gt; demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OK   demo
data=9 tasks=6 tools=42 verifiers=6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.)&lt;/p&gt;

&lt;p&gt;Write an agent. Anything that default-exports a function counts, any framework or a raw API loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// silo.agent.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;callTool&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;forecast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;forecast_report&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;weightedAmount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Open pipeline is worth $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;weightedAmount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it against a real task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @burn0/silo run &lt;span class="nt"&gt;--env&lt;/span&gt; demo &lt;span class="nt"&gt;--task&lt;/span&gt; TASK-004 &lt;span class="nt"&gt;--agent&lt;/span&gt; ./silo.agent.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fine. Now here is the part that got me.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verifier does not read your agent's essay
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Two design rules keep this honest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time is simulated.&lt;/strong&gt; &lt;code&gt;state.now&lt;/code&gt; is the only clock. Nothing reads &lt;code&gt;Date.now()&lt;/code&gt;, so a run from Tuesday reproduces exactly on Friday.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every run leaves evidence.&lt;/strong&gt; Each rollout writes a directory: &lt;code&gt;trace.jsonl&lt;/code&gt; (every event, append-only), &lt;code&gt;result.json&lt;/code&gt; (checks, reward, tool errors), &lt;code&gt;state-diff.json&lt;/code&gt; (exactly what changed), &lt;code&gt;run.json&lt;/code&gt; (task, verifier, timings).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj94192ws7clie5r81q9v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj94192ws7clie5r81q9v.png" alt="How Silo works: your agent acts inside an isolated runtime, and the outcome is inspected with traces, state diffs, and run artifacts" width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My favorite detail: &lt;code&gt;result.json&lt;/code&gt; and &lt;code&gt;state-diff.json&lt;/code&gt; 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, &lt;code&gt;--runs 5&lt;/code&gt; repeats the task so you see the real distribution instead of the lucky run you would have screenshotted.&lt;/p&gt;

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

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Links, since you will ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://silo.burn0.dev" rel="noopener noreferrer"&gt;silo.burn0.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.burn0.dev/silo/introduction" rel="noopener noreferrer"&gt;docs.burn0.dev/silo/introduction&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/burn0-dev/silo" rel="noopener noreferrer"&gt;github.com/burn0-dev/silo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>testing</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
