<?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: Austin Vance</title>
    <description>The latest articles on DEV Community by Austin Vance (@austinbv).</description>
    <link>https://dev.to/austinbv</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%2F305023%2Fc978f899-9fa5-4b1e-9ad9-e3f60313fd65.jpeg</url>
      <title>DEV Community: Austin Vance</title>
      <link>https://dev.to/austinbv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/austinbv"/>
    <language>en</language>
    <item>
      <title>Owning Your Intelligence Means Owning Your Implementation</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Thu, 22 Oct 2026 23:29:41 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/owning-your-intelligence-means-owning-your-implementation-4p8h</link>
      <guid>https://dev.to/focused_dot_io/owning-your-intelligence-means-owning-your-implementation-4p8h</guid>
      <description>&lt;p&gt;Harrison Chase's &lt;a href="https://www.langchain.com/blog/own-your-intelligence" rel="noopener noreferrer"&gt;"Own Your Intelligence"&lt;/a&gt; argument was a recurring theme at Interrupt London last week, and for good reason. As AI systems become more deeply embedded in how businesses operate, organizations need control over the intelligence that makes those systems valuable: their context, behavior, evaluations, and ability to improve over time.&lt;/p&gt;

&lt;p&gt;There's an important engineering question that follows: what does it take for an organization to exercise that ownership in practice?&lt;/p&gt;

&lt;p&gt;A company can own its models, harnesses, traces, evals, and every line of code in an AI system. But maintaining and improving that system requires something beyond access to the underlying technology. It requires people inside the organization who understand how the system works, why it behaves the way it does, and how to change it safely.&lt;/p&gt;

&lt;p&gt;The repository may belong to the company, while the expertise required to evolve the system still sits with a partner, a vendor, or a few people who have since moved on.&lt;/p&gt;

&lt;p&gt;As a consultancy, we're part of that equation. We believe our role is to help companies build that expertise internally, so ownership extends beyond the technology to the capability to keep improving it. That's what we mean by owning your implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The AI stack is an artifact of organizational intelligence&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Harrison's "Own Your Intelligence" makes the case for controlling the systems that turn general-purpose models into intelligence specific to a business: how those systems behave, how their quality is measured, and how they improve. Making that ownership meaningful requires the engineering capability to put it into practice.&lt;/p&gt;

&lt;p&gt;Every agent has models, a harness, context, memory, evals, traces, and feedback loops. People make decisions about all of them. Someone decides what belongs in the context. A failed trace becomes an eval because someone understands why it failed and which change might fix it. Someone restricts a tool or brings a human into a particular decision.&lt;/p&gt;

&lt;p&gt;An open, portable stack gives organizations control over those artifacts. The ability to keep producing, evaluating, and changing them is what turns that control into lasting organizational capability.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Organizational intelligence is collective learning&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;C.K. Prahalad and Gary Hamel &lt;a href="https://store.hbr.org/product/the-core-competence-of-the-corporation/90311" rel="noopener noreferrer"&gt;defined core competence as collective learning&lt;/a&gt; in 1990: skills and technologies coordinated inside the organization. That learning is distributed across people and gets embedded in &lt;a href="https://ascnhighered.org/ASCN/change_theories/collection/4i.html" rel="noopener noreferrer"&gt;routines, policies, and structures&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Organizational intelligence includes the written business: policies, contracts, trade secrets, architecture decisions. It also includes what people learn by doing the work. Which exceptions are harmless. Which customer signals change a decision. Which policies everyone quietly works around. Who gets pulled in on a weird case. Over time, an organization develops judgment about hard cases and about what to do when the written process is not enough.&lt;/p&gt;

&lt;p&gt;Software has always served this. Business rules become code, approval paths become workflows, databases hold what no one person could. But traditional software is designed around human interpretation. A form gets validated, a claim gets recorded, a ticket gets routed, and then a person reads the notes, applies policy, handles the exception, and decides what happens next.&lt;/p&gt;

&lt;p&gt;Agentic AI pushes into that judgment. An agent reads the notes, searches for policy, picks tools, asks for evidence, and decides whether a case follows the workflow or gets escalated.&lt;/p&gt;

&lt;p&gt;For that to work, the organization's judgment has to be legible to software. What gets hard coded and what gets left to the model? Where does the agent have authority, and where does a person take over? That work turns organizational learning into executable behavior. Implementing the technology now requires the organization to implement parts of itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Open infrastructure and implementation capability work together&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Open models, portable evals, and owned traces protect against a provider raising prices, retiring a model, or moving a feature to a more expensive tier. That flexibility matters. It gives organizations options as the technology changes. But exercising those options requires people who understand the system well enough to make changes safely.&lt;/p&gt;

&lt;p&gt;A model change introduces a subtle regression in one customer journey. A trace reveals unofficial steps that were never in the process map. A new tool grants an agent more authority than the risk team anticipated. Can the internal team find the failure, diagnose it, and fix it?&lt;/p&gt;

&lt;p&gt;If not, the organization still depends on whoever understands the harness, the evals, and the tradeoffs. The code is in the company's GitHub organization and the contract assigns ownership of the deliverables, but every time the system meets a new part of the business, someone else gets called.&lt;/p&gt;

&lt;p&gt;Ownership of the artifacts is an important starting point. But when the ability to diagnose failures and improve the system remains external, the organization has yet to develop the full capability that ownership makes possible. And the distinction becomes clearer when you look at what happens inside an engineering team.&lt;/p&gt;

&lt;p&gt;At a regulated wealth management firm with thousands of financial advisors, evals stopped a model upgrade that scored better on correctness but made worst-case response time much worse and changed which tools the agent selected. The tradeoff was visible before anything shipped.&lt;/p&gt;

&lt;p&gt;Separately, a month of gateway traffic showed that most failures came from one cause: the model guessing repository names. One fix at the gateway removed that failure class for every team at once.&lt;/p&gt;

&lt;p&gt;Neither of those was simply a model problem or a framework problem. They required implementation judgment: knowing what to measure, how to interpret the results, and where to intervene.&lt;/p&gt;

&lt;p&gt;The people exercising that judgment were the firm's own product engineers. They had written their first evals paired with us. Now they add tools and run evals in CI on their own.&lt;/p&gt;

&lt;p&gt;The firm didn't just gain a working system. Its engineers developed the ability to keep making that system better.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Implementation is now part of the core competence&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A bank can buy a model. An insurer can buy an orchestration framework. A retailer can buy observability. Those are generic capabilities, and buying them makes sense.&lt;/p&gt;

&lt;p&gt;But people inside the company need to be able to decompose a business process, separate the deterministic parts from the model-based parts, specify context, design evals, read traces, set authority boundaries, and change the process when the system reveals it was wrong.&lt;/p&gt;

&lt;p&gt;These decisions aren't independent of the business. They require understanding how the organization actually operates, including the exceptions, tradeoffs, and judgment that rarely make it into formal documentation. And that understanding develops through implementation.&lt;/p&gt;

&lt;p&gt;Every workflow sharpens the team for the next one. A production failure becomes a new eval. An unexpected tool call reveals a missing boundary. A recurring exception changes how the next workflow gets designed. Those lessons compound. The more capable the internal team becomes, the more effectively the organization can use the infrastructure it owns. It can adopt new models, change frameworks, improve performance, and extend agentic systems into new parts of the business without starting from scratch each time. Open infrastructure makes those choices possible. Internal implementation capability makes them practical.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;This does not mean doing everything alone&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Insourcing every tool and building an enormous internal AI group would be the wrong lesson. Owning a system doesn't mean never working with outside experts. It means being able to understand, change, and improve the system, with outside expertise used to accelerate the internal team rather than replace it. This is particularly important with agentic AI, where engineering practices are still evolving and production experience is unevenly distributed.&lt;/p&gt;

&lt;p&gt;A partner can bring experience with architectures, evaluation strategies, observability, and failure modes that an internal team hasn't encountered yet. That expertise is valuable. But it becomes more valuable when the organization retains what it learns through the engagement.&lt;/p&gt;

&lt;p&gt;Our &lt;a href="https://focused.io/lab/what-xp-gets-right-about-learning" rel="noopener noreferrer"&gt;pairing and feedback process&lt;/a&gt; exists so knowledge transfers while decisions get made, not in a handoff deck at the end. Our &lt;a href="https://focused.io/lab/the-anti-agency-approach-embracing-the-deprecation-model" rel="noopener noreferrer"&gt;deprecation model&lt;/a&gt; means the partner's share of the work shrinks as the client team's ability grows. The goal is a live system the client team can explain, challenge, diagnose, and change. That's a different measure of success than delivering software that works on the day the engagement ends.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Own the ability to keep learning&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As more organizational intelligence becomes embedded in AI systems, companies need to preserve their ability to understand, challenge, and improve how that intelligence is put to work.&lt;/p&gt;

&lt;p&gt;Open models, portable infrastructure, owned evals, and accessible traces create the foundation for that control. Internal engineering capability makes it actionable.&lt;/p&gt;

&lt;p&gt;These are the people who can swap models, change infrastructure, add or remove human review, adjust an agent's authority, or correct the judgment encoded in a system. And with every change, the organization gets better at building the next one. That's why owning your intelligence and owning your implementation belong together.&lt;/p&gt;

&lt;p&gt;Own the models when it matters. Own the harness, context, memory, evals, and traces. Keep the stack portable. And build the capability to keep evolving it.&lt;/p&gt;

</description>
      <category>langchain</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Focused Is Now a Claude Partner</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Thu, 22 Oct 2026 23:29:39 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/focused-is-now-a-claude-partner-4j6g</link>
      <guid>https://dev.to/focused_dot_io/focused-is-now-a-claude-partner-4j6g</guid>
      <description>&lt;p&gt;We're excited to announce that Focused is now a Claude partner, helping companies build, evaluate, and improve AI agents and applications with &lt;a href="https://www.anthropic.com/claude" rel="noopener noreferrer"&gt;Anthropic's Claude models&lt;/a&gt;. Focused is a boutique software and AI engineering consultancy working alongside teams to solve complex business problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Focused helps companies build with Claude&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Our senior software engineers work directly with your team to translate a business problem into an implementation, make architectural decisions, and address the details that determine how a system performs outside a demo.&lt;/p&gt;

&lt;p&gt;We help teams build Claude-powered agents, connect them to existing tools and data, and improve their performance in production. Throughout that work, we bring clear requirements, thoughtful integration, and evaluations that measure how well the system handles the tasks your business depends on.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Taking Claude applications into production&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Every organization brings different systems, constraints, and ways of working. We build around those realities, collaborating closely with your engineers and the people who understand the business.&lt;/p&gt;

&lt;p&gt;Reliability is part of development from the beginning. We define expected behavior, test the exceptions that matter, and instrument applications so teams can understand failures and assess changes as the system evolves.&lt;/p&gt;

&lt;p&gt;Building with Claude, or need help with what's already running? &lt;a href="https://focused.io/contact" rel="noopener noreferrer"&gt;Talk with our engineers&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Introducing the Focused Agent Academy</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Fri, 09 Oct 2026 16:35:46 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/introducing-the-focused-agent-academy-4dd0</link>
      <guid>https://dev.to/focused_dot_io/introducing-the-focused-agent-academy-4dd0</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;The most rewarding role I’ve ever had&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I’ve worked with a lot of great teams over my career, but one role has always stood out: teaching at Dev Bootcamp. Helping people move from nontechnical careers into software engineering is still the most rewarding work I’ve ever done.&lt;/p&gt;

&lt;p&gt;A few weeks ago, I received a Slack message from Austin, our CEO, that started with, “Alright, I have a job proposition for you.”&lt;/p&gt;

&lt;p&gt;He wanted to launch an Agent Academy at Focused: a program to hire strong senior software engineers and train them to become agent engineers. Given my background in education, he asked if I’d lead it.&lt;/p&gt;

&lt;p&gt;My response: HELL YES!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why an Agent Academy?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;There are a lot of talented software engineers looking for their next role right now. But finding engineers with the depth of experience in agent systems needed to meet the standards we uphold for our clients takes time.&lt;/p&gt;

&lt;p&gt;Many excellent engineers haven’t had the opportunity to build an agent yet. That doesn’t mean they’re starting from scratch. They already know how to design systems, write software, debug failures, and work through difficult problems. With the right training and hands-on experience, they can bring those skills to agent engineering.&lt;/p&gt;

&lt;p&gt;So why train people instead of continuing the search? Because it’s a win for everyone.&lt;/p&gt;

&lt;p&gt;Participants get paid to learn new skills and put them to work. We develop the engineers our clients need, instead of waiting for the market to catch up. And when we did the math, two months of training cost about the same as paying a recruiter.&lt;/p&gt;

&lt;p&gt;Quite frankly, we’d rather invest that money in people. No offense, recruiters.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How the program works&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Focused Agent Academy is a paid, full-time, contract-to-hire program. The contract runs for three months, and participants who successfully complete the program will receive a full-time W-2 offer.&lt;/p&gt;

&lt;p&gt;Instruction is delivered remotely, with participants expected to work from their local Focused office in Denver or Chicago two to three days a week.&lt;/p&gt;

&lt;p&gt;My time at Dev Bootcamp shaped how we designed the program. The Academy is built around project-based learning: participants work through learning materials from our certification providers, then apply what they’ve learned by building.&lt;/p&gt;

&lt;p&gt;Hands on the keyboard is how people learn. Writing the code, watching it fail, and figuring out why builds an understanding that copying and pasting can’t give you. That’s why the first two weeks are without coding agents. Before using them, participants need to understand the systems they’re building.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Weeks 1–6: Curriculum&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Eval-driven agent development&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Participants build agents in their editors, not notebooks, with eval-driven development at the center of the curriculum. They define the behavior they expect, build evaluation datasets, and establish a baseline they can test changes against.&lt;/p&gt;

&lt;p&gt;As they work through retrieval, tool use, and multi-agent workflows, they use evals and execution traces to identify failures and decide what to change. Changing a prompt, model, or routing decision means measuring the effect across their test cases, including checking for regressions. Learning to make those calls is a core part of becoming an agent engineer at Focused.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What participants will build&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Starting in week three, participants can use coding agents as part of their development workflow.&lt;/p&gt;

&lt;p&gt;The initial curriculum covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Week 1:&lt;/strong&gt; LLM fundamentals with the Claude client SDK&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 2:&lt;/strong&gt; LangGraph and LangChain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 3:&lt;/strong&gt; Working with coding agents and building retrieval-augmented generation (RAG) agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 4:&lt;/strong&gt; Multi-agent architectures and Deep Agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 5:&lt;/strong&gt; Deployment and monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 6:&lt;/strong&gt; Security&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Weeks 7–8: Capstone&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Participants bring those skills together by building a production agent with evaluations, data flywheels, MCP connectors, tools, and more.&lt;/p&gt;

&lt;p&gt;The capstone gives them more independent time to build, troubleshoot, and make decisions about their systems. During these weeks, they’ll also take the Claude Certified Architect and LangChain Certified Agent Engineer certification exams.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Weeks 9–12: Client work&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Each participant joins a Focused team working on real client projects, putting what they’ve learned into practice alongside experienced engineers.&lt;/p&gt;

