<?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>Forem: Ajay Devineni</title>
    <description>The latest articles on Forem by Ajay Devineni (@ajaydevineni).</description>
    <link>https://forem.com/ajaydevineni</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3862822%2Fddbc52cd-519d-4344-bea2-effb2a513786.png</url>
      <title>Forem: Ajay Devineni</title>
      <link>https://forem.com/ajaydevineni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ajaydevineni"/>
    <language>en</language>
    <item>
      <title>Your Agent Acts Without Checking Your Error Budget — That's the Failure Mode Nobody Is Tracking</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Tue, 26 May 2026 17:34:07 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/your-agent-acts-without-checking-your-error-budget-thats-the-failure-mode-nobody-is-tracking-29n0</link>
      <guid>https://forem.com/ajaydevineni/your-agent-acts-without-checking-your-error-budget-thats-the-failure-mode-nobody-is-tracking-29n0</guid>
      <description>&lt;p&gt;Yesterday a piece came out that framed something I've been watching build across production environments for months.&lt;br&gt;
There is a category of production incident that engineering teams are not tracking yet — because it doesn't fit any existing postmortem template. The agent initiated an action. The action was technically correct given the agent's context. The context was incomplete. The infrastructure cascaded. By the time the incident review happened, three teams were arguing about whether it was an agent failure or an infrastructure failure. Kore.ai&lt;br&gt;
That argument happens because the two disciplines — SRE and autonomous agents — have never been formally connected at the decision layer.&lt;br&gt;
Here's the connection I want to make explicit.&lt;br&gt;
What Chaos Engineering Gets Right&lt;br&gt;
Mature chaos engineering programs have a property that's easy to overlook because it's invisible when it's working. Before a human engineer initiates any experiment — a fault injection, a latency spike, a dependency kill — they make a judgment call: does this system have capacity to absorb a perturbation right now?&lt;br&gt;
They check error budget burn rate. They look at whether upstream dependencies are stable. They assess whether the on-call team has bandwidth to respond if something goes wrong. They check whether there's a deploy in flight that makes this a bad time.&lt;br&gt;
That judgment call is informal, often intuitive, and sometimes wrong. But it exists. It's the human-in-the-loop that decides whether the system is in a state to safely absorb autonomous action.&lt;br&gt;
Agents don't make that call. They evaluate their task context, form a plan, and execute. The question "is right now a safe time for this action given the current reliability state of the system?" is not in their decision loop.&lt;br&gt;
The agents delivering production value in 2026 share one defining property: bounded scope. The agent handles one domain, with a defined tool set, and explicitly refuses tasks outside that boundary. The boundary is what makes autonomous deployment safe. GlobeNewswire&lt;br&gt;
Boundary on task scope is necessary. It's not sufficient. You also need a boundary on timing — a gate that checks whether the system's current reliability state can absorb what the agent is about to do.&lt;br&gt;
The Pre-Action SRE Gate&lt;br&gt;
I want to introduce a concrete pattern here: the Pre-Action SRE Gate — a check an agent runs against your existing SRE signals before executing any state-changing action.&lt;br&gt;
The gate has three checks, all using metrics I've built out across this series:&lt;br&gt;
Check 1 — Error Budget Headroom&lt;br&gt;
Before acting, the agent queries current SLO error budget remaining for the services in its blast radius. If error budget is below threshold — the system is already burning faster than acceptable — the agent does not act autonomously. It escalates.&lt;br&gt;
This is the chaos engineering judgment call, formalized as a programmatic check.&lt;br&gt;
Check 2 — AQDD State&lt;br&gt;
Approval Queue Depth Drift tells you whether the human oversight layer is already backed up. If AQDD is elevated — meaning humans can't process approvals fast enough — autonomous action during that window means any mistake won't be caught in time. Agent holds.&lt;br&gt;
Check 3 — HER Trend&lt;br&gt;
If the agent's own Human Escalation Rate has been elevated in the recent window, it's operating outside its reliable envelope. Letting it take autonomous action in that state compounds the risk. Agent escalates.&lt;br&gt;
None of these metrics are new. They're from Post 4 and Post 10 of this series. What's new is using them as gates before action, not just as observability signals after the fact.&lt;br&gt;
python# agentsre/pre_action_gate.py&lt;/p&gt;

&lt;p&gt;from dataclasses import dataclass&lt;br&gt;
from typing import Optional&lt;br&gt;
from datetime import datetime, timezone&lt;br&gt;
import json&lt;/p&gt;

&lt;p&gt;@dataclass&lt;br&gt;
class SREGateResult:&lt;br&gt;
    """&lt;br&gt;
    Result of a Pre-Action SRE Gate check.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If approved is False, the agent must not proceed with
autonomous action — escalate to human owner per ARO record.

Attributes:
    approved: Whether autonomous action is cleared
    blocking_check: Which check blocked (if any)
    error_budget_pct: Current error budget remaining (0-100)
    aqdd_depth: Current approval queue depth
    her_trend: Recent HER rate (0-100)
    recommendation: What the agent should do
    checked_at: Timestamp of gate check
"""
approved: bool
blocking_check: Optional[str]
error_budget_pct: float
aqdd_depth: int
her_trend: float
recommendation: str
checked_at: str
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;class PreActionSREGate:&lt;br&gt;
    """&lt;br&gt;
    Pre-Action SRE Gate — checks your SRE signal state before&lt;br&gt;
    an agent executes any autonomous write, remediation, scale&lt;br&gt;
    event, or config change.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This is the chaos engineering judgment call, formalized.
A human engineer checks these things before running an experiment.
Your agent should check them before acting autonomously.

Thresholds should be calibrated per agent and task class
in shadow mode — same protocol as HER and RTD baselines.
"""

def __init__(self,
             error_budget_min_pct: float = 20.0,
             aqdd_max_depth: int = 3,
             her_max_trend_pct: float = 15.0):
    """
    Args:
        error_budget_min_pct: Minimum error budget % required
            for autonomous action. Below this = escalate.
            Default 20% — agent should not consume budget
            that's already critically low.
        aqdd_max_depth: Max approval queue depth before
            autonomous action is blocked. Above this,
            humans can't course-correct fast enough.
        her_max_trend_pct: Max recent HER rate before
            autonomous action is blocked. Elevated HER
            means agent is already outside reliable envelope.
    """
    self.error_budget_min_pct = error_budget_min_pct
    self.aqdd_max_depth = aqdd_max_depth
    self.her_max_trend_pct = her_max_trend_pct

def check(self,
          agent_id: str,
          intended_action: str,
          error_budget_pct: float,
          aqdd_depth: int,
          her_trend_pct: float) -&amp;gt; SREGateResult:
    """
    Run pre-action SRE gate check.

    Call this before any autonomous state-changing action.
    If result.approved is False — escalate, do not act.

    Args:
        agent_id: Agent requesting action clearance
        intended_action: Description of what agent plans to do
        error_budget_pct: Current error budget remaining (0-100)
        aqdd_depth: Current approval queue depth
        her_trend_pct: Agent's recent HER rate (0-100)

    Returns:
        SREGateResult with approval decision and reasoning
    """
    # Check 1: Error budget headroom
    if error_budget_pct &amp;lt; self.error_budget_min_pct:
        return SREGateResult(
            approved=False,
            blocking_check="error_budget",
            error_budget_pct=error_budget_pct,
            aqdd_depth=aqdd_depth,
            her_trend=her_trend_pct,
            recommendation=(
                f"Error budget at {error_budget_pct:.1f}% — "
                f"below {self.error_budget_min_pct}% minimum. "
                "Escalate to human owner. Do not act autonomously."
            ),
            checked_at=datetime.now(timezone.utc).isoformat()
        )

    # Check 2: Approval queue state
    if aqdd_depth &amp;gt; self.aqdd_max_depth:
        return SREGateResult(
            approved=False,
            blocking_check="aqdd",
            error_budget_pct=error_budget_pct,
            aqdd_depth=aqdd_depth,
            her_trend=her_trend_pct,
            recommendation=(
                f"Approval queue depth {aqdd_depth} exceeds "
                f"maximum {self.aqdd_max_depth}. "
                "Human oversight is backed up — autonomous action "
                "cannot be safely course-corrected. Hold."
            ),
            checked_at=datetime.now(timezone.utc).isoformat()
        )

    # Check 3: Agent's own HER trend
    if her_trend_pct &amp;gt; self.her_max_trend_pct:
        return SREGateResult(
            approved=False,
            blocking_check="her_trend",
            error_budget_pct=error_budget_pct,
            aqdd_depth=aqdd_depth,
            her_trend=her_trend_pct,
            recommendation=(
                f"HER at {her_trend_pct:.1f}% — "
                f"above {self.her_max_trend_pct}% threshold. "
                "Agent is operating outside reliable envelope. "
                "Escalate rather than act autonomously."
            ),
            checked_at=datetime.now(timezone.utc).isoformat()
        )

    # All checks passed
    return SREGateResult(
        approved=True,
        blocking_check=None,
        error_budget_pct=error_budget_pct,
        aqdd_depth=aqdd_depth,
        her_trend=her_trend_pct,
        recommendation="Autonomous action cleared. Proceed within blast radius.",
        checked_at=datetime.now(timezone.utc).isoformat()
    )

