<?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: Robin Singh</title>
    <description>The latest articles on DEV Community by Robin Singh (@robin_singh_456fbe1f602b9).</description>
    <link>https://dev.to/robin_singh_456fbe1f602b9</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%2F4140191%2Fb6df0017-4c6f-43d0-963b-10f07ce25675.png</url>
      <title>DEV Community: Robin Singh</title>
      <link>https://dev.to/robin_singh_456fbe1f602b9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/robin_singh_456fbe1f602b9"/>
    <language>en</language>
    <item>
      <title>MCP Went Stateless. Your AI Agent Still Needs State.</title>
      <dc:creator>Robin Singh</dc:creator>
      <pubDate>Thu, 24 Sep 2026 01:02:01 +0000</pubDate>
      <link>https://dev.to/robin_singh_456fbe1f602b9/mcp-went-stateless-your-ai-agent-still-needs-state-2knj</link>
      <guid>https://dev.to/robin_singh_456fbe1f602b9/mcp-went-stateless-your-ai-agent-still-needs-state-2knj</guid>
      <description>&lt;p&gt;One of the more interesting changes in the AI engineering ecosystem in 2026 is happening below the model layer.&lt;/p&gt;

&lt;p&gt;The latest MCP specification moved the protocol toward a &lt;strong&gt;stateless core&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That sounds like agents should become stateless too.&lt;/p&gt;

&lt;p&gt;They shouldn’t.&lt;/p&gt;

&lt;p&gt;In fact, as AI agents become longer-running, more autonomous, and capable of executing real actions, &lt;strong&gt;application-level state becomes even more important&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The distinction is simple:&lt;/p&gt;

&lt;p&gt;MCP should not need to remember your connection.&lt;br&gt;&lt;br&gt;
Your agent absolutely needs to remember its work.&lt;/p&gt;

&lt;p&gt;This difference becomes critical once you move from demos to production.&lt;/p&gt;

&lt;p&gt;What Changed in MCP?&lt;/p&gt;

&lt;p&gt;The 2026-07-28 Model Context Protocol specification introduced a stateless protocol core.&lt;/p&gt;

&lt;p&gt;Instead of depending on persistent sessions between an MCP client and server, requests can carry enough information to be handled independently.&lt;/p&gt;

&lt;p&gt;That means an MCP request can potentially hit:&lt;/p&gt;

&lt;p&gt;Client&lt;br&gt;&lt;br&gt;
   |&lt;br&gt;&lt;br&gt;
   v&lt;br&gt;&lt;br&gt;
Load Balancer&lt;br&gt;&lt;br&gt;
   |&lt;br&gt;&lt;br&gt;
   +------&amp;gt; MCP Server 1&lt;br&gt;&lt;br&gt;
   |&lt;br&gt;&lt;br&gt;
   +------&amp;gt; MCP Server 2&lt;br&gt;&lt;br&gt;
   |&lt;br&gt;&lt;br&gt;
   +------&amp;gt; MCP Server 3  &lt;/p&gt;

&lt;p&gt;without requiring the load balancer to keep routing a particular client back to the same server instance.&lt;/p&gt;

&lt;p&gt;The new specification removed the old session-oriented initialize flow and Mcp-Session-Id, making requests more self-describing and much easier to scale using conventional HTTP infrastructure.&lt;/p&gt;

&lt;p&gt;This is a good architectural change.&lt;/p&gt;

&lt;p&gt;But there is an important trap here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stateless transport does not mean stateless workflow.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI Agent Is Usually a State Machine&lt;/p&gt;

&lt;p&gt;Imagine an agent responsible for refunding a customer.&lt;/p&gt;

&lt;p&gt;The workflow might look like:&lt;/p&gt;

&lt;p&gt;User asks for refund&lt;br&gt;&lt;br&gt;
        |&lt;br&gt;&lt;br&gt;
        v&lt;br&gt;&lt;br&gt;
Agent investigates order&lt;br&gt;&lt;br&gt;
        |&lt;br&gt;&lt;br&gt;
        v&lt;br&gt;&lt;br&gt;
