<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rob Fox</title>
    <description>The latest articles on DEV Community by Rob Fox (@rsionnach).</description>
    <link>https://dev.to/rsionnach</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%2F3697052%2Fd9a378bc-4c55-4556-9e31-29784e45eb48.png</url>
      <title>DEV Community: Rob Fox</title>
      <link>https://dev.to/rsionnach</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rsionnach"/>
    <language>en</language>
    <item>
      <title>Your AI Agent Is Available, Fast, and Making Terrible Decisions</title>
      <dc:creator>Rob Fox</dc:creator>
      <pubDate>Fri, 27 Feb 2026 22:20:30 +0000</pubDate>
      <link>https://dev.to/rsionnach/your-ai-agent-is-available-fast-and-making-terrible-decisions-54ac</link>
      <guid>https://dev.to/rsionnach/your-ai-agent-is-available-fast-and-making-terrible-decisions-54ac</guid>
      <description>&lt;p&gt;Your code review bot has 99.9% availability. Median response time is under two seconds. It hasn't thrown an error in weeks.&lt;/p&gt;

&lt;p&gt;It's also approving PRs with critical security vulnerabilities, rejecting clean code because it doesn't like the variable names, and your senior engineers are quietly overriding it dozens of times a day. Nobody's tracking that. Nobody even has a dashboard for it.&lt;/p&gt;

&lt;p&gt;This is the state of AI reliability in 2026: we're measuring the system, not the judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Widening Gap
&lt;/h2&gt;

&lt;p&gt;SLOs have been the gold standard for service reliability since the Google SRE handbook popularised them nearly a decade ago. Availability. Latency. Error rate. Throughput. These metrics tell you whether a service is up and responsive. They're essential. They're also completely insufficient for AI systems that make decisions.&lt;/p&gt;

&lt;p&gt;Consider the systems being deployed right now: code-review bots that approve or reject PRs, content moderators that publish or flag posts, fraud detectors that allow or block transactions, triage agents that route incidents to teams. These are binary decision-makers embedded in critical workflows.&lt;/p&gt;

&lt;p&gt;Every existing observability tool monitors the same things: token usage, latency, cost per request, trace depth, error rates. Langfuse, Arize Phoenix, Datadog LLM Observability, LangSmith, Braintrust: they all give you operational metrics. Some offer evaluation frameworks. None of them answer the question that actually matters: is this agent making good decisions in production, right now, continuously?&lt;/p&gt;

&lt;p&gt;That's the gap. And it's growing wider every week as teams deploy more autonomous systems into production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Judgment SLO Looks Like
&lt;/h2&gt;

&lt;p&gt;I've been building reliability tooling for a while now, first NthLayer, then the OpenSRM specification. The further I get into AI systems, the more I realise we need a new category of SLO entirely. Not a replacement for availability and latency, but an addition to them.&lt;/p&gt;

&lt;p&gt;I'm calling them judgment SLOs. They measure decision quality the same way traditional SLOs measure system health: as a target, over a window, with an error budget.&lt;/p&gt;

&lt;p&gt;The key insight is that you don't need ground-truth labels to measure decision quality. You need human overrides. This is the Human-in-the-Loop (HITL) that you've likely read about in many AI articles and whitepapers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reversal Rate: The Metric That Already Exists in Your Data
&lt;/h3&gt;

&lt;p&gt;Every AI decision system with a human in the loop already has this signal. The AI says approve, a human says reject. The AI flags content, a human unflags it. The AI blocks a transaction, a human allows it through. These are reversals, meaning cases where a human reviewed the AI's decision and disagreed with the action it took.&lt;/p&gt;

&lt;p&gt;Reversal rate is the percentage of AI decisions that get overridden by humans within an observation window:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reversal_rate = human_overrides / total_ai_decisions (over observation_period)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This metric is powerful for three reasons. First, it requires zero labelling infrastructure. You don't need a ground-truth dataset. You don't need an ML pipeline. You just need to track two events: 'AI made a decision' and 'human changed it.' Second, it uses human judgment as the quality signal. In most production systems, when a human overrides an AI, the human is right. Not always, but often enough that the override rate is a meaningful quality indicator. Third, it's measurable today. If you have any kind of human review process, you already have this data. You're just not treating it as an SLO.&lt;/p&gt;