&lt;p&gt;At Dev Bootcamp, I watched people from every background become software engineers. Now the industry is shifting again, and I can’t wait to help another group of engineers make the leap.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Is this for you?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you’re a senior software engineer ready to build agent systems, we’d love to meet you. Whether you’re looking for a new challenge or finding your next role after a layoff, the Academy gives you paid time to learn, build, and put your experience to work.&lt;/p&gt;

&lt;p&gt;Our first cohort starts November 2 in Denver and Chicago.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://focused.io/agent-academy" rel="noopener noreferrer"&gt;&lt;strong&gt;Apply now.&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>How to Evaluate Voice Agents with LangSmith | Focused</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Wed, 26 Aug 2026 23:50:24 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/how-to-evaluate-voice-agents-with-langsmith-focused-ogc</link>
      <guid>https://dev.to/focused_dot_io/how-to-evaluate-voice-agents-with-langsmith-focused-ogc</guid>
      <description>&lt;p&gt;A voice agent finishing a call doesn't mean it worked.&lt;/p&gt;

&lt;p&gt;A scheduling agent can call the right tools in the right order and still book the wrong time, because nothing told it to confirm the caller's timezone. Another one can resolve the request and still make the caller sit through long pauses and repeated questions. Both calls failed. They failed differently.&lt;/p&gt;

&lt;p&gt;LangChain's post on &lt;a href="https://www.langchain.com/blog/how-to-evaluate-voice-agents-execution-outcomes-and-experience" rel="noopener noreferrer"&gt;evaluating voice agents&lt;/a&gt; splits "did it work" into three questions, and that split is the useful part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Execution.&lt;/strong&gt; Did the agent follow its instructions, including the right tools, the right order, and the policies?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outcome.&lt;/strong&gt; Did the interaction get the caller what they called for?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experience.&lt;/strong&gt; Was the call smooth, responsive, and natural to sit through?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted to see what that looks like in practice, so I built a small refund agent and ran evals against it. Six scripted calls, eleven evaluators. Everything below is either from their post or from what I hit building it.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Execution: did it follow instructions&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Execution is the closest thing here to normal software testing. Did the agent behave the way it was built to behave.&lt;/p&gt;

&lt;p&gt;For a voice agent that usually means tool invocation accuracy, policy compliance, whether it collected the required information before acting, and whether the answer was right given what it had. The final answer is only part of it. An agent can land on the right answer while calling tools it didn't need, skipping a confirmation, or reading data it had no business reading.&lt;/p&gt;

&lt;p&gt;Use code where you can. If the expected behavior is explicit and machine-verifiable, don't pay an LLM to check it. Tool call order, argument values, required disclosures, status codes, excessive tool usage: all of that is a code evaluator.&lt;/p&gt;

&lt;p&gt;My version of this is one function. The agent has to look the customer up before it files anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;verified_before_refund&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;tool_calls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_outputs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_calls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;create_refund_request&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tool_calls&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;comment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No refund filed, check not applicable.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;lookup_idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_customer_info&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_customer_info&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tool_calls&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;refund_idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;create_refund_request&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;lookup_idx&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;refund_idx&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;comment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_calls=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's fast, free, and it gives the same answer every time. There's no reason to hand it to a judge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use an LLM judge when meaning matters.&lt;/strong&gt; Whether the agent explained the next step, recognized an ambiguous request, or followed a policy written in prose. Keep the task narrow and the rubric specific. "Was this a good response" is not an evaluator. "Pass if the agent confirms date, time, and timezone before calling the booking tool, fail if any field is missing or the booking happens first" is.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Outcome: did it get the caller what they wanted&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;An agent can execute perfectly and still fail the person on the phone.&lt;/p&gt;

&lt;p&gt;Back to the scheduling example. It collects a date and time, checks availability, books it. The workflow never mentions timezone, so the appointment lands in the wrong hour. The agent followed instructions. The instructions weren't enough.&lt;/p&gt;

&lt;p&gt;An outcome evaluator asks whether the request was resolved, whether the task was completed rather than described, whether the fallback was right when it couldn't be completed, and whether the agent had the context and tool access it needed.&lt;/p&gt;

&lt;p&gt;An LLM judge can read that off the conversation. When a business system knows the answer, use the business system instead.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;What to verify downstream&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scheduling&lt;/td&gt;
&lt;td&gt;Correct person, time, location, and timezone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer support&lt;/td&gt;
&lt;td&gt;Resolution status and case reopen rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfers&lt;/td&gt;
&lt;td&gt;Correct destination and successful connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sales or onboarding&lt;/td&gt;
&lt;td&gt;Completed next step or meeting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The agent saying "you're all set" isn't proof. The ticket is.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Experience: was the call smooth&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is the part that transcript-only evaluation misses, and it's where most of my time went.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't roll latency into one number.&lt;/strong&gt; Trace each stage: time to first audio, speech-to-text, model time to first token, tool latency, text-to-speech. Measure P50, P95, P99. The median tells you what a normal call feels like. The tail is what makes an agent feel unreliable.&lt;/p&gt;

&lt;p&gt;One awkward pause could be transcription, the model, a slow tool, or audio generation. An aggregate number can't tell you which.&lt;/p&gt;

&lt;p&gt;I hit this immediately. My first responsiveness number was garbage because it included the ElevenLabs call, so a slow reply and slow audio looked identical. Timing them apart took two lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="n"&gt;started&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;monotonic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;reply_secs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;monotonic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt;      &lt;span class="c1"&gt;# model only
&lt;/span&gt;
&lt;span class="n"&gt;tts_started&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;monotonic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent_reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;audio_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tts_secs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;monotonic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tts_started&lt;/span&gt;    &lt;span class="c1"&gt;# audio only
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Across six calls the model averaged 3.72s per reply. TTS added another 2.7 to 4.1s on top. Those are different problems with different fixes, and one number would have hidden that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're grading the voice, listen to the voice.&lt;/strong&gt; A transcript tells you the wording was clear. It can't tell you the agent mispronounced a name, sped up, changed volume, or sounded robotic.&lt;/p&gt;

&lt;p&gt;This is the whole reason I went down this road. The transcript seems fine when reading it, but I know there's pauses in the response.&lt;/p&gt;

&lt;p&gt;So the audio judge gets the actual generated speech. Claude doesn't take audio input yet, so that one runs on OpenAI's gpt-audio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-audio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;modalities&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_audio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_audio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;audio_b64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mp3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;I split its output into two scores. Clarity covers pronunciation, volume consistency, and awkward pauses. Naturalness covers pacing, tone, expressiveness, robotic repetition, and whether the delivery fit the moment. Both come from one judge call per turn, cached, so the second metric is free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Look for conversational friction.&lt;/strong&gt; Requests for repetition, clarification loops, interruptions and overlapping speech, long silences, abnormal call duration, early termination, failure to recover after being cut off.&lt;/p&gt;

&lt;p&gt;Context matters. A clarifying question isn't automatically friction. It's friction when the agent asks for something the caller already gave, or keeps asking the same thing.&lt;/p&gt;

&lt;p&gt;I made this a judge that returns a count plus the names of the signals that fired, so a score can be audited:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FrictionGrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Annotated&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Which signals fired and where&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;friction_events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Annotated&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total count of friction events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Annotated&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;...,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;caller_asked_agent_to_repeat, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_asked_caller_to_repeat, repeated_clarification_loop, ...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some signals in their list I couldn't score at all: interruptions, overlapping speech, and long silences.&lt;/p&gt;

&lt;p&gt;All three need the same thing, which is both sides of the call on one clock. You need to know the caller started talking at 4.2s while the agent kept going until 4.9s, so those 700ms were overlap. Or that the agent stopped at 6.1s and the caller didn't start until 9.4s, so somebody sat through three seconds of dead air. Without both streams timestamped against a shared timeline, none of that exists as data to score.&lt;/p&gt;

&lt;p&gt;I've got two runtimes and only one of them can produce it. The live agent runs through Pipecat on a duplex transport, mic in and speakers out, with Silero VAD deciding when a turn ends. That side knows when both parties started and stopped talking. The eval harness doesn't use it. It replays scripted caller turns through the text agent and synthesizes each reply on its own, so there's no caller audio at all, just strings I typed. No second speaker means no timeline.&lt;/p&gt;

&lt;p&gt;So I left them unscored rather than invent a number, and the judge prompt tells it not to count them. Ask a judge to score interruptions off a transcript and it'll give you a number every time. The number is fiction.&lt;/p&gt;

&lt;p&gt;Closing that gap means running the evals through the Pipecat pipeline instead of around it. Synthesize the caller's turns as audio, play them into the transport on a schedule with deliberate barge-ins, and read overlap and silence off the VAD events both sides already emit. Turn tracking is on already for the tracing, so the events exist. I haven't wired the eval to drive them yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Match the evaluator to the claim&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Their post has a table for this and it's the right way to think about it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Code evaluators&lt;/td&gt;
&lt;td&gt;Explicit, machine-verifiable behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM judges&lt;/td&gt;
&lt;td&gt;Narrow semantic criteria with a clear rubric&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio-aware LLM judges&lt;/td&gt;
&lt;td&gt;Properties only audible in the recording&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business-system checks&lt;/td&gt;
&lt;td&gt;Real-world outcomes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A transcript can't prove pronunciation was clear. A judge is wasted on something a code check settles. A call that sounds successful doesn't prove the meeting got booked.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What tripped me up&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Two things I'd tell anyone starting this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The friction judge disagrees with itself.&lt;/strong&gt; I ran the same six scenarios twice. The scripted repeat request got caught both times, since the caller literally says "Sorry, can you say that again?" The softer calls moved around: one scenario went from 2 events to 1, another from 0 to 1. If I keep going with this I'll run each scenario a few times and look at the spread.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Report no data as no data.&lt;/strong&gt; ElevenLabs ran out of credits partway through a run, so a batch of calls had no audio. My evaluator averaged an empty list and reported naturalness as 0, which reads as the worst voice you've ever heard. It was a billing problem. It returns None now with a comment saying why.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What it looks like in LangSmith&lt;/strong&gt;
&lt;/h2&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%2Fcdn.prod.website-files.com%2F69171c5b6a36fedc1f0d6866%2F6a8e11633bd535e1c54d892a_image%2520%289%29.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%2Fcdn.prod.website-files.com%2F69171c5b6a36fedc1f0d6866%2F6a8e11633bd535e1c54d892a_image%2520%289%29.png" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every turn breaks out stt, llm, and tts as its own span with its own timing, so when a reply felt slow I could see which one was slow. The feedback scores hang off the same run, which means a regression points at a specific metric.&lt;/p&gt;

&lt;p&gt;One caveat if you go looking right after a run: the per-run cells populate immediately but the average row lags about a minute. I spent a while convinced my evaluators hadn't attached before I checked the API and found all 66 feedback rows sitting there.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;One score hides the tradeoffs&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A prompt change can improve instruction adherence and lower resolution. A faster model can cut latency and get worse at recovering from interruptions. Roll it into a single quality number and you can't see any of that.&lt;/p&gt;

&lt;p&gt;Track execution, outcome, and experience separately.&lt;/p&gt;

</description>
      <category>langchain</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Benchmarking Gemini, Claude, and OpenAI for Structured Document Extraction</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Fri, 14 Aug 2026 02:51:34 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/benchmarking-gemini-claude-and-openai-for-structured-document-extraction-151j</link>
      <guid>https://dev.to/focused_dot_io/benchmarking-gemini-claude-and-openai-for-structured-document-extraction-151j</guid>
      <description>&lt;p&gt;A few fellow engineers and I were talking about field extraction the other day. They were both saying Gemini's been surprisingly good at pulling structured data off documents, which surprised me, since that's not really the model I'd have reached for first. So we ran an experiment using &lt;a href="https://www.langchain.com/langsmith/observability" rel="noopener noreferrer"&gt;LangSmith&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I printed ten copies of a form with the usual set of fields, names, dates, IDs, a checkbox, a signature line, and asked my coworker to help me fill them out by hand. I ran OCR on them too, mostly out of curiosity. It was pretty bad, which wasn't unexpected, especially on checkboxes.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Testing it&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I set up a LangGraph graph with one node that does the extraction, and passed in which provider to use as runtime context, so the eval could run the exact same graph once per model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ExtractionState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ExtractionContext&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;extractor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EXTRACTORS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provider&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;extractor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hand-labeled ground truth for every form and ran it all through LangSmith so I could score each model against the exact same data.&lt;/p&gt;

&lt;p&gt;Scoring took a bit of tuning, mostly because a plain exact string match evaluator will ding a model for writing "Sr" instead of "Sr." or "management" instead of "Management," which isn't actually wrong, it's just formatting. So everything got normalized first (lowercased, trailing punctuation stripped, dates parsed into one format, phone numbers stripped down to digits) and scored three ways: fraction of fields correct for partial credit, whether the whole record was perfect for a stricter all-or-nothing exact match, and field accuracy per dollar.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Field accuracy&lt;/th&gt;
&lt;th&gt;Exact match&lt;/th&gt;
&lt;th&gt;Perfect records&lt;/th&gt;
&lt;th&gt;Field accuracy / cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude (opus-5)&lt;/td&gt;
&lt;td&gt;0.934&lt;/td&gt;
&lt;td&gt;0.364&lt;/td&gt;
&lt;td&gt;4/11&lt;/td&gt;
&lt;td&gt;31.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude (haiku-4-5)&lt;/td&gt;
&lt;td&gt;0.636&lt;/td&gt;
&lt;td&gt;0.091&lt;/td&gt;
&lt;td&gt;1/11&lt;/td&gt;
&lt;td&gt;207.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini (3.1-pro-preview)&lt;/td&gt;
&lt;td&gt;0.934&lt;/td&gt;
&lt;td&gt;0.636&lt;/td&gt;
&lt;td&gt;7/11&lt;/td&gt;
&lt;td&gt;93.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini (flash-lite-latest)&lt;/td&gt;
&lt;td&gt;0.884&lt;/td&gt;
&lt;td&gt;0.455&lt;/td&gt;
&lt;td&gt;5/11&lt;/td&gt;
&lt;td&gt;1084.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI (gpt-5.6-sol)&lt;/td&gt;
&lt;td&gt;0.860&lt;/td&gt;
&lt;td&gt;0.455&lt;/td&gt;
&lt;td&gt;5/11&lt;/td&gt;
&lt;td&gt;50.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI (gpt-5.4-nano)&lt;/td&gt;
&lt;td&gt;0.620&lt;/td&gt;
&lt;td&gt;0.091&lt;/td&gt;
&lt;td&gt;1/11&lt;/td&gt;
&lt;td&gt;814.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Claude and Gemini ended up tied on average field accuracy, but Gemini still got a lot more whole forms completely right, which is a different thing to be measuring than it sounds like at first. The other thing that jumped out was the cheap tiers. Gemini's Flash Lite scored higher on field accuracy than OpenAI's flagship did, while Claude's Haiku and OpenAI's nano both fell off hard.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Picking a metric&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;No single model won across the board, and that's kind of the whole point. Field accuracy, exact match, and cost efficiency measure different things, so a model that dominates one of them can easily be the weakest on another. What's nice about having an eval running is that switching which one you care about is just a matter of changing what you sort by.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Optimizing for exact match&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A form that's 11 out of 12 fields right still needs someone to go fix that twelfth field, and that costs about the same as fixing a form that's only 6 out of 12 right, since either way a person has to open it back up. That's the case for caring about exact match instead of average field accuracy.&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%2Fcdn.prod.website-files.com%2F69171c5b6a36fedc1f0d6866%2F6a7cb09f383e0fb625e744bc_image%2520%286%29.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%2Fcdn.prod.website-files.com%2F69171c5b6a36fedc1f0d6866%2F6a7cb09f383e0fb625e744bc_image%2520%286%29.png" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;exact match and field accuracy per model with a baseline selected for exact match&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Optimizing for field accuracy&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Field accuracy gives partial credit for every field that's right, which matters more than exact match when a human is going to check every field anyway. Fewer wrong fields overall beats fewer broken records when the correction happens field by field instead of record by record.&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%2Fcdn.prod.website-files.com%2F69171c5b6a36fedc1f0d6866%2F6a7cb1b622a293d1cf534b1a_image%2520%287%29.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%2Fcdn.prod.website-files.com%2F69171c5b6a36fedc1f0d6866%2F6a7cb1b622a293d1cf534b1a_image%2520%287%29.png" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;exact match and field accuracy per model with a baseline selected for field accuracy&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Optimizing for cost&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Cost efficiency matters most at volume, since a cheaper model that's a little less accurate can still get more forms extracted correctly per dollar than a pricier one that's only a little better.&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%2Fcdn.prod.website-files.com%2F69171c5b6a36fedc1f0d6866%2F6a7cb1e4bbce61d903d42d5f_image%2520%288%29.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%2Fcdn.prod.website-files.com%2F69171c5b6a36fedc1f0d6866%2F6a7cb1e4bbce61d903d42d5f_image%2520%288%29.png" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;exact match, field accuracy, and accuracy per dollar with a baseline selected for accuracy per dollar&lt;/p&gt;