Checks refund policy&lt;br&gt;&lt;br&gt;
        |&lt;br&gt;&lt;br&gt;
        v&lt;br&gt;&lt;br&gt;
Calculates refund amount&lt;br&gt;&lt;br&gt;
        |&lt;br&gt;&lt;br&gt;
        v&lt;br&gt;&lt;br&gt;
Requires human approval&lt;br&gt;&lt;br&gt;
        |&lt;br&gt;&lt;br&gt;
        v&lt;br&gt;&lt;br&gt;
      PAUSE&lt;br&gt;&lt;br&gt;
        |&lt;br&gt;&lt;br&gt;
   [30 minutes]&lt;br&gt;&lt;br&gt;
        |&lt;br&gt;&lt;br&gt;
        v&lt;br&gt;&lt;br&gt;
Human approves&lt;br&gt;&lt;br&gt;
        |&lt;br&gt;&lt;br&gt;
        v&lt;br&gt;&lt;br&gt;
Execute refund&lt;br&gt;&lt;br&gt;
        |&lt;br&gt;&lt;br&gt;
        v&lt;br&gt;&lt;br&gt;
Notify customer  &lt;/p&gt;

&lt;p&gt;What happens during those 30 minutes?&lt;/p&gt;

&lt;p&gt;If your agent state only exists inside:&lt;/p&gt;

&lt;p&gt;agent = Agent(...)&lt;br&gt;&lt;br&gt;
result = &lt;a href="http://agent.run" rel="noopener noreferrer"&gt;agent.run&lt;/a&gt;(...)  &lt;/p&gt;

&lt;p&gt;you have a problem.&lt;/p&gt;

&lt;p&gt;The process might restart.&lt;/p&gt;

&lt;p&gt;A deployment might happen.&lt;/p&gt;

&lt;p&gt;The request could reach another Kubernetes pod.&lt;/p&gt;

&lt;p&gt;The machine could disappear.&lt;/p&gt;

&lt;p&gt;The approval request could arrive hours later.&lt;/p&gt;

&lt;p&gt;The workflow therefore cannot depend on process memory.&lt;/p&gt;

&lt;p&gt;You need durable state.&lt;/p&gt;

&lt;p&gt;The Wrong Architecture&lt;/p&gt;

&lt;p&gt;A common first implementation looks something like this:&lt;/p&gt;

&lt;p&gt;pending_runs = {}  &lt;/p&gt;