&lt;p&gt;The following is what a judgment SLO looks like in an &lt;a href="https://github.com/rsionnach/opensrm" rel="noopener noreferrer"&gt;OpenSRM&lt;/a&gt; manifest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;opensrm/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ServiceReliabilityManifest&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;code-review-bot&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ai-gate&lt;/span&gt;
  &lt;span class="na"&gt;slos&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;availability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.999&lt;/span&gt;
      &lt;span class="na"&gt;window&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;latency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;p99&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;45s&lt;/span&gt;
      &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.99&lt;/span&gt;
    &lt;span class="na"&gt;judgment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;reversal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;rate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.05&lt;/span&gt;       &lt;span class="c1"&gt;# 5% of decisions overridden by humans&lt;/span&gt;
          &lt;span class="na"&gt;window&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;observation_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;24h&lt;/span&gt;
        &lt;span class="na"&gt;high_confidence_failure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.02&lt;/span&gt;       &lt;span class="c1"&gt;# 2% confident-and-wrong&lt;/span&gt;
          &lt;span class="na"&gt;window&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;confidence_threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;observation_period&lt;/code&gt; matters. A decision isn't considered 'final' until humans have had time to review it. For a code-review bot, 24 hours is reasonable. For a fraud detector, it might be minutes. For a content moderator, it could be a week. The period defines how long you wait before counting a decision as uncontested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond Reversal Rate: High-Confidence Failure
&lt;/h2&gt;

&lt;p&gt;Reversal rate is the foundation, but it has a blind spot: it only captures cases where humans actually review the decision. If your AI approves something with high confidence and nobody looks at it, a bad decision goes unmeasured.&lt;/p&gt;

&lt;p&gt;That's where high-confidence failure (HCF) comes in. HCF tracks cases where the AI was confident and wrong, meaning decisions made above a specified confidence threshold that were subsequently reversed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;high_confidence_failure = reversals_above_threshold / decisions_above_threshold
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An AI system with a 4% reversal rate might look healthy. But if its high-confidence failures are at 8%, something is seriously wrong: the model is confidently wrong, which means the decisions least likely to be reviewed are the ones most likely to be bad. That's a fundamentally different risk profile from an AI that's uncertain and wrong.&lt;/p&gt;

&lt;p&gt;HCF is the metric that tells you whether you can trust the AI's confidence scores. If confidence doesn't correlate with correctness, you can't use confidence to decide what to review. And if you can't decide what to review, you either review everything (defeating the purpose of automation) or miss the failures that matter most.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Makes Possible
&lt;/h2&gt;

&lt;p&gt;Once you define judgment SLOs, several things follow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Error budgets for decision quality.&lt;/strong&gt; Just like traditional SLOs, a judgment SLO creates an error budget. A 5% reversal rate target over 30 days means you can tolerate a certain number of bad decisions before the budget is exhausted. When the budget runs low, you can gate deployments, increase human review rates, or reduce the AI's autonomy. These are the same operational responses you'd use for an availability SLO breach.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Alerting on quality degradation.&lt;/strong&gt; A reversal rate SLO generates Prometheus alerting rules like any other SLO. Burn-rate alerts tell you when decision quality is degrading faster than the budget can absorb. You don't need an ML engineer to notice a drift; your existing on-call process catches it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deployment gates.&lt;/strong&gt; Before shipping a new model version, check the judgment SLO. If the current model is already close to exhausting its decision quality budget, deploying a new version is risky. This is the same logic teams use for availability-based deployment gates, applied to decision quality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dependency math.&lt;/strong&gt; If your checkout flow depends on a fraud detection agent, the quality of the fraud agent's decisions constrains the reliability of the checkout flow. OpenSRM's dependency validation can express this: your service's judgment quality ceiling is bounded by the worst judgment SLO in its critical path.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Instrumentation Problem
&lt;/h2&gt;

&lt;p&gt;The missing piece right now is standardised telemetry. There's no OpenTelemetry semantic convention for 'AI made a decision' or 'human overrode it.' I've been working on proposals for &lt;code&gt;gen_ai.decision.*&lt;/code&gt; and &lt;code&gt;gen_ai.override.*&lt;/code&gt; attributes that would make this data portable across vendors and tools. Without that standard, every team rolls their own event schema, and tooling can't be built generically.&lt;/p&gt;