&lt;p&gt;So Chris and Mike were right, though the answer splits three ways. Gemini Pro won exact match and tied Claude Opus on field accuracy, and Gemini Flash Lite won on cost. Flash Lite is the one I didn't see coming, since it beat OpenAI's flagship on field accuracy too, at a tiny fraction of the price.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Technical References:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/focused-dot-io/form-extraction" rel="noopener noreferrer"&gt;Benchmarking LLMs for Structured Data Extraction GitHub Repo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>langchain</category>
      <category>observability</category>
      <category>ai</category>
    </item>
    <item>
      <title>Agentic Software Engineering Makes Human Context the Budget</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Tue, 04 Aug 2026 17:37:06 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/agentic-software-engineering-makes-human-context-the-budget-1mfb</link>
      <guid>https://dev.to/focused_dot_io/agentic-software-engineering-makes-human-context-the-budget-1mfb</guid>
      <description>&lt;p&gt;Agentic software engineering is moving the bill into human context.&lt;/p&gt;

&lt;p&gt;Code is coming faster, pull requests are piling up faster and validation work lands in ever larger piles of judgment work that still need to be handled by people.&lt;/p&gt;

&lt;p&gt;This feeling has been captured by Honeycomb’s Douglas Soo in his August 3 piece, “LLM-driven development: the exhaustion of context switching for senior engineers, and anxiety of growth for junior engineers”. He writes that while agentic software engineering has the potential to increase the amount of software that is developed by engineering teams, it has the risk of &lt;a href="https://www.honeycomb.io/blog/spend-more-time-talking-to-humans" rel="noopener noreferrer"&gt;shipping more software while understanding less about the software that is being developed&lt;/a&gt;. He writes that in LLM-driven development, “context transfer” becomes an expensive part of the engineering loop. The old software development rhythm of Design, Implementation, Validation, Operation (DIVO) is being compressed in implementation time in the new rhythm of design, implementation and validation in agentic software engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generative AI software development burns human context first
&lt;/h2&gt;

&lt;p&gt;The old software development process had a bias towards the time it took to actually implement the software. So after the team had done a bit of design, the team spent longer writing the code for that design, then there would be code reviews to validate that the code written by the author(s) of the software was suitable for real traffic. After that the software would go live and then the team watched for operational problems, and that in turn would be used for design, implementation, validation and operation of the subsequent versions of the software. This process in software development has been referred to as DIVO, Design, Implementation, Validation, Operation.&lt;/p&gt;

&lt;p&gt;This change in software development is important because the cheap part (implementation) and the scarce part (context) have traded places.&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%2F7dxbfmwaxjvf70dx8rv7.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%2F7dxbfmwaxjvf70dx8rv7.png" alt="Side-by-side engineering lifecycle showing implementation shrinking while validation and context transfer expand." width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Implementation shrinks, but the context and validation loop gets heavier.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As we outlined before, &lt;a href="https://focused.io/lab/context-will-replace-your-design" rel="noopener noreferrer"&gt;context also becomes part of the design surface&lt;/a&gt;. So, within the boundaries of an agentic software engineering project, agents can only process as much context as has been previously stored in and connected between documents, tests, traces, ticket entries, comments, examples and a repository’s overall coding structure. A senior engineer later will have to actually re-construct the agent-shaped system around all those agents and contexts.&lt;/p&gt;

&lt;p&gt;It’s an engineering culture problem with an architecture spine, therefore, the limiting resource is no longer keystrokes, but the transfer of judgment to and from the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost model finally has names
&lt;/h2&gt;

&lt;p&gt;Story points have always been sort of fuzzy. Agentic software engineering makes them even fuzzier.&lt;/p&gt;

&lt;p&gt;In the “A Cost Estimation Model for Agentic Software Engineering” paper, the ACEM authors say traditional cost models such as COCOMO II, Function Points, and Story Points assume that software cost is mainly human labor across design, coding, and testing. As software development becomes more agentic, human effort shifts toward planning, specifying, architecting, and validating agent output, while the budget absorbs &lt;a href="https://arxiv.org/abs/2608.02582v1" rel="noopener noreferrer"&gt;LLM tokens, human-in-the-loop oversight, and orchestration infrastructure&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That framework is useful. First, it is easy to quantify the cost of token spend for an LLM. Then, the cost of the human oversight can be hand-waved away by stating that the already existing review process covers this. And last, but not least, the costs of the required infrastructure can be hidden in the agentic software engineering harness and all the additional layers such as sandboxes, eval runners, trace stores, routing layers, CI minutes, and permission layers. The improved way of speaking about the multipliers for the agentic software engineering cost estimation is by stating Revision Factors, Context Factors, and HITL Intensity Scores.&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%2Fjmwm547s2p7twk0ldh87.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%2Fjmwm547s2p7twk0ldh87.png" alt="Stacked cost model for agentic software engineering showing token, human oversight, and infrastructure costs with revision and context amplifiers." width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Token spend is only one layer of the agentic engineering bill.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yes. The ACEM paper is early and has constants that are symbolic. The important part is that the authors assert that the cost estimation model presented in the paper has &lt;a href="https://arxiv.org/abs/2608.02582v1" rel="noopener noreferrer"&gt;not yet been validated against real project data&lt;/a&gt;, a point worth reiterating in order to keep other people from using this work in a mistaken fashion and prematurely to estimate the costs of agentic software engineering.&lt;/p&gt;

&lt;p&gt;Quit pretending the following costs do not exist and start measuring them inside the organization.&lt;/p&gt;

&lt;p&gt;Also note that count of retries that change direction (as opposed to just more of the same) will be relatively high. So too will be count of review passes that find product misunderstandings (as opposed to simple syntax errors). There will be high count of time spent by engineers in explaining why a 'cleaner' abstraction actually violates an operational invariant. High count of instances where a reviewer cannot approve a change because the relevant branch does not have relevant traces, screenshots, migration plans, or rollback plans (i.e., they are not able to make sense of the change).&lt;/p&gt;

&lt;p&gt;These are the true costs of agentic software engineering, costs that should be incorporated into the budget for agentic software engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context transfer is runtime state
&lt;/h2&gt;

&lt;p&gt;Agents also use organizational state to generate code.&lt;/p&gt;

&lt;p&gt;To my knowledge, this is the formal version of the problem description given in the paper on Context Compaction Theory. Note that in modeling tasks that are to be carried out by coding agents, model calls have bounded context windows. Therefore, agents have to compact the context states that they accumulate while working on a task. They do so by either selecting parts of the state and generating a summary or by generating a summary right away. The two games that are modeled in the above paper are a Context Selection Game and a Context Generation Game. It is then possible to relate generation to &lt;a href="https://arxiv.org/abs/2608.01326v1" rel="noopener noreferrer"&gt;one-way communication complexity&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That sounds abstract because it is. Still useful.&lt;/p&gt;

&lt;p&gt;Every team is already running a human version of this game. Senior engineers join conversations, ask questions like “What matters here?” and help to steer the conversation in the right direction. Reviewers decide which files to open, which logs to trust and which product edge cases smell wrong. When writing a PR description, deciding what to put in a ticket and what to delete from chat, teams are making decisions about what matters and what doesn’t.&lt;/p&gt;

&lt;p&gt;Stale system knowledge costs. We’ve already established how &lt;a href="https://focused.io/lab/documentation-drift-breaks-coding-agents" rel="noopener noreferrer"&gt;documentation drift affects the use of coding agents&lt;/a&gt;, but the same drift to documentation affects humans in the same workflow. So an agentic coding workflow that is based on a poor representation of the current system will lead to problems, not just for the agents but for the humans too in the same workflow. The agent follows the out of date README. The reviewer has the current state of the live system in their heads. The junior engineer does a diff to find out what’s changed and learns a new rule that’s actually wrong.&lt;/p&gt;

&lt;p&gt;This is where agentic software engineering can become uncomfortable. A team can be able to produce more code, but at the same time reduce the shared understanding of a team. The throughput graph for such a team can look great, but when the live system asks a question that no one can answer, then there is a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make context a build artifact
&lt;/h2&gt;

&lt;p&gt;Package the context where the work happens.&lt;/p&gt;

&lt;p&gt;So instead of documentation as tedious implementation detail, we turn repeated human explanations into artifacts (as mentioned above) to support the agentic engineering loop.&lt;/p&gt;

&lt;p&gt;This is also the humane version of pairing in the LLM era. Honeycomb argues that LLM-based development moves pairing away from typing code together and toward rapid design and validation in a “rapid feedback” style, with senior engineers modeling judgment and junior engineers driving the actual implementation. That beats generating a huge number of PRs and reading comments on each of them &lt;a href="https://www.honeycomb.io/blog/spend-more-time-talking-to-humans" rel="noopener noreferrer"&gt;after they’ve been put in the queue and fallen far behind&lt;/a&gt;. Queue-backed review comments are not mentorship just because the diff came from an agent.&lt;/p&gt;

&lt;p&gt;A technical approach would be to code up an ‘AtumAI’ style agentic approach to generating datacenter control plane policies. Such an approach would first compile natural language goals into formal specifications of objectives, constraints, decision variables and an evaluation methodology. It would then search for solutions to the formalized problem. In evaluations of such approaches, it has been found that the policies generated by agents for control of datacenter control planes outperform the same policies that have been hand-engineered by experts in terms of various metrics for use in workload placement, for scaling of computer resources, and for management of power in datacenters &lt;a href="https://arxiv.org/abs/2608.02569v1" rel="noopener noreferrer"&gt;in AtumAI’s evaluation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is a narrow test, but it illustrates an important point. In general, the more context an agent gets about the world it is acting in, the better it will become. This is particularly the case when the prompt that is given to the agent is not as good as a specification, for example. The cleverly worded prompt is not as good as the eval. The heroic reviewer of the diff is not as good as a workflow that records why a change is safe.&lt;/p&gt;

&lt;p&gt;When a pattern repeats, promote the behavior into deterministic execution. I have previously noted that exploration should turn into &lt;a href="https://focused.io/lab/agentic-workflows-should-get-less-agentic" rel="noopener noreferrer"&gt;straightforward coding work&lt;/a&gt; when the shape is known. The same thing applies to engineering culture. If a senior engineer explains the same operational invariant for the third time, stop burning senior attention on rediscovery. Put that invariant in code, tests, agent instructions, and review checks where it can be found again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ownership survives by becoming explicit
&lt;/h2&gt;

&lt;p&gt;Agentic coding means branch sprawl and weak ownership.&lt;/p&gt;

&lt;p&gt;The better bargain is boring. Fewer disconnected work streams. Stronger handoff artifacts. &lt;a href="https://focused.io/lab/ai-agent-testing-runs-on-failure-traces" rel="noopener noreferrer"&gt;Live traces that feed back into the next prompt, test, and acceptance criterion&lt;/a&gt;. Review that asks whether the code meets product intent, whether it is safe to operate, and whether the work captured enough learning to make the next run cheaper.&lt;/p&gt;

&lt;p&gt;Process evidence matters here. The ACWorld paper on agentic commerce found that final state alone can miss evaluated errors, while incomplete trajectories still hold useful signals. Its environment validates actions before shared state changes and records interactions for reproducible evaluation of &lt;a href="https://arxiv.org/abs/2608.02441v1" rel="noopener noreferrer"&gt;ongoing transactions&lt;/a&gt;. Software teams have the same problem in a less exotic outfit. A green merge is a final state. The interesting evidence lives in the path: what the agent tried, what the reviewer rejected, which assumption changed, which trace proved the fix, which rollback path exists.&lt;/p&gt;

&lt;p&gt;Software engineering with agents will reward those teams who treat the human context in their process as scarce runtime input. Thus, it should be spent where necessary i.e. where high quality judgment is required. All other situations where similar explanations are needed in the future can be saved by turning them into artifacts that can be used by the agents as well as by the human for verification.&lt;/p&gt;

&lt;p&gt;So fast as to be worth only one line in a software engineering budget, implementation speed!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>AI Agent Governance Gets Audited in the Trace | Focused Labs</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Sat, 01 Aug 2026 22:57:45 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/ai-agent-governance-gets-audited-in-the-trace-focused-labs-4n31</link>
      <guid>https://dev.to/focused_dot_io/ai-agent-governance-gets-audited-in-the-trace-focused-labs-4n31</guid>
      <description>&lt;p&gt;New delays in the AI Act mean teams will be lazy in exactly the wrong place.&lt;/p&gt;

&lt;p&gt;The date moved, but the work did not. For those of us building agents in a regulated environment, the work of runtime proof has not changed. It is boring and specific: model, tool, policy, human in the loop, trace for receipt.&lt;/p&gt;

&lt;p&gt;The latest update of the EU Commission on the AI Act Overview (July 31) sets the following dates for rules and duties for the development and deployment of AI: transparency rules for AI systems apply from August 2, 2026 onwards (Annex II, AI Omnibus, Commission’s 31 July update &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai" rel="noopener noreferrer"&gt;in the Commission's 31 July update&lt;/a&gt;); Annex III high-risk obligations enter into force on December 2, 2027 (Annex III high-risk AI, &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/faq" rel="noopener noreferrer"&gt;under the AI Act definitions&lt;/a&gt;); embedded high-risk product obligations enter into force on August 2, 2028.&lt;/p&gt;

