Reliability Engineering · Steps 27–28Chapter 27 of 45

How Reliable Does an Agent Need to Be? Define SLOs and Error Budgets

Page content

An agent platform can be observable.

It can have replay.

It can have provenance.

It can have incident forensics.

It can have canaries, rollback, circuit breakers, quotas, and distributed coordination.

And the team can still have no disciplined answer to a very basic production question:

How reliable does this agent actually need to be?

Without an answer, every failure feels equally urgent.

Every improvement request competes with every reliability fix.

One team member wants better planning.

Another wants a stronger model.

Another wants more search.

Another wants to fix a verifier false positive.

Another wants to reduce cost.

Another wants to cut p95 latency.

All of them may be right.

But unless the platform has explicit reliability targets, prioritization becomes taste.

That is where Service Level Objectives become useful.

For ordinary services, an SLO might say:

  • 99.9% availability,
  • p95 latency below 300 ms,
  • fewer than 0.1% failed requests.

For agents, availability alone is not enough.

An agent can return HTTP 200 and still be wrong.

It can complete quickly and still use stale evidence.

It can return a plausible answer that the verifier incorrectly accepts.

It can refuse too often.

It can spend ten times the expected budget while still technically succeeding.

Agent reliability therefore needs a richer definition.

The central rule for this post is:

Define reliability around externally verified outcomes, not whether the orchestration completed without throwing an exception.

That gives us a foundation for everything else.


The Search Problem: “AI Agent SLOs and Reliability Metrics”

A naive reliability dashboard for an agent often looks like this:

requests completed: 99.7%
API availability:   99.95%
median latency:     8.2 s
error rate:         0.3%

That can look excellent.

But imagine the real outcomes are:

verified correct:     86%
false success:          4%
UNKNOWN:                7%
hard failure:           3%

The system is operationally healthy and behaviorally weak.

That is why agent SLOs need to begin with outcome semantics.

A useful top-level outcome model is:

PASS
FAIL
UNKNOWN

where:

  • PASS means the acceptance criteria were externally verified,
  • FAIL means the task was attempted but did not satisfy the acceptance criteria,
  • UNKNOWN means the system could not establish enough evidence to safely claim PASS or FAIL.

This is already more useful than a single “success rate.”


1. Start With User-Visible Reliability

The first SLO should describe what the user actually experiences.

Not:

router accuracy >= 94%

Not:

critic agreement >= 90%

Not:

tool success >= 99%

Those may be useful internal metrics.

But they are not the user-facing outcome.

A coding agent might have a top-level SLO such as:

For repository repair tasks in the supported task class:

verified_success_rate >= 95%
false_success_rate    <= 0.5%
p95_latency           <= 180 seconds
p95_cost              <= $1.20

A research agent might instead define:

citation_supported_answer_rate >= 97%
unsupported_claim_rate         <= 0.25%
UNKNOWN_rate                   <= 8%
p95_latency                    <= 90 seconds

A browser agent performing side effects may need a much stricter false-success target:

verified_transaction_success >= 99.5%
duplicate_side_effect_rate   <= 0.01%
ambiguous_completion_rate    <= 0.2%

The correct SLO depends on the task contract.

There is no universal number.


2. False Success Deserves Its Own Budget

This is one of the most important differences between agent reliability and ordinary request reliability.

A normal failed request is usually visible.

A false success is dangerous because the system claims success when the task is actually wrong.

That means:

false_success

should not be hidden inside generic failure rate.

Suppose two systems both have 94% verified success.

System A:

PASS      94%
FAIL       5%
UNKNOWN    1%
false PASS 0.1%

System B:

PASS      94%
FAIL       1%
UNKNOWN    1%
false PASS 4%

Those are not remotely equivalent.

System B is much more dangerous.

The reliability policy should therefore define a separate ceiling:

false_success_rate <= tolerance

For high-risk side effects, that tolerance may need to be extremely small.


3. UNKNOWN Is Not Automatically Failure

One of the easiest mistakes is to punish UNKNOWN exactly like FAIL.