&lt;p&gt;The events are simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gen_ai.decision.outcome: approve | reject | flag | route
gen_ai.decision.confidence: 0.0 - 1.0
gen_ai.decision.class: code_review | content_moderation | fraud_detection
gen_ai.override.original_outcome: approve
gen_ai.override.new_outcome: reject
gen_ai.override.actor: human | automated_policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two events. That's what it takes to compute reversal rate. The tooling to generate Prometheus recording rules, Grafana dashboards, and alerting from these events can be fully automated once the schema exists. That's what NthLayer does for traditional SLOs, and it's what I'm extending it to do for judgment SLOs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters Now
&lt;/h2&gt;

&lt;p&gt;AI agents are multiplying in production faster than our reliability practices are evolving. Every week, another team deploys an autonomous agent into a critical workflow. The observability vendors are building traces, cost tracking, and latency dashboards. The ML teams are building offline evals and prompt testing frameworks. Nobody is building the continuous, production-time measurement of decision quality that SREs need to actually run these systems.&lt;/p&gt;

&lt;p&gt;The question isn't whether AI agents need SLOs on their judgment. The question is whether we'll build the practice proactively or wait until a high-profile failure forces it.&lt;/p&gt;

&lt;p&gt;We have the patterns. SLOs are a solved problem. Error budgets work. Prometheus can compute any ratio. The only thing missing is the recognition that decision quality is a reliability concern, not just an ML concern, and that it deserves the same operational rigour we give to availability.&lt;/p&gt;




&lt;p&gt;The OpenSRM specification, including the &lt;code&gt;type: ai-gate&lt;/code&gt; judgment SLO model, is at &lt;a href="https://github.com/rsionnach/opensrm" rel="noopener noreferrer"&gt;github.com/rsionnach/opensrm&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;NthLayer, the CLI that generates Prometheus rules and Grafana dashboards from reliability manifests, is at &lt;a href="https://github.com/rsionnach/nthlayer" rel="noopener noreferrer"&gt;github.com/rsionnach/nthlayer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm actively working on the judgment SLO specification model (is reversal rate the right primary metric, and what signals am I missing?), OpenTelemetry semantic convention proposals for &lt;code&gt;gen_ai.decision.*&lt;/code&gt; and &lt;code&gt;gen_ai.override.*&lt;/code&gt;, and NthLayer support for generating judgment SLO recording rules and dashboards.&lt;/p&gt;

&lt;p&gt;If you're running AI agents in production and manually tracking override rates in spreadsheets (or not tracking them at all), I'd like to hear what you're seeing. Open an issue, or find me on the CNCF Slack.&lt;/p&gt;

&lt;p&gt;Decision quality is a reliability problem. Let's treat it like one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Rob Fox is a Senior Site Reliability Engineer building open-source reliability tooling. Previously: &lt;a href="https://dev.to/rsionnach/shift-left-reliability-4poo"&gt;Shift-Left Reliability&lt;/a&gt;, &lt;a href="https://dev.tolink"&gt;OpenSRM: An Open Specification for Service Reliability&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>sre</category>
    </item>
    <item>
      <title>OpenSRM: An Open Specification for Service Reliability</title>
      <dc:creator>Rob Fox</dc:creator>
      <pubDate>Tue, 24 Feb 2026 21:21:04 +0000</pubDate>
      <link>https://dev.to/rsionnach/opensrm-an-open-specification-for-service-reliability-44bi</link>
      <guid>https://dev.to/rsionnach/opensrm-an-open-specification-for-service-reliability-44bi</guid>
      <description>&lt;p&gt;A team sets a 99.99% availability target for their checkout service. It's ambitious but achievable: they've done the work, invested in redundancy, and their metrics look solid.&lt;/p&gt;

&lt;p&gt;Six months later, they're missing their target every single month. The postmortem reveals the problem: their critical path flows through three upstream services. The authentication service promises 99.9%. The payment gateway promises 99.95%. The inventory service promises 99.9%.&lt;/p&gt;

&lt;p&gt;The math is straightforward: 0.999 × 0.9995 × 0.999 = 0.9975. Their theoretical ceiling is 99.75%, not 99.99%. The target for the checkout service was impossible from day one.&lt;/p&gt;

&lt;p&gt;Nobody caught this because there's no standard way to express it. SLOs are set per-service, in isolation. Dependency information lives in architecture diagrams that nobody updates, service catalogs that are perpetually stale, and the heads of engineers who've since left the company. Nobody owns the cross-service math.&lt;/p&gt;