&lt;p&gt;Fine. The panic date shifted.&lt;/p&gt;

&lt;p&gt;The engineering problem got more concrete.&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%2Ftfeejamekr8apbhvjhrg.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%2Ftfeejamekr8apbhvjhrg.png" alt="Timeline showing EU AI Act enforcement milestones for AI agents and where runtime evidence work fits." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The delay changes the calendar. It does not change the evidence architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deadline moved, the evidence burden stayed
&lt;/h2&gt;

&lt;p&gt;A spreadsheet represents poor AI governance. It outlines all of the ‘agents’ i.e. processes that the AI is executing and attributes a policy owner to each of the ‘agents’ as well as outlines the associated risks. The board is told that there is a program of work going on in order to implement the required governance.&lt;/p&gt;

&lt;p&gt;Just as a fire escape plan is useful as a map that accompanies the team on the run, not just as a document hung on a wall, a spreadsheet inventory of agents and their associated policies, risk, and board reporting ultimately becomes theater when there is no way to connect it to the actual run of business.&lt;/p&gt;

&lt;p&gt;Connecting governance to execution path for AI systems (&lt;a href="https://digital-strategy.ec.europa.eu/en/library/guidelines-transparency-obligations-providers-and-deployers-ai-systems" rel="noopener noreferrer"&gt;for providers and deployers of AI systems&lt;/a&gt;) is the whole game. By 2 August 2026 Article 50 obligations for transparency will apply to providers and deployers of AI systems. Public disclosure for chatbots, run-level reconstruction for agents.&lt;/p&gt;

&lt;p&gt;What did the agent tell the person? What content did it generate? Which downstream system did it touch? Was the user aware that a machine was involved? Which runtime version made the decision?&lt;/p&gt;

&lt;p&gt;Policy documents do not reconstruct a tool call.&lt;/p&gt;

&lt;p&gt;A governance process that cannot see the execution path of a system cannot apply policy effectively. It is essentially applying policy blindfolded. This is why I keep coming back to the same governance shape: &lt;a href="https://focused.io/lab/ai-agent-governance-follows-the-execution-path" rel="noopener noreferrer"&gt;governance follows the execution path&lt;/a&gt;. The relevant policy layer is around identity, tools, state, approval, trace, and outcomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents turn compliance into an execution problem
&lt;/h2&gt;

&lt;p&gt;Software governance used to be made up of a comfortable fiction. The approved code path was the behavior of the service. It accepted input and ran through deterministic logic. It might hit a database or two, but in the end it produced output. The audit record for all that activity would sit at the edge as deploy tickets, access reviews, log lines and incident reports.&lt;/p&gt;

&lt;p&gt;Agents make that fiction expensive.&lt;/p&gt;

&lt;p&gt;In complexity, an agent uses tools, sets input arguments and possibly asks for a human intervention. In the process of generating output for the user, it can also potentially disclose information. The same prompt will travel through different trajectories in complex systems, because the context, which was retrieved, changed, a model provider changed behavior or a conversation state crossed a threshold.&lt;/p&gt;

&lt;p&gt;A recent post by Honeycomb goes into more detail about how to monitor AI systems for reliability, and clearly outlines how request-level context, model versions, retrieval results, and tool calls influence whether an AI system will work, and how failures in AI systems are to be analyzed and debugged within a single request &lt;a href="https://www.honeycomb.io/blog/observability-vs-monitoring-for-ai-systems" rel="noopener noreferrer"&gt;inside the actual request&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The compliance version of this also holds. A clean monthly report does not tell the team why one instance of running an agent revealed salary history to the wrong people. A policy committee cannot figure out if the proper data minimization checks were made. A risk taxonomy does not establish if a human had the appropriate authority to interrupt a process.&lt;/p&gt;

&lt;p&gt;The trace has to carry that work.&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%2Fyhuu63pad0734p5my67d.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%2Fyhuu63pad0734p5my67d.png" alt="Flow diagram showing an AI agent runtime evidence pipeline from tool call through policy checks, human approval, trace storage, monitoring, and audit export." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Governance has to be captured at the moment of action.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trace is becoming the compliance surface
&lt;/h2&gt;

&lt;p&gt;The record-keeping article of the AI Act matters here. Article 12 defines how high-risk AI systems shall technically allow automatic recording of events over the lifetime of the system. Such logs shall support risk identification, post-market monitoring and operation monitoring by means of traceability &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-12" rel="noopener noreferrer"&gt;through traceability&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Article 12 reads like law but behaves like an architecture spec for live AI systems.&lt;/p&gt;

&lt;p&gt;The live agent trace cannot be defined by prompt, completion and latency. The trace needs to follow the steps inside the AI agent's runtime: identity of the AI agent, delegated human user, tool used, resources touched, policy version, policy decision, evaluator result, human approval or rejection, output hash, model version, retrieval set and result status.&lt;/p&gt;

&lt;p&gt;This turns the runtime state layer into a governance layer (as previously explored and mapped &lt;a href="https://focused.io/lab/ai-agent-infrastructure-is-splitting-at-the-state-layer" rel="noopener noreferrer"&gt;state layer where audit records accumulate&lt;/a&gt;) as audit records (including checkpoints, memory, trace IDs, policy decisions, and evaluator results) start to collect in an operational zone where said governance can either be searched evidence or become narrative archaeology.&lt;/p&gt;

&lt;p&gt;C-Trace, a runtime compliance verification framework for AI agents, already looks at ways to transfer consent, purpose, data minimization and erasure as predicates over an execution trace for AI agent applications. The trace is generated by intercepting the tool invocations and model outputs of an AI application. Non-compliant actions are blocked. An audit log is created. Under perfect extraction, the system reports 0% attack success. Under 10% extractor noise, the system keeps attack success at or below 12%. The system keeps false positives at or below 16%. This is the result of an evaluation by the authors &lt;a href="https://arxiv.org/html/2606.19242v1" rel="noopener noreferrer"&gt;in the authors' evaluation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The interesting part: the AI Act can be monitored in real time as the run happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human oversight is a runtime event
&lt;/h2&gt;

&lt;p&gt;Teams treat human oversight, and the related implementation into policy, as if it were only to do with the required staffing for implementing that policy. Name a human and assign a control.&lt;/p&gt;

&lt;p&gt;Article 14 is more operational than the staffing slide. The Service Desk says oversight measures should enable assigned individuals to understand system capabilities and limitations, monitor operations, interpret outputs, override or reverse outputs, and interrupt the system by way of a stop button or similar procedure &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-14" rel="noopener noreferrer"&gt;that brings the system to a safe state&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So that's an agent runtime. An approval is a state transition. An override is a recorded decision with actor, authority, input, output, and consequence. An interrupt is control flow.&lt;/p&gt;

&lt;p&gt;This is where &lt;a href="https://focused.io/lab/ai-agent-governance-runs-before-the-tool-call" rel="noopener noreferrer"&gt;policy before the tool call&lt;/a&gt; comes in. Human oversight after the tool has already mutated a record is cleanup activity. Human oversight before risky activity is governance. The trace should clearly show this.&lt;/p&gt;

&lt;p&gt;A lending agent can draft a credit recommendation. A human reviewer can approve, edit, or reject it. A healthcare triage agent can summarize patient history. A supervisor can stop an escalation. A support agent can prepare a deletion workflow. A privacy owner can verify scope before execution.&lt;/p&gt;

&lt;p&gt;These decisions should also be captured as first-class events in the audit trail and not as after-the-fact comments in a case-management system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Post-market monitoring is the part teams skip
&lt;/h2&gt;

&lt;p&gt;The delayed high-risk dates will tempt executives to punt. Post-market monitoring has to become an operational habit before it becomes a compliance obligation.&lt;/p&gt;

&lt;p&gt;Article 72 says providers of high-risk AI systems must establish and document a post-market monitoring system that actively and systematically collects, documents, and analyzes relevant performance data throughout the system lifetime &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-72" rel="noopener noreferrer"&gt;to evaluate continuous compliance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That phrase, throughout the system lifetime, carries the operational burden.&lt;/p&gt;

&lt;p&gt;An agent changes after launch. A model changes after launch. A retrieval corpus changes after launch. A tool schema changes after launch. A permission boundary changes after launch (loosen up). A user cohort discovers a new path. The test cases never covered that new path. But one evaluator score means customer harm, the other score means no harm. The organization learns something new.&lt;/p&gt;

&lt;p&gt;The important thing: post-market monitoring as a feedback loop. Trace samples from the field are used for evaluation. If the evaluation detects drift, then incidents are replayed and then used as test cases in release gates. The new runtime checks that are developed as part of the release gate process result in the agent getting safer and safer as more evidence is developed and flows in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://focused.io/lab/ai-agents-in-finance-live-or-die-by-runtime-receipts" rel="noopener noreferrer"&gt;Runtime receipts&lt;/a&gt; are critical to financial workflows. A regulated workflow cannot be reduced to a summary of the overall performance of an agent. Rather, the review of such a workflow consists of a receipt containing a description of the action, the authority, the data, the approval, the outcome and the correction path.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an audit packet contains
&lt;/h2&gt;

&lt;p&gt;A full trace is too much for a reviewer to go through and a log line is too little detail to go by. A useful artifact for a reviewer is an audit packet cut from the trace.&lt;/p&gt;

&lt;p&gt;For one agent action, that packet should contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent identity and runtime version.&lt;/li&gt;
&lt;li&gt;Delegated user or service principal.&lt;/li&gt;
&lt;li&gt;Session ID, &lt;a href="https://focused.io/lab/ai-agent-observability-runs-on-conversation-ids" rel="noopener noreferrer"&gt;trace ID&lt;/a&gt;, and parent action.&lt;/li&gt;
&lt;li&gt;Tool, resource, and operation requested.&lt;/li&gt;
&lt;li&gt;Purpose and data categories involved.&lt;/li&gt;
&lt;li&gt;Policy version, policy decision, and reason code.&lt;/li&gt;
&lt;li&gt;Evaluator scores or guardrail outcomes.&lt;/li&gt;
&lt;li&gt;Human approval, edit, rejection, or interrupt event.&lt;/li&gt;
&lt;li&gt;Output hash, result status, and downstream side effect.&lt;/li&gt;
&lt;li&gt;Retention rule, tombstone status, and export location.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds like work until the first concrete question arrives.&lt;/p&gt;

&lt;p&gt;Note that the IETF Agent Audit Trail draft is an Internet-Draft and thus not a settled standard. However, for those interested in audit trail records from IETF software agents, this named the shape of JSON records containing the agent's identity, action taken, result of action, trust level, etc. that would form tamper-evident SHA-256 hash chains and optionally be ECDSA signed. JSONL, Syslog and CSV export are discussed as potential output formats for such records &lt;a href="https://www.ietf.org/archive/id/draft-sharif-agent-audit-trail-00.txt" rel="noopener noreferrer"&gt;as a proposed audit format&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There's no need to wait for the standard to finish. The field names will change, but the architectural boundary will not. So, for example, if an agent is doing work that could affect people, money, access to information, employment, health, credit or regulated data, that work should create a record that can withstand a hostile read of that record.&lt;/p&gt;

&lt;h2&gt;
  
  
  The teams that start now get a boring advantage
&lt;/h2&gt;

&lt;p&gt;The AI Act delay buys time for architecture, not time for governance-as-documentation theater.&lt;/p&gt;

&lt;p&gt;The next year should be boring work. Firstly, put trace IDs on every run of the system. Secondly, start to version policy decisions. Thirdly, start to capture human interrupts as control-flow events, and then preserve evaluator scores. Finally, start to export action packets, write retention rules, and then above all else, keep raw sensitive data out of records unless a reviewer truly requires it to be in there. Rehearse the audit query before the audit exists.&lt;/p&gt;

&lt;p&gt;This is the unglamorous side of ai agent governance. It will not demo well. Nobody claps for retention metadata.&lt;/p&gt;

&lt;p&gt;But by then, the reason for the decision may have been forgotten. The team without runtime evidence has to interview the system after the fact.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>AI Agent Testing Runs on Failure Traces | Focused Labs</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Mon, 27 Jul 2026 22:33:22 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/ai-agent-testing-runs-on-failure-traces-focused-labs-1lo5</link>
      <guid>https://dev.to/focused_dot_io/ai-agent-testing-runs-on-failure-traces-focused-labs-1lo5</guid>
      <description>&lt;p&gt;Agent tests should start from a failure under real traffic.&lt;/p&gt;

&lt;p&gt;Teams want to re-run the exact failure in the trace to test the agent. A test case, not a screenshot, not a dashboard page, not a Slack thread of people agreeing to “watch it.”&lt;/p&gt;

&lt;p&gt;That is where ai agent testing is heading. The useful unit of learning is no longer the benchmark score on Friday afternoon. It is the trace from a real run, turned into a verifier, owned by a team, and wired into the release path.&lt;/p&gt;

&lt;p&gt;I don’t see the mysticalness fading much more from ai agent testing, but the interesting step in LangChain launching the &lt;a href="https://www.langchain.com/blog/towards-automating-eval-engineering" rel="noopener noreferrer"&gt;Eval Engineering Skill&lt;/a&gt; is that the workflow now reads the repo, inspects the agent output, reads the traces, interviews the human who ran the task, and emits Harbor evals. The agent does not generate an opinion about quality. It generates a task the system can execute. The interesting part is that the agent is no longer only doing the work. It helps improve the engine that will run the next task.&lt;/p&gt;

&lt;p&gt;I wrote this months ago: &lt;a href="https://focused.io/lab/agent-traces-rewrite-the-harness" rel="noopener noreferrer"&gt;Traces collected from live agent behavior&lt;/a&gt; only become the basis for harness rewriting once an individual closes the loop from observed failure to change to the harness. This is fundamentally different from just trace storage, a pretty museum of weird agent behavior. Terrible for a test suite, nice for a touring show.&lt;/p&gt;

&lt;h2&gt;
  
  
  A score is a weak owner
&lt;/h2&gt;

&lt;p&gt;Evaluations of agents have carried too much emotional weight. There is a simple number that a model score and a human score (a “judge” in the evaluation lingo) by definition get. Follow that up with a benchmark suite that scores by a few points here and there, and everyone pretends that that score corresponds in a simple manner to how an agent will actually behave under real traffic.&lt;/p&gt;

&lt;p&gt;It does not.&lt;/p&gt;

&lt;p&gt;Failures under real traffic have names: The agent picked the wrong tool. The retriever returned outdated policy text to the agent. Subagent mismeasured the error. Workflow failed to include required human in the loop. Agent attempted to write after a timeout and as a result duplicated side effect of the write.&lt;/p&gt;

&lt;p&gt;An agent’s performance metric can improve in a benchmark setting while live traffic stays confusing. Conversely, a score does not say what broke. The trace says what is failing and why.&lt;/p&gt;

