<?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: Adrien | Building Alfred</title>
    <description>The latest articles on DEV Community by Adrien | Building Alfred (@adriencr81).</description>
    <link>https://dev.to/adriencr81</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%2F4057139%2F9eb33587-e6b0-4512-8f8a-176adbe6b28c.png</url>
      <title>DEV Community: Adrien | Building Alfred</title>
      <link>https://dev.to/adriencr81</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adriencr81"/>
    <language>en</language>
    <item>
      <title>How do you verify what your AI agent actually did?</title>
      <dc:creator>Adrien | Building Alfred</dc:creator>
      <pubDate>Sat, 01 Aug 2026 13:22:01 +0000</pubDate>
      <link>https://dev.to/adriencr81/how-do-you-verify-what-your-ai-agent-actually-did-3f9f</link>
      <guid>https://dev.to/adriencr81/how-do-you-verify-what-your-ai-agent-actually-did-3f9f</guid>
      <description>&lt;p&gt;Short answer: you can't, in general. You can only verify a specific claim, at a&lt;br&gt;
specific level of proof, and the level you need depends on what happens if the&lt;br&gt;
agent is wrong.&lt;/p&gt;

&lt;p&gt;That sounds like a dodge. It isn't. It's the reason this question generates so&lt;br&gt;
much confused advice: "verify what the agent did" bundles six different&lt;br&gt;
questions, and most tools answer one of them while sounding like they answer all&lt;br&gt;
six. A signed receipt proves an API call happened. It says nothing about whether&lt;br&gt;
that call was allowed. An observability dashboard shows you the execution path.&lt;br&gt;
It says nothing about whether the work should count.&lt;/p&gt;

&lt;p&gt;I test critical systems for a living — verification and qualification in cyber&lt;br&gt;
and space. In that world nothing ships because someone says it works. Every&lt;br&gt;
requirement has a test, every test has a pass criterion, every result leaves&lt;br&gt;
evidence. A claim with no evidence attached has a name: it's a non-conformity.&lt;/p&gt;

&lt;p&gt;Then I looked at how we deploy AI agents, and we accept from them exactly what we&lt;br&gt;
refuse from any critical system — that they write their own report certifying&lt;br&gt;
they did their job.&lt;/p&gt;

&lt;p&gt;So here is the ladder I use. Six levels, ordered by the question they answer.&lt;br&gt;
Plus two things that everyone mistakes for levels, and that aren't.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure up front: I maintain an open-source tool in this space. It sits at&lt;br&gt;
levels 1 to 3 and I'll say exactly where it stops.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  V0 — Self-report
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; what does the agent say it did?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invoice sent."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Proves:&lt;/strong&gt; nothing.&lt;/p&gt;

&lt;p&gt;This isn't a rhetorical flourish. The agent generates both the work and the&lt;br&gt;
report on the work, with the same model, in the same context. Research on&lt;br&gt;
self-evaluation has a name for the resulting bias — models systematically score&lt;br&gt;
their own output higher than they score other models'. Asking an agent whether it&lt;br&gt;
succeeded is asking a witness to testify about themselves, with no cross-&lt;br&gt;
examination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When it's enough:&lt;/strong&gt; when nothing real happens as a result. Which, for an agent&lt;br&gt;
with tools, is never.&lt;/p&gt;


&lt;h2&gt;
  
  
  V1 — Execution trace
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; what sequence of calls actually ran?&lt;/p&gt;

&lt;p&gt;Structured spans: which tool, which arguments, when, what came back, and whether&lt;br&gt;
it errored. OpenTelemetry's GenAI semantic conventions cover this; so does any&lt;br&gt;
structured log with a correlation ID.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proves:&lt;/strong&gt; that a call happened, with these arguments, and how it terminated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't prove:&lt;/strong&gt; that the call was permitted, or that it had any effect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; low, if you already emit traces.&lt;/p&gt;

&lt;p&gt;One thing V1 already catches that people miss: &lt;strong&gt;the agent reporting success over&lt;br&gt;
a tool call that failed.&lt;/strong&gt; The error is right there in the span status. If your&lt;br&gt;
report doesn't surface it, that's a reporting gap, not a detection problem — the&lt;br&gt;
evidence was already in your store.&lt;/p&gt;