&lt;p&gt;async def execute_agent(user_id, request):&lt;br&gt;&lt;br&gt;
    result = await &lt;a href="http://agent.run" rel="noopener noreferrer"&gt;agent.run&lt;/a&gt;(request)  &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if result.requires\_approval:  
    pending\_runs\[[result.id](http://result.id)\] = result  

    return {  
        "status": "waiting\_for\_approval",  
        "run\_id": [result.id](http://result.id)  
    }  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Later:&lt;/p&gt;

&lt;p&gt;async def approve(run_id):&lt;br&gt;&lt;br&gt;
    run = pending_runs[run_id]  &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return await run.resume()  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It works perfectly...&lt;/p&gt;

&lt;p&gt;until you deploy it.&lt;/p&gt;

&lt;p&gt;Consider two instances:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;         Load Balancer  
          /         \\  
         /           \\  
    Server A       Server B  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The agent runs on Server A.&lt;/p&gt;

&lt;p&gt;pending_runs["run_123"]  &lt;/p&gt;

&lt;p&gt;exists only in Server A's memory.&lt;/p&gt;

&lt;p&gt;The user clicks:&lt;/p&gt;

&lt;p&gt;Approve  &lt;/p&gt;

&lt;p&gt;The load balancer sends the request to Server B.&lt;/p&gt;

&lt;p&gt;Server B asks:&lt;/p&gt;

&lt;p&gt;pending_runs["run_123"]  &lt;/p&gt;

&lt;p&gt;and gets:&lt;/p&gt;

&lt;p&gt;KeyError  &lt;/p&gt;

&lt;p&gt;Your AI model isn't the problem.&lt;/p&gt;

&lt;p&gt;Your prompt isn't the problem.&lt;/p&gt;

&lt;p&gt;Your distributed system is.&lt;/p&gt;

&lt;p&gt;The Better Architecture&lt;/p&gt;

&lt;p&gt;Persist the workflow state.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             ┌───────────────┐  
             │     Client    │  
             └───────┬───────┘  
                     │  
                     ▼  
             ┌───────────────┐  
             │ Load Balancer │  
             └───────┬───────┘  
                     │  
         ┌───────────┴───────────┐  
         ▼                       ▼  
   ┌───────────┐           ┌───────────┐  
   │ Server A  │           │ Server B  │  
   └─────┬─────┘           └─────┬─────┘  
         │                       │  
         └───────────┬───────────┘  
                     ▼  
           ┌─────────────────┐  
           │ Workflow State  │  
           │                 │  
           │ Postgres        │  
           │ Redis           │  
           │ Temporal        │  
           │ Durable Runtime │  
           └─────────────────┘  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now the agent runtime becomes replaceable.&lt;/p&gt;

&lt;p&gt;Any server can reconstruct the current workflow.&lt;/p&gt;

&lt;p&gt;Separate Three Different Types of State&lt;/p&gt;

&lt;p&gt;This is where production agent architecture becomes interesting.&lt;/p&gt;

&lt;p&gt;I usually think about agent state as three different layers.&lt;/p&gt;

&lt;p&gt;1. Conversation State&lt;/p&gt;

&lt;p&gt;This is what the model needs to understand the interaction.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;&lt;br&gt;
  "messages": [],&lt;br&gt;&lt;br&gt;
  "summary": "...",&lt;br&gt;&lt;br&gt;
  "user_preferences": {},&lt;br&gt;&lt;br&gt;
  "retrieved_context": []&lt;br&gt;&lt;br&gt;
}  &lt;/p&gt;

&lt;p&gt;This state controls what the model knows.&lt;/p&gt;

&lt;p&gt;2. Workflow State&lt;/p&gt;

&lt;p&gt;This is what your application needs to understand &lt;strong&gt;where execution currently is&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;&lt;br&gt;
  "workflow_id": "refund_39281",&lt;br&gt;&lt;br&gt;
  "status": "WAITING_FOR_APPROVAL",&lt;br&gt;&lt;br&gt;
  "current_step": "refund_confirmation",&lt;br&gt;&lt;br&gt;
  "order_id": "ORD_8821",&lt;br&gt;&lt;br&gt;
  "refund_amount": 149.99&lt;br&gt;&lt;br&gt;
}  &lt;/p&gt;

&lt;p&gt;This is not prompt context.&lt;/p&gt;

&lt;p&gt;It is distributed-system state.&lt;/p&gt;

&lt;p&gt;3. Side-Effect State&lt;/p&gt;

&lt;p&gt;This tells you what the agent has already done.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;&lt;br&gt;
  "email_sent": true,&lt;br&gt;&lt;br&gt;
  "refund_created": false,&lt;br&gt;&lt;br&gt;
  "crm_updated": true&lt;br&gt;&lt;br&gt;
}  &lt;/p&gt;

&lt;p&gt;Without this state, retries become dangerous.&lt;/p&gt;

&lt;p&gt;Imagine:&lt;/p&gt;

&lt;p&gt;Agent calls refund API  &lt;/p&gt;

&lt;p&gt;↓  &lt;/p&gt;

&lt;p&gt;Network timeout  &lt;/p&gt;

&lt;p&gt;↓  &lt;/p&gt;

&lt;p&gt;Agent doesn't know whether refund succeeded  &lt;/p&gt;

&lt;p&gt;↓  &lt;/p&gt;

&lt;p&gt;Agent retries  &lt;/p&gt;

&lt;p&gt;↓  &lt;/p&gt;

&lt;p&gt;Customer gets refunded twice  &lt;/p&gt;

&lt;p&gt;That is why production agents need &lt;strong&gt;idempotency&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Idempotency Becomes Extremely Important&lt;/p&gt;

&lt;p&gt;Every side-effecting tool should ideally support something similar to:&lt;/p&gt;