&lt;p&gt;This is one of the things I've been building toward with NthLayer, and it's why I've developed OpenSRM: an open specification for declaring service reliability requirements as code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: Reliability is Bespoke and Ungoverned
&lt;/h2&gt;

&lt;p&gt;I've seen teams running identical technology stacks (the same Kubernetes clusters, the same Prometheus instances, the same on-call rotations) with completely different SLOs, metrics, and alerting strategies. Not because one approach was better than another, but because nobody told them what to implement.&lt;/p&gt;

&lt;p&gt;Services regularly move into production with SLOs being created months later, or never. Dashboards are missing, insufficient, or inconsistent. 'Looks fine to me' during PR reviews. Tribal knowledge. Varying levels of understanding across teams.&lt;/p&gt;

&lt;p&gt;We have version control for code. We have version control for infrastructure. Security has transformed with shift-left practices, finding vulnerabilities as code is written rather than after deployment. But reliability? Still fundamentally bespoke and ungoverned.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OpenSRM Looks Like
&lt;/h2&gt;

&lt;p&gt;OpenSRM (Open Service Reliability Manifest) is a declarative YAML specification for service reliability requirements. A manifest defines what 'production-ready' means for a service: its SLO targets, ownership, dependencies, and the contracts it makes with other services.&lt;/p&gt;

&lt;p&gt;Here's a basic manifest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yaml
apiVersion: opensrm.io/v1
kind: ServiceReliabilityManifest
metadata:
  name: checkout-service
  tier: critical
  template: api-critical

spec:
  type: api

  slos:
    availability:
      target: 0.9999
      window: 30d
    latency:
      p99: 200ms
      target: 0.995
      window: 30d

  ownership:
    team: platform-checkout
    slack: "#checkout-oncall"
    pagerduty: CHECKOUT_CRITICAL
    runbook: https://wiki.example.com/runbooks/checkout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The syntax is deliberately boring. The value isn't in clever YAML; it's in having a standard format that tooling can validate, generate from, and enforce.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contracts: Separating Internal Targets from External Promises
&lt;/h2&gt;

&lt;p&gt;One of the toughest problems in cross-team reliability is the gap between what a service measures internally and what it promises to others. Your payment service might target 99.995% availability internally (i.e. what you alert on), but only promise 99.99% externally (i.e. what dependent teams can rely on). OpenSRM makes this explicit with contracts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yaml
spec:
  contract:                           # What I promise to dependents
    availability: 0.9999
    latency:
      p99: 300ms

  slos:                               # Internal targets (tighter)
    availability:
      target: 0.99995                 # Buffer above contract
    latency:
      p99: 200ms                      # Headroom below contract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation eliminates a category of cross-team arguments. Your internal SLOs are your business. Your contract is what others can depend on. The specification makes the boundary explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependencies: The Math Nobody Does
&lt;/h2&gt;

&lt;p&gt;Returning to our checkout service example, with OpenSRM dependency expectations become declarative:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yaml
spec:
  dependencies:
    - service: auth-service
      critical: true
      expects:
        availability: 0.999
        latency:
          p99: 100ms

    - service: payment-gateway
      critical: true
      expects:
        availability: 0.9995
        latency:
          p99: 200ms

    - service: inventory-service
      critical: true
      expects:
        availability: 0.999

    - service: recommendation-engine
      critical: false              # Can degrade gracefully
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tooling can now do what humans consistently fail to do: validate that your targets are achievable given your dependency chain. If you promise 99.99% but your critical dependencies can only deliver 99.75% combined, the validation fails before you've made a promise you can't keep.&lt;/p&gt;

&lt;p&gt;This also creates an objective basis for architectural decisions. 'We need to improve auth-service reliability before checkout can hit its target' becomes a provable statement, not an opinion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Templates: Consistency at Scale
&lt;/h2&gt;

&lt;p&gt;If you have 200 services, you don't want 200 bespoke reliability definitions. OpenSRM supports templates that establish organisational defaults:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yaml
apiVersion: opensrm.io/v1
kind: Template
metadata:
  name: api-critical
spec:
  type: api
  slos:
    availability:
      target: 0.9999
      window: 30d
    latency:
      p99: 300ms
      target: 0.995
  ownership:
    oncall_required: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Services inherit from templates and override only what's different:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yaml
metadata:
  name: checkout-service
  template: api-critical