&lt;p&gt;That distinction matters because ownership starts at the failure mode. LangChain’s &lt;a href="https://www.langchain.com/blog/issuebench-how-we-evaluate-engine" rel="noopener noreferrer"&gt;IssueBench writeup&lt;/a&gt;, for instance, describes Engine processing batches of traces, then separating out the clean runs from the issue runs, and failing each of those into categories and attaching relevant traces to open issues or creating new issue cards for newly detected failures. In this way, the primary function of Engine’s input (traces) is turned into a usable stream of engineering work.&lt;/p&gt;

&lt;p&gt;That is a healthier direction for agentic engineering. The artifact has to route. A hallucination, a silent tool error, a missing feature, and a bad recovery path belong to different owners. If the eval cannot preserve this, the team will be left with noise instead of work.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://focused.io/lab/agent-failures-should-open-tickets" rel="noopener noreferrer"&gt;Agent Failures Should Open Tickets&lt;/a&gt;, we wrote the ticketing version of this rule: recurring live-system failures ought to become owned work. In other words, trace + hypothesis + regression check. The new wrinkle is that the ticket should point at an executable eval opened by the failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The eval is a repo object
&lt;/h2&gt;

&lt;p&gt;“eval” is still widely used to mean a spreadsheet (e.g. a balance sheet), a prompt (e.g. discussion prompt) a judge configuration (e.g. the evaluation configuration for a Harbor task). So all this feels pretty amorphous and soft.&lt;/p&gt;

&lt;p&gt;A key distinction to keep in mind about Harbor artifacts is that they have boring form. The official &lt;a href="https://www.harborframework.com/docs/tasks" rel="noopener noreferrer"&gt;Harbor task documentation&lt;/a&gt; describes a task directory with &lt;code&gt;instruction.md&lt;/code&gt;, &lt;code&gt;task.toml&lt;/code&gt;, a container environment, solution files, and tests. The &lt;a href="https://www.harborframework.com/docs/core-concepts" rel="noopener noreferrer"&gt;core concepts documentation for Harbor&lt;/a&gt; says roughly the same thing: instruction, container environment, and test script.&lt;/p&gt;

&lt;p&gt;An agent failure that matters should translate to something tangible: an instruction to reproduce the failure, the environment where it happened, the tools and constraints the agent had, a fixture or trace link, a verifier, and an owner who decides what change is allowed to make the test pass.&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%2Fooixbftdwpdpe40u4kb4.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%2Fooixbftdwpdpe40u4kb4.png" alt="Flow diagram showing a live trace becoming a failure cluster, an owned issue, a Harbor eval, a harness change, a rerun, and a release gate." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The trace matters when it becomes an executable artifact in the delivery loop.&lt;/p&gt;

&lt;p&gt;This is where the primary ai agent workflow conversation needs to get concrete and this is the concrete part: the soft path (agent runs, agent answers, team observes dashboard in a web UI) vs. the useful path (live trace turns into failure cluster turned into an owned issue turned into a Harbor eval turn into a harness change turn into a rerun turned into a release gate).&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarks should change the harness
&lt;/h2&gt;

&lt;p&gt;The Deep Agents team is treating benchmarks similarly. In &lt;a href="https://www.langchain.com/blog/how-we-benchmark-deep-agents" rel="noopener noreferrer"&gt;How We Benchmark Deep Agents&lt;/a&gt;, LangChain describes moving toward end-to-end Harbor evals for longer running tasks, then using those results to inform harness tweaks like removing todo-list middleware or slimming down the system prompt.&lt;/p&gt;

&lt;p&gt;That is the right level of abstraction. The eval exists so &lt;a href="https://focused.io/lab/ai-agent-evaluation-steers-the-harness" rel="noopener noreferrer"&gt;evaluation steers the harness&lt;/a&gt; instead of decorating a model leaderboard.&lt;/p&gt;

&lt;p&gt;This is where “ai agent workflow automation” gets tricky to use as a term. Automation conjures up images of more things running automatically. But the reality is to automate the feedback loop (agent fails, get trace, eval fails, fix on main (patches to prompts, tools, routing, context, middleware, model choice, etc.) and then the build proves the fix stayed fixed).&lt;/p&gt;

&lt;p&gt;Deep Agents is a useful example because the harness is the product surface. A todo-list middleware seems benign until evals show that it distracts newer models or burns context. A longer system prompt looks safe until benchmarks show that it crowds out task instructions. A verifier that only checks the final answer looks fine until the trace shows that the agent skipped the required tool.&lt;/p&gt;

&lt;p&gt;The reason to keep running &lt;a href="https://focused.io/lab/ai-agent-evaluation-ends-too-early" rel="noopener noreferrer"&gt;evaluation after the release&lt;/a&gt; is that the data used for pre-release evaluation catches what the team had remembered to encode. And the traces from live evaluation catch what users, tools, permissions, and weird state transitions do to the plan after it has hit reality. Annoying. The job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Graphs help when the loop has state
&lt;/h2&gt;

&lt;p&gt;But for testing, graph-shaped agent systems make the story easier to follow. LangChain’s &lt;a href="https://www.langchain.com/blog/3-years-of-graph-engineering-with-langgraph" rel="noopener noreferrer"&gt;graph engineering essay&lt;/a&gt; describes LangGraph as a mix of deterministic paths and agentic steps, with nodes for work and edges for what happens next. The &lt;a href="https://docs.langchain.com/oss/python/langgraph/graph-api#send" rel="noopener noreferrer"&gt;LangGraph Graph API&lt;/a&gt; shows conditional edges routing from graph state and &lt;code&gt;Send&lt;/code&gt; fanning out work only known at runtime.&lt;/p&gt;

&lt;p&gt;That matters because agent failures happen across transitions. The agent performed the first step correctly, then retried the wrong thing. It found the right document and sent it to the wrong specialist. It asked for approval while a sibling branch kept writing. It recovered from a tool error by losing the original intent.&lt;/p&gt;

&lt;p&gt;A flat final-answer eval fails to capture that. A trace-linked task can assert the transition the agent took, and the verifier can check the produced artifact, issue category, approval state, absence of side effect, or route shape. That is closer to how agentic AI workflows break under real traffic.&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%2Fgh4pf940mtuq8zflt1b3.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%2Fgh4pf940mtuq8zflt1b3.png" alt="Anatomy diagram of an agent eval artifact with instruction, task config, environment, verifier tests, trace fixture, expected result, owner, and release gate." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An eval becomes useful when it has files, fixtures, a verifier, and an owner.&lt;/p&gt;

&lt;p&gt;There are failures worth capturing in an eval artifact and failures that can wait. The rule of thumb is to capture failures that would cost customer trust, failures that recur from the same root cause, and failures that teams argue about after the fix. Everything else can probably stay in triage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approval is part of the workflow
&lt;/h2&gt;

&lt;p&gt;GitHub’s new issue automation controls are a good adjacent signal to us. GitHub recently made a &lt;a href="https://github.blog/changelog/2026-07-23-agent-automation-controls-in-github-issues-in-public-preview" rel="noopener noreferrer"&gt;public preview available for agent automation in Issues&lt;/a&gt;. In this preview, the issue UI shows the rationale for label assignment, field assignment, issue type changes, closing, and assignment. Importantly, all of these approval panels, and associated automation, are merely workflow conveniences and do not map to any server-side security controls.&lt;/p&gt;

&lt;p&gt;A release gate should test what the system enforces, not what the UI suggests. If an approval panel holds a label suggestion, test the suggestion path versus the agent directly applying the change. Test the permission boundary. Test the side-effect boundary when the workflow says rejection means zero side effects.&lt;/p&gt;

&lt;p&gt;So, the release question is whether the trace, artifact, and verifier functioned properly under the same circumstances that previously failed.&lt;/p&gt;

&lt;p&gt;This is why &lt;a href="https://focused.io/lab/you-cant-just-trust-the-vibes-a-deep-dive-on-ai-evaluations-with-sarah-kainec" rel="noopener noreferrer"&gt;vibes are not an evaluation strategy&lt;/a&gt;. A person can like the demo. The dashboard looks great and the trend is up. The judge liked the final answer. The build still needs a particular failing case, and it must turn green when that failure mode is gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Own the loop
&lt;/h2&gt;

&lt;p&gt;AI is simply another component in the larger engineering system. As &lt;a href="https://www.honeycomb.io/blog/shipping-is-your-companys-heartbeat-letter-from-cto" rel="noopener noreferrer"&gt;Honeycomb’s CTO recently wrote in a letter to customers&lt;/a&gt;, AI amplifies the engineering system as it exists. Good practices get amplified. Bad practices get amplified. Engineering rigor matters more when AI enters delivery, not less.&lt;/p&gt;

&lt;p&gt;A team with a healthy delivery system will turn traces into evals (because that is how the org already thinks, traces == evals). Failures create tests. Tests protect changes. Changes ship behind gates. Gates produce evidence.&lt;/p&gt;

&lt;p&gt;A team without this muscle simply want a better dashboard. They’ll call out an interesting trace from time to time, rename a category here or there, add a sentence or two to a prompt. And of course the same failure will recur with a new name, dressed up in a new set of slides or a new Slack thread.&lt;/p&gt;

&lt;p&gt;The engineering advantage is to treat every serious agent failure as a build opportunity. Mine the trace. Name the failure. Create the Harbor task. Assign an owner. Gate the release. Then use the release process to produce evidence that the fix held.&lt;/p&gt;

&lt;p&gt;Then the agent workflow learns from real traffic instead of it being something it tries to survive.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>testing</category>
    </item>
    <item>
      <title>AI Agents in Finance Live or Die by Runtime Receipts | Focused Labs</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Thu, 23 Jul 2026 22:13:45 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/ai-agents-in-finance-live-or-die-by-runtime-receipts-focused-labs-33ni</link>
      <guid>https://dev.to/focused_dot_io/ai-agents-in-finance-live-or-die-by-runtime-receipts-focused-labs-33ni</guid>
      <description>&lt;p&gt;The board wants to see the bottom line of the RFP. Show the receipt.&lt;/p&gt;

&lt;p&gt;Financial services boards want to know what they get from the spend on AI in LangChain’s July post titled &lt;a href="https://www.langchain.com/blog/proving-the-roi-of-agentic-ai-in-financial-services" rel="noopener noreferrer"&gt;proving the ROI of agentic AI in financial services&lt;/a&gt;. In the case of agentic RFP responses, AML investigations, portfolio management workflows, and financial services compliance reviews, the work crosses documents, systems, approvals, policies, and people that are typically involved in such financial work.&lt;/p&gt;

&lt;p&gt;One dashboard showing total tokens / uptime will not cut it.&lt;/p&gt;

&lt;p&gt;Financial services already is stressful enough without questioning the value of AI. The data point: &lt;a href="https://www.snowflake.com/en/blog/financial-services-ai-roi-agentic" rel="noopener noreferrer"&gt;68% of the financial-services respondents who used generative AI in a recent Snowflake survey from Snowflake were able to quantify a positive ROI from the technology, with 30% currently using agentic AI in live workflows.&lt;/a&gt; &lt;a href="https://www.moodys.com/web/en/us/creditview/blog/agentic-ai-in-financial-services.html" rel="noopener noreferrer"&gt;Moody's says Research Assistant users consume 60% more research and cut task completion time by 30%&lt;/a&gt;. As a result, financial services moves out of novelty category for agentic AI and goes straight to hard work of proving the value.&lt;/p&gt;

&lt;p&gt;The hard part is proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agentic AI ROI starts with work receipts
&lt;/h2&gt;

&lt;p&gt;Agentic AI ROI quickly goes from clear to fuzzy as soon as teams start to measure the “wrong” unit. Spend is not value. Prompts are not work. A simple monthly usage graph proves activity. That’s to show a better board packet. (a pretty low bar).&lt;/p&gt;

&lt;p&gt;The unit is the completed work item.&lt;/p&gt;

&lt;p&gt;An RFP answer section is a work item. An AML alert disposition is a work item. A KYC exception package is a work item. A risk memo refresh is a work item with input data, a responsible agent, tool calls, model cost, human approvals, policy checks, writes to downstream objects, and so on, until a set of reviews culminates in an outcome for the item, the end result of the agent’s work. The end result has a set of receipts for the finance department (evals, traces, etc.). Each run of a work item through an agent’s tools generates one or more such end result receipts.&lt;/p&gt;

&lt;p&gt;That is the receipt.&lt;/p&gt;

&lt;p&gt;That connects to prior work on &lt;a href="https://focused.io/lab/enterprise-ai-agents-are-runtime-products" rel="noopener noreferrer"&gt;enterprise AI agents as runtime products&lt;/a&gt;. Finance needs the same owned boundary if it wants per-work-item proof.&lt;/p&gt;

&lt;p&gt;LangChain’s finance piece names RFP processing and AML compliance monitoring as agentic use cases, then connects ROI to observability, governance, and economic measurement in the same stack. The operational discipline is making every meaningful run leave a receipt as it executes.&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%2Fa5xnf7eyzysl63s83m6t.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%2Fa5xnf7eyzysl63s83m6t.png" alt="Architecture diagram showing a financial services agent request flowing through an agent runtime into tools, databases, traces, side-effect receipts, a runtime ledger, and an evidence-backed KPI packet." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ROI proof is assembled while the agent runs, not after the fact in a spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The runtime is where the receipt gets written
&lt;/h2&gt;

&lt;p&gt;Whatever live agents execute is already in full view of the runtime, so hiding all that inside engineering tools is the self-inflicted wound here.&lt;/p&gt;

&lt;p&gt;An agent runtime handling real work knows the assistant, thread, run, input, tools, retries, costs, interrupts, stream events, and final state. &lt;a href="https://docs.langchain.com/langsmith/deployment" rel="noopener noreferrer"&gt;LangSmith Deployment describes its Agent Server execution model around assistants, threads, and runs&lt;/a&gt;, with durable execution, real-time streaming, and horizontal scaling for agent workloads. &lt;a href="https://docs.langchain.com/langsmith/agent-server-api/stateless-runs/create-background-run" rel="noopener noreferrer"&gt;The background-run API accepts metadata, context, webhooks, feedback keys, stream modes, and durability settings&lt;/a&gt;. That is enough surface area to attach business context before the work disappears into a trace search screen.&lt;/p&gt;

&lt;p&gt;The receipt for a run should be created before the moment the run is created (i.e. before the first tool is called in that run’s execution).&lt;/p&gt;

&lt;p&gt;Assign a task type to the run, attach the business object, cost center, policy, expected output contract, reviewer queue, and downstream system that the side effects will be written to. The runtime can then update the receipt as work is completed.&lt;/p&gt;

&lt;p&gt;For AI agents in finance, the receipt becomes the control surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  A receipt finance, risk, and engineering can read
&lt;/h2&gt;

&lt;p&gt;A runtime receipt is boring on purpose.&lt;/p&gt;