That creates bad incentives.

If an agent knows that saying UNKNOWN hurts its success metric as much as a wrong answer, the optimization pressure encourages unjustified confidence.

That is precisely what we do not want.

Consider:

Agent A
PASS:    90%
FAIL:     5%
UNKNOWN:  5%
false success: 0.2%

Agent B
PASS:    94%
FAIL:     4%
UNKNOWN:  2%
false success: 3.5%

If you only optimize apparent completion rate, Agent B looks better.

It is not.

A mature SLO system gives UNKNOWN its own budget.

For example:

verified_success_rate >= 92%
false_success_rate    <= 0.5%
UNKNOWN_rate          <= 8%

The objective is not to eliminate UNKNOWN blindly.

The objective is to reduce avoidable uncertainty without converting uncertainty into false confidence.


4. Reliability Is a Vector, Not One Number

Agent reliability usually needs multiple simultaneous objectives.

A useful vector is:

R = {
    verified_success,
    false_success,
    unknown_rate,
    latency,
    cost,
    side_effect_integrity,
    verifier_coverage
}

You should resist collapsing these immediately into one weighted score.

Why?

Because a weighted score can hide catastrophic trade-offs.

Example:

+3% verified success
-80% cost
+2.5% false success

A single utility function could still rank that as positive depending on the weights.

But the false-success ceiling may be a hard constraint.

A safer formulation is:

maximize verified_success

subject to:
    false_success <= 0.5%
    p95_latency   <= 180s
    p95_cost      <= $1.20
    verifier_coverage >= 99%

This mirrors the control-policy formulation from earlier steps in the series.

Reliability constraints come first.

Optimization happens inside them.


5. Define SLIs Before SLOs

An SLO is only useful if its underlying Service Level Indicator is measurable.

For agents, that means defining exactly how each metric is computed.

Example:

from dataclasses import dataclass
from enum import Enum


class Outcome(str, Enum):
    PASS = "PASS"
    FAIL = "FAIL"
    UNKNOWN = "UNKNOWN"


@dataclass(frozen=True)
class RunOutcome:
    run_id: str
    task_class: str
    outcome: Outcome
    externally_verified: bool
    false_success: bool
    latency_ms: int
    cost_usd: float

Then:

def verified_success_rate(rows: list[RunOutcome]) -> float:
    if not rows:
        return 0.0

    passed = sum(
        1
        for r in rows
        if r.outcome == Outcome.PASS and r.externally_verified
    )

    return passed / len(rows)

The exact denominator matters.

Are cancelled user requests included?

Are unsupported task classes included?

Are dependency-unavailable runs included?

Are retries counted as separate tasks or attempts?

Those choices must be explicit.

Otherwise teams can accidentally improve the metric by changing the population being measured.


6. SLOs Need Cohorts

A global SLO can hide local collapse.

Suppose the platform reports:

verified success = 96%

Looks excellent.

But the cohort breakdown is:

simple coding fixes      99%
research synthesis       98%
browser purchases        93%
production DevOps        78%

The aggregate is misleading.

The DevOps cohort may be unacceptable even if it is a small share of total traffic.

Useful cohort dimensions include:

  • task class,
  • risk class,
  • tenant,
  • repository size,
  • tool family,
  • model tier,
  • workflow type,
  • side-effect severity,
  • verifier type,
  • geographical/provider region,
  • workload source.

A reliability contract should therefore support cohort-specific SLOs.

Example:

slos:
  coding.simple_fix:
    verified_success_min: 0.97
    false_success_max: 0.005

  coding.large_refactor:
    verified_success_min: 0.90
    false_success_max: 0.01

  devops.production_change:
    verified_success_min: 0.99
    false_success_max: 0.001
    duplicate_side_effect_max: 0.0001

The numbers are illustrative.

The architecture is the important part.


7. Separate Task Reliability From Component Reliability

Component metrics matter.

They are just not substitutes for task SLOs.

You may track:

router accuracy
retrieval recall@k
critic net correction
search pruning regret
model escalation rescue rate
verifier false-positive rate
browser tool error rate
lease expiration rate
retry amplification
queue deadline misses

These metrics help explain why the user-facing SLO moved.

The hierarchy should look like:

user-facing SLO
workflow SLIs
component metrics
implementation counters

Not the other way around.

If a router metric improves but verified user outcomes get worse, the router metric is not the goal.


8. Error Budgets Turn Reliability Into a Decision Tool

Suppose the SLO is:

verified_success >= 99%

Then the allowed failure budget is:

1%

Over 100,000 eligible tasks, that means:

allowed failed outcomes = 1,000

If the platform consumes 700 of those failures halfway through the measurement window, the team has burned 70% of the error budget in 50% of the time.

That is actionable.

An error budget transforms reliability from:

“We had some incidents.”

into:

“We are consuming reliability allowance faster than the policy permits.”

That can change release behavior.


9. Burn Rate Matters More Than Remaining Budget Alone

A system can have plenty of budget remaining and still be in trouble.

Imagine a 30-day SLO window.

At day 2:

error budget consumed = 25%

That is alarming.

The raw remaining budget is 75%.

But the burn rate is far too high.

A simple burn-rate concept is:

actual_bad_event_rate
---------------------
allowed_bad_event_rate

If the SLO permits 1% bad outcomes and the recent window is running at 4%, then:

burn_rate = 4x

At 4x sustained burn, the budget will be exhausted much earlier than planned.

That should influence release policy.


10. Use Multiple Burn Windows

Short windows detect sharp regressions.

Long windows detect sustained degradation.

For example:

5-minute burn
1-hour burn
6-hour burn
24-hour burn
7-day burn

A sharp spike may indicate:

  • a broken model deployment,
  • a verifier regression,
  • a tool outage,
  • a bad prompt release,
  • a routing policy bug.

A slow sustained burn may indicate:

  • task-distribution shift,
  • retrieval drift,
  • model quality drift,
  • gradual policy degradation,
  • rising external API unreliability.

This connects directly to Step 23’s behavioral drift detection.


11. Different Failures Should Consume Different Budgets

Not all failures have equal severity.

A coding agent producing a patch that fails tests is different from a coding agent silently modifying the wrong repository.

A research agent returning UNKNOWN is different from fabricating a citation.

A browser agent timing out before purchase is different from purchasing twice.

You can model separate error budgets:

ordinary failure budget
false-success budget
side-effect-integrity budget
UNKNOWN budget
latency budget
cost budget

The critical ones may be zero-tolerance or near-zero-tolerance.

Example:

error_budgets:
  false_success:
    max_rate: 0.002

  duplicate_side_effect:
    max_rate: 0.0001

  unknown:
    max_rate: 0.08

  p95_latency_violation:
    max_rate: 0.05

This is more informative than one generic “error budget.”


12. Reliability Policy Should Change Release Policy

An error budget is useless if nothing happens when it burns.

A practical release policy could look like:

budget healthy
normal feature velocity

budget elevated
smaller canaries
more verification
reduced speculative complexity

budget critical
freeze risky behavioral releases
prioritize reliability work
rollback recent regressions

budget exhausted
no new capability rollout
except fixes that restore SLO compliance

The key idea is not bureaucracy.

It is making reliability trade-offs explicit.


13. Error Budgets Should Not Reward Under-Attempting

There is a subtle failure mode.

Suppose the system avoids difficult tasks by returning UNKNOWN immediately.

Its false-success rate may improve.

Its hard failure rate may improve.

But user value may collapse.

That is why you need multiple SLOs simultaneously.

Example:

verified_success >= 92%
false_success    <= 0.5%
UNKNOWN          <= 8%

The system cannot game reliability simply by refusing everything difficult.


14. Error Budgets Should Not Reward Easy-Traffic Routing

Another subtle failure mode is denominator manipulation.

Imagine the agent begins routing difficult tasks away from the measured workflow.

The measured success rate improves.

The actual platform did not.