spec:
  slos:
    latency:
      p99: 200ms                   # Tighter than template default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is how you get consistency without rigidity. Platform teams define the standards; service teams customise where needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Gates: A New Kind of Service, A New Kind of SLO
&lt;/h2&gt;

&lt;p&gt;AI systems are increasingly deployed as 'gates' in production workflows: code-review bots that approve or reject PRs, content moderators that publish or flag content, fraud detectors that allow or block transactions.&lt;/p&gt;

&lt;p&gt;These systems can be available, fast, and return valid responses while consistently making terrible decisions. Traditional SLOs measure the system, not the judgment.&lt;/p&gt;

&lt;p&gt;OpenSRM introduces a new service type and new SLO categories for this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yaml
apiVersion: opensrm.io/v1
kind: ServiceReliabilityManifest
metadata:
  name: code-review-bot
spec:
  type: ai-gate

  slos:
    availability:
      target: 0.999
      window: 30d
    latency:
      p99: 45s
      target: 0.99

    judgment:                        # New category
      reversal_rate:
        target: 0.05                 # ≤5% of decisions overridden by humans
        window: 30d
        observation_period: 24h
      high_confidence_failure:
        target: 0.02                 # ≤2% confident-and-wrong
        window: 30d
        confidence_threshold: 0.9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reversal rate (i.e. how often humans override the AI's decision) is the key metric here. It requires no ground-truth labelling, no ML pipeline, no delayed evaluation. You just track 'AI said approve, human said reject.' This is measurable in production today.&lt;/p&gt;

&lt;p&gt;I'll be writing more about judgment SLOs in a follow-up, but the key insight is this: as AI systems take on more consequential decisions, we need SLOs that measure decision quality, not just system health.&lt;/p&gt;

&lt;h2&gt;
  
  
  NthLayer: The Reference Implementation
&lt;/h2&gt;

&lt;p&gt;OpenSRM is a specification. NthLayer is a tool that implements it.&lt;br&gt;
Given an OpenSRM manifest, NthLayer can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate the manifest against the schema&lt;/li&gt;
&lt;li&gt;Validate against declared dependencies&lt;/li&gt;
&lt;li&gt;Generate Prometheus alerting rules&lt;/li&gt;
&lt;li&gt;Generate Grafana dashboards&lt;/li&gt;
&lt;li&gt;Generate OpenSLO specifications&lt;/li&gt;
&lt;li&gt;Verify that declared metrics actually exist in your monitoring stack&lt;/li&gt;
&lt;li&gt;Gate deployments based on error-budget status
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash
$ nthlayer validate service.reliability.yaml
✓ Schema valid
✓ Dependencies resolvable  
✓ Targets achievable (99.75% ceiling from dependencies)

$ nthlayer apply service.reliability.yaml
Generated: prometheus-rules.yaml (12 rules)
Generated: grafana-dashboard.json
Generated: openslo-spec.yaml

$ nthlayer check-deploy --service checkout-service
✓ Deployment allowed
  - availability: 99.97% (target: 99.99%)
  - error budget remaining: 4.2 hours
  - no blocking incidents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is that 'is this service ready for production?' becomes a deterministic question with a checkable answer, not a subjective judgment call in a PR review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Now?
&lt;/h2&gt;

&lt;p&gt;SLOs have had nearly a decade to mature since the Google SRE handbook popularised them. GitOps has normalised declarative configuration. Platform engineering has emerged as a discipline. The concepts are ready, but the tooling has lagged behind.&lt;/p&gt;

&lt;p&gt;Meanwhile, AI systems are now being deployed into production faster than our reliability practices can adapt. We're still measuring AI services the same way we measure CRUD APIs, even though the failure modes are fundamentally different.&lt;/p&gt;

&lt;p&gt;OpenSRM is my attempt to codify what I've learned about reliability engineering into something others can use, extend, and contribute to. The specification is open. The reference implementation is open source. The goal is a standard that makes reliability engineering more consistent, more automated, and more adapted to the systems we're actually building.&lt;/p&gt;




&lt;p&gt;The OpenSRM specification is available at &lt;a href="//github.com/rsionnach/opensrm"&gt;github.com/rsionnach/opensrm&lt;/a&gt;.&lt;br&gt;
NthLayer, the reference implementation, is at &lt;a href="//github.com/rsionnach/nthlayer"&gt;github.com/rsionnach/nthlayer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm particularly interested in feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The judgment SLO model

&lt;ul&gt;
&lt;li&gt;Is decision reversal rate the right primary metric for AI gate quality, and what other signals matter?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Dependency validation

&lt;ul&gt;
&lt;li&gt;How should tooling handle partial dependency information, given that not everyone will have a complete service graph on day one?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Template inheritance

&lt;ul&gt;
&lt;li&gt;Is shallow merge the right model, or do teams need more sophisticated inheritance?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Star the repos, open issues, or tell me where I'm wrong. Reliability shouldn't be something we figure out in postmortems.&lt;/p&gt;




&lt;p&gt;Rob Fox is a Senior Site Reliability Engineer building open-source reliability tooling. Previously: &lt;a href="https://dev.to/rsionnach/shift-left-reliability-4poo"&gt;Shift-Left Reliability&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>observability</category>
      <category>specification</category>
      <category>sitereliabilityengineering</category>
    </item>
    <item>
      <title>Shift-Left Reliability</title>
      <dc:creator>Rob Fox</dc:creator>
      <pubDate>Mon, 12 Jan 2026 21:34:19 +0000</pubDate>
      <link>https://dev.to/rsionnach/shift-left-reliability-4poo</link>
      <guid>https://dev.to/rsionnach/shift-left-reliability-4poo</guid>
      <description>&lt;p&gt;We've become exceptionally good at incident response. Modern teams restore service quickly, run thoughtful postmortems, and hold themselves accountable through corrective actions.&lt;/p&gt;

&lt;p&gt;And yet…&lt;/p&gt;

&lt;p&gt;A team ships a change that passes every test, gets all the required approvals, and still brings down checkout for 47 minutes. The postmortem conclusion? "We should have known our latency SLO was already at 94% before deploying."&lt;/p&gt;

&lt;p&gt;Many postmortems point to the same root cause: changes we introduced ourselves. Not hardware failures. Not random outages. Just software behaving exactly as we told it to.&lt;/p&gt;

&lt;p&gt;We continue to treat reliability as something to evaluate once those changes are already live. This isn't a failure of tooling or process. It's a question of &lt;em&gt;when&lt;/em&gt; we decide whether a system is ready.&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%2Fjk0ji4myj0ridnenw5kk.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%2Fjk0ji4myj0ridnenw5kk.png" alt="Shift-Left Reliability" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The paradox
&lt;/h2&gt;

&lt;p&gt;We've invested heavily in observing and responding to failure - better alerting, faster incident response, thorough postmortems. Teams care deeply about reliability and spend significant time optimizing how they respond to incidents.&lt;/p&gt;

&lt;p&gt;But when in a service's lifecycle are they supposed to &lt;em&gt;define&lt;/em&gt; reliability? Where's the innovation that happens &lt;em&gt;before&lt;/em&gt; deployment?&lt;/p&gt;

&lt;h2&gt;
  
  
  Where reliability decisions actually happen today
&lt;/h2&gt;

&lt;p&gt;I've seen multiple teams running identical technology stacks with completely different SLOs, metrics, and alerts. Nobody told them what to implement, what's best-practice or how to tune their alerts. They want to be good reliability citizens, but getting from the theory in the handbook to putting that theory into practice is not straightforward.&lt;/p&gt;

&lt;p&gt;Services regularly move into production with SLOs being created months later - or never. Dashboards are missing, insufficient, or inconsistent. "Looks fine to me" during PR reviews. Tribal knowledge. Varying levels of understanding across teams.&lt;/p&gt;

&lt;p&gt;Reliability is fundamentally bespoke and ungoverned. That's the core issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  The missing layer
&lt;/h2&gt;

&lt;p&gt;GitHub gave us version control for code. Terraform gave us version control for infrastructure. Security has transformed with shift-left - finding flaws as code is written, not after deployment.&lt;/p&gt;

&lt;p&gt;We're still missing version control for reliability.&lt;/p&gt;

&lt;p&gt;We need a specification that defines requirements, validates them against reality, and generates the artifacts: dashboards, SLOs, alerts, escalation policies. If the specification is validated and the artifacts created, the same tool can check in real-time whether a service is in breach - and block high-risk deployments in CI/CD.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shift-left reliability actually means
&lt;/h2&gt;

&lt;p&gt;Shift-left reliability doesn't mean more alerts and dashboards, more postmortems or more people in the room.&lt;br&gt;
It means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spec - Define reliability requirements as code before production deployment&lt;/li&gt;
&lt;li&gt;Validate - Test those requirements against reality&lt;/li&gt;
&lt;li&gt;Enforce - Gate deployments through CI/CD&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Engineers don't write PromQL or Grafana JSON - they declare intent, &lt;br&gt;
and reliability becomes deterministic. Outcomes are predictable, &lt;br&gt;
consistent, transparent, and follow best practice.&lt;/p&gt;
&lt;h2&gt;
  
  
  An executable reliability contract
&lt;/h2&gt;

&lt;p&gt;Keep it simple. A team creates a &lt;em&gt;service.yaml&lt;/em&gt; file with their reliability intent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: payment-api
tier: critical
type: api
team: payments
dependencies:
 - postgresql
 - redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is a complete &lt;em&gt;service.yaml&lt;/em&gt; &lt;a href="https://rsionnach.github.io/nthlayer/getting-started/first-service/#complete-service-example" rel="noopener noreferrer"&gt;example&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tooling validates metrics, SLOs, and error budgets then generates these artifacts automatically. This is the approach I am exploring with an open-source project called NthLayer.&lt;/p&gt;

&lt;p&gt;NthLayer runs in any CI/CD pipeline - GitHub Actions, ArgoCD, Jenkins, Tekton, GitLab CI. The goal isn't to be an inflexible blocker; it's visible risk and explicit decisions. Overrides are fine when they're intentional, logged, and owned.&lt;/p&gt;

&lt;p&gt;When a deployment is attempted, the specification is evaluated against reality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ nthlayer check-deploy - service payment-api
 ERROR: Deployment blocked
 - availability SLO at 99.2% (target: 99.95%)
 - error budget exhausted: -47 minutes remaining
 - 3 P1 incidents in last 7 days

Exit code: 2 (BLOCKED)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why now?
&lt;/h2&gt;

&lt;p&gt;SLOs have had 8+ years to mature and move from the Google SRE Handbook into mainstream practice. GitOps has normalized declarative configuration. Platform Engineering has matured as a discipline. The concepts are ready but the tooling has lagged behind.&lt;/p&gt;

&lt;p&gt;This is a deliberate shift in approach. Reliability is no longer up for debate during incidents. Services have defined owners with deterministic standards. We can stop reinventing the reliability wheel every time a new service is onboarded. If requirements change, update the &lt;em&gt;service.yaml&lt;/em&gt;, run NthLayer and every service benefits from adopting the new standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not replace
&lt;/h2&gt;

&lt;p&gt;NthLayer doesn't replace service catalogs, developer portals, observability platforms, or incident management. It doesn't predict failures or eliminate human judgment. It's upstream of all these systems.&lt;/p&gt;

&lt;p&gt;The goal: a reliability specification, automated deployment gates and to reduce cognitive load to implement best practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open questions
&lt;/h2&gt;

&lt;p&gt;I don't have all the answers but two questions I keep returning to are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contract Drift:&lt;/strong&gt; What happens when the spec says 99.95% but reality has been 99.5% for months? Is the contract wrong, or is the service broken?&lt;br&gt;
&lt;strong&gt;Emergency Overrides:&lt;/strong&gt; How should they work? Who approves? How do you prevent them from becoming the default?&lt;/p&gt;
&lt;h2&gt;
  
  
  The timing problem
&lt;/h2&gt;

&lt;p&gt;Where do reliability decisions actually happen in your organization? What would it look like to decide readiness before deployment? What reliability rules do you wish you could enforce automatically?&lt;/p&gt;

&lt;p&gt;The timing problem isn't going away. The only question is whether you address it before deployment - or learn about it in the postmortem.&lt;/p&gt;



&lt;p&gt;NthLayer is open source and looking for early adopters. If you're tired of reliability being an afterthought:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install nthlayer
nthlayer init
nthlayer check-deploy --service your-service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;→ &lt;a href="https://github.com/rsionnach/nthlayer" rel="noopener noreferrer"&gt;github.com/rsionnach/nthlayer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star the repo, open an issue, or tell me I'm wrong. I want to hear how reliability decisions happen in your organization.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Rob Fox is a Senior Site Reliability Engineer focused on platform and reliability tooling. He's exploring how reliability engineering can move earlier in the software delivery lifecycle. Find him on &lt;a href="https://github.com/rsionnach/nthlayer" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>cicd</category>
      <category>platformengineering</category>
    </item>
  </channel>
</rss>