&lt;h2&gt;
  
  
  V2 — Evidence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; do I hold an artifact I could put in front of someone who doubts me?&lt;/p&gt;

&lt;p&gt;A Message-ID. A SHA-256 of the file. The ID of the created record. The&lt;br&gt;
request/response payload, signed. An append-only log entry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proves:&lt;/strong&gt; that a specific, checkable artifact is attached to the action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't prove:&lt;/strong&gt; that the intended effect exists in the target system. A receipt&lt;br&gt;
is transport-layer proof. The vendors building receipt layers say this plainly in&lt;br&gt;
their own documentation; their users forget it by the time it reaches a slide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When it's enough:&lt;/strong&gt; disputes, reconstruction, non-repudiation.&lt;/p&gt;


&lt;h2&gt;
  
  
  V3 — Authorization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; was this action allowed?&lt;/p&gt;

&lt;p&gt;Here you need something that doesn't come from the run: a specification, written&lt;br&gt;
&lt;em&gt;before&lt;/em&gt; execution, that says what the agent may do. Allowed tools. Thresholds.&lt;br&gt;
Required follow-ups. Budget. Escalation conditions. Then you check the observed&lt;br&gt;
trace against it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proves:&lt;/strong&gt; that each observed action is, or is not, conformant to a declared&lt;br&gt;
mandate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't prove:&lt;/strong&gt; that the action produced its effect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; low. The work is writing the specification, not writing code.&lt;/p&gt;

&lt;p&gt;This is the level the market talks about constantly and ships least. It shows up&lt;br&gt;
as "task contract", "policy", "acceptance criteria", "define done" — everybody&lt;br&gt;
names it, almost nobody hands you the file format. And without it, the levels&lt;br&gt;
below are inert: a perfect execution trace of an action nobody authorized is&lt;br&gt;
just a well-documented incident.&lt;/p&gt;

&lt;p&gt;In qualification terms: evidence of execution is worthless without a requirement&lt;br&gt;
to hold it against. That's not a philosophy, it's the whole reason the V-model&lt;br&gt;
has a left-hand side.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;refund-bot-v3&lt;/span&gt;

&lt;span class="na"&gt;allowed_tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;read_order&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;issue_refund&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;notify_customer&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;escalate_to_human&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;daily_budget_eur&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5.00&lt;/span&gt;

&lt;span class="na"&gt;forbidden_actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;issue_refund_above_100_eur&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;send_marketing&lt;/span&gt;

&lt;span class="na"&gt;escalate_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;tool_error_rate &amp;gt; &lt;/span&gt;&lt;span class="m"&gt;0.10&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;budget_used &amp;gt; &lt;/span&gt;&lt;span class="m"&gt;0.80&lt;/span&gt;
&lt;span class="na"&gt;escalation_tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;escalate_to_human&lt;/span&gt;

&lt;span class="na"&gt;required_actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;when_tool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;issue_refund&lt;/span&gt;
    &lt;span class="na"&gt;require_tool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;notify_customer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  V4 — Independent outcome verification
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; did the intended change actually happen?&lt;/p&gt;

&lt;p&gt;Don't ask the agent. Go look. Query the database. Search the Sent folder. Hit the&lt;br&gt;
API and check the record exists. Crucially, &lt;strong&gt;use a different path than the action&lt;br&gt;
used&lt;/strong&gt; — if the write and the check go through the same client, they share the&lt;br&gt;
same failure modes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proves:&lt;/strong&gt; that the system of record carries the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't prove:&lt;/strong&gt; that it was the right thing to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; high. You need a verifier per action type, and you have to maintain them.&lt;/p&gt;

&lt;p&gt;This is the only level that closes the gap between "the call returned 200" and&lt;br&gt;
"the effect exists". Traces cannot do it — a trace records that a request was&lt;br&gt;
sent and a response came back, not that the row landed. If your agent moves&lt;br&gt;
money, sends things to customers, or does anything you can't undo, this level&lt;br&gt;
isn't optional.&lt;/p&gt;




&lt;h2&gt;
  
  
  V5 — Preserved invariants
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; is what should have stayed true still true?&lt;/p&gt;