&lt;p&gt;refund(&lt;br&gt;&lt;br&gt;
    order_id="ORD_8821",&lt;br&gt;&lt;br&gt;
    amount=149.99,&lt;br&gt;&lt;br&gt;
    idempotency_key="workflow_928_step_7"&lt;br&gt;&lt;br&gt;
)  &lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;Attempt 1&lt;br&gt;&lt;br&gt;
workflow_928_step_7&lt;br&gt;&lt;br&gt;
        ↓&lt;br&gt;&lt;br&gt;
Refund $149.99  &lt;/p&gt;

&lt;p&gt;If the workflow retries:&lt;/p&gt;

&lt;p&gt;Attempt 2&lt;br&gt;&lt;br&gt;
workflow_928_step_7&lt;br&gt;&lt;br&gt;
        ↓&lt;br&gt;&lt;br&gt;
Already processed&lt;br&gt;&lt;br&gt;
        ↓&lt;br&gt;&lt;br&gt;
Return existing result  &lt;/p&gt;

&lt;p&gt;instead of creating another refund.&lt;/p&gt;

&lt;p&gt;This applies to much more than payments.&lt;/p&gt;

&lt;p&gt;Think about:&lt;/p&gt;

&lt;p&gt;send_email()&lt;br&gt;&lt;br&gt;
create_ticket()&lt;br&gt;&lt;br&gt;
delete_resource()&lt;br&gt;&lt;br&gt;
publish_post()&lt;br&gt;&lt;br&gt;
update_crm()&lt;br&gt;&lt;br&gt;
book_meeting()&lt;br&gt;&lt;br&gt;
deploy_service()&lt;br&gt;&lt;br&gt;
transfer_money()  &lt;/p&gt;

&lt;p&gt;Once AI agents can perform actions, &lt;strong&gt;retry semantics become part of AI safety&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Human Approval Is Also a Distributed Systems Problem&lt;/p&gt;

&lt;p&gt;Human-in-the-loop workflows are becoming common for sensitive actions.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Agent&lt;br&gt;&lt;br&gt;
  |&lt;br&gt;&lt;br&gt;
  v&lt;br&gt;&lt;br&gt;
Draft action&lt;br&gt;&lt;br&gt;
  |&lt;br&gt;&lt;br&gt;
  v&lt;br&gt;&lt;br&gt;
Approval required&lt;br&gt;&lt;br&gt;
  |&lt;br&gt;&lt;br&gt;
  +---------- PAUSE ----------&lt;br&gt;&lt;br&gt;
                               |&lt;br&gt;&lt;br&gt;
                               |&lt;br&gt;&lt;br&gt;
                         Human approves&lt;br&gt;&lt;br&gt;
                               |&lt;br&gt;&lt;br&gt;
                               v&lt;br&gt;&lt;br&gt;
                           Resume job  &lt;/p&gt;

&lt;p&gt;The important word here is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;resume&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You don't want to restart the entire agent.&lt;/p&gt;

&lt;p&gt;You want to continue from a durable checkpoint.&lt;/p&gt;

&lt;p&gt;Modern agent frameworks increasingly expose this kind of pause/resume model. OpenAI's agent documentation, for example, describes storing serialized state when human review happens later and continuing the same run once the decision arrives.&lt;/p&gt;

&lt;p&gt;This changes how we should think about agent execution.&lt;/p&gt;

&lt;p&gt;An agent isn't necessarily:&lt;/p&gt;

&lt;p&gt;HTTP request&lt;br&gt;&lt;br&gt;
    ↓&lt;br&gt;&lt;br&gt;
LLM&lt;br&gt;&lt;br&gt;
    ↓&lt;br&gt;&lt;br&gt;
response  &lt;/p&gt;

&lt;p&gt;It may instead be:&lt;/p&gt;

&lt;p&gt;Start&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Think&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Tool&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Think&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Tool&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Pause&lt;br&gt;&lt;br&gt;
 ↓  &lt;/p&gt;

&lt;p&gt;--- 4 hours later ---  &lt;/p&gt;