Therefore the SLI definition should bind:

  • eligibility rules,
  • task-class definitions,
  • cohort assignment,
  • unsupported-task semantics,
  • excluded events,
  • attempt deduplication.

These should be versioned.

A metric definition is part of the behavioral contract.


15. Cost and Latency Need Budgets Too

An agent can hit reliability targets and still become operationally unusable.

Suppose a new search policy improves verified success from:

94% → 95%

but changes cost from:

$0.20 → $2.40

and p95 latency from:

40s → 240s

That may be unacceptable.

So define objectives such as:

p95_latency <= 120s
cost_per_verified_success <= $0.80

The important metric is often not average cost per run.

It is:

cost_per_verified_success

because cheap wrong answers are not useful.


16. Verification Coverage Needs Its Own Reliability Target

Suppose the platform reports:

verified success = 97%

But only 60% of tasks actually had strong external verification.

That is suspicious.

You need to know:

verification_coverage

For example:

strong_verifier_coverage >= 98%

for the task classes where strong verification is expected.

This protects against silently weakening the evidence standard.

It also connects directly to Step 22’s verifier degradation handling.

If verifier capacity drops, the system should not compensate by pretending verification is optional.


17. Verifier Reliability Is Part of the SLO System

The verifier itself can fail.

A permissive verifier creates false success.

An overly strict verifier inflates FAIL or UNKNOWN.

So monitor:

verifier_false_positive_rate
verifier_false_negative_rate
verifier_coverage
verifier_disagreement_rate

where ground truth is available through:

  • deterministic checks,
  • gold cases,
  • human review,
  • independent recomputation,
  • downstream observed outcomes.

The verifier cannot be treated as infallible simply because it is called “the verifier.”


18. Use Risk-Tiered SLOs

Not every task deserves the same reliability requirement.

A low-risk summarization task may tolerate:

95% verified usefulness

A production infrastructure mutation may require:

99.9% verified correctness

with near-zero false success.

A useful risk model is:

LOW
MEDIUM
HIGH
CRITICAL

Then define increasingly strict requirements.

Example:

LOW
  cheaper verification allowed
  moderate UNKNOWN tolerated

MEDIUM
  stronger verifier required
  lower false-success ceiling

HIGH
  mandatory independent verification
  reduced speculative authority

CRITICAL
  deterministic preconditions
  explicit approval / fenced commit
  near-zero false-success budget

Risk classification should happen before execution, not after something goes wrong.


19. Reliability Should Influence the Scheduler

The Step 16 run scheduler and Step 21 platform scheduler should consume reliability state.

Example:

false-success budget burning too fast
reserve more verifier capacity
reduce speculative fan-out
increase escalation threshold quality
route high-risk tasks to stronger verification

Or:

latency budget burning too fast
reduce search width
prefer cached observations
use cheaper/faster route where reliability remains inside SLO

The important part is constraint ordering.

Do not fix latency by violating correctness SLOs.


20. Reliability Should Influence the Router

A router should not only optimize expected capability and cost.

It should also know whether a route is consuming error budget disproportionately.

Suppose:

local model route
verified success = 88%

frontier model route
verified success = 97%

If the workload SLO is 95%, the local route may be unsuitable for that cohort even if it is cheaper.

The router policy can therefore include:

route allowed only if predicted reliability >= cohort SLO

This connects the control plane directly to reliability policy.


21. Reliability Should Influence Search Depth

Search is not free.

But under high error-budget burn, additional search may be justified if it measurably rescues failures.

Conversely, if search depth increases cost without improving verified outcomes, the SLO system should expose that.

Useful metrics include:

verified_success_by_search_depth
false_success_by_search_depth
cost_per_verified_success_by_depth
latency_by_depth

This is more useful than saying:

deeper search is smarter.


22. Reliability Should Influence Critic Invocation

A critic may help some cohorts and hurt others.

Track:

wrong → correct
correct → correct
wrong → wrong
correct → wrong

Then connect critic policy to SLO impact.

If a critic causes too many correct → wrong transitions in a cohort, its use should be reduced there.

