<?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: Rashid Mahmood</title>
    <description>The latest articles on DEV Community by Rashid Mahmood (@code-with-rashid).</description>
    <link>https://dev.to/code-with-rashid</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%2F1268469%2Fdca06eca-ff9e-476c-be84-206a0aa9cc9e.png</url>
      <title>DEV Community: Rashid Mahmood</title>
      <link>https://dev.to/code-with-rashid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/code-with-rashid"/>
    <language>en</language>
    <item>
      <title>The Anatomy of an Agent That Actually Works</title>
      <dc:creator>Rashid Mahmood</dc:creator>
      <pubDate>Tue, 03 Nov 2026 05:01:29 +0000</pubDate>
      <link>https://dev.to/code-with-rashid/the-anatomy-of-an-agent-that-actually-works-5dko</link>
      <guid>https://dev.to/code-with-rashid/the-anatomy-of-an-agent-that-actually-works-5dko</guid>
      <description>&lt;p&gt;&lt;em&gt;Day 2 of 7 — The Agentic Engineer’s Field&amp;nbsp;Notes&lt;/em&gt;&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%2F960zgb3ufhvnq5ayusp1.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%2F960zgb3ufhvnq5ayusp1.png" width="799" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yesterday I argued that the system is the artifact, not the prompt. Today I want to open the system up and show you what’s&amp;nbsp;inside.&lt;/p&gt;

&lt;p&gt;There is a diagram I draw on whiteboards more often than any other. It has four boxes and one arrow that loops back on itself. If your team can name what goes in each box and explain why the arrow loops, you have an agent. If they cannot, you have a chatbot pretending to be&amp;nbsp;one.&lt;/p&gt;

&lt;p&gt;Here it is, in plain&amp;nbsp;text:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;          ┌──────────┐
          │  MEMORY  │
          └────┬─────┘
               │
               ▼
   ┌───────────────────────┐
   │        MODEL          │◄────────┐
   └───────────┬───────────┘         │
               │ chooses             │
               ▼                     │
          ┌─────────┐                │
          │  TOOLS  │                │
          └────┬────┘                │
               │ produces            │
               ▼                     │
          ┌─────────┐                │
          │ RESULT  │────────────────┘
          └─────────┘
              the loop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Four moving parts. One loop. That is the entire substrate of agentic computing, and almost everything interesting in this field is about getting one of these four parts&amp;nbsp;right.&lt;/p&gt;

&lt;p&gt;Let’s take them one at a&amp;nbsp;time.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The&amp;nbsp;model
&lt;/h3&gt;

&lt;p&gt;The model is the brain. It is also the part you have the least control&amp;nbsp;over.&lt;/p&gt;

&lt;p&gt;You did not train it. You cannot easily fine-tune it. It will be replaced under you, sometimes silently, sometimes with weeks of notice. Its behavior on your specific task is an empirical question, not a design&amp;nbsp;choice.&lt;/p&gt;

&lt;p&gt;This sounds like bad news. It is actually the most freeing thing about agentic engineering: the model is a &lt;em&gt;capability&lt;/em&gt;, not an &lt;em&gt;implementation&lt;/em&gt;. You don’t optimize the model itself. You optimize how you compose around&amp;nbsp;it.&lt;/p&gt;

&lt;p&gt;The practical consequence: choose the smallest, fastest, cheapest model that gets the job done, and design the system so that you can swap models without rewriting it. The teams that bet hard on a specific model’s quirks (“Claude does this best because of X”) look brilliant for six months and stranded for the next six. The teams that treat the model as an interchangeable component compound their improvements every time the frontier&amp;nbsp;moves.&lt;/p&gt;

&lt;p&gt;A useful heuristic that has hardened into a production pattern by 2026: &lt;strong&gt;route by difficulty&lt;/strong&gt;. The dominant Claude Agent SDK pattern in production today uses Opus as the orchestrator and Haiku inside sub-agents. Cognition’s most recent writeup makes the same point with cross-frontier routing — running Claude and GPT together as “a capability router rather than a difficulty escalator,” each handling subtasks where it actually excels. Use a small model for routing, classification, and summarization. Reserve the frontier model for the actual reasoning. You will pay a fraction of the cost and most of your users will not&amp;nbsp;notice.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The&amp;nbsp;tools
&lt;/h3&gt;

&lt;p&gt;The tools are the hands. They are also where most agents quietly&amp;nbsp;fail.&lt;/p&gt;

&lt;p&gt;A tool is a function the model can call. The model picks the tool, picks the arguments, sees the result, and decides what to do next. From the model’s point of view, your codebase is a vocabulary — every tool is a word it can speak. If your vocabulary is bad, no amount of model intelligence will save&amp;nbsp;you.&lt;/p&gt;

&lt;p&gt;I’m going to spend an entire day on tool design later this week, so I’ll keep it short here. The key insight is one Anthropic published explicitly in their tool-design guidance for engineers: &lt;em&gt;more tools don’t always lead to better outcomes&lt;/em&gt;. Build a few thoughtful tools targeting specific high-impact workflows, not a thin wrapper around every API endpoint you happen to&amp;nbsp;have.&lt;/p&gt;

&lt;p&gt;A human-facing API and a tool designed for an LLM are not the same thing. Hold that thought until Day&amp;nbsp;4.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The&amp;nbsp;memory
&lt;/h3&gt;

