DEV Community

Cover image for Uptime Is Not an Agent SLO
Raju Dandigam
Raju Dandigam

Posted on

Uptime Is Not an Agent SLO

An agent endpoint returns HTTP 200 in 99.95% of requests. The service is “up.”

Meanwhile, some successful responses skip retrieval, some tool calls exceed their budget, and a few write actions occur without the expected approval. Availability is healthy while the product is not.

Traditional service-level indicators still matter. Agent systems add another layer: the path and outcome can fail without the request handler failing.

Start from the user-facing promise

Google's SRE guidance defines an SLO as a target value or range for a measured service level. That target should describe what users need, not whatever metric is easiest to collect.

For an agent, “successful request” is too ambiguous. Split the promise into distinct indicator families.

1. Outcome

Did the workflow produce the intended externally observable result?

task-success rate = eligible tasks with verified outcome
                    ------------------------------------
                    eligible tasks with known outcome
Enter fullscreen mode Exit fullscreen mode

The denominator matters. Exclude cancelled requests or unsupported tasks according to a documented policy—not after seeing the result.

Track the unknown-outcome rate separately. Otherwise, dropping difficult-to-observe cases from the denominator can make task success look healthier than it is.

2. Safety and policy

Did protected actions satisfy the required control?

authorized-action rate = protected actions with valid approval
                         --------------------------------------
                         all protected action attempts
Enter fullscreen mode Exit fullscreen mode

Also track forbidden actions separately. A near-perfect aggregate can hide one severe event.

3. Efficiency

Did the useful result arrive within a bounded resource envelope?

Possible indicators include task latency, model calls per task, total tokens, tool retries, and cost per verified outcome. Do not optimize a lower token count if it reduces task success.

4. Autonomy quality

Did the agent resolve work without unnecessary escalation or excessive intervention?

An escalation is not automatically a failure. For ambiguous or high-risk tasks, asking a human may be the correct behavior. Define appropriate escalation rather than maximizing autonomy blindly.

Use a scorecard, not one blended number

A single “agent reliability score” hides tradeoffs. Keep separate objectives:

Objective Example SLI Why separate?
Availability valid responses / requests Infrastructure health
Task outcome verified successes / eligible tasks Product usefulness
Safety controlled actions / protected attempts Risk boundary
Latency tasks below threshold / tasks User experience
Efficiency cost or calls per outcome Resource control
Escalation appropriate escalations / eligible cases Autonomy policy

Targets should come from product risk, user expectations, and observed baselines. Numbers copied from another system are not SLOs; they are decoration.

Do not average safety into availability. A dashboard that blends nine healthy indicators with one unauthorized action can still look green. Keep severe policy violations as explicit release or incident conditions, even when the corresponding rate rounds to 99.99%.

Some outcomes arrive after the trace ends

A notification agent may finish when it enqueues a message. Delivery happens later. A click, booking, dismissal, or expiry may happen hours after that.

Keep runtime completion and business outcome as separate records joined by a stable decision ID:

type AgentDecision = {
  decisionId: string;
  completedAt: string;
  action: "send_notification";
  policyResult: "allowed" | "blocked";
};

type DecisionOutcome = {
  decisionId: string;
  observedAt: string;
  windowHours: number;
  result: "delivered" | "clicked" | "dismissed" | "expired";
};
Enter fullscreen mode Exit fullscreen mode

Do not label “ignored” at send time. It becomes observable only after a defined window.

Instrument at decision boundaries

Useful measurements usually come from a few stable events:

  • request accepted;
  • policy evaluated;
  • tool proposed and executed;
  • response completed;
  • external effect confirmed;
  • later outcome observed.

Record bounded facts and stable reason codes. Keep prompts, retrieved documents, user IDs, and other high-cardinality or sensitive values out of metric labels. Detailed evidence belongs in protected traces or logs.

Turn violations into engineering work

An SLO is useful only when it changes decisions. For each objective, specify:

  1. the numerator and denominator;
  2. the observation window;
  3. exclusions and unknown outcomes;
  4. the owner;
  5. the response when the budget is exhausted.

A safety objective may stop a release immediately. A latency budget may trigger performance work. A rising escalation rate may send new failures into the evaluation set.

Define relationships between budgets before an incident. If task success falls because the agent correctly abstains more often, that is a product-coverage problem—not permission to weaken the safety gate. If latency rises because every action waits on a slow policy service, the response is to improve or redesign that dependency, not bypass it.

This is also why uptime remains necessary but insufficient. It tells you whether the service answered. Agent SLOs tell you whether the system completed the right work, within the right boundaries, at an acceptable cost.

References

Top comments (6)

Collapse
 
max_quimby profile image
Max Quimby •

The "200 while the product is not up" framing is exactly right, and the authorized-action-rate SLI is the one I'd push people to instrument first. A write that happens without the expected approval is a silent severity-1 that your availability dashboard will happily paint green forever. Tracking forbidden actions separately from the aggregate is the key detail — a 99.9% authorized rate can still hide the one unapproved write that actually matters, and averages are exactly the wrong tool for a metric where the tail is the whole story.

The unknown-outcome rate deserves a bright light too. It's tempting to quietly drop hard-to-verify tasks from the denominator, and then task-success looks great precisely because you stopped measuring the cases you couldn't confirm. We treat rising unknown-outcome as its own alert — it usually means observability regressed, not that the agent got better.

One thing I'd add to the scorecard: cost-per-verified-outcome as a first-class SLI rather than a raw token count. Optimizing tokens in isolation quietly trades away task success, which you already flag — pinning it to verified outcomes keeps that honest. Do you set an explicit budget on that, or watch it as a trend?

Collapse
 
raju_dandigam profile image
Raju Dandigam •

@max_quimby I'd use both: a hard per-run cap to bound runaway spend, and a rolling cost-per-verified-outcome budget by workflow. Unknown outcomes and their incurred spend should stay visible while awaiting reconciliation, otherwise “cheap” can just mean unverified. Lower cost also shouldn't buy permission to weaken safety or task-success gates. Do you segment that budget by task complexity as well as workflow?

Collapse
 
deanlee profile image
Dean Lee •

The section on late-arriving outcomes hits the central problem with agent accounting. Treating runtime completion as task success is the software equivalent of booking mark-to-market profit at trade execution while ignoring the settlement window.

If an agent triggers an external action that takes forty-eight hours to resolve, the system is holding open risk across that entire interval. The true operational cost of an autonomous workflow is not the token invoice at runtime, but the capital required to cover the unobserved tail risk until the real-world state actually settles. Separating execution from verification makes that lag visible instead of hiding it inside a green availability dashboard.

Collapse
 
raju_dandigam profile image
Raju Dandigam •

@deanlee The settlement-window analogy captures why runtime completion is the wrong point to close the record. I'd keep a pending-verification state with an owner, observation deadline, and bounded exposure until the external postcondition is confirmed. Tracking the age of those pending decisions alongside their count would make a growing verification backlog visible even while availability stays green.

Collapse
 
brianainews profile image
Brian · AI News •

Separating outcome, safety, and efficiency makes this scorecard actionable. The unknown outcome rate is the metric I would put beside every agent dashboard.

Collapse
 
raju_dandigam profile image
Raju Dandigam •

@brianainews Agreed—and I'd put the age of pending outcomes beside the unknown-outcome rate. A normal delivery delay and a broken verification path can produce the same count, but very different age distributions. Keeping both visible helps distinguish expected lag from an observability regression without quietly removing those tasks from the denominator.