Again:

mechanisms must earn their cost through verified outcomes.


23. Error Budgets Connect Incidents to Roadmap Priority

Step 26 gave us incident forensics.

Now imagine the incident taxonomy shows:

routing failure          18 incidents
verifier false positive  4 incidents
stale state              9 incidents
selection failure       23 incidents

Raw incident count is not enough.

You also need error-budget impact.

Perhaps the four verifier incidents consumed more reliability budget than the 23 selection incidents because they caused harmful false success.

A useful prioritization table might be:

Failure class Incidents Error-budget impact Severity Priority
Verifier false PASS 4 38% Critical 1
Selection failure 23 22% Medium 2
Stale state 9 17% High 3
Routing failure 18 12% Medium 4

That is much better than fixing whatever incident happened most recently.


24. Define a Reliability Contract

A useful reliability contract can be versioned like any other policy artifact.

Example:

reliability_contract:
  version: reliability-v4

  scope:
    task_class: coding.patch
    risk: medium

  slos:
    verified_success_min: 0.95
    false_success_max: 0.005
    unknown_max: 0.06
    verifier_coverage_min: 0.98
    p95_latency_ms_max: 120000
    cost_per_verified_success_max: 0.80

  window:
    type: rolling
    duration_days: 30

  release_policy:
    warning_burn_rate: 2.0
    freeze_burn_rate: 5.0
    rollback_burn_rate: 10.0

The exact thresholds are domain-specific.

The important point is that the policy is explicit, diffable, replayable, and auditable.


25. Implement a Small Reliability Evaluator

You do not need an LLM to implement this.

from dataclasses import dataclass


@dataclass(frozen=True)
class ReliabilitySnapshot:
    verified_success: float
    false_success: float
    unknown_rate: float
    verifier_coverage: float
    p95_latency_ms: int
    cost_per_verified_success: float


@dataclass(frozen=True)
class ReliabilityContract:
    verified_success_min: float
    false_success_max: float
    unknown_max: float
    verifier_coverage_min: float
    p95_latency_ms_max: int
    cost_per_verified_success_max: float


def violations(
    snapshot: ReliabilitySnapshot,
    contract: ReliabilityContract,
) -> list[str]:
    out: list[str] = []

    if snapshot.verified_success < contract.verified_success_min:
        out.append("verified_success")

    if snapshot.false_success > contract.false_success_max:
        out.append("false_success")

    if snapshot.unknown_rate > contract.unknown_max:
        out.append("unknown_rate")

    if snapshot.verifier_coverage < contract.verifier_coverage_min:
        out.append("verifier_coverage")

    if snapshot.p95_latency_ms > contract.p95_latency_ms_max:
        out.append("p95_latency")

    if (
        snapshot.cost_per_verified_success
        > contract.cost_per_verified_success_max
    ):
        out.append("cost_per_verified_success")

    return out

This is ordinary software.

That is a feature.


26. Add Burn-Rate Evaluation

A simple burn-rate function can also remain deterministic.

def burn_rate(
    observed_bad_rate: float,
    allowed_bad_rate: float,
) -> float:
    if allowed_bad_rate <= 0:
        return float("inf") if observed_bad_rate > 0 else 0.0

    return observed_bad_rate / allowed_bad_rate

For a 99% success SLO:

allowed bad rate = 1%

If recent bad rate is 3%:

burn = 3x

The release controller can use this signal without asking a model to interpret it.


27. Do Not Let the Agent Change Its Own SLO

This boundary should be explicit.

The agent may observe:

  • current burn rate,
  • remaining budget,
  • reliability mode,
  • route restrictions.

But it should not be able to lower its own target because the target is inconvenient.

Bad architecture:

agent failing SLO
agent decides SLO too strict
agent lowers threshold
problem disappears from dashboard

Good architecture:

external reliability policy
agent receives constraints
agent operates within constraints

Reliability authority belongs outside the optimized system.


28. Do Not Let the Verifier Define the SLO Alone