&lt;p&gt;The memory is what survives across&amp;nbsp;turns.&lt;/p&gt;

&lt;p&gt;This is more subtle than it sounds. There are at least three kinds of memory in any non-trivial agent, and confusing them is the root of an entire class of&amp;nbsp;bugs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Working memory&lt;/strong&gt; — the conversation so far. Everything the model can see in its current context window. This is bounded, and managing it is most of the&amp;nbsp;game.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episodic memory&lt;/strong&gt; — past conversations and runs. “Last Tuesday the user asked us to summarize a contract. Here is what we did.” Stored externally; pulled in on&amp;nbsp;demand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic memory&lt;/strong&gt; — durable facts about the world or the user. “This user prefers SQL examples in PostgreSQL syntax.” Stored externally; sometimes pinned, sometimes retrieved.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most “memory features” you’ve seen in chatbots conflate these. They store everything in a vector database, retrieve a top-k slice, and call it memory. That works for trivial cases and breaks the moment the user’s “memory” includes contradictions, retractions, or evolving preferences. We’ll get to the fix on Day 5, including the Letta team’s hierarchical memory architecture that has become the de facto reference design.&lt;/p&gt;

&lt;p&gt;For now, the operating principle: memory is not a bag of facts. It is a &lt;em&gt;managed surface&lt;/em&gt; that the agent reasons over. The management — what to write, what to retrieve, what to expire — is engineering, not&amp;nbsp;magic.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The&amp;nbsp;loop
&lt;/h3&gt;

&lt;p&gt;The loop is what makes it an agent and not a function&amp;nbsp;call.&lt;/p&gt;

&lt;p&gt;In its simplest form, the loop is a&amp;nbsp;while:&lt;/p&gt;

&lt;p&gt;context = system_prompt + user_request&lt;br&gt;
while not done:&lt;br&gt;
    action = model(context)&lt;br&gt;
    if action == "stop":&lt;br&gt;
        return action.final_message&lt;br&gt;
    result = execute_tool(action.tool, action.args)&lt;br&gt;
    context = update(context, action, result)&lt;/p&gt;

&lt;p&gt;That’s it. That is the entire control flow of an agent. Everything else is decoration.&lt;/p&gt;

&lt;p&gt;The loop is also where almost every interesting failure mode&amp;nbsp;lives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Infinite loops&lt;/strong&gt; — the model keeps calling the same tool because it doesn’t realize the result is the&amp;nbsp;same.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Off-track loops&lt;/strong&gt; — the model wanders, retrying, exploring, never converging on the&amp;nbsp;goal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dead-end loops&lt;/strong&gt; — the model gives up too early because the context contains a misleading error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost blowouts&lt;/strong&gt; — the loop runs 47 iterations on a task that should have taken&amp;nbsp;three.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context exhaustion&lt;/strong&gt; — the loop runs long enough that the original instruction has rolled out of the model’s attention window.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of these is an engineering problem, not a model problem. You add max-iteration caps. You add cycle detection. You add cost budgets (the Claude Agent SDK now ships with a max_tool_calls budget defaulting to 12, for good reason). You add periodic context summarization. You add escape hatches that hand control back to a human. The loop is the place where agentic engineering becomes most like classical systems engineering — and most teams do not give it the attention it deserves because it does not feel like AI&amp;nbsp;work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Five patterns to know by&amp;nbsp;name
&lt;/h3&gt;

&lt;p&gt;When Anthropic published &lt;em&gt;Building Effective Agents&lt;/em&gt;, they did the field a quiet favor by codifying five composable patterns. They are not new individually. What’s useful is that they are now named, with shared vocabulary across teams. If you are sketching an agent on a whiteboard, you should be able to point at any region of it and say “this part is &lt;em&gt;evaluator-optimizer&lt;/em&gt;” or “this is &lt;em&gt;parallelization&lt;/em&gt;” — and have the room&amp;nbsp;nod.&lt;/p&gt;