&lt;p&gt;↓&lt;br&gt;&lt;br&gt;
Resume&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Tool&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Think&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Complete  &lt;/p&gt;

&lt;p&gt;That is much closer to a workflow engine than a normal API request.&lt;/p&gt;

&lt;p&gt;Durable Execution Is Becoming Part of the Agent Stack&lt;/p&gt;

&lt;p&gt;Long-running agents introduce familiar distributed-system problems:&lt;/p&gt;

&lt;p&gt;process crashes&lt;br&gt;&lt;br&gt;
network failures&lt;br&gt;&lt;br&gt;
duplicate messages&lt;br&gt;&lt;br&gt;
timeouts&lt;br&gt;&lt;br&gt;
retries&lt;br&gt;&lt;br&gt;
partial execution&lt;br&gt;&lt;br&gt;
concurrent updates&lt;br&gt;&lt;br&gt;
human approvals&lt;br&gt;&lt;br&gt;
scheduled execution&lt;br&gt;&lt;br&gt;
deployment during execution  &lt;/p&gt;

&lt;p&gt;These problems existed long before LLMs.&lt;/p&gt;

&lt;p&gt;We're just rediscovering them inside agent systems.&lt;/p&gt;

&lt;p&gt;A production architecture may therefore look like:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    User  
                     |  
                     v  
                API Gateway  
                     |  
                     v  
             Agent Orchestrator  
                     |  
         ┌───────────┼───────────┐  
         │           │           │  
         v           v           v  
       Model       Tools        MCP  
         │           │           │  
         └───────────┼───────────┘  
                     |  
                     v  
            Durable Workflow  
                     |  
        ┌────────────┼────────────┐  
        │            │            │  
        v            v            v  
     State DB      Queue       Event Log  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Frameworks are increasingly acknowledging this requirement. LangChain, for example, describes durable execution, memory, human-in-the-loop support, multi-tenancy, and observability as infrastructure needed underneath long-running production agents.&lt;/p&gt;

&lt;p&gt;MCP and Durable Execution Solve Different Problems&lt;/p&gt;

&lt;p&gt;This distinction is worth remembering.&lt;/p&gt;

&lt;p&gt;MCP answers:&lt;/p&gt;

&lt;p&gt;How does an agent communicate with tools and external systems?&lt;/p&gt;

&lt;p&gt;Durable execution answers:&lt;/p&gt;

&lt;p&gt;How does an agent reliably continue working over time?&lt;/p&gt;

&lt;p&gt;They complement each other.&lt;/p&gt;

&lt;p&gt;You might have:&lt;/p&gt;

&lt;p&gt;Agent&lt;br&gt;&lt;br&gt;
  |&lt;br&gt;&lt;br&gt;
  | MCP&lt;br&gt;&lt;br&gt;
  v&lt;br&gt;&lt;br&gt;
Salesforce  &lt;/p&gt;

&lt;p&gt;Agent&lt;br&gt;&lt;br&gt;
  |&lt;br&gt;&lt;br&gt;
  | MCP&lt;br&gt;&lt;br&gt;
  v&lt;br&gt;&lt;br&gt;
GitHub  &lt;/p&gt;

&lt;p&gt;Agent&lt;br&gt;&lt;br&gt;
  |&lt;br&gt;&lt;br&gt;
  | MCP&lt;br&gt;&lt;br&gt;
  v&lt;br&gt;&lt;br&gt;
Slack  &lt;/p&gt;

&lt;p&gt;while the overall workflow is managed separately:&lt;/p&gt;

&lt;p&gt;Step 1: Fetch GitHub issue&lt;br&gt;&lt;br&gt;
Step 2: Analyze code&lt;br&gt;&lt;br&gt;
Step 3: Generate patch&lt;br&gt;&lt;br&gt;
Step 4: Run tests&lt;br&gt;&lt;br&gt;
Step 5: Wait for approval&lt;br&gt;&lt;br&gt;
Step 6: Create PR&lt;br&gt;&lt;br&gt;
Step 7: Post Slack notification  &lt;/p&gt;

&lt;p&gt;The MCP servers do not need to remember the entire workflow.&lt;/p&gt;