Similarly, the same verifier that judges production runs should not be the sole authority for whether the reliability target is met.

Why?

Because verifier drift can make the metric itself move.

Use independent checks where possible:

  • deterministic acceptance tests,
  • gold cases,
  • human audits,
  • secondary verifiers,
  • downstream ground truth.

This is measurement-system integrity.


29. Reliability Windows Need Enough Data

Small samples are noisy.

Suppose a cohort has 10 tasks.

One failure changes the observed rate by 10 percentage points.

Do not build aggressive automatic rollback around tiny samples without confidence controls.

Useful safeguards include:

  • minimum sample size,
  • confidence intervals,
  • paired comparisons,
  • cohort pooling only when justified,
  • long-window confirmation,
  • severity-aware overrides for catastrophic failures.

A single critical false-success incident may justify immediate rollback even with small sample size.

So the policy needs both statistical and severity logic.


30. Availability SLOs Still Matter

Behavioral reliability does not replace infrastructure reliability.

You still need:

API availability
queue availability
worker availability
database availability
browser pool availability
model endpoint availability

The distinction is:

infrastructure SLOs
    measure ability to execute

behavioral SLOs
    measure quality of decisions and outcomes

Both matter.

Neither substitutes for the other.


31. Example: Coding Agent

Suppose a coding agent repairs failing tests.

Possible SLOs:

verified test-fix rate        >= 95%
false-success rate            <= 0.5%
wrong-repository mutation     = 0
p95 latency                   <= 180s
cost per verified fix         <= $1.00

If false success burns too quickly:

increase mandatory test coverage
require diff-level verification
reduce critic-only acceptance
route risky refactors to stronger verification

If latency burns but correctness is healthy:

reduce search width
reuse cached repository evidence
parallelize independent diagnostics

The corrective action depends on which SLO is burning.


32. Example: Research Agent

Possible SLOs:

citation-supported claims >= 98%
unsupported claims        <= 0.2%
UNKNOWN                   <= 10%
p95 latency               <= 90s

If unsupported-claim budget burns:

increase primary-source requirement
strengthen claim-source binding
reduce answer synthesis when evidence is weak

If UNKNOWN burns:

improve retrieval coverage
add targeted source discovery
fix stale indexes

Do not solve both by simply using a bigger model.


33. Example: Browser Agent

Possible SLOs:

verified transaction success >= 99%
duplicate transaction rate   <= 0.01%
ambiguous completion          <= 0.2%

If ambiguous completion burns:

strengthen postcondition checks
record transaction identifiers
query authoritative account state after timeout

If duplicate side effects burn:

fix idempotency
strengthen operation IDs
improve fencing / commit gateway

That is a distributed-systems problem, not a prompt problem.


34. Example: DevOps Agent

Possible SLOs:

verified safe change >= 99.5%
unauthorized mutation = 0
rollback failure      <= 0.1%
false-success         <= 0.05%

When the error budget degrades:

reduce autonomous authority
increase approval requirements
reserve more verification capacity
restrict high-risk tool routes

Reliability state can therefore directly control authority.


35. Reliability Mode as Runtime State

You can expose a coarse reliability mode:

HEALTHY
WATCH
CONSTRAINED
FREEZE

For example:

from enum import Enum


class ReliabilityMode(str, Enum):
    HEALTHY = "HEALTHY"
    WATCH = "WATCH"
    CONSTRAINED = "CONSTRAINED"
    FREEZE = "FREEZE"

The platform scheduler can then consume it.

Example:

HEALTHY
  normal rollout

WATCH
  smaller canaries
  more shadow traffic

CONSTRAINED
  restrict risky routes
  reserve verifier capacity
  reduce speculative work

FREEZE
  no new behavioral capability releases
  reliability fixes only

This connects SLOs to real operational behavior.


36. Error Budgets Prevent Endless Reliability Work Too

Error budgets are not only a mechanism for stopping feature releases.

They also protect teams from trying to eliminate every possible failure.

If reliability is comfortably inside the agreed SLO, the platform may not need another layer of complexity.