&lt;p&gt;The five:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prompt chaining&lt;/strong&gt; — sequential decomposition. Each step’s output feeds the next. Use when the task has obvious sub-steps and you want to trade latency for accuracy. (Generate marketing copy → translate it.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing&lt;/strong&gt; — classify the input, dispatch to a specialist. Use when categories of input genuinely need different handling, or when you’re routing for cost (small model triages, big model only when the triage flags&amp;nbsp;hard).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallelization&lt;/strong&gt; — run multiple model calls at once, either on independent sections or as a vote on the same question. Use for speed gains or for confidence-via-redundancy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestrator-workers&lt;/strong&gt; — a central agent breaks the problem into sub-tasks dynamically and delegates. Use when the sub-task structure depends on the input and can’t be hard-coded. (This is the territory of multi-agent debates we’ll cover on Day&amp;nbsp;7.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluator-optimizer&lt;/strong&gt; — one model proposes; another critiques; loop until acceptable. Use when there’s a clear quality criterion and iterative refinement measurably helps. (The Anthropic engineering team has explicitly used this for translation quality.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most production agents are some composition of two or three of these patterns. The error most teams make is reaching for the most complicated pattern they’ve heard of, when the simpler one would have shipped in a&amp;nbsp;week.&lt;/p&gt;

&lt;p&gt;The principle Anthropic states explicitly is the one to internalize: &lt;strong&gt;start simple. Add complexity only when simpler solutions demonstrably underperform.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A note on frameworks
&lt;/h3&gt;

&lt;p&gt;You are going to be told, repeatedly, that you need a framework. LangChain, LangGraph, AutoGen, CrewAI, the Claude Agent SDK, the OpenAI Agents SDK, Letta, and a dozen others are all competing for your import statements.&lt;/p&gt;

&lt;p&gt;Frameworks are not free. Each one introduces its own abstractions, its own coupling, its own state machine you have to understand to debug. For simple agents, a 50-line while loop around your model SDK is shorter, clearer, and easier to debug than the equivalent in any framework. For complex agents — multi-step, branching, retry-aware, observability-rich — a good framework will save you months. The trick is knowing where the cutover is for your&amp;nbsp;team.&lt;/p&gt;

&lt;p&gt;My rule of thumb: if you can describe your agent’s control flow in one paragraph of plain English, write it in raw SDK calls. If you cannot — if it has parallel sub-tasks, conditional branches, retries with backoff, persistent state across runs — pick a framework and commit. Don’t half-adopt one. The worst codebase I’ve debugged was a “lightweight wrapper” some team had built around three different agent frameworks at&amp;nbsp;once.&lt;/p&gt;

&lt;p&gt;The other rule: your framework should not be the most interesting part of your agent. If your team meetings are mostly about which framework to use, you are not building an agent. You are building an&amp;nbsp;opinion.&lt;/p&gt;

&lt;h3&gt;
  
  
  The simplest agent worth&amp;nbsp;shipping
&lt;/h3&gt;

&lt;p&gt;Here is what a minimum-viable agent looks like in production. Not in a tutorial — in production.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A model, called via an SDK, with a system prompt that defines the role and the boundaries.&lt;/li&gt;
&lt;li&gt;A small set of tools (often three to seven) that are designed for the model, instrumented with logging, and tested for the messy&amp;nbsp;cases.&lt;/li&gt;
&lt;li&gt;A memory layer that includes at least: a scratchpad for the current task, a way to recall recent runs, and durable preferences for the&amp;nbsp;user.&lt;/li&gt;
&lt;li&gt;A loop with a hard iteration cap, a cost cap, a wallclock cap, and an escape hatch that returns control to a human or to a deterministic fallback.&lt;/li&gt;
&lt;li&gt;Observability hooks on every model call and every tool call, so that when something goes wrong (and it will), you can replay the trajectory.&lt;/li&gt;
&lt;li&gt;One of the five Anthropic patterns as your top-level shape — usually orchestrator-workers or evaluator-optimizer for non-trivial tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s the whole thing. You can build the first version in a week. The next six months are about making each of the four subsystems better — and that is what this series is&amp;nbsp;about.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tomorrow: the part that’s quietly eating prompt engineering
&lt;/h3&gt;

&lt;p&gt;Look at the loop diagram again. Notice the arrow back into the model. Every time it fires, the context gets bigger. The model sees more, but its attention is finite. What it pays attention to determines what it does&amp;nbsp;next.&lt;/p&gt;

&lt;p&gt;The discipline of deciding &lt;em&gt;what gets into the model’s context, in what order, with what compression&lt;/em&gt; — that is the most important emerging skill in this entire field. It has a name now. Karpathy gave it the canonical formulation last year: “the delicate art and science of filling the context window with just the right information for the next step.” It has a four-strategy framework that’s quietly become the reference model. And the teams that have internalized it are quietly running away from everyone&amp;nbsp;else.&lt;/p&gt;

&lt;p&gt;Tomorrow we go deep on context engineering. See you&amp;nbsp;then.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Day 2 of 7. Yesterday: the mental shift. Tomorrow: context engineering — and why prompt engineering is dying as a job description. Follow&amp;nbsp;along.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sources &amp;amp; further&amp;nbsp;reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic, &lt;a href="https://www.anthropic.com/research/building-effective-agents" rel="noopener noreferrer"&gt;&lt;em&gt;Building Effective AI&amp;nbsp;Agents&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic, &lt;a href="https://www.anthropic.com/engineering/writing-tools-for-agents" rel="noopener noreferrer"&gt;&lt;em&gt;Writing Effective Tools for AI&amp;nbsp;Agents&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cognition, &lt;a href="https://cognition.ai/blog/multi-agents-working" rel="noopener noreferrer"&gt;&lt;em&gt;Multi-Agents: What’s Actually&amp;nbsp;Working&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/agent-sdk/overview" rel="noopener noreferrer"&gt;&lt;em&gt;Claude Agent SDK&amp;nbsp;overview&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;First published at &lt;a href="https://codewithrashid.com/blog/day-2-anatomy" rel="noopener noreferrer"&gt;codewithrashid.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why Most Agents Never Survive Production (And the Mental Shift That Fixes It)</title>
      <dc:creator>Rashid Mahmood</dc:creator>
      <pubDate>Sun, 01 Nov 2026 05:01:35 +0000</pubDate>
      <link>https://dev.to/code-with-rashid/why-most-agents-never-survive-production-and-the-mental-shift-that-fixes-it-3fjc</link>
      <guid>https://dev.to/code-with-rashid/why-most-agents-never-survive-production-and-the-mental-shift-that-fixes-it-3fjc</guid>
      <description>&lt;p&gt;&lt;em&gt;Day 1 of 7 — The Agentic Engineer’s Field&amp;nbsp;Notes&lt;/em&gt;&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%2Fjovw90zapdqhgo3umyot.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%2Fjovw90zapdqhgo3umyot.png" width="799" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo always&amp;nbsp;works.&lt;/p&gt;

&lt;p&gt;Picture it. A small audience, a slide deck, a prompt typed into a textbox. The agent reads a Jira ticket, opens a browser, scrapes a competitor’s pricing page, drafts a slide, posts it to Slack. Applause. Calendar invites for follow-up calls. Someone in product asks how soon it can&amp;nbsp;ship.&lt;/p&gt;

&lt;p&gt;Six months later, that agent is still not in production. Maybe it never will&amp;nbsp;be.&lt;/p&gt;

&lt;p&gt;In May 2026, this is no longer just an anecdote. Gartner is now publicly forecasting that &lt;em&gt;over 40% of agentic AI projects will be cancelled by 2027&lt;/em&gt;. Industry surveys of shipped agent projects show a brutal split: narrow-scope projects (single workflow, defined boundaries) deliver on time at roughly 65%, with a median slip of about two months. Broad-scope projects (multiple workflows, multiple integrations) deliver on time at 16%, with a median slip approaching ten months. The gap is not the model. The gap is everything around the&amp;nbsp;model.&lt;/p&gt;

&lt;p&gt;If you are building agents in 2026 and your demo-to-production ratio looks like everyone else’s, this series is for you. Over the next seven days I’m going to walk through the system I use to build agentic systems that actually ship, hold up under load, and survive the next model upgrade. Today is the mental shift that has to happen before any of the rest of it&amp;nbsp;lands.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agents are not chatbots with tools bolted&amp;nbsp;on
&lt;/h3&gt;

&lt;p&gt;The most expensive mistake I see is treating an agent as “a chatbot, but it can also call functions.” That framing is intuitive and almost entirely&amp;nbsp;wrong.&lt;/p&gt;

&lt;p&gt;A chatbot is a stateless transformation: text in, text out. The user is in the loop. They read the answer, decide if it’s any good, and either accept it or rephrase. The chatbot’s mistakes are &lt;em&gt;transient&lt;/em&gt;. A wrong answer in turn three is forgotten by turn&amp;nbsp;five.&lt;/p&gt;

&lt;p&gt;An agent is a closed loop where the model is making decisions, taking actions, and feeding the consequences of those actions back into its own context. The user is no longer the corrector. The model itself is the corrector. Mistakes don’t evaporate — they compound. A bad tool call at step three poisons the context at step four, which produces a worse decision at step five, and by step nine the agent is confidently wrong in ways that would have been caught instantly by a human in the&amp;nbsp;loop.&lt;/p&gt;

&lt;p&gt;Andrej Karpathy, in his 2025 LLM year-in-review, put a useful frame on what’s happening. We are not building “smarter chatbots.” We are summoning what he calls &lt;em&gt;ghosts&lt;/em&gt; — entities optimized differently than biological minds, with what he labels &lt;em&gt;jagged intelligence&lt;/em&gt;: simultaneously polymath-genius and grade-schooler-confused. They live on your computer. They make decisions. And, in his words, “it’s not just a website you go to like Google, it’s a little spirit/ghost that ‘lives’ on your computer.”&lt;/p&gt;

&lt;p&gt;When you bolt tools onto a chatbot, you are not building a chatbot with hands. You are giving a ghost a loaded&amp;nbsp;weapon.&lt;/p&gt;

&lt;h3&gt;
  
  
  The demo-to-production cliff
&lt;/h3&gt;

&lt;p&gt;Most agent demos work because the demo path has been implicitly hand-tuned. The prompt has been iterated on the demo input. The tools have been tested on the demo input. The expected trajectory is two or three steps. The data is clean. The user is forgiving. The cost doesn’t matter because nobody is counting tokens during a&amp;nbsp;slide.&lt;/p&gt;

&lt;p&gt;Production looks nothing like that. A year of production agent deployments has surfaced a now-canonical list of failure modes. They show up in conference talks, post-mortems, and academic workshops (ICML even ran a &lt;em&gt;Failure Modes in Agentic AI&lt;/em&gt; workshop earlier this year). The recurring themes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Silent failures.&lt;/strong&gt; Systems appear healthy. Outputs look reasonable. The agent has been confidently wrong for six weeks and nobody&amp;nbsp;noticed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Black-box decisions.&lt;/strong&gt; When something does go wrong, no one can explain &lt;em&gt;why&lt;/em&gt; the agent did what it did, because nobody instrumented the trajectory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission explosion.&lt;/strong&gt; Agents accumulate access over time. By month four, the customer-support agent has read access to half your data warehouse and nobody remembers approving it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runaway execution.&lt;/strong&gt; A loop that should have stopped at iteration five runs to fifty. The bill arrives. The CFO has questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compounding errors.&lt;/strong&gt; Each step of a long-running agent introduces small errors. By step forty, the cumulative drift is&amp;nbsp;fatal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context degradation.&lt;/strong&gt; Surveys put this at the top of the list — &lt;em&gt;65% of developers&lt;/em&gt; now cite missing or rotted context as the leading cause of poor AI code&amp;nbsp;quality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assumption-filling.&lt;/strong&gt; When the agent doesn’t know something, it doesn’t ask. It guesses. The guess looks plausible. The downstream code calls a method that doesn’t&amp;nbsp;exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-review blindness.&lt;/strong&gt; Ask the agent if its work is good and it will tell you&amp;nbsp;yes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these is solvable. None of them gets solved if your team’s mental model is “make the LLM smarter.” The model isn’t your bottleneck. The system around the model&amp;nbsp;is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stop optimizing the artifact you’re staring&amp;nbsp;at
&lt;/h3&gt;

&lt;p&gt;When teams hit the production wall, their instinct is almost always to keep tuning the prompt. They add another bullet point to the system message. They reword the instructions. They paste in three more examples. They beg the model not to hallucinate.&lt;/p&gt;

&lt;p&gt;This is a category error. The prompt is not the artifact. &lt;em&gt;The system is the artifact.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The system has at least four moving parts: the model, the tools, the memory, and the loop that ties them together. The prompt is, at most, a configuration file for one of those. If your agent is unreliable, the prompt is one of maybe a dozen places the bug could live, and probably not the most likely. I have spent days reworking system prompts on agents whose real bug was a tool that returned a 200-OK with an empty body when the real answer was “not found.” The model dutifully reasoned over an empty body and produced confident nonsense. No prompt was going to fix&amp;nbsp;that.&lt;/p&gt;

&lt;p&gt;Once you internalize that the system is the artifact, your day-to-day work changes. You stop arguing about the wording of a sentence in the system prompt. You start instrumenting the loop. You start logging every tool call and every model output. You start asking: when the agent fails, &lt;em&gt;which subsystem failed?&lt;/em&gt; That question is answerable. “Why is the LLM dumb today?” is&amp;nbsp;not.&lt;/p&gt;

&lt;h3&gt;
  
  
  The shift, in one&amp;nbsp;sentence
&lt;/h3&gt;

&lt;p&gt;Here is the framing that changed how I work, and the through-line for everything in this&amp;nbsp;series:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You are not building a smarter chatbot. You are building software whose runtime behavior is decided by a probabilistic component, with all the engineering rigor that statement deserves.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Read it twice. Every word in there is doing&amp;nbsp;work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Software&lt;/em&gt; — not a magic box. It has interfaces, state, error modes, and tests. It can be debugged. It has a deployment story.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Whose runtime behavior is decided by a probabilistic component&lt;/em&gt; — the model’s outputs are not deterministic and never will be. Your system has to be robust to that, the way distributed systems are robust to network&amp;nbsp;failure.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;With all the engineering rigor that statement deserves&lt;/em&gt; — observability, evals, rollback strategies, capability boundaries, cost budgets, incident response. Boring, unsexy infrastructure. The same things that make any production system&amp;nbsp;work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The teams that ship agents successfully are the teams that treat agentic systems as a &lt;em&gt;new substrate for software engineering&lt;/em&gt;, not as a clever chatbot trick. Their mental model is closer to “I’m building a service that internally consults a brilliant but unreliable contractor on every call” than “I’m building a magic AI that does the&amp;nbsp;job.”&lt;/p&gt;

&lt;p&gt;This shift is not optional. It is, increasingly, the difference between the 16% who ship the broad-scope projects and the 84% who don’t. Anthropic’s &lt;em&gt;2026 Agentic Coding Trends Report&lt;/em&gt; tracks the inflection in real time: software development is shifting from &lt;em&gt;writing code&lt;/em&gt; to &lt;em&gt;orchestrating agents that write code&lt;/em&gt;. One case study profiles a team at Rakuten that had an agent implement a complex feature across a 12.5-million-line codebase in a single seven-hour run. That is not “AI helps engineers code faster.” That is a different shape of engineering work entirely.&lt;/p&gt;

&lt;p&gt;The engineers who learn to do that work well — who can move fluently between the four subsystems, design tools an LLM speaks, build memory that doesn’t rot, run evals that catch silent regressions — those are the engineers who will be enormously valuable for the rest of the&amp;nbsp;decade.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the next six days look&amp;nbsp;like
&lt;/h3&gt;

&lt;p&gt;If you accept the shift, the natural follow-up question is: &lt;em&gt;what does the engineering rigor actually consist of?&lt;/em&gt; That is what the next six days are&amp;nbsp;about.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tomorrow (Day 2):&lt;/strong&gt; I’ll dissect the anatomy of an agent that actually works in production — the four moving parts, why frameworks often hurt before they help, and the simplest agent worth shipping. I’ll also walk through Anthropic’s five composable patterns (prompt chaining, routing, parallelization, orchestrator-workers, evaluator-optimizer) and where each one actually&amp;nbsp;fits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 3:&lt;/strong&gt; Context engineering. Why Karpathy is right that this has eaten prompt engineering, the four-strategy framework that’s emerging as the canonical model, and why teams that figured this out a year ago are pulling away from everyone&amp;nbsp;else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 4:&lt;/strong&gt; Tools. The most undervalued lever in agent design. Plus the &lt;em&gt;lethal trifecta&lt;/em&gt; — Simon Willison’s framework that has predicted four major production AI vulnerabilities in the first two weeks of 2026&amp;nbsp;alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 5:&lt;/strong&gt; Memory. The hardest unsolved problem in agentic systems. We’ll get into hierarchical memory architectures (Letta’s three-tier model, the LLM-as-OS paradigm), and why most “memory features” you’ve seen are&amp;nbsp;theater.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 6:&lt;/strong&gt; Evals. Hamel Husain’s discipline, codified. Error analysis, binary-not-Likert judgment evals, and the single habit that separates the teams whose agents quietly improve every quarter from the teams whose agents silently&amp;nbsp;rot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 7:&lt;/strong&gt; The multi-agent debate — and the plot twist. Cognition famously published &lt;em&gt;Don’t Build Multi-Agents&lt;/em&gt; in 2025. They published a follow-up in 2026 that significantly updates that position. We’ll go through both, plus Anthropic’s Planner/Generator/Evaluator architecture and what production multi-agent systems actually look like&amp;nbsp;now.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each piece stands alone. Together, they’re the playbook I wish someone had handed me three years&amp;nbsp;ago.&lt;/p&gt;

&lt;h3&gt;
  
  
  A small ask before you&amp;nbsp;go
&lt;/h3&gt;

&lt;p&gt;If you take one thing from today, take this: stop describing your agent project by its prompt. Start describing it by its system. The next time someone on your team says “the agent is broken, can we tweak the system prompt?”, ask them which of the four subsystems they think is failing and what the evidence is. If they can’t answer, you’ve found your real problem — and it’s not the&amp;nbsp;prompt.&lt;/p&gt;

&lt;p&gt;Tomorrow I’ll show you what the four subsystems are, how they interact, and the diagram that has saved me more debugging hours than any tool I’ve ever installed.&lt;/p&gt;

&lt;p&gt;See you&amp;nbsp;then.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is Day 1 of a 7-day series on agentic development. If this resonated, follow along — the rest of the week goes deep on context engineering, tool design, memory, evals, and multi-agent systems. No fluff, no hype, just what’s working in production in&amp;nbsp;2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sources &amp;amp; further&amp;nbsp;reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic, &lt;a href="https://www.anthropic.com/research/building-effective-agents" rel="noopener noreferrer"&gt;&lt;em&gt;Building Effective AI&amp;nbsp;Agents&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic, &lt;a href="https://resources.anthropic.com/2026-agentic-coding-trends-report" rel="noopener noreferrer"&gt;&lt;em&gt;2026 Agentic Coding Trends&amp;nbsp;Report&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Karpathy, &lt;a href="https://karpathy.bearblog.dev/year-in-review-2025/" rel="noopener noreferrer"&gt;&lt;em&gt;2025 LLM Year in&amp;nbsp;Review&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ICML 2026 &lt;a href="https://fmai-workshop.github.io/" rel="noopener noreferrer"&gt;&lt;em&gt;Failure Modes in Agentic AI&amp;nbsp;workshop&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;First published at &lt;a href="https://codewithrashid.com/blog/day-1-the-mental-shift" rel="noopener noreferrer"&gt;codewithrashid.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>One broken call in a batch: how seven agent frameworks handle it</title>
      <dc:creator>Rashid Mahmood</dc:creator>
      <pubDate>Wed, 28 Oct 2026 04:01:34 +0000</pubDate>
      <link>https://dev.to/code-with-rashid/one-broken-call-in-a-batch-how-seven-agent-frameworks-handle-it-12oh</link>
      <guid>https://dev.to/code-with-rashid/one-broken-call-in-a-batch-how-seven-agent-frameworks-handle-it-12oh</guid>
      <description>&lt;p&gt;When a model returns several tool calls in one turn and one of them is broken, the framework has to decide what goes into the next request. &lt;a href="https://github.com/code-with-rashid/agentic-arena" rel="noopener noreferrer"&gt;agentic-arena&lt;/a&gt; asks two questions of that request: did the &lt;strong&gt;successful&lt;/strong&gt; call's result reach the model, and was the broken call &lt;strong&gt;reported&lt;/strong&gt; at all?&lt;/p&gt;

&lt;h2&gt;
  
  
  What was measured
&lt;/h2&gt;

&lt;p&gt;Three kinds of broken call were tested, each sent in a batch next to a valid call: an unknown tool name, malformed arguments, and a missing required argument.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;unknown tool&lt;/th&gt;
&lt;th&gt;malformed args&lt;/th&gt;
&lt;th&gt;missing required arg&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;vanilla&lt;/code&gt;, &lt;code&gt;pydantic_ai&lt;/code&gt;, &lt;code&gt;microsoft_af&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;both&lt;/td&gt;
&lt;td&gt;both&lt;/td&gt;
&lt;td&gt;both&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;langgraph&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;both&lt;/td&gt;
&lt;td&gt;good only&lt;/td&gt;
&lt;td&gt;both&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;smolagents&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;error only&lt;/td&gt;
&lt;td&gt;good only&lt;/td&gt;
&lt;td&gt;error only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openai_agents&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;raises&lt;/td&gt;
&lt;td&gt;both&lt;/td&gt;
&lt;td&gt;both&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google_adk&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;raises&lt;/td&gt;
&lt;td&gt;raises&lt;/td&gt;
&lt;td&gt;both&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"both" means the good result and the error both reached the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways to get it wrong
&lt;/h2&gt;

&lt;p&gt;The results show three failure modes, and they do different amounts of harm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Silent partial.&lt;/strong&gt; The broken call vanishes with no message of any kind, and the run answers from partial evidence without the model ever being told.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Successful sibling discarded.&lt;/strong&gt; smolagents does report the error, but as a rewritten task rather than a turn in the transcript. The good result is dropped along with the history, so the model sends the identical batch again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raises.&lt;/strong&gt; This one is loud. The repo prefers it of the three because nothing is silently wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Batching changes an earlier result
&lt;/h2&gt;

&lt;p&gt;On its own, a langgraph call with malformed arguments produces no tool message and the graph halts, so the item fails where you can see it. Batched with a call that succeeds, the graph carries on and the drop becomes invisible. The repo records the visible failure as the better outcome. So "batching changes nothing" turned out to be false. The rule the repo checks instead is that batching may rescue a fault but must never make a framework worse than it is when calls run one at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The probe had its own bug
&lt;/h2&gt;

&lt;p&gt;The first version of this measurement counted the word "observation" in the messages a framework returned. One corpus entry describes Tokyo Tower as a "communications and observation tower", so the probe read 3 for a batch of 2. The overall direction of the results held, but one claim did not: it had said the model is never told, and smolagents does tell the model. The probe now matches each outcome's own text, and a test checks that none of those markers appear in the corpus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;All of this runs in mock mode. The model's turns are scripted and byte-identical for every framework, so any difference comes from the framework's own error handling. These are behaviour measurements, not answer-quality rankings. No finding here says any framework produces a better answer; that needs a live run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pytest tests/test_parallel_tool_calls.py &lt;span class="nt"&gt;-q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full write-up is in &lt;code&gt;docs/findings.md&lt;/code&gt;, section 2b, and in the &lt;a href="https://code-with-rashid.github.io/agentic-arena/" rel="noopener noreferrer"&gt;field guide&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Eight broken tool calls: how six agent frameworks recover</title>
      <dc:creator>Rashid Mahmood</dc:creator>
      <pubDate>Mon, 05 Oct 2026 04:16:23 +0000</pubDate>
      <link>https://dev.to/code-with-rashid/eight-broken-tool-calls-how-six-agent-frameworks-recover-9k1</link>
      <guid>https://dev.to/code-with-rashid/eight-broken-tool-calls-how-six-agent-frameworks-recover-9k1</guid>
      <description>&lt;p&gt;Models send bad tool calls: malformed JSON, a tool name that does not exist, a missing argument. What happens next is decided by the agent framework, not the model. In &lt;a href="https://github.com/code-with-rashid/agentic-arena" rel="noopener noreferrer"&gt;agentic-arena&lt;/a&gt; I measure that directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was measured
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;resilience&lt;/code&gt; arena feeds eight scripted faults to every framework. The scripted model turns are byte-identical for all of them, so any difference in outcome is the framework's own error handling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;res-01&lt;/code&gt; calculator called with malformed JSON arguments&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;res-02&lt;/code&gt; a tool that does not exist&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;res-03&lt;/code&gt; an unevaluable expression (the tool returns ERROR)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;res-04&lt;/code&gt; a required argument missing entirely&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;res-05&lt;/code&gt; an extra argument the tool does not accept&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;res-06&lt;/code&gt; search with an empty query&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;res-07&lt;/code&gt; an expression the safe evaluator must refuse&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;res-08&lt;/code&gt; arguments serialised as JSON &lt;code&gt;null&lt;/code&gt; instead of an object&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;framework&lt;/th&gt;
&lt;th&gt;recovered&lt;/th&gt;
&lt;th&gt;notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;hand-rolled baseline&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;2 LLM calls each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pydantic_ai&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;microsoft_af&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;langgraph&lt;/td&gt;
&lt;td&gt;7/8&lt;/td&gt;
&lt;td&gt;fails &lt;code&gt;res-01&lt;/code&gt;, malformed tool arguments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;openai_agents&lt;/td&gt;
&lt;td&gt;7/8&lt;/td&gt;
&lt;td&gt;raises on &lt;code&gt;res-02&lt;/code&gt;, unknown tool name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;google_adk&lt;/td&gt;
&lt;td&gt;6/8&lt;/td&gt;
&lt;td&gt;fails &lt;code&gt;res-01&lt;/code&gt; and &lt;code&gt;res-02&lt;/code&gt;, both uncaught exceptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smolagents&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;but 6 LLM calls on four faults, against 2 elsewhere&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The smolagents split is exact. On the four faults where the tool ran and returned something, it recovers in two calls like everyone else. On the four its validation layer rejects first (unknown name, missing argument, unexpected argument, &lt;code&gt;null&lt;/code&gt; arguments), the error never reaches the transcript. The model cannot see it, re-emits the identical call, and the run spends the whole six-call budget, about 2.7x the prompt tokens, with zero tool calls recorded. It still reaches the right final answer, so the item passes. A retry wrapper would not help: the prompt is byte-identical every time.&lt;/p&gt;

&lt;p&gt;Google ADK is the only framework that loses both &lt;code&gt;res-01&lt;/code&gt; and &lt;code&gt;res-02&lt;/code&gt;. Both are uncaught exceptions rather than the model giving up, which is at least loud, and the kind of failure a retry wrapper can handle.&lt;/p&gt;

&lt;h2&gt;
  
  
  A correction
&lt;/h2&gt;

&lt;p&gt;The smolagents row read 4/8 for several iterations. That was measured when an exhausted run returned an empty string; it now surfaces a final answer from its last memory step, so the check passes. The mechanism is unchanged, but the consequence is roughly 3x the cost, not a lost item. &lt;code&gt;check_resilience.py&lt;/code&gt; now gates every count in this table, so the next drift fails CI instead of ageing silently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;These are scripted-model (mock) behaviour measurements, not answer-quality rankings. Mock mode compares two things honestly: what a framework sends on the wire, and how it behaves when the model misbehaves. This arena is the second. It says nothing about how well any framework does with a real model on real tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; arena run &lt;span class="nt"&gt;--arena&lt;/span&gt; resilience &lt;span class="nt"&gt;--framework&lt;/span&gt; all &lt;span class="nt"&gt;--mode&lt;/span&gt; mock &lt;span class="nt"&gt;--no-scorecard&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; python .github/scripts/check_resilience.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full findings, with the command behind every number: &lt;a href="https://code-with-rashid.github.io/agentic-arena/findings/" rel="noopener noreferrer"&gt;https://code-with-rashid.github.io/agentic-arena/findings/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>python</category>
    </item>
    <item>
      <title>What agent frameworks cost on the wire: measurements from agentic-arena</title>
      <dc:creator>Rashid Mahmood</dc:creator>
      <pubDate>Wed, 30 Sep 2026 17:05:46 +0000</pubDate>
      <link>https://dev.to/code-with-rashid/what-agent-frameworks-cost-on-the-wire-measurements-from-agentic-arena-13o7</link>
      <guid>https://dev.to/code-with-rashid/what-agent-frameworks-cost-on-the-wire-measurements-from-agentic-arena-13o7</guid>
      <description>&lt;p&gt;Most framework comparisons argue from feature lists. I wanted numbers, so &lt;a href="https://github.com/code-with-rashid/agentic-arena" rel="noopener noreferrer"&gt;agentic-arena&lt;/a&gt; holds the model, tools, datasets and iteration budget fixed and measures what each framework does differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read this first:&lt;/strong&gt; everything below is measured against a scripted (mock) model, so the turns are byte-identical for every framework. That makes these wire and behaviour measurements. They say nothing about which framework writes better answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What a framework puts on the wire
&lt;/h2&gt;

&lt;p&gt;Mean prompt tokens per item on a 15-item tool-use task:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;framework&lt;/th&gt;
&lt;th&gt;prompt tokens&lt;/th&gt;
&lt;th&gt;vs baseline&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vanilla (stdlib loop)&lt;/td&gt;
&lt;td&gt;753.5&lt;/td&gt;
&lt;td&gt;1.00x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;langgraph&lt;/td&gt;
&lt;td&gt;753.5&lt;/td&gt;
&lt;td&gt;1.00x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pydantic_ai&lt;/td&gt;
&lt;td&gt;794.0&lt;/td&gt;
&lt;td&gt;1.05x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;microsoft_af&lt;/td&gt;
&lt;td&gt;802.0&lt;/td&gt;
&lt;td&gt;1.06x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;google_adk&lt;/td&gt;
&lt;td&gt;836.1&lt;/td&gt;
&lt;td&gt;1.11x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;openai_agents&lt;/td&gt;
&lt;td&gt;856.9&lt;/td&gt;
&lt;td&gt;1.14x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smolagents&lt;/td&gt;
&lt;td&gt;2935.5&lt;/td&gt;
&lt;td&gt;3.90x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Six of seven sit inside a 1.15x band, and none is leaner than the hand-rolled loop. smolagents' 3.90x is a 4,207-character system prompt where the arena asked for 384, including a prose restatement of tools it already sent as a schema. The tools are transmitted, and billed, twice.&lt;/p&gt;

&lt;p&gt;That is a worst case. The same conversation run to 30 turns shrinks the gap from 8.83x on the first request to 1.27x on the 31st, because a fixed overhead decays as the conversation grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What breaks when the provider fails
&lt;/h2&gt;

&lt;p&gt;I scripted 429, 500 and 400 responses. The hand-rolled baseline has no retry at all, so one 429 loses the item. Every framework survives a single 429. Only smolagents survives three in a row, by quietly sleeping roughly two to four minutes on one item. The item passes, so nothing in a scorecard shows it, but in a batch your throughput quietly collapses.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What delegation costs
&lt;/h2&gt;

&lt;p&gt;A three-role pipeline doubles the LLM calls and multiplies prompt tokens by 2.5x, whether you build it with a graph library or a or loop. The structure costs that, not the framework.&lt;/p&gt;

&lt;p&gt;Model-decided handoffs cost about 10% more prompt than the same pipeline wired structurally. Of that gap, 94% is the    ransfer_to_* tool schemas, which ride on every request whether or not anyone delegates. You pay for the options you offer, not the ones you use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benchmark found bugs in itself
&lt;/h2&gt;

&lt;p&gt;Five of the seven adapters never passed the shared request timeout to their client, so they waited out their library's default through a 20-second hang on a one-second budget. A hanging mock provider exposed it. It is fixed, and gated in CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;

&lt;p&gt;Everything above has a command that regenerates it, and CI regenerates each number on a clean install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/code-with-rashid/agentic-arena
&lt;span class="nb"&gt;cd &lt;/span&gt;agentic-arena
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arena run &lt;span class="nt"&gt;--arena&lt;/span&gt; tool_use &lt;span class="nt"&gt;--framework&lt;/span&gt; all &lt;span class="nt"&gt;--mode&lt;/span&gt; mock &lt;span class="nt"&gt;--no-scorecard&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full findings and the reasoning behind each: &lt;a href="https://code-with-rashid.github.io/agentic-arena/findings/" rel="noopener noreferrer"&gt;https://code-with-rashid.github.io/agentic-arena/findings/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