&lt;p&gt;The orchestrator does.&lt;/p&gt;

&lt;p&gt;Observability Also Changes&lt;/p&gt;

&lt;p&gt;Traditional API monitoring might tell you:&lt;/p&gt;

&lt;p&gt;POST /agent&lt;br&gt;&lt;br&gt;
200 OK&lt;br&gt;&lt;br&gt;
Duration: 4.2s  &lt;/p&gt;

&lt;p&gt;That isn't enough.&lt;/p&gt;

&lt;p&gt;A production agent might execute:&lt;/p&gt;

&lt;p&gt;Run #8291  &lt;/p&gt;

&lt;p&gt;├── Model call&lt;br&gt;&lt;br&gt;
├── retrieve_documents&lt;br&gt;&lt;br&gt;
├── Model call&lt;br&gt;&lt;br&gt;
├── search_customer&lt;br&gt;&lt;br&gt;
├── Model call&lt;br&gt;&lt;br&gt;
├── update_customer&lt;br&gt;&lt;br&gt;
├── approval_required&lt;br&gt;&lt;br&gt;
├── PAUSED&lt;br&gt;&lt;br&gt;
├── approval_received&lt;br&gt;&lt;br&gt;
├── update_salesforce&lt;br&gt;&lt;br&gt;
├── send_email&lt;br&gt;&lt;br&gt;
└── complete  &lt;/p&gt;

&lt;p&gt;You need to understand the complete trajectory.&lt;/p&gt;

&lt;p&gt;That means tracking:&lt;/p&gt;

&lt;p&gt;model calls&lt;br&gt;&lt;br&gt;
tool calls&lt;br&gt;&lt;br&gt;
tool arguments&lt;br&gt;&lt;br&gt;
tool responses&lt;br&gt;&lt;br&gt;
latency&lt;br&gt;&lt;br&gt;
token usage&lt;br&gt;&lt;br&gt;
retries&lt;br&gt;&lt;br&gt;
approvals&lt;br&gt;&lt;br&gt;
guardrail decisions&lt;br&gt;&lt;br&gt;
state transitions&lt;br&gt;&lt;br&gt;
errors&lt;br&gt;&lt;br&gt;
cost  &lt;/p&gt;

&lt;p&gt;Agent platforms are moving in this direction as well. Current OpenAI tooling, for example, exposes structured tracing across model calls, tool calls, handoffs, guardrails, and custom spans.&lt;/p&gt;

&lt;p&gt;The Production Pattern&lt;/p&gt;

&lt;p&gt;If I were designing a serious agent system today, I would separate it roughly like this:&lt;/p&gt;

&lt;p&gt;┌───────────────────────────────┐&lt;br&gt;&lt;br&gt;
│           API Layer           │&lt;br&gt;&lt;br&gt;
└───────────────┬───────────────┘&lt;br&gt;&lt;br&gt;
                │&lt;br&gt;&lt;br&gt;
                ▼&lt;br&gt;&lt;br&gt;
┌───────────────────────────────┐&lt;br&gt;&lt;br&gt;
│      Agent Orchestrator       │&lt;br&gt;&lt;br&gt;
│                               │&lt;br&gt;&lt;br&gt;
│ Planning                      │&lt;br&gt;&lt;br&gt;
│ Reasoning                     │&lt;br&gt;&lt;br&gt;
│ Tool selection                │&lt;br&gt;&lt;br&gt;
└───────────────┬───────────────┘&lt;br&gt;&lt;br&gt;
                │&lt;br&gt;&lt;br&gt;
       ┌────────┴────────┐&lt;br&gt;&lt;br&gt;
       │                 │&lt;br&gt;&lt;br&gt;
       ▼                 ▼&lt;br&gt;&lt;br&gt;
