AI SRE benchmark

19 Kubernetes faults. 3 agents. Every trace public.

We break a small app on a kind cluster in known ways, hand each agent only the alert, and grade the root cause against the fault we injected. A judge model scores first, then a person checks every verdict. Misses are published with the hits. Arvo builds Aurora and wrote the scenarios; read the numbers with that in mind.

Auroracommit 87d22baf
89%
34 correct, 4 partial, 0 wrong or no answer, of 38 graded runs
median 154 s · $0.35 a run
bedrock/us.anthropic.claude-sonnet-5
HolmesGPT0.43.0
82%
31 correct, 6 partial, 1 wrong or no answer, of 38 graded runs
median 45 s
bedrock/us.anthropic.claude-sonnet-5
K8sGPT0.4.40
0%
0 correct, 21 partial, 17 wrong or no answer, of 38 graded runs
median 13 s
us.anthropic.claude-sonnet-4-5 (K8sGPT sends temperature, which Bedrock rejects for Sonnet 5)
#FaultAlert the agent receivesAuroraHolmesGPTK8sGPT
01Worker OOMKilled after a batch size changeKubePodCrashLooping
02Log shipper sidecar OOMKilled, app container healthyKubePodCrashLooping
03Frontend rollout stuck on a mistyped image tagKubeDeploymentRolloutStuck
04New api pods blocked on a Secret that does not existKubeDeploymentRolloutStuck
05Frontend crash loop from an invalid nginx configKubePodCrashLooping
06api restarts because the liveness probe targets the wrong portKubePodCrashLooping
07api Service selects no pods after a selector changeHighErrorRate
08Worker pod Pending, CPU request larger than any nodeKubePodNotReady
09api failing because redis is Pending on an unbindable PVCKubePodCrashLooping
10api crash loop from a wrong REDIS_HOSTKubePodCrashLooping
11frontend 5xx from a wrong api Service targetPort, next to a noisy but harmless workerHighErrorRate [critical] namespace=shop service=frontend
12Two faults at once, worker OOM and a frontend Service selecting no pods; the alert covers only the workerKubePodCrashLooping [warning] namespace=shop deployment=worker
13frontend 5xx because a NetworkPolicy blocks api to redisHighErrorRate [critical] namespace=shop service=frontend
14api rollout stuck because a ResourceQuota forbids the surge podKubeDeploymentRolloutStuck [warning] namespace=shop deployment=api
15One in three api requests fails because a stray Deployment's pods carry app=apiHighErrorRate [warning] namespace=shop service=frontend
16New api pods crash because their dnsConfig search domains are for another cluster domainKubePodCrashLooping [warning] namespace=shop deployment=api
17Worker OOMKilled every few minutes by a slow leak in its code; logs look cleanKubePodCrashLooping [warning] namespace=shop deployment=worker
18api rollout stuck on an init container waiting for a Service that does not existKubeDeploymentRolloutStuck [warning] namespace=shop deployment=api
19Half of frontend requests fail; one frontend pod loaded an edited ConfigMap, the other still runs the old configHighErrorRate [warning] namespace=shop service=frontend

How a run works

  1. kind v0.33.0, Kubernetes v1.37.0, 3 nodes. The shop app: nginx, a Python API, a worker, redis, a load generator. Synthetic, no customer code.
  2. One fault is injected with the scenario's break.sh; check.sh proves it is visible.
  3. Each agent gets the alert text (K8sGPT has no notion of an alert and scans the namespace). Aurora runs under its default read-only observability_only policy; HolmesGPT and K8sGPT got the cluster admin kubeconfig, and no transcript contains a mutating command.
  4. HolmesGPT ran through holmes ask with default toolsets and a 40-step cap it never reached; the lab has no Alertmanager, so holmes investigate was not used. Its own command allow-list blocked kubectl rollout history in 12 runs, the same problem Aurora's policy had in the first lab report.
  5. Correct means every must_identify item in the scenario is stated and no listed wrong answer is asserted. Judge: us.anthropic.claude-opus-5-5, then a person.

Every tool ran twice per scenario. Aurora's verdicts were checked by a person. HolmesGPT’s and K8sGPT’s were graded by the judge model, then re-graded from scratch by a second model. It agreed on all 38 HolmesGPT verdicts and disputed 6 K8sGPT labels, where K8sGPT only restated the symptom: the judge said partial or wrong, the reviewer said no answer. We kept the judge’s labels, and every grade file carries both opinions. No person has checked these 76 yet. Aurora's runs are from commit 87d22baf, before the three fixes the first lab report prompted; the six reruns on the fixed build are in the repo and not in this table.

What is not comparable: K8sGPT's row. Its analyzers flag objects and the model explains the flag, so it is scored on a criterion built for alert-driven investigators. It ran on Sonnet 4.5 because it sends a temperature parameter that Bedrock rejects for Sonnet 5; we did not try a proxy that strips it. Costs are recorded for Aurora only; HolmesGPT's token counts were not captured.

Rerun it, or add your agent

Everything is in Arvo-AI/aurora-lab: scenarios, the runner, every transcript and grade, and this table as results.json.

git clone https://github.com/Arvo-AI/aurora-lab && cd aurora-lab
./lab.sh up && ./lab.sh break 03-bad-image-tag
./runner/h2h.sh 03-bad-image-tag runs/mine

To put another agent on the board, open an issue titled "Benchmark: <agent>" with a script that takes the alert text and prints the root cause. We run it on all 19 faults and publish the result, whatever it is. Submit an agent.

Read the full write-up: lab report v1. Fix the faults yourself: runbooks, each with Aurora's real trace.

Results updated 2026-10-19. Scenario and tool versions are recorded with every run in the repo.