&lt;p&gt;That all gets recorded, and it is boring by design. There’s run ID and thread ID and task, data accessed, tool calls, model+token cost to run, latency to run, retries, approvals (and all the side-effect receipts), an evaluator score and a reviewer’s result, and business outcomes. For RFP sections we get to know if we’re accepting them with or without SME material re-write. For AML alerts they get escalated or closed or sent back for human review. For research memos they can be cited, rejected or re-written.&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%2Fc4ivmgh81q176rn57afe.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%2Fc4ivmgh81q176rn57afe.png" alt="Per-run receipt card listing run ID, thread ID, task type, model cost, latency, data touched, tool calls, approvals, side effects, evaluator score, and business outcome." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A receipt turns a trace into evidence finance, risk, and engineering can all read.&lt;/p&gt;

&lt;p&gt;For Engineering it is debug evidence, for Risk it is authority and data lineage, for Finance it is cost per accepted work item, and for Product it is adoption tied to outcome. This receipt answers different questions for the teams and does not force each to make up its own “truth” for how well things are working.&lt;/p&gt;

&lt;p&gt;Honeycomb has made similar observations in the past about Observability. As they put it in &lt;a href="https://www.honeycomb.io/blog/observability-are-you-measuring-what-matters" rel="noopener noreferrer"&gt;connect technical signals to business outcomes&lt;/a&gt;, because uptime, MTTR, and engineering productivity do not automatically yield a measure of what the business gets from the system. AI increases this already-substantial barrier, in that a healthy model, up service, etc. is not at all sufficient to guarantee that the agent using it will spend its time and money productively, or even at all.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://focused.io/lab/ai-agent-cost-is-a-runtime-signal" rel="noopener noreferrer"&gt;AI agent cost is a runtime signal&lt;/a&gt;, and its useful question is whether the agent’s work item can be replayed, judged, explained, and tied to business results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aggregate dashboards are too late
&lt;/h2&gt;

&lt;p&gt;They show spend by team, average latency, total runs, error rates, top agents, cost by model, and adoption trends. These are good to keep and to be proud of, but they are late by design, i.e. they cannot be used to prove the value of a single compliance-sensitive action.&lt;/p&gt;

&lt;p&gt;Averages hide important details, especially when it comes to individual expensive runs and costly rework caused by high adoption. The expensive run might be valuable to investigate deeply. The cheap run might be garbage. The agent with high adoption might cause rework, whereas the agent with low adoption is the one doing the riskiest work for the firm.&lt;/p&gt;

&lt;p&gt;The receipt is what lets the rollup make sense.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opentelemetry.io/blog/2026/otel-grad-now-what/" rel="noopener noreferrer"&gt;OpenTelemetry's graduation post&lt;/a&gt; is worth reading. Even though it’s talk of the future of telemetry and how to abstract it away from current vendor lock-in, it’s anchored firmly in current reality. OpenTelemetry is a graduated CNCF project and the maintainers point out that agent execution (running processes or containers) within agentic workflows (running workflows within workflow managers), and GenAI semantic conventions (as used by current AI and expected to be used in the future) are future workloads that OTel will be able to handle. Therefore, the receipt evidence that a run produced needs to be able to travel between all of the queues, databases, identity providers, SaaS APIs, and code review work-flows that the agent is executing in. The receipt cannot be locked in the private vocabulary of any single vendor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent work volume turns measurement into architecture
&lt;/h2&gt;

&lt;p&gt;Delegating work to agents as a regular part of one’s operating work is becoming operating volume, not a lab artifact. The recent Codex usage paper reported that &lt;a href="https://arxiv.org/html/2606.26959v1" rel="noopener noreferrer"&gt;active users grew more than fivefold in the first half of 2026&lt;/a&gt;. In addition, there are now more than 10% of users managing three or more agents in current active work at any time, and 26.6% of users using skills in their use of Codex for coding and other knowledge work.&lt;/p&gt;

&lt;p&gt;Parallel execution breaks casual measurement.&lt;/p&gt;

&lt;p&gt;The runtime needs to know what work item is currently active, which is pending approval, which handled customer data, which triggered follow-up jobs, which exceeded cost bounds, and which have side effects. &lt;a href="https://arxiv.org/html/2607.01641v1" rel="noopener noreferrer"&gt;A recent infinite-agent-loop paper found 68 confirmed failures across 47 projects&lt;/a&gt;. All of these failures can cause cost exhaustion, context growth, model denial of service, or repeated external side effects, and are caused by the iterations on the agent and its authority outpacing the system’s ability to observe its runtime behavior.&lt;/p&gt;

&lt;p&gt;The Agent libOS paper gets the systems shape right: long-running agents require &lt;a href="https://arxiv.org/html/2606.03895v1" rel="noopener noreferrer"&gt;process identity, parent-child lineage, lifecycle state, explicit capabilities, human queues, checkpoints, events, and audit records&lt;/a&gt;. In financial-services language that becomes identity, authority, state, approval, evidence, and accountability.&lt;/p&gt;

&lt;p&gt;Just as with money movement, &lt;a href="https://focused.io/lab/agentic-payments-move-spending-authority-into-the-runtime" rel="noopener noreferrer"&gt;spending authority moves into the runtime&lt;/a&gt; and therefore policy, approvals, receipts, and revocation need to be accounted for before the wallet signs the spending of tokens. The runtime should not simply spend tokens and hope finance reconstructs the value later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repeated work should become measured paths
&lt;/h2&gt;

&lt;p&gt;The first version of the finance agent is an exploratory one. It will try out various tools, ask for more information here and there, fail evals (which it can recover from), request approval, and in the process learn which path is best.&lt;/p&gt;

&lt;p&gt;Then the repeated paths should harden.&lt;/p&gt;

&lt;p&gt;A weekly RFP process is not something that should stay in a loose agent loop forever. It’s a process of requirements extraction, approved-content retrieval, answers, citations, SME review, and packaging. And those should be a well defined process with well defined gates. (Even if there are also places for ambiguity).&lt;/p&gt;

&lt;p&gt;That is the point behind &lt;a href="https://focused.io/lab/agentic-workflows-should-get-less-agentic" rel="noopener noreferrer"&gt;agentic workflows getting less agentic&lt;/a&gt;. Repeated behavior of an agentic workflow should transform into an observable, doable, legible execution path (and remain agentic as soon as reality changes again). Likewise the ROI of a finance agent does not only grow as it becomes more agentic, it also grows as the agent’s work is first discovered, recorded, measured and then hardened.&lt;/p&gt;

&lt;p&gt;And, side-effect layer. As we’ve written about before, &lt;a href="https://focused.io/lab/ai-agent-orchestration-needs-a-side-effect-ledger" rel="noopener noreferrer"&gt;side-effect receipts&lt;/a&gt; are critical to enabling features like retry, compensation, and ownership tracking when various tools are orchestrating work that causes side effects by running to update live systems. For a finance agent, this would include updating CRM records, requesting documents, opening up new case work, generating client-facing drafts, and opening up new compliance work, etc., all of which would need to be issued with an operation key and receive a corresponding receipt.&lt;/p&gt;

&lt;p&gt;A trace in the workflow captures all the activity that occurred within the agent as it executed the workflow. A side-effect receipt, by contrast, captures the changes that the agent caused outside of the workflow, i.e., the actual side-effects.&lt;/p&gt;

&lt;p&gt;Both belong in the ledger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Own the ledger before the board asks
&lt;/h2&gt;

&lt;p&gt;A distributed systems lecture is not what the board wants. Fair enough. They just want to know if their money has been converted into real work value.&lt;/p&gt;

&lt;p&gt;To answer that question honestly requires a tremendous amount of engineering discipline to create runtime receipts that are dull enough to be understood by people in finance, risk, and engineering, and to attach all relevant metadata before work begins, to track all changes to authority throughout the process, to ensure that all side effects are recorded as first class facts, to tie the scores from evaluators and the results of human review to the work item in question, and to do rollups from the receipt as opposed to from the vibes that were brought to the work.&lt;/p&gt;

&lt;p&gt;This also changes how one evaluates vendors for finance agent platforms. A platform without per-work receipts for finance, risk, and engineering to share is magic; a runtime with receipts is evidence, easier to defend when the model changes, when a workflow drifts, when a regulator asks for lineage, or when the CFO asks why the AI budget went up again.&lt;/p&gt;

&lt;p&gt;Show the receipt.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>langchain</category>
      <category>ai</category>
    </item>
    <item>
      <title>Agent Protocols Fail at the Seams | Focused Labs</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Fri, 17 Jul 2026 21:45:42 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/agent-protocols-fail-at-the-seams-focused-labs-317h</link>
      <guid>https://dev.to/focused_dot_io/agent-protocols-fail-at-the-seams-focused-labs-317h</guid>
      <description>&lt;p&gt;The agent protocols are becoming integrated into normal software infrastructure, making integration easier. And this is making ownership blurrier.&lt;/p&gt;

&lt;p&gt;These all make integration easier, so that’s great for product teams that want agents working together quickly. But then this becomes another failure surface in addition to specification. In this case, content flows quickly, and so do the different standards for delegation and state and all the rest. Meanwhile, ownership has traditionally moved more slowly through the org chart than that, so the mismatch becomes a problem for everybody.&lt;/p&gt;

&lt;p&gt;Research is emerging around the integration of different agent protocols and the security of their composition. A 2026 paper, &lt;a href="https://arxiv.org/abs/2606.28690" rel="noopener noreferrer"&gt;Formal Security Analysis of Agent Protocol Composition&lt;/a&gt;, investigates five agent protocols, finds 35 specification-level findings, backs them with 80 detailed implementation tests, and adds 30 failures found when the protocols were composed together as part of a larger system.&lt;/p&gt;

&lt;p&gt;Finally, the years of pressuring AI agent vendors to connect together are starting to bear fruit. Work that can be done by isolated ‘agents’ is child’s play. The work of an enterprise is to cross boundaries in every direction. It has to traverse files, work items, schedules, databases, customer records in CRM systems, web pages viewed in browsers, software repositories, and APIs for internal services.&lt;/p&gt;

&lt;p&gt;Clean locally. Sketchy globally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protocols standardize communication, not responsibility
&lt;/h2&gt;

&lt;p&gt;Note to buyers: IBM’s useful definition says &lt;a href="https://www.ibm.com/think/topics/ai-agent-protocols" rel="noopener noreferrer"&gt;AI agent protocols standardize communication&lt;/a&gt; among AI agents and between agents and other system components; they do not standardize workflow coordination, execution, or optimization. Don’t make the stupid mistake of believing protocol support automatically includes control plane functionality.&lt;/p&gt;

&lt;p&gt;MCP (Model Context Protocol) allows agents to discover tools and call them. A2A (Agent to Agent) allows independent agents to interact with each other using a standard interface. ACP (Agent Communication Protocol) allows agents to interact with each other using a REST interface (synchronous and asynchronous, streaming, stateful and stateless, online and offline, long running etc). It describes a thick grammar layer.&lt;/p&gt;

&lt;p&gt;Grammar does not decide who can touch payroll.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://a2a-protocol.org/latest/specification/" rel="noopener noreferrer"&gt;A2A 1.0 specification&lt;/a&gt; describes A2A in terms of three layers: the canonical data model, abstract operations, and bindings to specific protocols. Appendix A gives the enterprise pattern in miniature. An A2A client agent asks an A2A server agent to perform work. The server agent can then use tools and APIs supported by MCP. The architecture is useful for enterprise work and is exactly the direction people are moving AI agents.&lt;/p&gt;

&lt;p&gt;ACP explicitly states the quiet part. The &lt;a href="https://agentcommunicationprotocol.dev/introduction/welcome" rel="noopener noreferrer"&gt;Agent Communication Protocol docs&lt;/a&gt; pitch interoperability between different frameworks, teams, and infrastructures. ACP exposes a REST API and is therefore opaque to the method calling the API. It supports long-running tasks, cancellation, streaming messages, and discovery. But as always: what looks valid as a method call can still be wrong when executed at runtime as part of a longer composed path of actions.&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%2Ff6tbyd3c2ssuhmi8b0zz.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%2Ff6tbyd3c2ssuhmi8b0zz.png" alt="Architecture map showing an A2A client delegating to an A2A server that calls MCP tools while runtime policy and trace audit span the protocol seam." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The risky boundary is where locally valid protocol calls become one composed path.&lt;/p&gt;

&lt;p&gt;This is why &lt;a href="https://focused.io/lab/mcp-security-starts-after-tool-approval" rel="noopener noreferrer"&gt;MCP security starts after tool approval&lt;/a&gt;. Approving a server, registering its tools, and checking schemas only proves that a local component has a shape the client recognizes. Runtime security starts when the system asks a set of questions: What changed? What authority is being carried forward? What content entered the model’s context? What evidence will there be after the action is taken?&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure moves through content, delegation, and authority
&lt;/h2&gt;

&lt;p&gt;The AgentThread paper includes an example that is simple but should make security teams squint. One MCP server fetches attacker-controlled web content. Hidden instructions enter the model context. A second MCP server has file access. The agent reads local data and sends it back out through the first server. &lt;a href="https://arxiv.org/abs/2606.28690" rel="noopener noreferrer"&gt;The paper describes the unsafe behavior as composition, implicit authority transfer, missing consent, and weak audit visibility across the agent runtime&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No single action needs to be out of the ordinary. Get a web page. Read a local file. Send the result of that.&lt;/p&gt;

&lt;p&gt;The failure is the path.&lt;/p&gt;

&lt;p&gt;The old framing of &lt;code&gt;mcp security&lt;/code&gt; as a checklist around one server is too small. CoSAI’s &lt;a href="https://www.coalitionforsecureai.org/wp-content/uploads/2026/03/model-context-protocol-security-1.pdf" rel="noopener noreferrer"&gt;Model Context Protocol Security whitepaper&lt;/a&gt; maps MCP to twelve threat categories and almost forty threats, including identity, access control, input and data boundaries, trust boundaries, lifecycle governance, logging, monitoring, and auditability. That taxonomy belongs in deployment design.&lt;/p&gt;

&lt;p&gt;This is related to the prior post on the tool-call boundary. &lt;a href="https://focused.io/lab/ai-agent-security-happens-at-the-tool-call" rel="noopener noreferrer"&gt;AI agent security happens at the tool call&lt;/a&gt;. But now that the tool call is a node in a larger composed route, the runtime must remember the content and the delegation that happened before calling that tool. A runtime that only checks the tool call is doing the bouncer’s work at one door, while there are tunnels in the building.&lt;/p&gt;

&lt;h2&gt;
  
  
  SDK conformance is not runtime safety
&lt;/h2&gt;

&lt;p&gt;I like standards. I want fewer custom connectors. I want agents to connect to tools, agents, and servers without six months of mapping fields between corresponding data objects.&lt;/p&gt;

&lt;p&gt;The AgentThread authors break down security failures at the protocol level to describe separate problems: unsafe behavior within a single protocol, missing SDK recommendations, missing deployment hardening, and unassigned responsibilities in cross-protocol cases. Ultimately, the authors find that agent-protocol insecurity stems from responsibility gaps across protocols, SDKs, and deployments, &lt;a href="https://arxiv.org/abs/2606.28690" rel="noopener noreferrer"&gt;failures that occur when semantic content, delegated authority, and tool access cross protocol boundaries&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When a set of features required for securing agent-protocol interactions is distributed across three SDKs and documented in a wiki, no one ends up owning the seam.&lt;/p&gt;