&lt;p&gt;This is the level almost nobody implements, and the one that catches the failure&lt;br&gt;
everyone complains about: the agent stayed inside its assigned scope and still&lt;br&gt;
broke something.&lt;/p&gt;

&lt;p&gt;The instinct is to write down what the agent must not do. Don't touch auth. Don't&lt;br&gt;
change the response shape. Don't modify the schema. And the list grows every time&lt;br&gt;
something new goes wrong, and it never closes — &lt;strong&gt;because the set of forbidden&lt;br&gt;
behaviors is infinite.&lt;/strong&gt; You are enumerating a complement, and complements of&lt;br&gt;
useful sets are unbounded.&lt;/p&gt;

&lt;p&gt;Qualification does the opposite. You don't enumerate the forbidden. You assert&lt;br&gt;
the invariants that must remain true, and you check them afterwards. "Fix null&lt;br&gt;
handling in &lt;code&gt;parse()&lt;/code&gt;" doesn't become "don't alter authentication". It becomes:&lt;br&gt;
null input returns an error, the public signature is unchanged, every existing&lt;br&gt;
caller's test still passes. That's a &lt;strong&gt;finite&lt;/strong&gt; set of assertions, it's&lt;br&gt;
executable, and it covers behaviors you never thought to forbid.&lt;/p&gt;

&lt;p&gt;Finite beats exhaustive. That's the whole trick.&lt;/p&gt;




&lt;h2&gt;
  
  
  The two things that are not levels
&lt;/h2&gt;

&lt;p&gt;Both of the AI-generated taxonomies I've seen on this topic get these wrong, and&lt;br&gt;
so do several vendor posts. They matter enough to name.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrity is a property, not a level
&lt;/h3&gt;

&lt;p&gt;Signing your logs, chaining hashes, append-only storage, timestamp attestation.&lt;br&gt;
Every taxonomy I've read puts "cryptographic audit trail" at the top as the&lt;br&gt;
highest level of assurance.&lt;/p&gt;

&lt;p&gt;It isn't a level. &lt;strong&gt;Signing a log tells you nothing new about what happened.&lt;/strong&gt; It&lt;br&gt;
tells you the record wasn't altered afterwards. A signed V1 trace is still a V1&lt;br&gt;
trace: it proves a call happened, tamper-evidently. Integrity is orthogonal — it&lt;br&gt;
strengthens whatever level you're at, and it's necessary exactly when your&lt;br&gt;
evidence will be contested. Adding it doesn't move you up the ladder.&lt;/p&gt;

&lt;h3&gt;
  
  
  A second model is a weak oracle, not a strong one
&lt;/h3&gt;

&lt;p&gt;One taxonomy ranked "use another AI as verifier" at level 7 and independent&lt;br&gt;
outcome verification at level 4. That's backwards.&lt;/p&gt;

&lt;p&gt;The axis that matters is &lt;strong&gt;how independent your oracle is from the thing that did&lt;br&gt;
the work&lt;/strong&gt;: the agent itself (worthless) → a second model (correlated blind&lt;br&gt;
spots, same training, similar failure modes) → a deterministic script → direct&lt;br&gt;
observation of the system of record. An LLM judge is useful for questions with no&lt;br&gt;
deterministic oracle, like whether a summary is faithful. It cannot outrank&lt;br&gt;
looking at the database.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where the tools actually sit
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LLM observability platforms (traces, spans, dashboards)&lt;/td&gt;
&lt;td&gt;V1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data/AI monitoring platforms&lt;/td&gt;
&lt;td&gt;V1 + upstream data quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signed receipt / proof-of-execution layers&lt;/td&gt;
&lt;td&gt;V2, strong integrity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise governance &amp;amp; evidence platforms&lt;/td&gt;
&lt;td&gt;V2–V3, strong integrity, regulated buyers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verification-receipt consultancies&lt;/td&gt;
&lt;td&gt;V4, delivered as a service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope-checking tools for coding agents&lt;/td&gt;
&lt;td&gt;V3 approximated by file paths, partial V5 via tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent identity / delegation (CIAM)&lt;/td&gt;
&lt;td&gt;different axis entirely&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last row matters. Verifying &lt;em&gt;who&lt;/em&gt; the agent is and verifying &lt;em&gt;what it did&lt;/em&gt;&lt;br&gt;
are different problems, and the current discourse blends them constantly. Both are&lt;br&gt;
necessary. Buying one thinking you got the other is how you end up with an&lt;br&gt;
auditable identity attached to unverified actions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify your verifier
&lt;/h2&gt;