That is consistent with the entire series.

Advanced mechanisms are justified by measured failure, not architectural ambition.

If the reliability contract is healthy, adding another critic, search layer, verifier, or coordinator may make the system worse.

The error budget gives permission to stop hardening when the evidence says reliability is good enough.


37. Reliability Targets Must Be Economically Realistic

A target like:

99.9999% verified success

may be meaningless if achieving it requires:

  • ten frontier-model calls,
  • three independent verifiers,
  • human review,
  • five-minute latency,
  • $50 per task.

Reliability exists inside an economic envelope.

The real question is:

What level of verified reliability is required for the task’s risk and value, at an acceptable cost and latency?

That is a product and engineering decision.

Not a model benchmark decision.


38. Reliability Targets Should Be Derived From Consequence

A useful heuristic is:

higher consequence
higher verification requirement
lower false-success tolerance
more conservative authority

This is better than assigning one global target to every workflow.

For low-consequence tasks, the cheapest reliable architecture may be enough.

For consequential tasks, the system may need:

  • independent verification,
  • approval gates,
  • stronger provenance,
  • stricter replay guarantees,
  • fenced side effects,
  • lower error budgets.

39. Make SLO Breaches Explainable

A dashboard should not merely say:

SLO FAILED

It should explain:

SLO: verified_success >= 95%
observed: 91.8%
window: 6h
burn rate: 3.2x

largest contributing cohorts:
  large_repo_refactor: -6.4 pp
  browser_tool_v7:     -4.1 pp

largest failure classes:
  selection failure:   31%
  stale state:         27%
  verifier unknown:    18%

recent changes:
  router v12 → v13
  browser tool v6 → v7

Now the error budget becomes an entry point into Step 26 incident forensics.


40. SLOs Need Versioned Definitions

If the metric definition changes, historical comparison can become invalid.

Version:

  • eligibility rules,
  • outcome semantics,
  • verifier requirements,
  • false-success definition,
  • UNKNOWN semantics,
  • cohort rules,
  • measurement windows.

Example:

reliability-contract-v4

should be stored alongside each evaluation snapshot.

Otherwise a chart can appear to improve simply because the definition changed.


41. Store Reliability Snapshots as Evidence

A reliability snapshot should be reproducible.

Example:

@dataclass(frozen=True)
class SLOEvaluation:
    evaluation_id: str
    contract_version: str
    cohort: str
    window_start: str
    window_end: str
    eligible_runs: int
    verified_success: float
    false_success: float
    unknown_rate: float
    p95_latency_ms: int
    cost_per_verified_success: float
    burn_rates: dict[str, float]
    release_versions: tuple[str, ...]

This makes later incident analysis much stronger.

You can ask:

Which release versions consumed this error budget?
Which cohorts drove it?
Which failure classes dominated?

42. Test the SLO System Itself

The measurement system can fail.

Test cases should include:

Denominator changes

Ensure unsupported tasks are not silently excluded differently between versions.

Duplicate attempts

One user task retried five times should not necessarily become five independent failures.

Verifier outage

Ensure missing verification does not become PASS.

Late evidence

Ensure a delayed postcondition can reconcile an earlier UNKNOWN correctly.

Cohort reassignment

Ensure tasks do not migrate between cohorts silently after execution.

Clock/window boundaries

Ensure rolling windows do not double-count or lose events.

Release attribution

Ensure mixed-version distributed runs are attributed correctly.

Reliability metrics are software.

They need tests too.


43. Failure Injection Should Consume the Expected Budget

If you deliberately inject a known failure mode, the SLO machinery should react predictably.

Examples:

inject stale repository snapshot
state-uncertainty / stale-state failures rise
verified success falls
relevant burn rate rises

Or:

make verifier permissive
false-success incidents rise
false-success budget burns rapidly

If the dashboard does not reflect the injected failure, the measurement system is incomplete.


44. Error Budgets Create a Reliability Feedback Loop

We now have a full loop:

production runs
verified outcomes
SLIs
SLO evaluation
error-budget burn
release / scheduler / authority policy
incidents and drift investigation
remediation
shadow / canary
production

This is where the earlier advanced-agent mechanisms start behaving like a real engineering platform rather than a pile of orchestration patterns.


45. The Most Important Metric Is Still the External Outcome

Throughout this series we have introduced:

  • routers,
  • search,
  • critics,
  • memory,
  • multi-agent orchestration,
  • dynamic budgets,
  • uncertainty decomposition,
  • Expected Value of Information,
  • speculative concurrency,
  • distributed coordination,
  • global scheduling,
  • circuit breakers,
  • drift detection,
  • release engineering,
  • replay,
  • incident forensics.

Each mechanism has internal metrics.

But those metrics exist to explain and improve externally verified outcomes.

The hierarchy remains:

external verified outcome
reliability SLO
workflow metrics
component metrics

Never reverse that hierarchy.


46. A Minimal Production Reliability Stack

A practical implementation does not need to begin with a giant SRE platform.

Start with:

1. explicit PASS / FAIL / UNKNOWN
2. false-success measurement
3. one verified-success SLO
4. one false-success ceiling
5. one latency target
6. one cost target
7. cohort breakdown
8. rolling error-budget burn
9. release freeze / rollback rules
10. incident attribution

Then add complexity only when the failure evidence demands it.

That is enough to make reliability operational rather than rhetorical.


47. What Not to Do

Do not define reliability as:

model confidence > 0.8

Do not define reliability as:

agent completed without exception

Do not define reliability as:

critic approved result

Do not define reliability as:

majority of agents agreed

Do not define reliability as:

HTTP 200

Do not let the candidate agent lower its own target.

Do not let UNKNOWN become fake PASS.

Do not hide false success inside one aggregate metric.

Do not compare cohorts with different risk semantics as if they were identical.

Do not keep shipping risky behavioral releases while the error budget is burning uncontrollably.

And do not keep adding reliability machinery forever when the measured reliability is already sufficient for the task.


48. The Bigger Architectural Shift

The deeper idea is not really about SLO dashboards.

It is about turning reliability into a control input.

Once reliability is explicit, the platform can make better decisions about:

  • which models may serve which task classes,
  • how much search is justified,
  • when escalation is required,
  • how much verifier capacity to reserve,
  • whether speculative work should be reduced,
  • whether a behavioral release may proceed,
  • whether authority should be constrained,
  • which reliability fix deserves engineering time.

The platform stops asking:

Is the agent good?

and starts asking:

Is this cohort meeting its verified reliability contract inside the agreed cost, latency, and risk envelope?

That is a much more useful engineering question.


49. Final Architecture

The reliability layer now sits above the mechanisms developed throughout the series:

user task
platform admission
run control policy
routing / search / tools / memory / critics
execution
external verification
PASS / FAIL / UNKNOWN
SLIs
SLO evaluation
error-budget burn
release / scheduling / authority policy
incident forensics / remediation

The important property is feedback.

Reliability evidence changes architecture and release decisions.

The architecture is no longer allowed to grow independently of measured outcomes.


50. Final Rule

The rule for agent reliability is simple:

Define what good enough means before production failure forces you to invent the definition after the fact.

Then measure it with external evidence.

Give false success its own ceiling.

Treat UNKNOWN honestly.

Track cost and latency alongside correctness.

Slice by risk and task class.

Turn failures into error-budget burn.

And let the burn rate decide when the platform should keep expanding capability and when it should stop and become more reliable.

That is how agent reliability becomes an engineering discipline rather than a collection of post-incident opinions.


What Comes Next?

SLOs tell us whether reliability is acceptable.

Error budgets tell us whether the team is consuming that reliability too quickly.

The next problem is deciding which reliability work should happen first when several components are contributing to the burn.

That leads naturally to the next stage:

Reliability economics and risk-based prioritization: how do you decide whether to spend engineering effort on model quality, verification, routing, tooling, infrastructure, or process when every improvement has a different cost and expected reduction in failure risk?