&lt;p&gt;Multi-agent systems already expose this kind of problem without the added complexity of security. We have written about how &lt;a href="https://focused.io/lab/multi-agent-systems-break-at-the-collaboration-plane" rel="noopener noreferrer"&gt;multi-agent systems break at the collaboration plane&lt;/a&gt;, at the claims, findings, handoffs, and shared-state level between agents. In the worst case, a lost finding turns into a security incident, and a lost authority boundary turns into a breach report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Own the seam above the protocol stack
&lt;/h2&gt;

&lt;p&gt;The fix starts by treating protocol composition as a runtime surface.&lt;/p&gt;

&lt;p&gt;Standards committees can improve the grammar. Vendors can ship nicer SDKs. Security teams can review popular servers. Good. The runtime that joins MCP, A2A, ACP, AG-UI, browser tools, file tools, and internal APIs still has to own composition policy.&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%2Fkpknbcsd8h8q8w53df0u.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%2Fkpknbcsd8h8q8w53df0u.png" alt="Responsibility matrix showing protocol specs and SDKs handling local grammar while runtime and application owners handle cross-protocol intent, authority, content labels, trace context, and rollback." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Standards define grammar. System ownership has to be assigned above them.&lt;/p&gt;

&lt;p&gt;First, every step across protocol boundaries should leave an execution record: the principal, user or sponsor, original objective, delegated objective, source-content classification, requested tool or action, target resource, credential scope, policy decision, and resulting artifact. Call it a “ledger,” a “receipt chain,” or a “protocol-composition record.” The important thing is that the record exists for the entire composition path and is preserved for the duration of the execution.&lt;/p&gt;

&lt;p&gt;As cross-protocol actions are executed, the authority granted to the previous step in the protocol should be restricted, such that subsequent steps in the protocol require additional justification or authorization, in line with the authority narrowdowns identified above. In particular, A2A delegation should not transfer the ambient authority of the calling principal to subsequent agents, MCP tool calls should be executed with credentials scoped to the task at hand as opposed to the human’s session, and browser-side agents should not silently inherit backend privileges as a result of a convenient protocol bridge.&lt;/p&gt;

&lt;p&gt;Third, untrusted content needs to be labelled by the runtime as to its origin. This will allow policy to determine if later content can be used to justify actions that involve model processing of that untrusted content. A simple prompt-injection defense that only scans new text as it is injected into a model will not be effective if the injected text consists of, for example, web pages, ticket comments, email bodies, etc. Simply labelling such content as originating from the “user” will be insufficient to control its usage, since it would be allowed to be used to justify virtually any subsequent action.&lt;/p&gt;

&lt;p&gt;Fourth, we need to carry trace context with us across protocol boundaries. As we said before, &lt;a href="https://focused.io/lab/agent-traces-need-to-cross-the-mcp-boundary" rel="noopener noreferrer"&gt;agent traces need to cross the MCP boundary&lt;/a&gt; because otherwise we would be left with planner traces with no tool/service spans, a useful story with a missing crime scene. But when protocol composition is involved, the downstream calls made by A2A or ACP can also cross MCP boundaries, and thus the traces they produce need to cross boundaries as well. If instead each of the different protocols produced a separate trace with no correlation between them, then any post-incident review would be pure archaeology.&lt;/p&gt;

&lt;p&gt;Fifth, tracking of what to undo in case of failure (rollback) has to be attached to the composed path as well. The number of steps to undo can easily exceed the number of steps to complete a task already. If a tool creates a ticket, updates a file, sends out an email to customers, updates a CRM like Salesforce, and stores something in memory, then all of these steps have to be undoable as a whole. Otherwise the only thing to do in case of failure is to manually clean up the mess, which is what happens in enterprises already (classic).&lt;/p&gt;

&lt;h2&gt;
  
  
  The runtime is the security boundary buyers actually get
&lt;/h2&gt;

&lt;p&gt;The protocol ecosystem is moving in the right direction. MCP lowered tool integration friction. A2A gives independent agents a shared way to delegate and report task state. ACP gives teams a simple HTTP path for agent interoperability. These are good tools for building useful workflows.&lt;/p&gt;

&lt;p&gt;They are also incomplete by design.&lt;/p&gt;

&lt;p&gt;A protocol specification describes messages, the state through which an agent goes, how an agent is authenticated, and the semantics of the operations that the agent can perform. But, the specific enterprise data structures, human rules for approval, scope of particular credentials, rules for handling an incident, and rules for rolling back actions that have been performed, all of these are outside of the scope of a protocol specification. They live in the &lt;a href="https://focused.io/lab/enterprise-ai-agents-are-runtime-products" rel="noopener noreferrer"&gt;runtime and application architecture around it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So the procurement question should change.&lt;/p&gt;

&lt;p&gt;Don’t just ask if the vendor supports MCP or A2A, because everybody supports the hot acronym eventually. Ask what happens when an agent delegates across A2A, calls an MCP tool, consumes untrusted content, accesses internal data, and returns an artifact to a user. Ask where the runtime’s ledger is. Ask how A2A-delegated credentials are minted for the task at hand. Ask how trace context is propagated throughout the composed protocol chain. Ask how policy sees the origin of new content introduced into a model. Ask how a system would roll back the damage done by a four-step process where each step seemed rational inside the bounds of the current protocol.&lt;/p&gt;

&lt;p&gt;That is the AI agent security boundary now.&lt;/p&gt;

&lt;p&gt;A protocol makes the path easier to build. The team running the system still owns what happens when authority crosses the seam.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>AI Agent Infrastructure Is Splitting at the State Layer | Focused Labs</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Thu, 16 Jul 2026 21:40:53 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/ai-agent-infrastructure-is-splitting-at-the-state-layer-focused-labs-27l0</link>
      <guid>https://dev.to/focused_dot_io/ai-agent-infrastructure-is-splitting-at-the-state-layer-focused-labs-27l0</guid>
      <description>&lt;p&gt;The agent stack is so boring where buyers keep looking: the loop.&lt;/p&gt;

&lt;p&gt;Loop in sight, the rest of the system is elsewhere in the loop (the agent loop did not disappear). Even more, a layer has been created to manage durable records of work done by the agent: state (a durable record of the work done by the AI agent to service customer requests). This is the crux of enterprise work. The enterprise will configure a system (AI or not) to create and maintain such records and also decide who can read such records, how long to keep them, what they are allowed to do with such records, etc. With the introduction of the state layer, AI agent infrastructure now splits at the state layer. Model + a prompt-centered agent no longer represents the infrastructure argument for AI agents.&lt;/p&gt;

&lt;p&gt;The state layer of an AI agent is now the dividing line between the agent being a product and the agent being a parlor trick that happens to access Salesforce etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop is the wrong buying surface
&lt;/h2&gt;

&lt;p&gt;The harder questions live one layer down.&lt;/p&gt;

&lt;p&gt;Where does the state live after the tab has been closed? What writes the checkpoint? What happens when a tool call is successfully completed but the model fails before a summary can be generated? Where do traces, policy decisions and permission grants enter the run? What can an enterprise export when the vendor contract expires? Who can delete memory? Who can subpoena memory? Who is responsible for the record when two agents are working with the same customer and writing to the same file?&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%2Fdxj05bp4wclp2t4fwvyz.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%2Fdxj05bp4wclp2t4fwvyz.png" alt="Side-by-side architecture showing a prompt-centered agent beside an agent backed by a durable state layer." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The durable boundary is where the agent becomes operating infrastructure.&lt;/p&gt;

&lt;p&gt;State turns agent behavior into infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The database is becoming the backend
&lt;/h2&gt;

&lt;p&gt;On Thursday, LangChain and MongoDB announced a partnership that frames agent systems as requiring retrieval, persistent memory, operational data access, observability, and reliable deployment. The real launch is a set of tools, and the proof that the partnership matters sits in the “more about” line: &lt;a href="https://www.langchain.com/blog/announcing-the-langchain-mongodb-partnership-the-ai-agent-stack-that-runs-on-the-database-you-already-trust" rel="noopener noreferrer"&gt;"Agents need more than a model and a prompt"&lt;/a&gt;. A tool-centered agent (or prompt-centered builder) is not a product.&lt;/p&gt;

&lt;p&gt;That sentence is doing more work than the launch language around it.&lt;/p&gt;

&lt;p&gt;The official LangGraph documentation notes that &lt;a href="https://docs.langchain.com/oss/python/langgraph/add-memory#use-in-production" rel="noopener noreferrer"&gt;durable memory should use a database-backed checkpointer&lt;/a&gt;, with examples for Postgres, MongoDB, Redis, and Oracle. The LangSmith deployment documentation exposes the state-layer switch directly: &lt;a href="https://docs.langchain.com/langsmith/configure-checkpointer#deploy-by-environment" rel="noopener noreferrer"&gt;set &lt;code&gt;LS_DEFAULT_CHECKPOINTER_BACKEND&lt;/code&gt; to &lt;code&gt;mongo&lt;/code&gt; and provide &lt;code&gt;LS_MONGODB_URI&lt;/code&gt;&lt;/a&gt;. That line belongs in the platform review, right next to storage, deployment, and data residency.&lt;/p&gt;

&lt;p&gt;Boring. Also the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  State is where lock-in turns real
&lt;/h2&gt;

&lt;p&gt;O'Reilly's 2026 AI agent architecture diagram defines &lt;a href="https://www.oreilly.com/radar/the-ai-agents-stack-2026-edition/" rel="noopener noreferrer"&gt;six layers between the LLM and an AI agent running real workloads&lt;/a&gt;. Memory / persistent state is a first level primitive in the architecture above the vector database. This architecture matches the actual experience of the market for the framework layer: easy to switch out when the application is well bounded. State is much harder to switch out.&lt;/p&gt;

&lt;p&gt;TGVP outlined a similar argument for how &lt;a href="https://www.tgvp.vc/releases/tgvp-report-ai-agent-infrastructure-in-2026" rel="noopener noreferrer"&gt;stateful services create moats because memory graphs, identity stores, policy logic, and audit history compound over time&lt;/a&gt;. While I dislike moat arguments for infrastructure (such as how custom UIs in enterprise software create a barrier to entry that replaces simply offering a “connector catalog” which can then be replaced by a single adapter), there is merit in the increased memory graphs, identity stores, policy logic, and audit histories that compound over time.&lt;/p&gt;

&lt;p&gt;I wrote this out originally as part of my vendor evaluation criteria. The first part was model neutrality. This seems to be something people want to hear. Durable memory should use a database-backed checkpointer, and implementation details for that checkpointer should be exposed to review (storage, deployment, data residency, etc) long before the memory format, the trace (or log) schema, the policy and decision-making portions of the state, and the audit export. Open model routing on top of closed state is a nicer cage with better lighting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance follows the state
&lt;/h2&gt;

&lt;p&gt;The state layer also pulls governance out of slideware.&lt;/p&gt;

&lt;p&gt;Agent governance can sound abstract and be confined to slideware when it is stored in policy documents. But as soon as the platform is viewed as a series of layers, the team starts to ask concrete questions about a given run of an agent. For example: who was the principal that started the run off? What was the task that narrowed down the set of permissions that were granted to that principal? What was the tool call that was made that actually crossed the boundary of what that principal was allowed to do with that set of permissions, given by that task? What was the policy that actually allowed that tool call to be made by that principal, given by that task? What was the checkpoint that actually recorded that run of the agent? And what was the trace that actually proves that that run of the agent happened in that order.&lt;/p&gt;

&lt;p&gt;Research into the security of Agent-based systems is only just beginning to explore the boundary between what the agent is granted permission to do and what the MCP server will actually allow the agent to do. AgentBound looked at &lt;a href="https://arxiv.org/html/2510.21236v1" rel="noopener noreferrer"&gt;296 popular MCP servers and found that automatically generated permission manifests worked without modification 80.9% of the time, with 0.6 ms average enforcement overhead&lt;/a&gt;. It is clear that MCP tool access is heading in the direction of explicit manifests and runtime enforcement of access rights rather than the current model of trust-by-default and running of host processes.&lt;/p&gt;

&lt;p&gt;Identity work also dovetails nicely with this analysis. A 2026 AI identity report defines AI identity as &lt;a href="https://arxiv.org/html/2604.23280v1" rel="noopener noreferrer"&gt;a continuous relationship between what an agent declares and what it is observed to do&lt;/a&gt;. This relationship is established through the declaration, the observation, and the confidence in that observation. Thus the same architecture that tracks the state of a productive AI also establishes and tracks the identity of that AI. Declaration without observation is a credential. Observation without a durable store of state is a log. Confidence in the system’s understanding of the relationship between an agent’s declared identity and its observed behavior requires that the system have a durable store of state and be able to compare what has happened to what the system expected to happen.&lt;/p&gt;

&lt;p&gt;Task-scoped access control, a topic we’ve covered in the past, also falls under this topic. A writeup for TrueFoundry’s TBAC (Task-Based Access Control) function explained how current identity-centric access models can strain under the weight of agents, because each task may need to call for a different permission set. That can happen quickly, and is particularly exposed to prompt-injection attacks. In short, TrueFoundry argues that &lt;a href="https://www.truefoundry.com/pt/blog/tbac-task-based-access-control-ai-agents" rel="noopener noreferrer"&gt;task-based controls bundle minimal permissions for the duration of work&lt;/a&gt;. And that’s a great architecture, even if the vendor packaging leaves a bit to be desired.&lt;/p&gt;

&lt;p&gt;We have looked at the authorization side before through &lt;a href="https://focused.io/lab/ai-agent-security-happens-at-the-tool-call" rel="noopener noreferrer"&gt;tool-call security&lt;/a&gt; and agent principals (e.g. running an agent as a user). From a state-layer perspective, these all tie together: authorization, identity, memory, checkpoints, traces and audit records. The record of an agent doing work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stateful loop is the product
&lt;/h2&gt;

&lt;p&gt;A live agent run has a rhythm.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Load memory. Call tool(s) and enforce policy for each. Write trace for each tool call. Record audit event. Update run state. Later, resume run from evidence collected during run&lt;/em&gt;. As mentioned previously, each live agent run will have a history which can be inspected by the platform. Such a history provides much greater value than having the agent’s runs be driven by prompts to which the model may or may not answer correctly.&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%2F5rqtrko5tekwivkcc5se.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%2F5rqtrko5tekwivkcc5se.png" alt="Flow diagram showing a stateful agent loop that loads memory, calls tools, writes traces and audit records, and resumes later." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;State compounds.&lt;/p&gt;

&lt;p&gt;The work does not have to be “unlearned” when an agent run is abandoned for whatever reason. A new run of work can start from the exact point at which the previous run left off.&lt;/p&gt;