┌─────────────┐    ┌───────────────┐&lt;br&gt;&lt;br&gt;
│ MCP / Tools │    │ Workflow      │&lt;br&gt;&lt;br&gt;
│             │    │ Runtime       │&lt;br&gt;&lt;br&gt;
│ Stateless   │    │               │&lt;br&gt;&lt;br&gt;
│ interface   │    │ Durable State │&lt;br&gt;&lt;br&gt;
└─────────────┘    └───────┬───────┘&lt;br&gt;&lt;br&gt;
                           │&lt;br&gt;&lt;br&gt;
                   ┌───────┼───────┐&lt;br&gt;&lt;br&gt;
                   ▼       ▼       ▼&lt;br&gt;&lt;br&gt;
                  DB     Queue    Logs  &lt;/p&gt;

&lt;p&gt;Notice the separation:&lt;/p&gt;

&lt;p&gt;MCP            → tool interoperability&lt;br&gt;&lt;br&gt;
LLM            → reasoning&lt;br&gt;&lt;br&gt;
Workflow layer → durability&lt;br&gt;&lt;br&gt;
Database       → state&lt;br&gt;&lt;br&gt;
Queue          → asynchronous execution&lt;br&gt;&lt;br&gt;
Tracing        → observability&lt;br&gt;&lt;br&gt;
Guardrails     → control  &lt;/p&gt;

&lt;p&gt;Trying to make the LLM responsible for all of these concerns is where agent architecture usually starts falling apart.&lt;/p&gt;

&lt;p&gt;The Bigger Lesson&lt;/p&gt;

&lt;p&gt;The AI industry spent the first phase of the LLM boom asking:&lt;/p&gt;

&lt;p&gt;Which model should we use?&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;Which prompt should we use?&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;Which agent framework should we use?&lt;/p&gt;

&lt;p&gt;The more important production questions are increasingly becoming:&lt;/p&gt;

&lt;p&gt;How does the workflow recover?  &lt;/p&gt;

&lt;p&gt;How do we resume execution?  &lt;/p&gt;

&lt;p&gt;How do we prevent duplicate side effects?  &lt;/p&gt;

&lt;p&gt;Where does state live?  &lt;/p&gt;

&lt;p&gt;How do we authorize tool calls?  &lt;/p&gt;

&lt;p&gt;How do we trace a 50-step execution?  &lt;/p&gt;

&lt;p&gt;How do we roll out a new agent version safely?  &lt;/p&gt;

&lt;p&gt;How do we replay failed workflows?  &lt;/p&gt;

&lt;p&gt;How do we evaluate complete trajectories?  &lt;/p&gt;

&lt;p&gt;These are not fundamentally AI questions.&lt;/p&gt;

&lt;p&gt;They are &lt;strong&gt;distributed systems questions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that might be one of the most important shifts happening in AI engineering right now.&lt;/p&gt;

&lt;p&gt;MCP becoming more stateless doesn't remove state from agent systems.&lt;/p&gt;

&lt;p&gt;It simply puts state where it belongs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the application and workflow layer, not the transport protocol.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Final Thought&lt;/p&gt;

&lt;p&gt;The next generation of AI applications probably won't look like:&lt;/p&gt;

&lt;p&gt;User → Prompt → LLM → Response  &lt;/p&gt;

&lt;p&gt;They will look more like:&lt;/p&gt;

&lt;p&gt;User&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Agent&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Planner&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Tools / MCP&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Durable Workflow&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Events&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Approvals&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Retries&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Observability&lt;br&gt;&lt;br&gt;
 ↓&lt;br&gt;&lt;br&gt;
Result  &lt;/p&gt;

&lt;p&gt;The model may be the brain.&lt;/p&gt;

&lt;p&gt;But production reliability still comes from good systems engineering.&lt;/p&gt;

&lt;p&gt;And no amount of prompt engineering can replace that.&lt;/p&gt;

</description>
      <category>aimcparchitectureagents</category>
    </item>
    <item>
      <title>This is my post</title>
      <dc:creator>Robin Singh</dc:creator>
      <pubDate>Thu, 24 Sep 2026 00:51:01 +0000</pubDate>
      <link>https://dev.to/robin_singh_456fbe1f602b9/this-is-my-post-ih1</link>
      <guid>https://dev.to/robin_singh_456fbe1f602b9/this-is-my-post-ih1</guid>
      <description>&lt;p&gt;Testing the post &lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