def to_audit_log(self, agent_id: str,
                 intended_action: str,
                 result: SREGateResult) -&amp;gt; dict:
    """
    Structured audit log entry for every gate check.
    Every autonomous action attempt — approved or blocked —
    should be logged. This is your agent action audit trail.
    """
    return {
        "trace_type": "pre_action_gate",
        "agent_id": agent_id,
        "intended_action": intended_action,
        "gate_approved": result.approved,
        "blocking_check": result.blocking_check,
        "sre_signals": {
            "error_budget_pct": result.error_budget_pct,
            "aqdd_depth": result.aqdd_depth,
            "her_trend_pct": result.her_trend,
        },
        "recommendation": result.recommendation,
        "checked_at": result.checked_at,
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;How This Connects to the Full Arc&lt;br&gt;
Post 4 introduced DQR, TIE, HER, AQDD as observability SLIs — things you watch.&lt;br&gt;
Post 10 introduced ARO — who owns the agent when those SLIs breach.&lt;br&gt;
Post 11 introduced RTD — the reasoning observability layer.&lt;br&gt;
Post 12 introduced CUR — context budget as a reliability ceiling.&lt;br&gt;
This post introduces the Pre-Action SRE Gate — where all of those signals become decision inputs rather than observability outputs. The agent reads your SRE state before acting, not just after.&lt;br&gt;
Resilience requires explicit investment in circuit breakers, graceful degradation, and clear failure modes that preserve system integrity. Teams building agents must invest in resilience infrastructure before pushing to higher-criticality workloads. SourceForge&lt;br&gt;
The Pre-Action Gate is that infrastructure. It's your agent's circuit breaker — not on retry loops or cost, but on system-level reliability state.&lt;br&gt;
The Postmortem Template Gap&lt;br&gt;
79% of organizations now have AI agents in production. Gartner warns 40% of those projects will be canceled due to poor risk controls. The incidents happening in that gap don't fit existing postmortem templates because current templates ask: what changed? who deployed? what failed? Kore.ai&lt;br&gt;
They don't ask: what was the error budget state when the agent acted? Was AQDD elevated, meaning the approval layer was already overwhelmed? Had the agent's HER been trending up, meaning it was already in unreliable territory?&lt;br&gt;
Those questions need to be in your postmortem template. Add a section: Agent Pre-Action State — error budget at time of action, AQDD depth, HER trend. If your postmortem can't answer those three questions, you don't have the data to prevent the same incident from happening again.&lt;br&gt;
The code is in agentsre/pre_action_gate.py on GitHub. MIT licensed, zero external dependencies.&lt;br&gt;
Ajay Devineni | AWS Community Builder | Senior SRE/Platform Engineer&lt;br&gt;
github.com/Ajay150313/agentsre&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fah1uu32oi9dqse8tf02a.jpeg" 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.amazonaws.com%2Fuploads%2Farticles%2Fah1uu32oi9dqse8tf02a.jpeg" alt=" " width="427" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sre</category>
      <category>devops</category>
      <category>cursor</category>
    </item>
    <item>
      <title>Why Your AI Agent Monitoring is Wrong (And How to Fix It)</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Mon, 25 May 2026 11:35:24 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/why-your-ai-agent-monitoring-is-wrong-and-how-to-fix-it-1b25</link>
      <guid>https://forem.com/ajaydevineni/why-your-ai-agent-monitoring-is-wrong-and-how-to-fix-it-1b25</guid>
      <description>&lt;p&gt;As I discussed in my SLO Design article, traditional reliability metrics fail for agentic AI systems. Now let's look at how to actually implement semantic monitoring in production.&lt;br&gt;
Your AI agent is running in production.&lt;br&gt;
HTTP 200. Uptime 99.9%. All dashboards are green.&lt;br&gt;
But it's making the wrong decision 30% of the time.&lt;br&gt;
Your monitoring won't tell you.&lt;br&gt;
The Gap&lt;br&gt;
I spent six months figuring this out the hard way. Traditional SRE monitoring measures infrastructure. Network latency. Error rates. Uptime. It's designed for services that crash when they break. But agents don't crash. They degrade. Slowly. Silently.&lt;br&gt;
An agent can be:&lt;/p&gt;

&lt;p&gt;94% accurate (still 94%) &lt;br&gt;
But losing confidence (0.92 to 0.41)&lt;br&gt;
Compensating by calling tools 3x more (1.1x to 3.1x)&lt;br&gt;
While humans reject more of its output (1% to 19%)&lt;br&gt;
As work piles up waiting for approval (8 to 340 items)&lt;/p&gt;

&lt;p&gt;Your monitoring sees "everything is fine."&lt;br&gt;
You see $2M impact by the time you notice.&lt;br&gt;
What We Actually Need to Measure Not infrastructure metrics. Semantic metrics.&lt;br&gt;
Four things:&lt;br&gt;
Decision Quality Rate &lt;strong&gt;(DQR)&lt;/strong&gt;&lt;br&gt;
Is the agent picking the right tool?&lt;br&gt;
Healthy: 92%+&lt;br&gt;
Threshold for action: &amp;lt;85%&lt;br&gt;
Tool Invocation Efficiency **(TIE)**&lt;br&gt;
Is it over-compensating by calling tools more than normal?&lt;br&gt;
Healthy: 1.0-1.2x baseline&lt;br&gt;
Threshold for action: &amp;gt;1.5x&lt;br&gt;
Human Escalation Rate &lt;strong&gt;(HER)&lt;/strong&gt;&lt;br&gt;
Are humans rejecting its decisions?&lt;br&gt;
Healthy: &amp;lt;2%&lt;br&gt;
Threshold for action: &amp;gt;5%&lt;br&gt;
Approval Queue Depth Drift (&lt;strong&gt;AQDD&lt;/strong&gt;)&lt;br&gt;
Is work piling up waiting for approval?&lt;br&gt;
Healthy: &amp;lt;20 pending&lt;br&gt;
Threshold for action: &amp;gt;50 pending&lt;br&gt;
When any of these drift, semantic failure is 48 hours away.&lt;br&gt;
Real Scenario&lt;br&gt;
Tuesday 2pm: Agent starts degrading. DQR drops from 94% to 88%. TIE increases from 1.1x to 1.4x. Nothing alarming yet by traditional metrics.&lt;br&gt;
Your infrastructure monitoring stays green.&lt;br&gt;
Thursday 10am: DQR at 62%. TIE at 3.1x. Queue at 340 items.&lt;br&gt;
Your first alert finally fires - from your infrastructure monitoring noticing error rates creeping up.&lt;br&gt;
You've just lost 40+ hours of bad decisions.&lt;br&gt;
With semantic SLIs, you would have known Tuesday at 2:15pm.&lt;br&gt;
How We Built It&lt;br&gt;
Semantic SLI monitoring system that:&lt;/p&gt;

&lt;p&gt;Tracks what matters - DQR, TIE, HER, AQDD (not uptime)&lt;br&gt;
Detects degradation early - 48 hours before traditional SLIs Suggests remediation - Not just "something's wrong" Automates response - Progressive autonomy constraints&lt;/p&gt;

&lt;p&gt;When degradation detected:&lt;/p&gt;

&lt;p&gt;Agent autonomy automatically constrained (FULL → GUIDED → SUPERVISED → BLOCKED)&lt;br&gt;
Slack notification sent with context&lt;br&gt;
Remediation steps suggested (prioritized by success rate)&lt;br&gt;
Everything tracked for audit and learning&lt;/p&gt;

&lt;p&gt;Code Example&lt;br&gt;
pythonfrom agentsre.orchestration import FintechSREOrchestrator, AgentRole, AlertManager&lt;/p&gt;

&lt;h1&gt;
  
  
  Initialize orchestrator
&lt;/h1&gt;

&lt;p&gt;orch = FintechSREOrchestrator()&lt;br&gt;
orch.register_agent("payment-1", AgentRole.PAYMENT_PROCESSOR)&lt;/p&gt;

&lt;h1&gt;
  
  
  Initialize alerts
&lt;/h1&gt;

&lt;p&gt;alerts = AlertManager()&lt;/p&gt;

&lt;p&gt;def on_critical_alert(alert_dict):&lt;br&gt;
    send_to_slack(alert_dict)&lt;/p&gt;

&lt;p&gt;alerts.slack_handler = on_critical_alert&lt;/p&gt;

&lt;h1&gt;
  
  
  Update metrics as agent runs
&lt;/h1&gt;

&lt;p&gt;orch.update_metrics(&lt;br&gt;
    agent_id="payment-1",&lt;br&gt;
    dqr=62.0,      # Decision quality degraded&lt;br&gt;
    tie=2.8,       # Tool calls increased&lt;br&gt;
    her=15.0,      # Escalations up&lt;br&gt;
    aqd=180,       # Queue growing&lt;br&gt;
    confidence=0.42,&lt;br&gt;
    cost=0.0003&lt;br&gt;
)&lt;/p&gt;

&lt;h1&gt;
  
  
  Create alert with remediation suggestions
&lt;/h1&gt;

&lt;p&gt;alert = alerts.create_alert(&lt;br&gt;
    agent_id="payment-1",&lt;br&gt;
    reason="Semantic degradation detected",&lt;br&gt;
    triggered_metrics=["DQR", "TIE", "HER"],&lt;br&gt;
    current_values={&lt;br&gt;
        "dqr": 62.0,&lt;br&gt;
        "tie": 2.8,&lt;br&gt;
        "her": 15.0,&lt;br&gt;
        "aqd": 180&lt;br&gt;
    }&lt;br&gt;
)&lt;/p&gt;

&lt;h1&gt;
  
  
  Get remediation steps
&lt;/h1&gt;

&lt;p&gt;for step in alert.suggested_remediations[:3]:&lt;br&gt;
    print(f"→ {step.action} ({step.estimated_time_minutes}min)")&lt;br&gt;
Output:&lt;br&gt;
→ Review latest 10 agent decisions - identify pattern (15min)&lt;br&gt;
→ Check upstream service - likely returning bad data (10min)&lt;br&gt;
→ Agent over-compensating - check confidence scores (10min)&lt;br&gt;
What This Means for SRE&lt;br&gt;
You're not just detecting problems. You're understanding them.&lt;br&gt;
Instead of:&lt;/p&gt;

&lt;p&gt;"Error rate is high"&lt;br&gt;
"Latency is up"&lt;br&gt;
"Something's wrong"&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;p&gt;"Agent decision quality dropped 15%, tool calls increased 2.8x, humans rejecting 15% of output, 180 items pending approval"&lt;br&gt;
Suggested fix: Check upstream service (likely corrupting data)&lt;br&gt;
Severity: CRITICAL&lt;/p&gt;

&lt;p&gt;That's the difference between reactive and proactive reliability.&lt;br&gt;
Open Source Built all this open source. MIT licensed.&lt;br&gt;
Tested in production at scale. Works with LangChain, CrewAI, Bedrock.&lt;br&gt;
GitHub: &lt;a href="https://github.com/Ajay150313/agentsre" rel="noopener noreferrer"&gt;https://github.com/Ajay150313/agentsre&lt;/a&gt;&lt;br&gt;
For Your Team&lt;br&gt;
If you're running agents in production, you probably have this problem too. You just don't know it yet.&lt;br&gt;
Try semantic SLIs. If you catch something you didn't know was degrading (most teams do), you'll know it was worth it.&lt;br&gt;
The cost of not knowing? Sometimes it's $2M.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sre</category>
      <category>devops</category>
      <category>fintech</category>
    </item>
    <item>
      <title>The Context Window Is RAM — Why Your Agent's SLIs Are Telling You It's Full</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Fri, 22 May 2026 02:18:21 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/the-context-window-is-ram-why-your-agents-slis-are-telling-you-its-full-4ejb</link>
      <guid>https://forem.com/ajaydevineni/the-context-window-is-ram-why-your-agents-slis-are-telling-you-its-full-4ejb</guid>
      <description>&lt;p&gt;The Microsoft team that built the Azure SRE Agent published something in January that I keep coming back to.&lt;br&gt;
Six months into building it, they realized they weren't building an SRE agent. They were building a context engineering system that happens to do site reliability engineering. Better models were table stakes, but what moved the needle was what they controlled: disciplined context management. Kore.ai&lt;br&gt;
That framing is exactly right. And it has a reliability implication that I haven't seen anyone write about directly.&lt;br&gt;
The Problem&lt;br&gt;
Your agent's context window is volatile working memory. Fast, expensive, and non-persistent. It's RAM, not storage. When the session ends, it's gone. When it fills up, quality degrades — not linearly, but in ways that are hard to predict and easy to miss.&lt;br&gt;
As you fill the context window, model quality drops non-linearly. "Lost in the middle," "not adhering to my instructions," and long-context degradation show up well before the advertised token limits. More tokens don't just cost latency — they quietly erode accuracy. Kore.ai&lt;br&gt;
That quiet erosion is the reliability failure mode. It doesn't throw an exception. It doesn't spike your error rate. Your agent keeps running. It just makes progressively worse decisions as the context fills.&lt;br&gt;
And here's the part I want to be specific about: you already have the SLIs to catch this. You just haven't connected them to context state yet.&lt;br&gt;
What Context Overflow Looks Like in Your SLIs&lt;br&gt;
When an agent's context fills beyond its effective working range, three things happen in order:&lt;br&gt;
DQR (Decision Quality Rate) drops first. The agent's decisions get worse because early instructions are now competing with thousands of tokens of recent tool output. An instruction from turn 3 gets buried under content that arrived after it — the agent isn't ignoring it, it's attending more reliably to recent content as the session grows. This is a passive decay process, not a model bug. incident.io&lt;br&gt;
RTD (Reasoning Trace Depth) climbs next. The agent re-plans more because its earlier context — what it already established about the problem — is partially decayed. It's not re-planning because something changed. It's re-planning because it partially forgot what it already figured out.&lt;br&gt;
TIE (Tool Invocation Efficiency) degrades last. The agent starts calling tools to reconstruct context it already had. It queries the same data sources again. It re-fetches runbooks it already read. Tool call count per task climbs above baseline while task quality continues to fall.&lt;br&gt;
By the time TIE is visibly elevated, you're already well into the degradation window. DQR was the earlier signal. And DQR dropping in a long-running session, without any external trigger, is your context overflow signature.&lt;br&gt;
The Architecture Fix&lt;br&gt;
Mem0's 2026 benchmarks quantify the difference clearly: full-context baseline (everything packed into the window) scored 72.9% accuracy using 26,000 tokens per query at 17 second p95 latency. A two-layer memory architecture scored 91.6% accuracy using under 7,000 tokens at 1.4 second p95 latency. That's an 18.7 point accuracy improvement while using 4x fewer tokens and cutting latency by 91%. Yahoo Finance&lt;br&gt;
The two-layer architecture is straightforward:&lt;br&gt;
Working memory (context window): Only what's needed for the current decision. Active task state, recent tool results, current instructions. Managed actively — compressed, summarized, or paged out as the session grows.&lt;br&gt;
Persistent memory (external store): Facts that persist across decisions and sessions. User preferences, established system state, prior investigation findings, runbook contents. Fetched into context when relevant, not kept resident the whole time.&lt;br&gt;
The discipline is knowing what belongs in each layer and managing the boundary actively.&lt;br&gt;
Connecting This to Your Production Readiness Checklist&lt;br&gt;
Before a long-running agent goes to production, two questions need answers:&lt;br&gt;
What is the expected context budget for a typical session? Not the model's maximum. The budget at which you've measured DQR starting to degrade for this specific agent on this specific task class. That number is your operational ceiling, not the advertised token limit.&lt;br&gt;
What happens when the agent approaches that ceiling? Does it compress? Summarize and page out? Escalate to human? Or does it silently continue with degrading accuracy until something downstream notices?&lt;br&gt;
If the answer to the second question is "it keeps going," that's your reliability gap. The context ceiling needs the same circuit breaker thinking as your token budget ceiling from the cost post.&lt;br&gt;
python# agentsre/context_budget.py&lt;/p&gt;

&lt;p&gt;from dataclasses import dataclass, field&lt;br&gt;
from typing import Optional&lt;br&gt;
import json&lt;br&gt;
from datetime import datetime, timezone&lt;/p&gt;

&lt;p&gt;@dataclass&lt;br&gt;
class ContextBudgetTracker:&lt;br&gt;
    """&lt;br&gt;
    Track context utilization against operational DQR ceiling.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The model's advertised token limit is not your operational limit.
Your operational limit is the token count at which DQR starts
to degrade for this agent on this task class. Establish that
baseline in shadow mode. Set your ceiling below it.

Attributes:
    agent_id: Agent being tracked
    task_class: Task type (DQR ceiling varies by task complexity)
    operational_ceiling_tokens: Tokens at which DQR degrades
        for this agent/task combination. NOT the model's max.
    warning_threshold_pct: Fraction of ceiling triggering warning
    current_tokens: Current context utilization
"""
agent_id: str
task_class: str
operational_ceiling_tokens: int
warning_threshold_pct: float = 0.75
current_tokens: int = 0
session_id: str = ""
compression_events: int = 0

@property
def utilization_pct(self) -&amp;gt; float:
    """Current context utilization as fraction of operational ceiling."""
    return self.current_tokens / self.operational_ceiling_tokens

@property
def budget_status(self) -&amp;gt; str:
    """
    OK — within safe operating range
    WARNING — approaching DQR degradation ceiling
    CRITICAL — at or above operational ceiling, DQR degrading
    """
    u = self.utilization_pct
    if u &amp;lt; self.warning_threshold_pct:
        return "OK"
    elif u &amp;lt; 1.0:
        return "WARNING"
    return "CRITICAL"

def update(self, current_tokens: int) -&amp;gt; dict:
    """
    Update current context utilization and return status record.
    Call this after each tool call or model response.

    Returns status record for logging to CloudWatch / Datadog.
    """
    self.current_tokens = current_tokens
    record = {
        "agent_id": self.agent_id,
        "session_id": self.session_id,
        "task_class": self.task_class,
        "current_tokens": self.current_tokens,
        "operational_ceiling": self.operational_ceiling_tokens,
        "utilization_pct": round(self.utilization_pct, 3),
        "budget_status": self.budget_status,
        "compression_events": self.compression_events,
        "timestamp": datetime.now(timezone.utc).isoformat(),
    }
    return record

def record_compression(self) -&amp;gt; None:
    """Call when context compression or summarization fires."""
    self.compression_events += 1

def should_compress(self) -&amp;gt; bool:
    """True when context is approaching DQR degradation ceiling."""
    return self.utilization_pct &amp;gt;= self.warning_threshold_pct

def should_escalate(self) -&amp;gt; bool:
    """
    True when context is at or above operational ceiling.
    At this point DQR is actively degrading.
    Escalate to human or terminate session cleanly.
    """
    return self.utilization_pct &amp;gt;= 1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The Practical Baseline Protocol&lt;br&gt;
Before you can set an operational context ceiling, you need to know where DQR actually starts to degrade for your specific agent on your specific task class. The steps:&lt;br&gt;
Run the agent in shadow mode on a representative sample of tasks. Record DQR at 25%, 50%, 75%, and 100% of the model's advertised context limit. Find the inflection point — where DQR starts dropping. Set your operational ceiling at 80% of that inflection point. That's your warning threshold. At the ceiling, trigger compression or escalation, not continuation.&lt;br&gt;
This is the same baseline protocol as HER and RTD. Thirty days of shadow mode, measure the metric, set the threshold. The only difference is that context budget degradation is session-scoped rather than task-scoped.&lt;br&gt;
Why This Post Belongs in This Series&lt;br&gt;
Post 4 established DQR as your output quality SLI. Post 9 established token budget as a cost circuit breaker. Post 11 introduced RTD as your reasoning observability layer.&lt;br&gt;
This post connects all three: context window mismanagement is the common cause that degrades DQR, elevates RTD, and burns your token budget simultaneously. Fix the memory architecture and you see improvement across all three SLIs. That's not a coincidence — they're measuring the same failure from different angles.&lt;br&gt;
The code is in agentsre/context_budget.py on GitHub. MIT licensed, zero external dependencies.&lt;br&gt;
Ajay Devineni | AWS Community Builder | Senior SRE/Platform Engineer&lt;br&gt;
github.com/Ajay150313/agentsre&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.amazonaws.com%2Fuploads%2Farticles%2Fhv6pnufmeze84rbn9kur.jpeg" 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.amazonaws.com%2Fuploads%2Farticles%2Fhv6pnufmeze84rbn9kur.jpeg" alt=" " width="427" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sre</category>
      <category>devops</category>
      <category>azure</category>
    </item>
    <item>
      <title>Your OTel Traces Are Lying to You Observability for the Reasoning Layer</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Tue, 19 May 2026 02:12:12 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/your-otel-traces-are-lying-to-you-observability-for-the-reasoning-layer-2f7p</link>
      <guid>https://forem.com/ajaydevineni/your-otel-traces-are-lying-to-you-observability-for-the-reasoning-layer-2f7p</guid>
      <description>&lt;p&gt;Three weeks ago someone on the AWS Builders Slack posted something that stopped me cold. Their production AI agent had been running for six hours. CPU normal. Memory stable. Latency within SLO. Zero error rate in CloudWatch.&lt;br&gt;
The agent was re-planning on every single task. One tool kept returning stale data. The agent recognized it, switched tools, got a different failure, re-planned again. It completed tasks — slowly, expensively, with degrading output quality. Nothing in the dashboard moved.&lt;br&gt;
This is not an edge case. This is the default failure mode of agentic AI in production, and your current observability stack cannot see it.&lt;br&gt;
Why OTel Misses the Problem&lt;br&gt;
OpenTelemetry is the best thing that's happened to observability in a decade. Traces, metrics, logs — stable across all three signal types as of the 2026 CNCF milestone. Auto-instrumentation is production-grade. The ecosystem is mature.&lt;br&gt;
And for agent reasoning behavior, it is the wrong level of abstraction.&lt;br&gt;
OTel traces infrastructure execution. A trace shows you: this request arrived, it called this service, that service called this database, the database returned in 42ms, the response went back. Perfect for distributed systems.&lt;br&gt;
An agent doesn't execute a fixed call graph. An agent reasons. It evaluates state, picks a tool, observes the result, decides whether to continue or re-plan, picks another tool. The reasoning path is dynamic. The same input can produce different call graphs on different runs depending on what the tools return.&lt;br&gt;
The key shift is that once agent reasoning is exported into your observability stack, traces stop showing infrastructure execution and start showing reasoning behavior — but only if you're emitting the right data. Kore.ai&lt;br&gt;
Most teams aren't. They're emitting infrastructure spans. The reasoning is invisible.&lt;/p&gt;

&lt;p&gt;The Pattern: Silent Degradation via Re-Planning Loops&lt;br&gt;
Here's what silent agent degradation looks like in a trace when you're not capturing reasoning:&lt;br&gt;
span: agent-task-processor  duration: 4.2s  status: OK&lt;br&gt;
  span: tool-call-cloudwatch  duration: 0.8s  status: OK&lt;br&gt;
  span: tool-call-s3           duration: 0.3s  status: OK&lt;br&gt;
  span: tool-call-cloudwatch  duration: 0.8s  status: OK&lt;br&gt;
  span: tool-call-dynamodb     duration: 0.4s  status: OK&lt;br&gt;
Looks fine. Four tool calls, all successful, task completed.&lt;br&gt;
Here's what's actually happening:&lt;br&gt;
agent receives task&lt;br&gt;
→ plans: use CloudWatch metric X&lt;br&gt;
→ calls CloudWatch: returns stale data (tool succeeds, data is wrong)&lt;br&gt;
→ agent evaluates result: doesn't match expected state&lt;br&gt;
→ RE-PLANS: try DynamoDB instead&lt;br&gt;
→ calls DynamoDB: schema mismatch (tool succeeds, data wrong format)&lt;br&gt;
→ RE-PLANS: back to CloudWatch, different metric&lt;br&gt;
→ calls CloudWatch: stale again&lt;br&gt;
→ RE-PLANS: escalate to human&lt;br&gt;
Four successful spans. Two re-planning cycles. One HER escalation. Zero errors in your monitoring.&lt;br&gt;
This is your RSI (Retry Storm Index) in action — not at the HTTP retry level, but at the reasoning level.&lt;/p&gt;

&lt;p&gt;Introducing Reasoning Trace Depth&lt;br&gt;
I want to introduce a new observable to pair with RSI: Reasoning Trace Depth (RTD).&lt;br&gt;
RTD = the number of re-planning cycles an agent goes through before either completing a task or escalating.&lt;br&gt;
Baseline for a healthy agent on routine tasks: 0–1 re-planning cycles.&lt;br&gt;
Warning threshold: 3+ re-planning cycles.&lt;br&gt;
Critical threshold: 5+ re-planning cycles (agent is effectively stuck).&lt;br&gt;
RTD is your earliest signal. It rises before HER (because the agent is still trying before escalating), before latency becomes visible to users, and before cost metrics show anomalous spend.&lt;br&gt;
pythonfrom dataclasses import dataclass, field&lt;br&gt;
from typing import List, Optional&lt;br&gt;
import time&lt;/p&gt;

&lt;p&gt;@dataclass&lt;br&gt;
class AgentDecisionTrace:&lt;br&gt;
    """&lt;br&gt;
    Structured reasoning trace for a single agent task execution.&lt;br&gt;
    Emitted once per task — NOT once per tool call.&lt;br&gt;
    This is your reasoning observability layer.&lt;br&gt;
    """&lt;br&gt;
    agent_id: str&lt;br&gt;
    session_id: str&lt;br&gt;
    task_id: str&lt;br&gt;
    timestamp: str&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Reasoning behavior
initial_plan: str
tools_called: List[str] = field(default_factory=list)
replan_count: int = 0           # RTD — Reasoning Trace Depth
replan_reasons: List[str] = field(default_factory=list)

# Outcome
task_completed: bool = False
human_escalated: bool = False   # HER signal

# Cost signals
total_tool_calls: int = 0
latency_ms: int = 0

# Quality proxy (if available)
confidence_proxy: Optional[float] = None
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;def emit_decision_trace(trace: AgentDecisionTrace) -&amp;gt; dict:&lt;br&gt;
    """&lt;br&gt;
    Emit structured decision trace to your log aggregator.&lt;br&gt;
    This sits ABOVE your OTel infrastructure spans.&lt;br&gt;
    One entry per agent task — your reasoning observability layer.&lt;br&gt;
    """&lt;br&gt;
    record = {&lt;br&gt;
        "trace_type": "agent_decision",&lt;br&gt;
        "agent_id": trace.agent_id,&lt;br&gt;
        "session_id": trace.session_id,&lt;br&gt;
        "task_id": trace.task_id,&lt;br&gt;
        "timestamp": trace.timestamp,&lt;br&gt;
        "reasoning": {&lt;br&gt;
            "initial_plan": trace.initial_plan,&lt;br&gt;
            "replan_count": trace.replan_count,        # RTD&lt;br&gt;
            "replan_reasons": trace.replan_reasons,&lt;br&gt;
            "tools_sequence": trace.tools_called&lt;br&gt;
        },&lt;br&gt;
        "outcome": {&lt;br&gt;
            "completed": trace.task_completed,&lt;br&gt;
            "human_escalated": trace.human_escalated,  # HER&lt;br&gt;
        },&lt;br&gt;
        "cost": {&lt;br&gt;
            "tool_calls_total": trace.total_tool_calls,&lt;br&gt;
            "latency_ms": trace.latency_ms&lt;br&gt;
        }&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Flag for immediate attention
if trace.replan_count &amp;gt;= 3:
    record["alert"] = "RTD_WARNING"
if trace.replan_count &amp;gt;= 5:
    record["alert"] = "RTD_CRITICAL"

return record
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The Three-Layer Observability Model for Agents&lt;br&gt;
Your current stack has two layers. You need three.&lt;br&gt;
Layer 1 — Infrastructure (you already have this)&lt;br&gt;
OTel traces, Prometheus metrics, structured logs. Tool call latency, error rates, resource utilization. This is what Datadog, Grafana, and CloudWatch show you. It's correct and necessary. It just doesn't see reasoning.&lt;br&gt;
Layer 2 — Control Plane (from Post 7 — RAR, RSI, DCS)&lt;br&gt;
Routing accuracy, retry patterns at the orchestration level, decomposition quality. This is your agent behavior at the workflow level — are tasks being routed correctly? Is the orchestrator stable?&lt;br&gt;
Layer 3 — Reasoning (what's missing)&lt;br&gt;
RTD (Reasoning Trace Depth), re-plan reasons, plan-to-execution delta, decision confidence proxies. One structured log entry per agent task. This is the layer your dashboards don't have.&lt;br&gt;
The diagnostic flow when something feels wrong but dashboards are green:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Check Layer 1: Is infrastructure healthy?&lt;br&gt;
→ Yes → move to Layer 2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check Layer 2: Is RSI elevated? Is RAR degraded?&lt;br&gt;
→ RSI elevated → move to Layer 3&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check Layer 3: Is RTD above baseline?&lt;br&gt;
→ RTD &amp;gt; 3 → agent is re-planning, find the tool/data source causing it&lt;br&gt;
→ RTD normal, HER elevated → agent is escalating cleanly, check decision envelope&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What This Looks Like in CloudWatch&lt;br&gt;
pythonimport boto3&lt;/p&gt;

&lt;p&gt;cw = boto3.client('cloudwatch', region_name='us-east-1')&lt;/p&gt;

&lt;p&gt;def publish_rtd_metric(agent_id: str, rtd_value: int) -&amp;gt; None:&lt;br&gt;
    """&lt;br&gt;
    Publish Reasoning Trace Depth to CloudWatch.&lt;br&gt;
    Alert when RTD exceeds 3 — agent is re-planning excessively.&lt;br&gt;
    """&lt;br&gt;
    cw.put_metric_data(&lt;br&gt;
        Namespace='AgentSRE/Reasoning',&lt;br&gt;
        MetricData=[{&lt;br&gt;
            'MetricName': 'ReasoningTraceDepth',&lt;br&gt;
            'Dimensions': [{'Name': 'AgentId', 'Value': agent_id}],&lt;br&gt;
            'Value': float(rtd_value),&lt;br&gt;
            'Unit': 'Count'&lt;br&gt;
        }]&lt;br&gt;
    )&lt;br&gt;
Set your alarm at RTD &amp;gt; 3 sustained over a 5-minute window. That's your early warning before HER spikes, before users feel latency, before cost anomalies appear in your billing dashboard.&lt;/p&gt;

&lt;p&gt;The Connection to Your Existing SLI Framework&lt;br&gt;
If you've been following this series:&lt;/p&gt;

&lt;p&gt;Post 4 introduced HER — your human escalation signal. HER is what happens after the agent gives up re-planning.&lt;br&gt;
Post 7 introduced RSI — your retry storm signal at the control plane level.&lt;br&gt;
This post introduces RTD — the earlier, reasoning-level signal that predicts both RSI and HER before they breach.&lt;/p&gt;

&lt;p&gt;RTD → feeds → RSI → feeds → HER&lt;br&gt;
The three form a causal chain. If you're only watching HER, you're watching the end of the chain. RTD gives you the front.&lt;/p&gt;

&lt;p&gt;The Practical Checklist&lt;br&gt;
Before your next agent ships, add to your production-readiness checklist:&lt;br&gt;
☐ Decision trace structured logging configured (one JSON entry per task, not per span)&lt;br&gt;
☐ RTD metric emitting to CloudWatch / Prometheus&lt;br&gt;
☐ RTD baseline established (30-day shadow mode — same as HER baseline protocol)&lt;br&gt;
☐ RTD alarm set at threshold &amp;gt; 3&lt;br&gt;
☐ RTD correlated to HER in your dashboards — rising RTD without rising HER means the agent is struggling but not yet escalating&lt;br&gt;
Your OTel traces are correct. They're just answering the wrong question.&lt;br&gt;
&lt;a href="https://www.linkedin.com/posts/ajay-devineni_sre-agenticai-observability-activity-7462294037518159872-iF29?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/ajay-devineni_sre-agenticai-observability-activity-7462294037518159872-iF29?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ajay Devineni | AWS Community Builder | Senior SRE/Platform Engineer | github.com/Ajay150313/agentsre&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2F2z9lhkgk1fhuawt4t8zg.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.amazonaws.com%2Fuploads%2Farticles%2F2z9lhkgk1fhuawt4t8zg.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sre</category>
      <category>devops</category>
      <category>platformeng</category>
    </item>
    <item>
      <title>The AI Agent Cost Ceiling Problem: Why Your AWS Bill Is Your Reliability Alert</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Mon, 11 May 2026 21:16:09 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/the-ai-agent-cost-ceiling-problem-why-your-aws-bill-is-your-reliability-alert-3kn5</link>
      <guid>https://forem.com/ajaydevineni/the-ai-agent-cost-ceiling-problem-why-your-aws-bill-is-your-reliability-alert-3kn5</guid>
      <description>&lt;p&gt;Production AI agents fail on tool calls 3–15% of the time. That's not a failure rate you fix — it's a reality you design around.&lt;/p&gt;

&lt;p&gt;The teams that have designed around it have circuit breakers: token budgets, retry limits, cost anomaly alerts wired to incident response.&lt;/p&gt;

&lt;p&gt;The teams that haven't find out from their AWS bill.&lt;/p&gt;

&lt;p&gt;This article is about the reliability infrastructure between those two outcomes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Retry Loop Failure Mode
&lt;/h2&gt;

&lt;p&gt;When an AI agent calls a tool and gets an ambiguous response — not an error, not a success, just something unexpected — most agents do what they're designed to do: they try again. And again. And again.&lt;/p&gt;

&lt;p&gt;Without a hard retry limit, this becomes a loop. Without a token budget cap, the loop has no ceiling. Without observability instrumentation specific to retry signatures, your standard dashboards show nothing unusual until the cost spike appears.&lt;/p&gt;

&lt;p&gt;In documented production deployments, the cost spike is the first operational signal that something has gone wrong. By that point, if the agent has write permissions and has queued remediation actions, the incident may have worsened before anyone noticed the loop.&lt;/p&gt;

&lt;p&gt;This is the reliability problem behind the cost problem. The bill is the symptom. The missing circuit breaker is the cause.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Standard SLIs Don't Catch It
&lt;/h2&gt;

&lt;p&gt;Request latency: normal. The agent is responding within SLO. Error rate: zero. Every call returns something — just not what the agent expected. Availability: 100%. The agent is up and running.&lt;/p&gt;

&lt;p&gt;The retry loop produces none of the infrastructure-layer signals your existing alerts are watching.&lt;/p&gt;

&lt;p&gt;What it does produce is a Tool Invocation Efficiency (TIE) anomaly — your agent is making 4, 6, 8 tool calls per task when its baseline is 2. That ratio climbing is your early warning. It fires before the billing cycle closes. It fires before the incident escalates.&lt;/p&gt;

&lt;p&gt;This is why TIE is a first-class SLI in the agentsre library. It catches what latency and error rate miss.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three Circuit Breakers
&lt;/h2&gt;

&lt;p&gt;Every production AI agent needs three reliability controls specifically for the retry loop failure mode:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Hard Token Budget Per Session
&lt;/h3&gt;

&lt;p&gt;Set a maximum token count per agent session. Not a soft recommendation in the system prompt — a hard limit enforced at the infrastructure layer. When the agent hits the limit, it stops executing and routes to your escalation path.&lt;/p&gt;

&lt;p&gt;The budget should be sized at 3x your P95 task token usage. A task that normally uses 2,000 tokens gets a 6,000-token ceiling. Anything above that is a signal, not normal operation.&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentsre&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentSLICollector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TaskRecord&lt;/span&gt;

&lt;span class="c1"&gt;# Track token usage as part of your task record
&lt;/span&gt;&lt;span class="n"&gt;collector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;TaskRecord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;task_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;incident-analysis&lt;/span&gt;&lt;span class="sh"&gt;"&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="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="c1"&gt;# elevated — baseline is 2.3
&lt;/span&gt;    &lt;span class="n"&gt;decision_confidence&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;completed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# TIE will catch the retry signature before the bill does
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;incident-analysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;breached&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;trigger_circuit_breaker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Retry Loop Signature in Observability
&lt;/h3&gt;

&lt;p&gt;A retry loop has a distinctive signature: tool call count per task climbing above baseline, task completion time extending beyond P99, and decision confidence declining across sequential attempts.&lt;/p&gt;

&lt;p&gt;Configure a CloudWatch alarm on TIE drift: when tool calls per task exceed 2x baseline for 10 consecutive minutes, fire an alert. This is your early warning before the cost spike and before the incident escalates.&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="c1"&gt;# CloudWatch alarm for retry loop detection
&lt;/span&gt;&lt;span class="n"&gt;aws&lt;/span&gt; &lt;span class="n"&gt;cloudwatch&lt;/span&gt; &lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;alarm&lt;/span&gt; \
  &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;alarm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AgentRetryLoopDetected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; \
  &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ToolInvocationEfficiency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; \
  &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AgentReliability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; \
  &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;statistic&lt;/span&gt; &lt;span class="n"&gt;Average&lt;/span&gt; \
  &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; \
  &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; \
  &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;comparison&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;operator&lt;/span&gt; &lt;span class="n"&gt;GreaterThanThreshold&lt;/span&gt; \
  &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;evaluation&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;periods&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; \
  &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;alarm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;actions&lt;/span&gt; &lt;span class="n"&gt;arn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;REGION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ACCOUNT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;AgentAlerts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Cost Anomaly as Incident Trigger
&lt;/h3&gt;

&lt;p&gt;Wire your AWS Cost Anomaly Detection to your incident management system. An AI agent whose cost per hour doubles is experiencing a reliability event — treat it as one.&lt;/p&gt;

&lt;p&gt;Set a cost anomaly threshold at 150% of your rolling 7-day average for the relevant Lambda functions and Bedrock invocations. When it fires, it routes to the same on-call channel as your availability alerts — because it is an availability signal.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers Behind This
&lt;/h2&gt;

&lt;p&gt;40% of agentic AI projects are expected to be cancelled by 2027. Cost overruns and inadequate risk controls rank in the top three reasons. These are not independent failure modes — they're the same failure mode at different stages of the same incident.&lt;/p&gt;

&lt;p&gt;The retry loop causes the cost overrun. The missing circuit breaker causes the retry loop. The missing circuit breaker exists because teams treat AI agent reliability as an application problem rather than an infrastructure problem requiring SRE governance.&lt;/p&gt;




&lt;h2&gt;
  
  
  What To Do Before Your Next Agent Goes Live
&lt;/h2&gt;

&lt;p&gt;Three checks before any AI agent touches production:&lt;/p&gt;

&lt;p&gt;Check 1: Does this agent have a hard token budget enforced at the infrastructure layer? Not a prompt instruction — a hard limit.&lt;/p&gt;

&lt;p&gt;Check 2: Is TIE instrumented per task class with a 2x-baseline breach alert configured?&lt;/p&gt;

&lt;p&gt;Check 3: Is cost anomaly detection wired to your incident management system for this agent's associated AWS resources?&lt;/p&gt;

&lt;p&gt;If any answer is no — the agent is not production-ready. It is demo-ready.&lt;/p&gt;

&lt;p&gt;The circuit breaker for the retry loop costs an afternoon to build. The absence of it costs the project.&lt;/p&gt;

&lt;p&gt;Open-source implementation: github.com/Ajay150313/agentsre — the agentsre library instruments TIE, DQR, HER, and AQDD out of the box with AWS CloudWatch integration.&lt;/p&gt;

&lt;p&gt;LinkedIn discussion: &lt;a href="https://www.linkedin.com/posts/ajay-devineni_sre-agenticai-reliability-ugcPost-7459711021738307584-x6cv?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/ajay-devineni_sre-agenticai-reliability-ugcPost-7459711021738307584-x6cv?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What ceiling do you have today when an agent starts looping?&lt;/p&gt;

</description>
      <category>sre</category>
      <category>agenticai</category>
      <category>reliability</category>
      <category>devops</category>
    </item>
    <item>
      <title>The Double-Exposure Problem: When AI Agents and AI-Generated Code Fail Together</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Fri, 08 May 2026 02:02:45 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/the-double-exposure-problem-when-ai-agents-and-ai-generated-code-fail-together-1amk</link>
      <guid>https://forem.com/ajaydevineni/the-double-exposure-problem-when-ai-agents-and-ai-generated-code-fail-together-1amk</guid>
      <description>&lt;p&gt;Amazon's March 2026 AI outages — two separate incidents within three days, totaling more than 6 million lost orders — have done something unusual for the SRE community: they've made a failure mode visible that most teams have been quietly carrying in their production systems without acknowledging.&lt;/p&gt;

&lt;p&gt;The incidents were traced to AI-generated code changes deployed without adequate approval gates. Amazon's response was a 90-day code safety reset across 335 critical systems, with a new requirement that AI-assisted code changes be reviewed by senior engineers before deployment.&lt;/p&gt;

&lt;p&gt;That response is SRE discipline. Applied reactively. This article is about applying it proactively — and about a compounding failure mode most teams haven't modeled yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Double-Exposure Problem
&lt;/h2&gt;

&lt;p&gt;The SRE concept of blast radius asks: when a component fails, what is the maximum scope of impact? Most blast radius models assume that the failing component is one thing — a service, a database, a network partition.&lt;/p&gt;

&lt;p&gt;In 2026 production environments, a new blast radius scenario is emerging that most models don't account for:&lt;/p&gt;

&lt;p&gt;What happens when your AI agent and the AI-generated code it runs on fail simultaneously?&lt;/p&gt;

&lt;p&gt;This is the double-exposure problem. It has three components:&lt;/p&gt;

&lt;p&gt;Exposure 1 — AI runtime behavior. Your AI agent operates non-deterministically. Its decisions, tool selections, and reasoning paths vary across invocations. Standard observability — latency, error rate, availability — does not instrument this layer. The semantic failure modes (wrong decisions, context drift, tool compensation) are invisible to your dashboards.&lt;/p&gt;

&lt;p&gt;Exposure 2 — AI-generated code changes. Your CI/CD pipeline uses AI assistance to generate infrastructure changes, configuration updates, or application code. According to Lightrun's 2026 survey of 200 senior SRE and DevOps leaders, 43% of these changes require manual debugging in production even after passing QA. Not a single survey respondent expressed "very confidence" that AI-generated code would behave correctly in production.&lt;/p&gt;

&lt;p&gt;Exposure 3 — The interaction.** When an AI-generated code change deploys to the same environment your agent is operating in, you have two non-deterministic systems interacting. The code change may alter the agent's tool environment, context window, or available action space in ways that manifest as behavioral drift — drift that your current instrumentation will miss because it's measuring infrastructure, not agent behavior.&lt;/p&gt;

&lt;p&gt;The result: a production incident that looks like agent degradation. The root cause is a code change. The RCA takes hours because the investigation starts at the wrong layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Standard Observability Misses This
&lt;/h2&gt;

&lt;p&gt;IEEE Spectrum described this failure class in their recent article on quiet AI failures: every monitoring dashboard reads healthy while users report that system decisions are becoming wrong.&lt;/p&gt;

&lt;p&gt;This is structurally identical to what happens in the double-exposure scenario. A code change that subtly alters an agent's tool environment produces no infrastructure-layer signal. The agent's HTTP responses stay at 200. Latency stays within SLO. Error budget stays unburned.&lt;/p&gt;

&lt;p&gt;What changes is the agent's Decision Quality Rate — the percentage of decisions falling within expected behavioral bounds. And Tool Invocation Efficiency — the ratio of tool calls per task completion. And eventually Human Escalation Rate — the percentage of tasks requiring intervention.&lt;/p&gt;

&lt;p&gt;None of these are instrumented in a standard observability stack. All of them detect the double-exposure failure mode before it reaches user impact.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Governance Framework
&lt;/h2&gt;

&lt;p&gt;Amazon's 90-day reset is a retroactive version of what proactive SRE governance looks like. Here are the four components that matter, drawn from first principles rather than post-incident response:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The AI Code Change Approval Gate
&lt;/h3&gt;

&lt;p&gt;Every code change touching an AI agent's runtime environment — its tools, configuration, action space, or infrastructure — should require explicit approval before deployment. Not because AI code generation is untrustworthy, but because non-deterministic code changes interacting with non-deterministic runtime systems have a compounding failure surface that standard CI/CD testing cannot fully cover.&lt;/p&gt;

&lt;p&gt;This is not a new concept. Amazon has now required it. The cost of implementing it proactively is hours. The cost of discovering it's missing is incidents.&lt;/p&gt;

&lt;p&gt;Implementation: A dedicated approval stage in your deployment pipeline for changes flagged as AI-generated or agent-environment-adjacent. This is distinct from your standard peer review — it specifically evaluates: does this change touch any agent's tool environment, context configuration, or action space?&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Behavioral Baseline Snapshots Around Code Deployments
&lt;/h3&gt;

&lt;p&gt;Apply the same framework version governance pattern to AI code changes: snapshot your agent's behavioral baselines before the change deploys, and compare post-deployment behavior against them.&lt;/p&gt;

&lt;p&gt;Specifically, capture per-task-class TIE and DQR baselines immediately before any deployment that touches your agent's environment. Run the deployment in a shadow environment for a minimum review period. If TIE drifts more than 15% or DQR drops more than 15%, flag for human review before promoting to production.&lt;/p&gt;

&lt;p&gt;This is the instrumentation that would have surfaced Amazon's failure earlier in the pipeline — not at the infrastructure layer, but at the behavioral layer where the actual impact manifested.&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentsre&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentSLICollector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TaskRecord&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentsre.sprawl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FrameworkVersionGovernance&lt;/span&gt;

&lt;span class="c1"&gt;# Capture baseline before deployment
&lt;/span&gt;&lt;span class="n"&gt;gov&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FrameworkVersionGovernance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tie_drift_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dqr_drift_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;min_shadow_samples&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;gov&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;snapshot_baseline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;task_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-task-class&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;framework_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pre-ai-code-change&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tie_values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;current_tie_samples&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dqr_values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;current_dqr_samples&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# After shadow deployment — evaluate before promoting
&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;gov&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate_upgrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;task_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-task-class&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;production_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pre-ai-code-change&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;shadow_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;post-ai-code-change&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="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;UpgradeDecision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BLOCK&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;block_deployment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;block_reason&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. A Blast Radius Model for Double-Exposure
&lt;/h3&gt;

&lt;p&gt;Most blast radius models assume one failing component. Run the double-exposure calculation explicitly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which of your production services depend on AI agents?&lt;/li&gt;
&lt;li&gt;Which code paths in those services are AI-generated?&lt;/li&gt;
&lt;li&gt;If both the agent's semantic behavior and the underlying code fail simultaneously, what is the maximum scope of user impact?&lt;/li&gt;
&lt;li&gt;What is the safe degradation sequence — which agent capabilities can you reduce autonomously, and in what order?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This calculation should exist as a named document, owned by a named person, reviewed quarterly. It is the blast radius equivalent of a fire drill — done in advance so the answer is known before the incident.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. A Proactive Runbook — Not Amazon's Retroactive Reset
&lt;/h3&gt;

&lt;p&gt;Amazon's 90-day reset is a retroactive runbook. Write yours proactively. A minimum viable AI code reliability runbook covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detection: Which metrics signal that an AI code change has degraded agent behavior? (Answer: TIE drift, DQR drop, HER increase — not latency or error rate)&lt;/li&gt;
&lt;li&gt;Attribution: How do you determine whether the degradation is agent behavior, code change, or model drift? (Answer: compare against behavioral baseline snapshots captured pre-deployment)&lt;/li&gt;
&lt;li&gt;Containment: What is the fastest path to reverting the code change while maintaining partial agent operation? (Answer: the progressive autonomy constraint ladder — not a binary kill switch)&lt;/li&gt;
&lt;li&gt;Recovery criteria: When is it safe to redeploy? (Answer: shadow behavioral baselines within ±15% of production baseline for 30 consecutive minutes)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The SRE Perspective on AI Code Generation
&lt;/h2&gt;

&lt;p&gt;The Lightrun finding that 88% of SRE leaders need two to three redeploy cycles to verify an AI-generated fix suggests something straightforward: the testing and verification frameworks for AI-generated code have not kept pace with the adoption of AI code generation.&lt;/p&gt;

&lt;p&gt;This is the same lag that produced Amazon's incidents. And it's the same lag that the SRE community has closed before — with microservices, with Kubernetes, with cloud-native architectures. Each time, capability arrived before governance. The SRE discipline developed the governance.&lt;/p&gt;

&lt;p&gt;The governance for AI-generated code in agent environments exists. Error budgets, blast radius models, approval gates, behavioral baseline comparison — these are standard SRE tools. They need to be applied to a new layer of the stack.&lt;/p&gt;

&lt;p&gt;The open-source implementation is at github.com/Ajay150313/agentsre. The FrameworkVersionGovernance module handles behavioral baseline capture and comparison. The progressive constraint ladder handles safe degradation. Both work for AI code change governance as directly as they do for framework upgrades.&lt;/p&gt;

&lt;p&gt;Amazon spent 6.3 million lost orders learning this lesson. Most teams can learn it for the cost of an afternoon.&lt;/p&gt;




&lt;h2&gt;
  
  
  What To Do This Week
&lt;/h2&gt;

&lt;p&gt;If you're running AI agents in production and using AI-assisted code generation in the same environment:&lt;/p&gt;

&lt;p&gt;Today: Identify which code changes in your last 30 days touched your agent's tool environment, configuration, or action space. Determine whether any were AI-generated. If yes — were they reviewed specifically for agent-environment impact?&lt;/p&gt;

&lt;p&gt;This week: Add an AI code change flag to your deployment pipeline. Start capturing TIE and DQR baselines around any deployment flagged as agent-environment-adjacent.&lt;/p&gt;

&lt;p&gt;This month: Run the double-exposure blast radius calculation. Document the result. Assign an owner. Review it with your team.&lt;/p&gt;

&lt;p&gt;The Amazon incidents happened in March. The Lightrun survey data was collected in January. IEEE Spectrum is calling quiet failure one of the defining challenges of the year.&lt;/p&gt;

&lt;p&gt;The signal is clear. The governance frameworks exist.&lt;/p&gt;




&lt;p&gt;Open-source implementation: github.com/Ajay150313/agentsre&lt;br&gt;
LinkedIn discussion: &lt;a href="https://www.linkedin.com/posts/ajay-devineni_sre-agenticai-reliability-activity-7458330530212835328-36__?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/ajay-devineni_sre-agenticai-reliability-activity-7458330530212835328-36__?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What does your current approval gate for AI-generated code look like? Or is this the first time you've run the double-exposure calculation?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sre</category>
      <category>devops</category>
      <category>aws</category>
    </item>
    <item>
      <title>The Agent Control Plane is an SRE Problem: Governing the Orchestration Layer Nobody is Watching</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Mon, 04 May 2026 23:57:35 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/the-agent-control-plane-is-an-sre-problem-governing-the-orchestration-layer-nobody-is-watching-4i72</link>
      <guid>https://forem.com/ajaydevineni/the-agent-control-plane-is-an-sre-problem-governing-the-orchestration-layer-nobody-is-watching-4i72</guid>
      <description>&lt;p&gt;IBM's Distinguished Engineer Chris Hay declared this week that "agent control planes and multi-agent dashboards become real in 2026." Gartner projects that 40% of enterprise applications will use task-specific AI agents by 2026. The orchestration infrastructure to manage all of those agents — the control plane — is becoming the most critical and least governed layer in production AI.&lt;/p&gt;

&lt;p&gt;This article applies SRE discipline to the agent control plane: what it is, what failure modes it introduces, and what instrumentation it requires before it goes to production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is an Agent Control Plane?
&lt;/h2&gt;

&lt;p&gt;In 2026, an agent control plane is the orchestration layer that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receives tasks from humans or upstream systems&lt;/li&gt;
&lt;li&gt;Decomposes them into subtasks&lt;/li&gt;
&lt;li&gt;Routes subtasks to specialist agents&lt;/li&gt;
&lt;li&gt;Manages retry, rescheduling, and priority queues across the agent fleet&lt;/li&gt;
&lt;li&gt;Makes autonomous decisions about resource allocation when demand spikes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control plane is distinct from the agents it manages. It is infrastructure — the same way a Kubernetes control plane is distinct from the pods it schedules.&lt;/p&gt;

&lt;p&gt;This distinction matters for reliability: when the control plane degrades, it does not degrade one agent. It degrades the entire fleet simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Control Plane Failure Taxonomy
&lt;/h2&gt;

&lt;p&gt;Control plane failures are uniquely difficult to detect because they do not look like single-agent failures. They look like correlated degradation across multiple agents — which standard observability interprets as coincidence or noise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Failure Class 1: Routing Drift
&lt;/h3&gt;

&lt;p&gt;The control plane misassigns tasks to suboptimal agents — sending high-complexity reasoning tasks to agents specialized for retrieval, or routing compliance-sensitive tasks through agents without the required tool access. Each individual agent appears healthy. The control plane's routing logic is the failure.&lt;/p&gt;

&lt;p&gt;Observable signal: fleet-wide DQR drops across unrelated task classes simultaneously.&lt;/p&gt;

&lt;h3&gt;
  
  
  Failure Class 2: Retry Storms
&lt;/h3&gt;

&lt;p&gt;When multiple downstream agents fail simultaneously, the control plane retries across its full routing table. Each retry generates additional tool calls. If the control plane does not implement backoff and circuit breaking at the routing layer, a partial agent outage generates a retry storm that saturates the entire MCP tool layer.&lt;/p&gt;

&lt;p&gt;Observable signal: fleet-wide TIE spike not attributable to any single agent or task class.&lt;/p&gt;

&lt;h3&gt;
  
  
  Failure Class 3: Priority Queue Starvation
&lt;/h3&gt;

&lt;p&gt;Under load, control planes must prioritize. If the priority algorithm fails — or if it was never set — low-priority tasks consume resources that high-priority tasks need. Users of business-critical workflows experience silent slowdown while batch jobs consume capacity.&lt;/p&gt;

&lt;p&gt;Observable signal: AQDD breaches across multiple task classes with no corresponding error rate increase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Failure Class 4: Decomposition Accuracy Degradation
&lt;/h3&gt;

&lt;p&gt;As task complexity increases, the control plane's decomposition logic produces subtask sets that are incomplete, redundant, or contradictory. Individual agents execute their subtasks correctly. The composed result is wrong because the decomposition was wrong.&lt;/p&gt;

&lt;p&gt;Observable signal: HER climbs fleet-wide — humans are intervening not because agents failed, but because the task decomposition produced nonsensical results.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three SLIs Your Control Plane Needs
&lt;/h2&gt;

&lt;p&gt;I extend the agentsre SLI framework with three control plane-specific measurements:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Routing Accuracy Rate (RAR)
&lt;/h3&gt;

&lt;p&gt;The percentage of task assignments that match the optimal agent for the task class, measured against a labeled evaluation set.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RAR(t, w) = (correct_assignments / total_assignments) × 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Baseline during a 30-day calibration window. Alert when RAR drops &amp;gt;15% from baseline — this is the signal that routing logic has drifted, usually because a new task class was added without updating routing rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Retry Storm Index (RSI)
&lt;/h3&gt;

&lt;p&gt;The ratio of retry-generated tool calls to primary-invocation tool calls across the fleet in a rolling window.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RSI(t, w) = retry_tool_calls / primary_tool_calls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Normal RSI baseline is typically 0.05–0.15 (5–15% of tool calls are retries). RSI &amp;gt; 0.50 indicates retry storm conditions. RSI &amp;gt; 1.0 means more retry traffic than primary traffic — the control plane is in a positive feedback loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Decomposition Completeness Score (DCS)
&lt;/h3&gt;

&lt;p&gt;The percentage of decomposed subtask sets that, when executed, produce outputs covering all requirements of the original task.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DCS requires a completeness validator per task class.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is the hardest to instrument — it requires semantic understanding of task requirements. Start with a rule-based validator for your highest-volume task classes before attempting ML-based validation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Control Plane Governance Model
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Separate SLO Ownership
&lt;/h3&gt;

&lt;p&gt;The control plane is not owned by the same person who owns the agents. It is a separate system with a separate error budget. The control plane SLO owner:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is paged when RAR drops &amp;gt;15% from baseline&lt;/li&gt;
&lt;li&gt;Is paged when RSI exceeds 0.50 for 10+ minutes&lt;/li&gt;
&lt;li&gt;Owns the retry storm runbook&lt;/li&gt;
&lt;li&gt;Reviews control plane decomposition logic on every new task class addition&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Retry Storm Runbook (minimum viable version)
&lt;/h3&gt;

&lt;p&gt;Every production control plane needs this runbook before launch:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Detection&lt;/strong&gt;: RSI &amp;gt; 0.50 sustained 10 minutes → page control plane owner&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immediate action&lt;/strong&gt;: Reduce control plane retry limit from default (3) to 1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit breaking&lt;/strong&gt;: Identify failing agents via fleet-wide TIE spike attribution. Apply circuit breaker (open at 85% semantic validation rate)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovery&lt;/strong&gt;: Restore retry limit only after RSI returns to &amp;lt; 0.20 for 15 consecutive minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postmortem trigger&lt;/strong&gt;: Any RSI &amp;gt; 1.0 event requires a postmortem within 48 hours&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Control Plane Version Governance
&lt;/h3&gt;

&lt;p&gt;Apply the same framework upgrade governance to control plane versions as to agent framework versions: snapshot RAR, RSI, and DCS baselines before any control plane update. Run shadow traffic. Block promotion if any metric drifts beyond threshold.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation on AWS
&lt;/h2&gt;

&lt;p&gt;The three control plane SLIs instrument naturally on Bedrock's orchestration layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RAR&lt;/strong&gt;: Evaluate routing decisions by comparing &lt;code&gt;agentId&lt;/code&gt; in Bedrock orchestration traces against a task-class-to-optimal-agent mapping in DynamoDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RSI&lt;/strong&gt;: Count &lt;code&gt;RETRY&lt;/code&gt; events vs &lt;code&gt;INVOKE&lt;/code&gt; events in Bedrock CloudWatch logs, published as a ratio metric per 5-minute window&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DCS&lt;/strong&gt;: Lambda validator comparing subtask outputs against original task requirements, triggered by task completion events via EventBridge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full implementation is in the agentsre library: &lt;a href="https://github.com/Ajay150313/agentsre" rel="noopener noreferrer"&gt;https://github.com/Ajay150313/agentsre&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting the Arc
&lt;/h2&gt;

&lt;p&gt;This is the fifth layer of the AI-SRE reliability framework:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Single-agent SLIs (DQR, TIE, HER, AQDD)&lt;/li&gt;
&lt;li&gt;A2A semantic boundary validation + circuit breaker&lt;/li&gt;
&lt;li&gt;Agent Sprawl governance (fleet inventory, framework canary, deprecation alerting)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Control Plane SLIs (RAR, RSI, DCS) — this article&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each layer adds governance to the next abstraction level of the same infrastructure problem: autonomous AI operating in production without adequate reliability discipline.&lt;/p&gt;

&lt;p&gt;LinkedIn discussion: &lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Feko995q2bjjulk4yb93z.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.amazonaws.com%2Fuploads%2Farticles%2Feko995q2bjjulk4yb93z.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;a href="https://www.linkedin.com/posts/ajay-devineni_agenticai-sre-controlplane-share-7457213748500475904-yi9g?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/ajay-devineni_agenticai-sre-controlplane-share-7457213748500475904-yi9g?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's the biggest control plane reliability gap in your environment?&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>agentaichallenge</category>
      <category>python</category>
    </item>
    <item>
      <title>Agent Sprawl is Your Next Production Incident: An SRE Response to Datadog's State of AI Engineering 2026</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Fri, 01 May 2026 01:20:45 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/agent-sprawl-is-your-next-production-incident-an-sre-response-to-datadogs-state-of-ai-engineering-3k83</link>
      <guid>https://forem.com/ajaydevineni/agent-sprawl-is-your-next-production-incident-an-sre-response-to-datadogs-state-of-ai-engineering-3k83</guid>
      <description>&lt;p&gt;Datadog published the State of AI Engineering 2026 report this week — real telemetry from over a thousand production environments. Read it. It is the most comprehensive look at AI in production available right now.&lt;/p&gt;

&lt;p&gt;I want to respond from the reliability engineering perspective, because the data reveals a problem the report names but doesn't fully resolve: agent sprawl is now a production reliability crisis, and the SRE discipline does not yet have governance frameworks for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Data Shows
&lt;/h2&gt;

&lt;p&gt;Three findings stand out from an SRE perspective:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Framework adoption doubled year over year.&lt;/strong&gt; LangChain, LangGraph, Pydantic AI, Vercel AI SDK — up from 9% of organizations in early 2025 to nearly 18% by 2026. Services using agentic frameworks: more than doubled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;70%+ of organizations run three or more models.&lt;/strong&gt; The share running more than six models nearly doubled. Teams are building model portfolios rather than committing to a single provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams add models faster than they retire them.&lt;/strong&gt; Datadog calls this "LLM tech debt." Each overlapping model introduces its own quality, latency, and cost profile. The report is explicit: this becomes a governance problem.&lt;/p&gt;

&lt;p&gt;These three findings combine to describe an environment growing faster than it can be governed. I call this &lt;strong&gt;Agent Sprawl&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Defining Agent Sprawl
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agent Sprawl&lt;/strong&gt; — the condition where AI agent infrastructure complexity (frameworks, models, tool layers, orchestration patterns) grows faster than your ability to measure and govern its reliability.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is structurally identical to the microservices sprawl problem SRE teams faced between 2015 and 2020. Teams added services faster than they added SLOs. The result: production incidents nobody could attribute because the dependency graph was too complex to observe.&lt;/p&gt;

&lt;p&gt;Agent Sprawl has three specific manifestations:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Framework-Invisible Call Complexity
&lt;/h3&gt;

&lt;p&gt;When you add LangChain, LangGraph, or any orchestration framework, it adds steps and paths you did not write — retry logic, fallback handlers, context window management, tool routing. All of this happens between your application code and your observability layer.&lt;/p&gt;

&lt;p&gt;Your SLIs measure at the application boundary. Framework-added calls are invisible.&lt;/p&gt;

&lt;p&gt;This means your Tool Invocation Efficiency (TIE) baseline — tool calls per task completion — is measuring a mix of your agent's behavior and your framework's behavior. When you upgrade the framework, both change simultaneously. You cannot separate them.&lt;/p&gt;

&lt;p&gt;In practice, across regulated production environments I've studied: TIE baselines can drift 30–40% after a framework major version upgrade with no corresponding change in the agent's task logic. The baseline shift looks like agent degradation. It's actually framework overhead. Teams spend hours on a false RCA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Instrument at the framework output layer, not the application layer. Capture tool invocations after framework processing. Then freeze your TIE baseline before any upgrade and compare shadow traffic before promoting.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Multi-Model SLO Orphaning
&lt;/h3&gt;

&lt;p&gt;70% of organizations running 3+ models means 70% have at least two additional SLO ownership gaps they haven't acknowledged.&lt;/p&gt;

&lt;p&gt;SLOs are set once — typically when the first model is deployed. As models 2, 3, 4, 5, 6 are added for specific task classes, latency profiles, or cost tiers, nobody revisits the SLO ownership model. Models run in production with no named owner, no baseline, no error budget.&lt;/p&gt;

&lt;p&gt;When model 3 degrades, there is no owner to page, no baseline to compare against, no runbook to execute. The degradation surfaces as a customer complaint, not an alert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Treat every model in your fleet like a microservice. Each model gets: a named owner (not a team — a person), a task-class-specific SLO, and a 30-day observation baseline before the SLO is enforced.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. LLM Tech Debt as a Reliability Liability
&lt;/h3&gt;

&lt;p&gt;Deprecated models running in agent chains create silent compatibility risks. When a provider announces deprecation, teams with models buried inside multi-step chains often miss the migration window. The model ages. Safety training falls behind. Decision Quality Rate declines slowly — too slowly to trigger a threshold alert — until accumulated drift surfaces as a production incident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Treat model deprecation notices the same way you treat dependency CVEs. Automate alerts at 60, 30, and 7 days before end-of-life. Build the migration ticket at announcement time, not at expiry.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Governance Framework Agent Sprawl Needs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Agent Fleet Inventory
&lt;/h3&gt;

&lt;p&gt;Before you can govern sprawl, you need to know what you're governing. Maintain a living inventory with, for each component: framework and version, model(s) used, task classes handled, named SLO owner, current TIE/DQR baselines, and deprecation dates.&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentsre.sprawl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentFleetInventory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FleetComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ComponentType&lt;/span&gt;

&lt;span class="n"&gt;inventory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentFleetInventory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FleetComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;component_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic.claude-sonnet-4-6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;component_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ComponentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payment-processor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;task_classes&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;payment-routing&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;fraud-detection&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;slo_owner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;owner@team.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                    &lt;span class="c1"&gt;# named human — not a team
&lt;/span&gt;    &lt;span class="n"&gt;baseline_established_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-04-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;deprecation_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2027-06-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;last_slo_review&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-04-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;current_tie_baseline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;current_dqr_baseline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;91.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quarterly_review_report&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&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;Fleet governance score: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fleet_governance_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/100&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;h3&gt;
  
  
  Framework Version Governance — Canary Before Promotion
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentsre.sprawl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FrameworkVersionGovernance&lt;/span&gt;

&lt;span class="n"&gt;gov&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FrameworkVersionGovernance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tie_drift_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# block if TIE drifts &amp;gt;15%
&lt;/span&gt;    &lt;span class="n"&gt;dqr_drift_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# block if DQR drops &amp;gt;15%
&lt;/span&gt;    &lt;span class="n"&gt;min_shadow_samples&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Before upgrade: snapshot production baseline
&lt;/span&gt;&lt;span class="n"&gt;gov&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;snapshot_baseline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payment-processor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;task_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payment-routing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;framework_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;langchain-0.2.x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tie_values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;production_tie_samples&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dqr_values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;production_dqr_samples&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# After 48hrs shadow traffic:
&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;gov&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate_upgrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payment-processor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;task_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payment-routing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;production_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;langchain-0.2.x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;shadow_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;langchain-0.3.x&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="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;UpgradeDecision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BLOCK&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;rollback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c1"&gt;# framework added hidden overhead — don't promote
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Quarterly Multi-Model SLO Review
&lt;/h3&gt;

&lt;p&gt;The review should take 30–60 minutes per quarter. For every model in fleet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify named owner exists&lt;/li&gt;
&lt;li&gt;Verify baseline is current (&amp;lt; 90 days old)&lt;/li&gt;
&lt;li&gt;Check deprecation schedule against provider announcements&lt;/li&gt;
&lt;li&gt;Review TIE per-model — models with rising TIE relative to task class baseline are drifting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Models scoring below 70 on the governance health score are flagged as governance debt requiring a 30-day remediation window.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Datadog Report's Implicit Challenge
&lt;/h2&gt;

&lt;p&gt;The State of AI Engineering 2026 describes an industry in rapid expansion. What it does not fully resolve is the SRE question: who governs all of this, and what does that look like in practice?&lt;/p&gt;

&lt;p&gt;The SRE community has solved exactly this class of problem before — in distributed systems, in microservices, in cloud infrastructure. The discipline already exists. It needs to be applied to the AI agent layer now, before agent sprawl becomes agent chaos.&lt;/p&gt;

&lt;p&gt;The Datadog data tells us the window is closing. Framework adoption doubles in a year. Multi-model fleets become the norm. Model debt accumulates.&lt;/p&gt;

&lt;p&gt;Build the governance layer before the production incidents start.&lt;/p&gt;




&lt;p&gt;Open-source implementation: [&lt;a href="https://github.com/Ajay150313/agentsre" rel="noopener noreferrer"&gt;https://github.com/Ajay150313/agentsre&lt;/a&gt;]&lt;br&gt;
LinkedIn discussion: [&lt;a href="https://www.linkedin.com/posts/ajay-devineni_agenticai-sre-reliability-ugcPost-7455786901673902080-BCRM?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/ajay-devineni_agenticai-sre-reliability-ugcPost-7455786901673902080-BCRM?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;What's your biggest agent sprawl challenge right now?&lt;/p&gt;

</description>
      <category>sre</category>
      <category>agentaichallenge</category>
      <category>devops</category>
      <category>cloudnative</category>
    </item>
    <item>
      <title>RAG vs MCP is the wrong debate — here's the right framing for production AI systems</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Tue, 28 Apr 2026 21:13:56 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/rag-vs-mcp-is-the-wrong-debate-heres-the-right-framing-for-production-ai-systems-2pef</link>
      <guid>https://forem.com/ajaydevineni/rag-vs-mcp-is-the-wrong-debate-heres-the-right-framing-for-production-ai-systems-2pef</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2F3z8jlzwkemk5haluapjb.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.amazonaws.com%2Fuploads%2Farticles%2F3z8jlzwkemk5haluapjb.png" alt=" "&gt;&lt;/a&gt;&lt;br&gt;
The question I keep seeing in every AI engineering forum right now:&lt;/p&gt;

&lt;p&gt;"Should we use RAG or MCP?"&lt;/p&gt;

&lt;p&gt;It's the wrong question. And the fact that it's being asked at all tells me the field hasn't yet settled on a shared mental model for agentic AI architecture.&lt;/p&gt;

&lt;p&gt;Here's the framing I use — and why getting this wrong has real production consequences.&lt;/p&gt;
&lt;h2&gt;
  
  
  RAG and MCP operate at different layers
&lt;/h2&gt;

&lt;p&gt;RAG (Retrieval-Augmented Generation) and MCP (Model Context Protocol) are not alternatives. They are not competitors. They solve fundamentally different problems in an agentic system.&lt;/p&gt;

&lt;p&gt;Think of it this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG answers: what does the agent know?&lt;/li&gt;
&lt;li&gt;MCP answers: what can the agent do?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One is a knowledge pattern. The other is an execution protocol. Comparing them is a category error — like asking whether you should use a database or an API. The answer is almost always: both, at the right layer.&lt;/p&gt;
&lt;h2&gt;
  
  
  What RAG actually is (and isn't)
&lt;/h2&gt;

&lt;p&gt;RAG is a memory pattern. Before the model reasons, you fill its context window with relevant information retrieved from an external store — documents, knowledge bases, runbooks, historical data.&lt;/p&gt;

&lt;p&gt;RAG is appropriate when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent needs domain knowledge that isn't in its training data&lt;/li&gt;
&lt;li&gt;The information is relatively stable (changes on the order of days or weeks, not seconds)&lt;/li&gt;
&lt;li&gt;The query is about "what do we know" not "what is happening right now"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RAG is not appropriate when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent needs to know the current state of a live system&lt;/li&gt;
&lt;li&gt;The information changes faster than your retrieval pipeline can refresh&lt;/li&gt;
&lt;li&gt;The agent needs to take an action, not just retrieve information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This last point is where teams get into trouble. Embedding stale infrastructure docs into a RAG pipeline and treating them as a substitute for live system data is one of the most common architecture mistakes I see in agentic AI deployments.&lt;/p&gt;
&lt;h2&gt;
  
  
  What MCP actually is (and isn't)
&lt;/h2&gt;

&lt;p&gt;MCP is an execution protocol. It gives agents the ability to invoke tools, call external APIs, read live system state, and take actions in the world — all in a standardized, auditable way.&lt;/p&gt;

&lt;p&gt;MCP is appropriate when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent needs to act, not just reason&lt;/li&gt;
&lt;li&gt;The information required is live — current system state, real-time data, dynamic context&lt;/li&gt;
&lt;li&gt;You need auditability of what the agent did and why (decision lineage)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MCP is not appropriate as a substitute for knowledge retrieval. Routing every context-building query through a live MCP tool call introduces unnecessary latency, increases blast radius surface area, and creates tool dependency chains that are hard to reason about under failure.&lt;/p&gt;
&lt;h2&gt;
  
  
  The production architecture that actually works
&lt;/h2&gt;

&lt;p&gt;RAG and MCP compose. They don't compete. Here is the pattern I recommend for agentic systems that need both knowledge and action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User goal / trigger
       |
       v
RAG retrieval layer
  - Fetch relevant runbook sections
  - Fetch historical incident context
  - Fetch policy and compliance docs
       |
       v
Agent reasoning
  - Synthesize retrieved context
  - Classify decision (blast radius tier)
  - Determine required action
       |
       v
MCP execution layer
  - Invoke appropriate tool
  - Apply validation gates (LOW / HIGH / CRITICAL)
  - Emit decision lineage trace
  - Execute or route for human review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The boundary between RAG and MCP is the boundary between knowing and doing. Design it intentionally.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SRE reliability implications
&lt;/h2&gt;

&lt;p&gt;From a reliability engineering perspective, conflating RAG and MCP creates two distinct failure modes:&lt;/p&gt;

&lt;p&gt;Failure mode 1: using RAG where MCP belongs&lt;br&gt;
The agent makes decisions based on stale retrieved data about a live system. The information looked correct at retrieval time. By execution time, the system state has changed. The agent acts on a false picture of reality.&lt;/p&gt;

&lt;p&gt;This is particularly dangerous in infrastructure automation, where a runbook that was accurate six months ago may describe a system that no longer exists in that form.&lt;/p&gt;

&lt;p&gt;Failure mode 2: using MCP where RAG belongs&lt;br&gt;
Every knowledge query goes through a live tool call. Latency climbs. Tool dependencies multiply. Each MCP call is a potential blast radius event. The agent becomes slow, brittle, and expensive to operate — not because it's doing more, but because it's routing the wrong workload through the wrong layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SLO implications
&lt;/h2&gt;

&lt;p&gt;If you've read my previous posts on agentic SLO design, this connects directly. Your SLOs need to be aware of which layer a failure occurred in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A RAG retrieval failure (stale data, embedding drift, retrieval miss) has different blast radius than an MCP execution failure (wrong tool invoked, action taken on bad context).&lt;/li&gt;
&lt;li&gt;Human Escalation Rate (HER) needs to be segmented by failure layer. Rising HER from RAG staleness looks different from rising HER from MCP tool errors — and the runbook responses are completely different.&lt;/li&gt;
&lt;li&gt;Decision lineage traces should capture which documents were retrieved via RAG and which tool calls were made via MCP, so post-mortems can identify which layer caused a bad decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The decision framework
&lt;/h2&gt;

&lt;p&gt;Before your team debates RAG vs MCP, answer these questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the agent retrieving knowledge or taking action? Knowledge → RAG. Action → MCP.&lt;/li&gt;
&lt;li&gt;How fast does the information change? Stable → RAG. Live → MCP.&lt;/li&gt;
&lt;li&gt;What is the blast radius if this goes wrong? High blast radius operations belong behind MCP validation gates regardless of how the context was retrieved.&lt;/li&gt;
&lt;li&gt;Do you need an audit trail? MCP gives you decision lineage natively. RAG retrieval should be logged separately and linked to the agent's reasoning trace.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Closing thought
&lt;/h2&gt;

&lt;p&gt;The RAG vs MCP debate is a sign that the field is still building its shared vocabulary for agentic AI architecture. That's fine — this is early. But the teams shipping production agents today can't wait for consensus.&lt;/p&gt;

&lt;p&gt;Design the boundary between knowing and doing intentionally. SLO it separately. Trace both layers in your observability stack.&lt;/p&gt;

&lt;p&gt;The question isn't which one to use. It's whether you've thought carefully about where each one belongs.&lt;/p&gt;

&lt;p&gt;This post is part of an ongoing series on AI-SRE: applying production reliability engineering principles to agentic AI systems.&lt;/p&gt;

&lt;p&gt;Previous posts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SLO design for agentic AI systems — beyond uptime metrics&lt;/li&gt;
&lt;li&gt;MCP decision-lineage observability in production&lt;/li&gt;
&lt;li&gt;Human Escalation Rate (HER) as a reliability signal for agentic systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/posts/ajay-devineni_sre-agenticai-rag-share-7454971617409150976--nbK?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/ajay-devineni_sre-agenticai-rag-share-7454971617409150976--nbK?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sre</category>
      <category>rag</category>
      <category>mcp</category>
      <category>aiops</category>
    </item>
    <item>
      <title>A2A + MCP in Production: The SRE Reliability Framework Nobody Has Written Yet</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Thu, 23 Apr 2026 18:51:21 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/a2a-mcp-in-production-the-sre-reliability-framework-nobody-has-written-yet-2hf2</link>
      <guid>https://forem.com/ajaydevineni/a2a-mcp-in-production-the-sre-reliability-framework-nobody-has-written-yet-2hf2</guid>
      <description>&lt;p&gt;Google A2A Protocol turned one year old on April 9, 2026. Over 150 organizations are running it in production. It is live inside Amazon Bedrock AgentCore and Azure AI Foundry. IBM's competing Agent Communication Protocol merged into A2A rather than fight it. The Linux Foundation now governs the spec.&lt;/p&gt;

&lt;p&gt;The protocol is production-grade. The reliability engineering discipline for it is not.&lt;/p&gt;

&lt;p&gt;I have spent the past year building SRE frameworks for single-agent + MCP deployments in regulated financial services environments. When A2A entered the picture, I realized the failure surface I had been managing had changed completely. This article documents the new failure modes A2A introduces and the SRE patterns I believe are required to manage them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Two-Layer Stack and Why It Changes Everything
&lt;/h2&gt;

&lt;p&gt;MCP and A2A solve different problems at different layers of the agent stack. This is well understood by now. What is not yet well understood is what the two-layer combination means for reliability engineering.&lt;/p&gt;

&lt;p&gt;MCP (Model Context Protocol)** — the vertical layer. An agent connects to tools and data sources. The failure modes are familiar to any distributed systems engineer: tool unavailability, degraded response quality, latency spikes, authentication failures. The blast radius is bounded. One agent, one tool layer, one error budget.&lt;/p&gt;

&lt;p&gt;A2A (Agent-to-Agent Protocol)** — the horizontal layer. Agents communicate with other agents across organizational and platform boundaries. An orchestrator agent delegates subtasks to specialist agents via JSON-RPC over HTTP. Those specialist agents may be built by different teams, running on different vendors, governed by different SLOs.&lt;/p&gt;

&lt;p&gt;The reliability engineering challenge A2A creates is not technical — the protocol itself is well-designed. It is organizational and observational. When an orchestrator agent delegates to a sub-agent via A2A, and that sub-agent fails silently, who carries the error budget? How do you instrument the boundary? What does safe degradation look like when an entire reasoning capability disappears because a downstream agent is unavailable?&lt;/p&gt;

&lt;p&gt;These questions have no consensus answers yet. This article is my attempt to start building them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The A2A Failure Mode Taxonomy
&lt;/h2&gt;

&lt;p&gt;After studying multi-agent failure patterns across production deployments, I categorize A2A-specific failures into four classes. The first two are detectable with existing tooling. The last two are not.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class 1: Sub-Agent Unavailability
&lt;/h3&gt;

&lt;p&gt;The downstream agent returns a 503 or connection timeout. This is the easiest failure to handle — it looks like a standard HTTP failure and can be caught by existing circuit breaker patterns. Your orchestrator agent should treat sub-agent unavailability exactly as it treats MCP tool unavailability: fall back to a degraded capability or route to a human escalation path.&lt;/p&gt;

&lt;p&gt;Instrumentation: standard HTTP error rate monitoring at the A2A client layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class 2: Sub-Agent Latency Degradation
&lt;/h3&gt;

&lt;p&gt;The downstream agent responds, but slowly. In a multi-agent chain (Agent A → Agent B → Agent C), latency compounds. A 2-second degradation at Agent C becomes a 6-second degradation at Agent A's response time. Users experience this as the orchestrator being slow — but the problem is buried three hops down the chain.&lt;/p&gt;

&lt;p&gt;Instrumentation: distributed tracing across A2A boundaries. Each A2A task invocation should carry a trace ID propagated from the orchestrator. Without this, your latency SLI for the orchestrator tells you nothing useful about where the latency is originating.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class 3: Silent Task Result Corruption — ⚠️ Not detectable with standard tooling
&lt;/h3&gt;

&lt;p&gt;The downstream agent returns HTTP 200 with a syntactically valid A2A task result, but the result is semantically wrong — incomplete reasoning, missing context fields, hallucinated data treated as factual output. The orchestrator agent receives this as a successful response and incorporates it into its own output.&lt;/p&gt;

&lt;p&gt;Your error rate SLI stays at zero. Your latency SLI stays normal. Your user receives incorrect output from a system that reported 100% success.&lt;/p&gt;

&lt;p&gt;This is the failure mode that existing observability stacks cannot detect. It requires what I call an A2A Semantic Boundary Validator — a lightweight evaluation function that runs at the A2A client layer on every incoming task result, checking the result against expected behavioral bounds for that sub-agent's task class.&lt;/p&gt;

&lt;p&gt;The implementation pattern mirrors my Decision Quality Rate (DQR) SLI for single-agent systems: maintain a behavioral baseline per sub-agent per task class, and flag results that fall outside expected bounds as potential corruptions before they propagate upstream.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class 4: Cascading Autonomy Amplification — ⚠️ The most dangerous failure mode
&lt;/h3&gt;

&lt;p&gt;Agent A delegates to Agent B. Agent B, uncertain about the task, makes additional autonomous decisions to resolve the ambiguity — invoking more MCP tools than its baseline, delegating further to Agent C, modifying its task interpretation. Agent C does the same.&lt;/p&gt;

&lt;p&gt;By the time a result returns to Agent A, the original task intent has been substantially transformed by a chain of autonomous interpretations — none of which were visible to the orchestrator, none of which crossed any error threshold, and none of which can be reconstructed without end-to-end decision lineage capture.&lt;/p&gt;

&lt;p&gt;This failure mode is unique to multi-agent systems. Single-agent + MCP deployments cannot produce it. It requires agents talking to agents, each adding their own layer of autonomous interpretation to a task that was never explicitly respecified.&lt;/p&gt;




&lt;h2&gt;
  
  
  The SRE Framework for A2A: Five Additions to Your Existing Stack
&lt;/h2&gt;

&lt;p&gt;If you have followed my previous work on SLOs for agentic AI, you already have Decision Quality Rate, Tool Invocation Efficiency, and Human Escalation Rate instrumented for your single-agent deployments. A2A requires five additional capabilities on top of that foundation.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. A2A Boundary Tracing
&lt;/h3&gt;

&lt;p&gt;Every A2A task delegation must carry a distributed trace ID originating from the orchestrator. This is not optional — without it, you cannot attribute latency, errors, or behavioral drift to the correct agent in a multi-agent chain.&lt;/p&gt;

&lt;p&gt;Implementation: Propagate a &lt;code&gt;x-trace-id&lt;/code&gt; header on every A2A HTTP request. Store the full delegation tree (which agent delegated to which, with what task parameters, at what timestamp) in your centralized trace store. On AWS, I use X-Ray for the distributed trace and a DynamoDB table for the delegation tree — X-Ray captures the HTTP-level trace, DynamoDB captures the semantic-level task delegation structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Per-Sub-Agent SLO Ownership
&lt;/h3&gt;

&lt;p&gt;Every A2A sub-agent your orchestrator calls must have a designated SLO owner — a named human or team who is paged when that sub-agent's reliability degrades. In practice, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For internal sub-agents: assign SLO ownership the same way you assign ownership to microservices&lt;/li&gt;
&lt;li&gt;For external/third-party sub-agents: define a sub-agent reliability budget. If a third-party A2A agent degrades, your orchestrator should treat it as a dependency failure and activate your degraded-mode runbook — not wait for the vendor to page you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The org chart question — who owns the SLO when agents from different vendors collaborate via A2A — is the most important unresolved governance question in multi-agent reliability today.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A2A Semantic Boundary Validation
&lt;/h3&gt;

&lt;p&gt;For each sub-agent your orchestrator calls, define the expected output schema and behavioral bounds. Implement a validator function that runs on every incoming A2A task result before the orchestrator acts on it.&lt;/p&gt;

&lt;p&gt;Minimum validation layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schema validation: does the result match the expected A2A task result structure?&lt;/li&gt;
&lt;li&gt;Completeness check: are required fields populated?&lt;/li&gt;
&lt;li&gt;Behavioral bound check: does the result fall within the baseline distribution for this sub-agent's task class?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Results that fail validation should not be silently dropped — they should trigger your escalation path and log the full task context for postmortem analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The Agent Chain Circuit Breaker
&lt;/h3&gt;

&lt;p&gt;In traditional microservices, a circuit breaker opens when downstream failure rate exceeds a threshold, preventing cascade failures. Multi-agent systems need an equivalent pattern, adapted for the non-deterministic nature of agent communication.&lt;/p&gt;

&lt;p&gt;My implementation: an agent chain circuit breaker that tracks the running success rate of each A2A sub-agent invocation over a 15-minute rolling window. When the validated success rate drops below 85% (accounting for semantic validation failures, not just HTTP errors), the circuit opens and the orchestrator routes that task class to a degraded-mode handler — typically a simplified version of the task that can be completed with MCP tools the orchestrator controls directly, or an immediate human escalation.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. End-to-End Decision Lineage for Multi-Agent Chains
&lt;/h3&gt;

&lt;p&gt;In single-agent systems, decision lineage is the record of what tools an agent invoked and what reasoning it applied. In A2A multi-agent systems, decision lineage must span the entire delegation chain — capturing not just what the orchestrator decided, but what each sub-agent decided on its behalf.&lt;/p&gt;

&lt;p&gt;This is the audit trail that satisfies SOC 2 Type II requirements for autonomous decision-making in regulated environments. Without it, you cannot demonstrate to auditors that you have oversight of decisions made by agents you deployed but didn't directly control.&lt;/p&gt;

&lt;p&gt;Implementation: each A2A task result must include a &lt;code&gt;decision_lineage&lt;/code&gt; field containing the sub-agent's tool invocations, reasoning path, and confidence metadata. The orchestrator appends this to its own decision lineage before logging the full chain to the immutable audit store.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Organizational Question A2A Forces
&lt;/h2&gt;

&lt;p&gt;Every SRE framework I've described above requires answers to an organizational question the industry hasn't resolved:&lt;/p&gt;

&lt;p&gt;When an orchestrator agent delegates to a third-party sub-agent via A2A, and the sub-agent produces output that causes downstream harm — who is operationally responsible?&lt;/p&gt;

&lt;p&gt;This is not a legal question (yet). It is an operational ownership question that every multi-agent team will face in 2026.&lt;/p&gt;

&lt;p&gt;My position: the orchestrator owner carries responsibility for validating and acting on sub-agent output. The A2A protocol handles communication. It does not handle accountability. An orchestrator that blindly trusts A2A task results without semantic validation is the operational equivalent of a service that makes no network calls — in other words, it doesn't exist in any production-grade form.&lt;/p&gt;

&lt;p&gt;Build the semantic boundary validation. Own the chain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where to Start
&lt;/h2&gt;

&lt;p&gt;If you are moving from single-agent + MCP to multi-agent + A2A, I recommend this progression:&lt;/p&gt;

&lt;p&gt;Week 1: Implement A2A boundary tracing with distributed trace ID propagation. You cannot debug what you cannot trace.&lt;/p&gt;

&lt;p&gt;Week 2: Assign explicit SLO ownership to every A2A sub-agent your orchestrator calls. Even a spreadsheet with named owners is better than none.&lt;/p&gt;

&lt;p&gt;Week 3-4: Build the semantic boundary validator for your highest-volume A2A task class. Start with schema and completeness validation before attempting behavioral bound checks.&lt;/p&gt;

&lt;p&gt;Month 2: Instrument the agent chain circuit breaker. Set your initial threshold conservatively (85% validated success rate) and adjust based on 30 days of baseline data.&lt;/p&gt;

&lt;p&gt;Month 3+: Build end-to-end decision lineage capture. This is the hardest piece and the most important for regulated environments.&lt;/p&gt;




&lt;p&gt;Connecting the Arc&lt;/p&gt;

&lt;p&gt;This article is part of a series on applying SRE discipline to agentic AI in production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ajaydevineni/why-sre-principles-are-the-missing-layer-in-mcp-security-2fo8"&gt;Why SRE Principles Are the Missing Layer in MCP Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SLOs for Agentic AI: The Reliability Framework Production Teams Are Missing (published this week)&lt;/li&gt;
&lt;li&gt;A2A + MCP in Production: The SRE Reliability Framework Nobody Has Written Yet (this article)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I shared the core argument on LinkedIn: &lt;a href="https://www.linkedin.com/posts/ajay-devineni_agenticai-a2a-mcp-share-7453145380822605824-pMta?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/ajay-devineni_agenticai-a2a-mcp-share-7453145380822605824-pMta?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The SRE community spent a decade learning to run distributed microservices reliably. We're at day one for multi-agent systems with A2A. The failure modes are different. The organizational questions are harder. The instrumentation doesn't exist yet.&lt;/p&gt;

&lt;p&gt;Build it now — before your agent chains are running at a scale where these gaps become production incidents.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>agentaichallenge</category>
      <category>cloudnative</category>
      <category>a2a</category>
    </item>
    <item>
      <title>SLO Design for Agentic AI Systems — Why Traditional Reliability Metrics Break (and What to Use Instead)</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Tue, 21 Apr 2026 18:05:55 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/slo-design-for-agentic-ai-systems-why-traditional-reliability-metrics-break-and-what-to-use-3581</link>
      <guid>https://forem.com/ajaydevineni/slo-design-for-agentic-ai-systems-why-traditional-reliability-metrics-break-and-what-to-use-3581</guid>
      <description>&lt;h2&gt;
  
  
  The problem with applying traditional SLOs to AI agents
&lt;/h2&gt;

&lt;p&gt;SLOs work beautifully when "good" is observable.&lt;/p&gt;

&lt;p&gt;An API either returns &lt;code&gt;200&lt;/code&gt; or it doesn't. Latency is measurable. Availability is binary. You instrument, you baseline, you commit to a number, and you burn down an error budget when reality diverges.&lt;/p&gt;

&lt;p&gt;AI agents break every one of these assumptions.&lt;/p&gt;

&lt;p&gt;After a quarter of running agentic systems against production infrastructure, here are the three failure modes I keep running into when teams apply traditional SLO thinking to agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure mode 1: Correctness is not observable at the response layer
&lt;/h2&gt;

&lt;p&gt;A REST service fails loudly. A &lt;code&gt;500&lt;/code&gt;, a timeout, a malformed payload — your existing observability catches it.&lt;/p&gt;

&lt;p&gt;An agent can produce a response that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parses correctly&lt;/li&gt;
&lt;li&gt;Passes schema validation&lt;/li&gt;
&lt;li&gt;Triggers no alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...and still be wrong in a way that compounds silently for hours.&lt;/p&gt;

&lt;p&gt;Traditional error rate SLOs have zero visibility into this. Your dashboards stay green. The blast radius is growing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do instead:&lt;/strong&gt; Add a &lt;em&gt;behavioral correctness&lt;/em&gt; signal. For every agent decision class, define a human-reviewable sample rate and track the delta between agent judgment and human override. That delta is data. It belongs in your SLO.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure mode 2: Latency SLOs punish safe agent behavior
&lt;/h2&gt;

&lt;p&gt;A p99 latency SLO makes perfect sense for a stateless service.&lt;/p&gt;

&lt;p&gt;It is actively dangerous for an agent.&lt;/p&gt;

&lt;p&gt;Agents that pause to verify context, escalate ambiguous decisions to a human, or refuse to act on a poisoned tool output are doing exactly what you want them to do. A latency SLO penalizes them for it.&lt;/p&gt;

&lt;p&gt;If you optimize against a latency target, you are implicitly optimizing for speed over safety. In agentic systems, that's how you get silent degradation and runbook violations at 2am.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do instead:&lt;/strong&gt; Track &lt;em&gt;decision latency distribution&lt;/em&gt; separately from &lt;em&gt;response latency&lt;/em&gt;. Escalation paths should be excluded from latency SLO calculations or governed by a separate, explicitly higher target.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure mode 3: You cannot commit to a number you haven't earned
&lt;/h2&gt;

&lt;p&gt;This one keeps coming up in conversations with other SRE leads.&lt;/p&gt;

&lt;p&gt;Teams instrument an agent, run it for a week, and immediately try to commit to a 99.5% reliability target. Then they burn their error budget in the first real incident because the baseline was built on demo traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule I enforce on my team:&lt;/strong&gt; Minimum 30-day behavioral baseline before any agentic SLO is ratified. No exceptions. The baseline must cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool failure scenarios&lt;/li&gt;
&lt;li&gt;Context window edge cases&lt;/li&gt;
&lt;li&gt;At least one simulated prompt drift event&lt;/li&gt;
&lt;li&gt;Real production traffic, not synthetic load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You cannot reliability-engineer what you have not yet measured.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an agentic SLO actually looks like
&lt;/h2&gt;

&lt;p&gt;After iterating on this for a quarter, I'm building agentic SLOs around three signal types that traditional SLOs don't capture:&lt;/p&gt;

&lt;h3&gt;
  
  
  Signal 1: Human Escalation Rate (HER)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HER = (decisions requiring human override) / (total agent decisions) × 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is your canary metric. Rising HER is often the first observable signal of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model drift&lt;/li&gt;
&lt;li&gt;Context degradation&lt;/li&gt;
&lt;li&gt;Prompt decay&lt;/li&gt;
&lt;li&gt;Tool output poisoning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set a threshold. Wire it to your on-call rotation. Page on it.&lt;/p&gt;

&lt;p&gt;My current target: &lt;strong&gt;HER ≤ 8% over any 24-hour rolling window&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Signal 2: Decision confidence distribution
&lt;/h3&gt;

&lt;p&gt;Don't track a single average confidence score. Track the &lt;em&gt;distribution&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When an agent is operating normally, confidence tends to be bimodal — high confidence on routine decisions, lower on edge cases. When the distribution collapses from bimodal to flat, something has shifted in the agent's environment.&lt;/p&gt;

&lt;p&gt;That shift may not produce errors yet. But it will.&lt;/p&gt;

&lt;p&gt;My current target: &lt;strong&gt;Decision confidence p10 ≥ 0.65&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Signal 3: Blast radius exposure rate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BRER = (HIGH + CRITICAL tier changes per hour)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can have a green error rate and a dangerous blast radius exposure rate at the same time.&lt;/p&gt;

&lt;p&gt;This metric captures &lt;em&gt;risk velocity&lt;/em&gt; — how fast your agent is accumulating unreversed high-impact changes. It belongs in your SLO alongside uptime.&lt;/p&gt;

&lt;p&gt;My current target: &lt;strong&gt;CRITICAL tier changes ≤ 2/hour without explicit approval gate&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The SLO I'm piloting
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;agent_slo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;baseline_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30d&lt;/span&gt;
  &lt;span class="na"&gt;signals&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;human_escalation_rate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;≤&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;8%"&lt;/span&gt;
      &lt;span class="na"&gt;window&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;24h&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rolling"&lt;/span&gt;
      &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;page_on_call&lt;/span&gt;
    &lt;span class="na"&gt;decision_confidence_p10&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;≥&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0.65"&lt;/span&gt;
      &lt;span class="na"&gt;window&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1h&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rolling"&lt;/span&gt;
      &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;warn&lt;/span&gt;
    &lt;span class="na"&gt;critical_blast_radius_rate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;≤&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2/hour"&lt;/span&gt;
      &lt;span class="na"&gt;gate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;explicit_approval_required&lt;/span&gt;
  &lt;span class="na"&gt;error_budget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;calculated_from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;HER&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;confidence_p10&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;blast_radius_rate&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;not_from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;uptime&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;latency&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;review_cadence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;weekly_baseline_review&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The mindset shift
&lt;/h2&gt;

&lt;p&gt;Traditional SLO: &lt;em&gt;Is the system up?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agentic SLO: &lt;em&gt;Is the system trustworthy?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These are not the same question. Uptime is necessary but not sufficient. An agent can be 100% available and producing wrong decisions at scale.&lt;/p&gt;

&lt;p&gt;The SRE community has the tooling, the culture, and the postmortem discipline to solve this. But we have to resist the temptation to copy-paste our existing SLO playbook onto a fundamentally different kind of system.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;In the next post in this series, I'll walk through how I'm wiring these signals into OpenTelemetry alongside the decision-lineage layer from my previous MCP observability write-up — so a single trace can answer both "what happened" and "why the agent decided to do it."&lt;/p&gt;

&lt;p&gt;If you're running agentic AI against production infrastructure and have built your own reliability signals, I'd genuinely like to hear what you're measuring. Drop it in the comments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is part of an ongoing series on AI-SRE: applying production reliability engineering principles to agentic AI systems in regulated cloud-native environments.&lt;/em&gt;&lt;br&gt;
Linkedin url &lt;a href="https://www.linkedin.com/posts/ajay-devineni_sre-agenticai-reliability-ugcPost-7452416001553567744-BPgq?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/ajay-devineni_sre-agenticai-reliability-ugcPost-7452416001553567744-BPgq?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACIp55QBRGVmAcEbf0D-1PaR5vEbm2yMcJU&lt;/a&gt; &lt;/p&gt;

</description>
      <category>sre</category>
      <category>devplusplus</category>
      <category>devops</category>
      <category>agentaichallenge</category>
    </item>
    <item>
      <title>Your AI Agent Doesn't Have a Feature Problem. It Has an On-Call Rotation Problem. published: true</title>
      <dc:creator>Ajay Devineni</dc:creator>
      <pubDate>Thu, 16 Apr 2026 16:06:25 +0000</pubDate>
      <link>https://forem.com/ajaydevineni/your-ai-agent-doesnt-have-a-feature-problem-it-has-an-on-call-rotation-problempublished-true-22kg</link>
      <guid>https://forem.com/ajaydevineni/your-ai-agent-doesnt-have-a-feature-problem-it-has-an-on-call-rotation-problempublished-true-22kg</guid>
      <description>&lt;p&gt;Applying SRE principles to AI agents in production — ownership, observability, SLOs, runbooks, and the kill switch pattern.&lt;br&gt;
I've spent a year closely studying how AI agents fail in the wild — across incidents, postmortems, and real operational patterns — and what I keep noticing is a gap nobody talks about. Teams celebrate capability. Nobody builds operational readiness.&lt;br&gt;
Here's what that gap costs, and how to close it.&lt;/p&gt;

&lt;p&gt;The Gap: AI Agents Are Treated Like Features, Not Services&lt;br&gt;
In traditional SRE, every production service has:&lt;/p&gt;

&lt;p&gt;✅ A named owner who carries the pager&lt;br&gt;
✅ A defined SLO&lt;br&gt;
✅ An on-call rotation&lt;br&gt;
✅ A runbook&lt;br&gt;
✅ A postmortem process&lt;/p&gt;

&lt;p&gt;Most AI agents have a demo video and a Slack channel.&lt;br&gt;
This is a category error. An agent is not a feature. It is an autonomous decision-making service operating at the speed of your automation. When it fails, it doesn't fail quietly like a broken button. It fails at the rate of your automation — and often with external side effects: emails sent, APIs called, records written.&lt;/p&gt;

&lt;p&gt;The Failure Nobody Talks About&lt;br&gt;
The failure everyone prepares for is the hard failure: an exception thrown, a timeout, a 500 error. These are easy to catch. CloudWatch alarm, SNS notification, done.&lt;br&gt;
The failure nobody prepares for is the silent degradation.&lt;/p&gt;

&lt;p&gt;The agent completes tasks. Dashboards stay green. But for the last 6 hours, its reasoning has been subtly wrong — selecting the wrong tools, misinterpreting scope, producing outputs that look correct and aren't.&lt;/p&gt;

&lt;p&gt;This is the worst case. Not failure. Plausible, undetected, incorrect action at scale.&lt;br&gt;
Traditional observability doesn't catch this. You need a new layer.&lt;/p&gt;

&lt;p&gt;Introducing HER: Human Escalation Rate&lt;br&gt;
The most useful signal I've seen for agent health is one most teams don't track:&lt;br&gt;
HER = (decisions requiring human override / total decisions) × 100&lt;br&gt;
HER is to AI agents what error rate is to APIs. It tells you whether the agent's judgment is holding up.&lt;br&gt;
Here's a simple implementation:&lt;br&gt;
pythondef publish_her_metric(agent_id: str, human_overrides: int, total_decisions: int):&lt;br&gt;
    her = (human_overrides / total_decisions) * 100 if total_decisions &amp;gt; 0 else 0&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Push to your metrics store
metrics.gauge(
    "agent.human_escalation_rate",
    her,
    tags=[f"agent_id:{agent_id}"]
)

# Alert if above threshold
if her &amp;gt; THRESHOLD:
    alert_oncall_owner(agent_id, her)

return her
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;When HER exceeds your threshold, a named human gets paged. Not a team. Not a Slack channel. A person.&lt;/p&gt;

&lt;p&gt;Three Requirements Before Any Agent Goes to Production&lt;br&gt;
Based on everything I've observed and learned, here's what I consider non-negotiable.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A Named Human Owner Who Gets Paged
The ownership model matters more than the tooling.
Every agent must have a named individual who is accountable when HER exceeds threshold. Shared ownership is no ownership. "The AI team owns it" means nobody owns it.
Write it down:
yamlagent:
name: document-processor-v2
owner: &lt;a href="mailto:ajay.devineni@company.com"&gt;ajay.devineni@company.com&lt;/a&gt;
pager: +1-xxx-xxx-xxxx
slack_handle: "&lt;a class="mentioned-user" href="https://dev.to/ajay"&gt;@ajay&lt;/a&gt;"
escalation_policy: p1-sre-rotation&lt;/li&gt;
&lt;li&gt;A Runbook That Covers At Least Four Failure Modes
Before any agent ships, a runbook must exist. Minimum coverage:
Failure ModeWhat to look forImmediate actionTool failureTool error rate spikesCheck dependency health, assess in-flight tasksContext degradationOutput length increases, HER spikesInspect conversation history, rollback promptPrompt driftBehavioral baseline deviationFreeze deploys, compare prompt versionsBlast radius eventAgent operating outside defined scopeInvoke kill switch, audit side effects
A runbook doesn't need to be 20 pages. It needs to be right and reachable at 2am.&lt;/li&gt;
&lt;li&gt;A 30-Day Behavioral Baseline Before Any SLO Is Set
This is the one most teams skip because it feels slow.
You cannot commit to reliability you have not measured.
Run your agent in shadow mode for 30 days — processing real inputs, generating real outputs, but reviewed before action. During that window, measure everything:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Task completion rate&lt;br&gt;
Human escalation rate (baseline HER)&lt;br&gt;
Tool call accuracy&lt;br&gt;
Decision latency (p50/p95/p99)&lt;br&gt;
Context window utilization&lt;br&gt;
Output quality score variance across identical inputs&lt;/p&gt;

&lt;p&gt;Only after 30 days do you write an SLO. The baseline IS the SLO foundation.&lt;br&gt;
yaml# Example SLO written after baseline&lt;br&gt;
agent_slo:&lt;br&gt;
  valid_from: "after-30d-baseline"&lt;br&gt;
  objectives:&lt;br&gt;
    - metric: task_completion_rate&lt;br&gt;
      target: 99.2%&lt;br&gt;
      baseline_observed: 99.6%   # headroom built in intentionally&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- metric: human_escalation_rate
  target: "&amp;lt; 3%"
  baseline_observed: 1.8%
  alert_threshold: 5%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The Kill Switch Pattern&lt;br&gt;
Every production agent needs a kill switch — a mechanism to halt execution immediately, without a code deployment.&lt;br&gt;
pythondef check_kill_switch(agent_id: str) -&amp;gt; bool:&lt;br&gt;
    """&lt;br&gt;
    Checks a config store for kill switch status.&lt;br&gt;
    Works with SSM Parameter Store, LaunchDarkly, &lt;br&gt;
    or any feature flag system.&lt;br&gt;
    """&lt;br&gt;
    status = config_store.get(f"agents/{agent_id}/kill-switch")&lt;br&gt;
    return status == "ACTIVE"&lt;/p&gt;

&lt;p&gt;def agent_task_loop(agent_id: str, tasks: list):&lt;br&gt;
    for task in tasks:&lt;br&gt;
        # Check before EVERY decision, not just at startup&lt;br&gt;
        if check_kill_switch(agent_id):&lt;br&gt;
            log_halt(agent_id, task)&lt;br&gt;
            raise AgentHaltException("Kill switch active")&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    execute(task)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The kill switch should be:&lt;/p&gt;

&lt;p&gt;Flipable without a deployment (config store, not code)&lt;br&gt;
Checked before every decision, not just at startup&lt;br&gt;
Audited — log every check and every activation&lt;/p&gt;

&lt;p&gt;What the Observability Stack Actually Looks Like&lt;br&gt;
Agent Runtime&lt;br&gt;
    │&lt;br&gt;
    ├──▶ Structured logs (JSON, one entry per decision)&lt;br&gt;
    │       └── Fields: session_id, tool_calls, human_override, confidence, latency&lt;br&gt;
    │&lt;br&gt;
    ├──▶ Custom metrics&lt;br&gt;
    │       └── HER, tool error rate, context utilization, decision latency&lt;br&gt;
    │&lt;br&gt;
    ├──▶ Distributed traces&lt;br&gt;
    │       └── End-to-end: input → LLM → tool calls → output&lt;br&gt;
    │&lt;br&gt;
    ├──▶ Event stream (one event per agent decision)&lt;br&gt;
    │       └── Powers alerting rules and downstream audit&lt;br&gt;
    │&lt;br&gt;
    └──▶ Decision audit log (immutable)&lt;br&gt;
            └── S3 / blob store, retained for postmortem analysis&lt;br&gt;
Every agent decision should emit a structured log entry:&lt;br&gt;
json{&lt;br&gt;
  "timestamp": "2025-01-15T14:23:01Z",&lt;br&gt;
  "agent_id": "doc-processor-v2",&lt;br&gt;
  "session_id": "sess_abc123",&lt;br&gt;
  "tools_called": ["search", "summarize"],&lt;br&gt;
  "tool_success": [true, true],&lt;br&gt;
  "human_override": false,&lt;br&gt;
  "context_utilization_pct": 47.1,&lt;br&gt;
  "latency_ms": 3420,&lt;br&gt;
  "task_completed": true&lt;br&gt;
}&lt;br&gt;
This is your audit trail. This is what you bring to a postmortem.&lt;/p&gt;

&lt;p&gt;The Postmortem Question Nobody Asks&lt;br&gt;
After an incident with a traditional service, postmortems ask:&lt;/p&gt;

&lt;p&gt;What failed?&lt;br&gt;
Why did it fail?&lt;br&gt;
How do we prevent recurrence?&lt;/p&gt;

&lt;p&gt;For AI agents, there's a fourth question that almost nobody asks:&lt;br&gt;
Was there a window where the agent was wrong, and we didn't know?&lt;br&gt;
Silent degradation periods are invisible in traditional postmortems because the dashboards were green. Adding a behavioral baseline comparison to every postmortem template forces this question into the open.&lt;/p&gt;

&lt;p&gt;Is Your Agent Production-Ready or Demo-Ready?&lt;br&gt;
The SRE community spent 20 years learning how to operate distributed systems reliably. Those lessons — ownership, observability, SLOs, runbooks, postmortems — weren't invented in conference rooms. They were earned through outages.&lt;br&gt;
AI agents are distributed systems with an additional dimension of unpredictability: they make decisions.&lt;br&gt;
Before your next agent ships, run this checklist:&lt;/p&gt;

&lt;p&gt;Named human owner with pager assigned&lt;br&gt;
 Runbook covering tool failure, context degradation, prompt drift, blast radius&lt;br&gt;
 HER metric instrumented and alerting&lt;br&gt;
 Kill switch implemented and tested&lt;br&gt;
 30-day shadow mode baseline completed&lt;br&gt;
 SLO written and derived from baseline data&lt;br&gt;
 Postmortem template updated to include behavioral baseline comparison&lt;/p&gt;

&lt;p&gt;If any box is unchecked, your agent is demo-ready. Not production-ready.&lt;br&gt;
Author: Ajay Devineni | Connect on &lt;a href="https://www.linkedin.com/in/ajay-devineni/" rel="noopener noreferrer"&gt;LinkedIn &lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sre</category>
      <category>devops</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