&lt;p&gt;Whatever level you choose, one rule survives all of them: &lt;strong&gt;feed your checker a&lt;br&gt;
result you know is wrong, and confirm it rejects it.&lt;/strong&gt; An untested verifier is a&lt;br&gt;
belief, not a proof.&lt;/p&gt;

&lt;p&gt;Two failures from my own tool, both of which I shipped and later had to fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The verifier trusted the thing it was verifying.&lt;/strong&gt; My escalation check —&lt;br&gt;
"did the agent escalate when it was required to?" — read an attribute called&lt;br&gt;
&lt;code&gt;alfred.escalated&lt;/code&gt; from the trace. The agent wrote that attribute. So an agent&lt;br&gt;
that never escalated could set one boolean and switch off the very check watching&lt;br&gt;
it. The fix was to stop believing the declaration and count actual calls to the&lt;br&gt;
mandate's escalation tools: escalation is proven by an action, never by a&lt;br&gt;
self-reported flag. That is axis B in one bug — my oracle was not independent of&lt;br&gt;
the work it was checking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Silence read as success.&lt;/strong&gt; A tool call carrying no tool name was skipped by the&lt;br&gt;
allowlist check, quietly. Which means dropping one attribute waved &lt;em&gt;any&lt;/em&gt; call&lt;br&gt;
past the mandate. The rule now is that a tool which cannot be named cannot be&lt;br&gt;
allowed — an unverifiable call is a finding, not a blank.&lt;/p&gt;

&lt;p&gt;Both bugs share a shape, and it's the one to watch for: &lt;strong&gt;the check reported a&lt;br&gt;
clean run because it couldn't see, not because there was nothing to see.&lt;/strong&gt; An&lt;br&gt;
absence of findings and a finding of absence are not the same result, and most&lt;br&gt;
verifiers conflate them.&lt;/p&gt;

&lt;p&gt;So attack your own checker before you trust it. Feed it the run you know is bad.&lt;br&gt;
If it comes back green, you haven't built a verifier — you've built a formality.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to choose
&lt;/h2&gt;

&lt;p&gt;Pick by what you risk, not by what's available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nothing irreversible happens&lt;/strong&gt; → V1 is fine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Someone else must answer for the agent's behavior&lt;/strong&gt; — a client, an auditor, a
regulator → &lt;strong&gt;V3 is the floor.&lt;/strong&gt; A trace with no declared requirement is not an
audit trail; it's a log file with good marketing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Money, or anything you can't undo&lt;/strong&gt; → V4, with an independent oracle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broad autonomy over a system you care about&lt;/strong&gt; → V5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The evidence will be contested&lt;/strong&gt; → add integrity to whichever level you chose.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I build &lt;a href="https://github.com/adriencr81/Check-Alfred" rel="noopener noreferrer"&gt;Alfred&lt;/a&gt;, an Apache-2.0 Python&lt;br&gt;
package that covers V1 to V3: it reads an agent's OpenTelemetry GenAI spans,&lt;br&gt;
checks them against a mandate declared in YAML, and computes a daily digest where&lt;br&gt;
every statement is anchored to a trace event ID. Failed tool calls surface on&lt;br&gt;
their own line, whatever the agent said about them.&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%2Fs1sc8baojaam8d00xb6m.gif" 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%2Fs1sc8baojaam8d00xb6m.gif" alt="14-second terminal demo: a mandate forbids refunds above €100, the agent issues a €250 refund anyway, and alfred watch flags the deviation anchored to its trace event ID." width="760" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; do V4 — it reads traces, not your database — and it does not do V5&lt;br&gt;
today. I'd rather write that here than let you discover it in production.&lt;/p&gt;

&lt;p&gt;If you're verifying agents in production, I'd genuinely like to know which level&lt;br&gt;
you stopped at and why. That's the part nobody publishes.&lt;/p&gt;

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