&lt;p&gt;However, all of this work would be for naught if the evidence from past runs of an agent were not properly monitored. This is why &lt;a href="https://focused.io/lab/agent-monitoring-is-an-infrastructure-workload" rel="noopener noreferrer"&gt;agent monitoring is infrastructure&lt;/a&gt;. The stateful agent loop that we discussed earlier includes a section for “write trace and audit records” for a reason. This is the means by which all of the side effects of a run of an agent are recorded, so that they can be inspected by a human (or automated system) later.&lt;/p&gt;

&lt;p&gt;It is therefore no surprise that &lt;a href="https://focused.io/lab/langchain-bridging-the-gap-to-production-grade-ai-agents" rel="noopener noreferrer"&gt;agent platforms that can handle real workloads&lt;/a&gt; are focused on platform work (as illustrated before).&lt;/p&gt;

&lt;p&gt;The model may still be the expensive line item. The state layer is where operational trust accumulates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Platform evaluation moves to the state layer
&lt;/h2&gt;

&lt;p&gt;The buying checklist should change.&lt;/p&gt;

&lt;p&gt;Where does it store the checkpoints for previous runs? What is the format of the platform’s memory? How does it join together the information from thread ID, run ID, trace ID, and audit ID? Does it record permission decisions made by a tool call with the record of that tool call, or does it have to rebuild that information from elsewhere? Can it export the state information on the platform surfaces, or is that something that one has to ask support to do for them? (Note that just because something is exported as a state, it doesn’t mean that the state information exported is the same as the information that was stored as state information on the platform surfaces). Can the system delete the memory of one user without affecting the memory of other users that are stored in the same index? How does the system partition out the information that it stores for state information by tenants, by environment, by region, by retention rules, etc.&lt;/p&gt;

&lt;p&gt;Then ask the uncomfortable version: what gets lost during migration?&lt;/p&gt;

&lt;p&gt;Prompt history and agent builder configuration are one thing. Checkpoints, memory, traces, approvals, audit records, and policy history are another. If the vendor can’t migrate all of that to the customer's new backend then the vendor is in control of the live behavior of the agent. Yes, the agent runs on the customer's cloud. Yes, the customer pays for the model and has a model key that the customer uses to sign into the agent. But the memory, the record of the agent’s governance, the record of the agent’s work, that lives somewhere else.&lt;/p&gt;

&lt;p&gt;Own that layer or the agent's memory, governance and operating history belong to someone else's backend.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Agentic Workflows Should Get Less Agentic | Focused Labs</title>
      <dc:creator>Austin Vance</dc:creator>
      <pubDate>Wed, 15 Jul 2026 03:32:07 +0000</pubDate>
      <link>https://dev.to/focused_dot_io/agentic-workflows-should-get-less-agentic-focused-labs-3h32</link>
      <guid>https://dev.to/focused_dot_io/agentic-workflows-should-get-less-agentic-focused-labs-3h32</guid>
      <description>&lt;p&gt;Agentic workflows are supposed to get boring.&lt;/p&gt;

&lt;p&gt;The first pass can be exploratory and pretty expensive. The tenth pass should be boring and not have to rediscover the solution through a completely new set of tools. That workflow has earned a promotion.&lt;/p&gt;

&lt;p&gt;That is the useful part of the new &lt;a href="https://arxiv.org/html/2607.07052v1" rel="noopener noreferrer"&gt;Progressive Crystallization paper&lt;/a&gt;. It names a lifecycle agent teams are going to rediscover the painful way: agents explore, traces prove repeated behavior, tests turn that behavior into workflow code, and telemetry from those runs decides when the workflow gets demoted back to the agent layer.&lt;/p&gt;

&lt;p&gt;The paper presents data from a cloud-network operations system handling real incidents in which deterministic executions went from 0% to 45% over eight months. In the meantime, the per-incident agent cost went down by more than 70% and the number of incidents doubled. The model did not simply get cheaper. Solved work stopped being agent work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploration belongs upstream
&lt;/h2&gt;

&lt;p&gt;We continue to see agentic workflows get treated as a fixed architecture choice: build an agent, give it tools, add approvals, add observability, and hope the loop gets better.&lt;/p&gt;

&lt;p&gt;The better shape is a lifecycle.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://arxiv.org/html/2607.07052v1" rel="noopener noreferrer"&gt;Progressive Crystallization taxonomy&lt;/a&gt; organizes the various possible forms execution can take in a lifecycle agent. The Type 3 form of execution is 'agent-orchestrated'. That is to say that an agent investigates a problem with bounded autonomy, checkpoints reads and routes writes through human approval. Type 2 forms of execution are 'hybrid'. In a hybrid execution a workflow of steps is owned by a workflow, but the model is used to interpret or classify information at scoped points in the workflow. Type 1 forms of execution are 'deterministic'. They consist of typed API calls, conditionals, and so on, that together form a rigid and non-negotiable execution path. There is no place in a Type 1 workflow for model invocation at runtime.&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%2F0h2h0y69voa7kpyqp97q.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%2F0h2h0y69voa7kpyqp97q.png" alt="Lifecycle spectrum showing Type 3 agent exploration promoting through Type 2 hybrid workflow into Type 1 deterministic execution" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The maturity curve moves agency out of repeated execution and leaves it for novelty.&lt;/p&gt;

&lt;p&gt;This is how enterprise teams build out agentic workflows. First, a novel incident gets explored with tools and state. Then, as that incident repeats, the team wants a workflow that implements that path of work. Then, as that workflow starts to get weird on the edge cases, the system needs a path back to exploration. And that's what we've been saying all along about &lt;a href="https://focused.io/lab/langgraph-enterprise-agent-development" rel="noopener noreferrer"&gt;LangGraph as the foundation for enterprise agents&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The compile step is the economic boundary
&lt;/h2&gt;

&lt;p&gt;First we "reason" once through a problem. Then we execute that same problem solution over and over again as repeated incidents of the same thing. The Progressive Crystallization paper documents a real-world crystallization workflow, which turns out to be a straightforward incarnation of this fundamental software pattern.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://arxiv.org/html/2604.05150v1" rel="noopener noreferrer"&gt;Compiled AI paper&lt;/a&gt; describes a class of live AI systems in which an LLM is used once to generate an artifact, that artifact is then validated, and then a large amount of code is run with zero execution tokens. The authors evaluate function-calling, reporting 96% task completion with zero execution tokens, and a break-even point of 17 transactions to compile the function. They report 57x reduction in tokens at 1,000 transactions.&lt;/p&gt;

&lt;p&gt;If a workflow gets run repeatedly (i.e., it is a repeatable process), the fact that it is an agentic workflow gets to be a tax on the number of times that workflow gets run. That tax is enforced by runtime inference and, thus, is best countered by reducing the number of runtime inference steps, in particular the number of execution tokens required to run each step of the workflow. There are different approaches to do this (for example, model routing, prompt caching, reducing the size of the LLM used to implement each step of the workflow), all pointing at the same idea: a process repeated enough times becomes worth compiling into a function that can be called directly. We previously laid out the cost argument in &lt;a href="https://focused.io/lab/ai-agent-cost-is-a-runtime-signal" rel="noopener noreferrer"&gt;AI Agent Cost Is a Runtime Signal&lt;/a&gt;, but that was at the level of an entire agent, whereas this tax can be incurred by individual workflows within an agent. That is the basic move behind Compiled AI.&lt;/p&gt;

&lt;p&gt;Note, a workflow that is promoted will have a slightly different contract on the trace. The trace will serve as a candidate specification, which in the end would have to pass acceptance tests. The steps in the promoted workflow would have to have side effects that are idempotent (i.e. with keys, upserts, read-before-writes). The human approvals in the trace would have to be encoded in the workflow as explicit states instead of as mere chat turns. The failure modes of the steps in a promoted workflow would have to be of a particular type (i.e. typed exits).&lt;/p&gt;

&lt;h2&gt;
  
  
  LangGraph keeps the seam visible
&lt;/h2&gt;

&lt;p&gt;So where does the seam go between exploration and execution?&lt;/p&gt;

&lt;p&gt;LangGraph is especially useful in this situation because it does not force a team to decide between using a free-form agent loop, and building a full-fledged workflow engine. Instead, it lets a team use existing Python control flow and wrap API calls and other execution logic with persistence primitives, such as memory and checkpointing. Two primitives in the &lt;a href="https://docs.langchain.com/oss/python/langgraph/functional-api" rel="noopener noreferrer"&gt;Functional API&lt;/a&gt;, &lt;code&gt;@entrypoint&lt;/code&gt; and &lt;code&gt;@task&lt;/code&gt;, are plain, and they end up powerful. An entrypoint defines a workflow, while a task defines work within a given workflow.&lt;/p&gt;

&lt;p&gt;This plainness matters for two reasons. The first is that repeated execution of a particular path through the agent is just repeated execution of a function. Therefore that function can be written as Python code, complete with a model call in the middle if that still makes sense for the application. Second, the task API lets a team write one task for database records and another task for approval. In the first task, the write can carry an idempotency key, and the approval can carry its own. This way, the workflow can still do approval steps, and the workflow still gets the benefit of persisted runtime state for the agent, without doing that in a single, tricky prompt.&lt;/p&gt;

&lt;p&gt;LangGraph also tracks changes to past workflow runs, and implements important implications for a reproducible workflow API. &lt;a href="https://docs.langchain.com/oss/python/langgraph/functional-api" rel="noopener noreferrer"&gt;Saved workflow checkpoints&lt;/a&gt; are loaded into a resumed workflow from the beginning of the entrypoint, re-running &lt;code&gt;@entrypoint&lt;/code&gt; calls and loading saved results from &lt;code&gt;@task&lt;/code&gt; calls completed before the last checkpoint. The &lt;a href="https://docs.langchain.com/oss/python/langgraph/backward-compatibility#non-determinism" rel="noopener noreferrer"&gt;backward compatibility docs&lt;/a&gt; make the implication blunt: adding, removing, or reordering task calls before the last resume point can replay incorrect cached values. Nondeterministic code outside a task can also change behavior during replay.&lt;/p&gt;

&lt;p&gt;Just like compiled code, a crystallized workflow is something that can be run again and again. It can have a version number. It can have a window of time in which to complete (a "drain window"). It can have a set of rules for migrating to a newer version in the middle of a run (a "migration plan"). And a path that has been promoted out of an agent loop is now something that behaves like API calls against a persisted record of the execution of that path. So it can be edited as a whole as a single "implementation", as a single program, rather than as a series of individual edits to individual prompts.&lt;/p&gt;

&lt;p&gt;So the pattern here for live agentic systems, as outlined in the &lt;a href="https://www.langchain.com/blog/how-to-think-about-agent-frameworks" rel="noopener noreferrer"&gt;LangChain documentation for agent frameworks&lt;/a&gt; is to define a system of a combination of workflows and agents and let workflows be the simplest, cheapest, fastest and reliable means to complete a task when it doesn't require agency. Thus the mix of workflows and agents for a system will change over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Promotion is an evidence gate
&lt;/h2&gt;

&lt;p&gt;The fastest way to ruin this workflow is to promote it based on vibes.&lt;/p&gt;

&lt;p&gt;A model claiming a repeatable path is largely meaningless. A corpus of traces for same cases going through same path is significantly more valuable. A proposed workflow which passes tests for candidate specification is even more valuable. A promoted path of work with no human overrides, bounded by appropriate tool permissions, idempotent for all side effects, and clean rollback semantics, is starting to look like durable software.&lt;/p&gt;

&lt;p&gt;First, &lt;a href="https://focused.io/lab/approval-queues-are-the-runtime-for-agentic-ai-workflows" rel="noopener noreferrer"&gt;approval queues belong in the runtime for agentic AI workflows&lt;/a&gt;. Once the path is known, &lt;a href="https://focused.io/lab/agent-orchestration-belongs-in-code" rel="noopener noreferrer"&gt;agent orchestration belongs in code&lt;/a&gt;. Evals should sit close to where changes happen, and traces should sit close to the decision. So, the gate to "promotion" (i.e. to live usage of a particular path for a given case) is now just another release gate for a service.&lt;/p&gt;

&lt;p&gt;The checklist of persistent state, re-executable work, idempotent writes, etc. to determine safe replay of the node is boring but there. That's what needs to be there for repeated agent paths to be 'promoted' to newly 'durable' function calls. Until then, they remain fragile in-the-loop workarounds with no persistent contract and hence no way to track, test or reproduce them for regression testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability decides demotion
&lt;/h2&gt;

&lt;p&gt;Promotion gets the money conversation. Demotion keeps the system honest.&lt;/p&gt;

&lt;p&gt;A deterministic workflow can decay. The API that a task uses can change. Firmware can be updated to add a field. A support policy can change. Workflows can continue to pass syntactic validation while slowly drifting away from the real work being done. The promoted system needs a way to notice this kind of decay without incurring the cost of the agent on every run. Traces become the control plane.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opentelemetry.io/blog/2026/genai-observability" rel="noopener noreferrer"&gt;OpenTelemetry's GenAI observability post&lt;/a&gt; describes a single trace for an end-to-end workflow of invoking an agent, having a chat with a model, and executing a tool. Honeycomb's &lt;a href="https://www.honeycomb.io/blog/fast-ai-feedback-loops-honeycomb-opentelemetry" rel="noopener noreferrer"&gt;fast AI feedback loop writeup&lt;/a&gt; shows how similar telemetry can be used to drive SLOs, alerts, and dashboards, and can even be queried with Honeycomb's native query language.&lt;/p&gt;

&lt;p&gt;This is the same reason &lt;a href="https://focused.io/lab/agent-traces-rewrite-the-harness" rel="noopener noreferrer"&gt;Agent Traces Rewrite the Harness&lt;/a&gt; matters: traces of agentic workflow execution under real traffic matter. They become eval cases, they become harness patches, they become release gates, and they provide solid proof that fixes to solved problems actually stay fixed.&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%2Fzno1ewwy3hosxaps0bhs.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%2Fzno1ewwy3hosxaps0bhs.png" alt="Promotion and demotion loop showing traces feeding tests, deterministic workflow promotion, monitoring, and fallback when drift appears" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Observability turns agent traces into promotion evidence and drift into a demotion trigger.&lt;/p&gt;

&lt;p&gt;The number of repeated incidents where the platform is still burning full agent loops, even after it has seen the pattern before, belongs in front of leadership as the waste signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spend agency on novelty
&lt;/h2&gt;

&lt;p&gt;The goal is not to remove agents from agentic workflows, that would be counterproductive and as silly as keeping all solved paths inside an agent loop forever.&lt;/p&gt;

&lt;p&gt;Agents are valuable because there is always going to be uncertainty and changing reality: new requests, new incidents, misbehaving APIs, and policy exceptions between systems. The agent does all of its work at the boundary of the known process.&lt;/p&gt;

&lt;p&gt;The operating mistake is letting that boundary stay frozen.&lt;/p&gt;

&lt;p&gt;Workflows in live systems should decrease in agency over time. They spend fewer tokens to execute solved work. They save receipts for the execution of risky work. And they use the model for the part of the workflow where judgment still matters.&lt;/p&gt;

&lt;p&gt;The Type 1:2:3 mix is the scoreboard. If every execution stayed Type 3 forever then the platform would be charging the business for amnesia.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
