Benchmarks / RCA Bench

Can AI find the commit that broke prod?

36Scenarios23Models2484Trials99%Top pass rateJul 27, 2026Updated

A monitor pages. p99 latency is up 20x, or pods are getting OOMKilled. Forty commits landed in the last three hours and someone flipped a feature flag. The on-call engineer has to find the one commit that did it, without getting fooled by the innocent deploy that landed thirty seconds before the graph went vertical. RootCauseBench asks whether an LLM can do that. Every model gets the same data and the same shell. We measure the reasoning, not the tooling.

Model ranking

kimi-k3
0.991
claude-opus-5
0.981
glm-5.2
0.981
claude-fable-5
0.968
gpt-5.6-sol
0.967
grok-4.5
0.963
fugu-ultra
0.952
claude-opus-4.8
0.944
deepseek-v4-flash
0.942
gemini-3.5-flash
0.935
gemini-3.1-pro-preview
0.925
claude-sonnet-4.6
0.917
gpt-5.5
0.917
kimi-k2-thinking
0.852
gpt-5.4
0.845
kimi-k2.5
0.815
gpt-5.4-mini
0.739
qwen3-235b-a22b-2507
0.643
gemini-3.1-flash-lite
0.518
gpt-oss-120b
0.465
claude-haiku-4.5
0.446
qwen3-32b
0.356
gpt-oss-20b
0.302
#ModelGraded reward (95% CI)Pass rateeasymediumhardadversarialno-code-cause
1kimi-k30.991 ± 0.01899%100%100%100%97%100%
2claude-opus-50.981 ± 0.02698%100%100%100%94%100%
3glm-5.20.981 ± 0.02698%100%100%100%94%100%
4claude-fable-50.968 ± 0.03296%100%100%94%94%100%
5gpt-5.6-sol0.967 ± 0.03396%100%100%100%89%100%
6grok-4.50.963 ± 0.03696%100%100%100%89%100%
7fugu-ultra0.952 ± 0.03994%100%100%94%89%96%
8claude-opus-4.80.944 ± 0.04394%100%100%97%86%100%
9deepseek-v4-flash0.942 ± 0.04394%100%96%94%89%83%
10gemini-3.5-flash0.935 ± 0.04794%100%100%92%89%88%
11gemini-3.1-pro-preview0.925 ± 0.04892%100%100%92%83%88%
12claude-sonnet-4.60.917 ± 0.05292%100%100%92%83%88%
13gpt-5.50.917 ± 0.05292%100%100%92%83%92%
14kimi-k2-thinking0.852 ± 0.06684%100%89%81%81%62%
15gpt-5.40.845 ± 0.06783%100%100%94%56%92%
16kimi-k2.50.815 ± 0.07481%100%96%78%69%58%
17gpt-5.4-mini0.739 ± 0.07669%78%89%78%42%88%
18qwen3-235b-a22b-25070.643 ± 0.08459%89%74%72%28%79%
19gemini-3.1-flash-lite0.518 ± 0.09149%100%59%50%28%25%
20gpt-oss-120b0.465 ± 0.08842%100%56%33%25%38%
21claude-haiku-4.50.446 ± 0.08941%78%41%44%28%29%
22qwen3-32b0.356 ± 0.08531%33%52%36%11%38%
23gpt-oss-20b0.302 ± 0.07522%56%30%22%8%54%

How graded reward is scored: 1.0 for naming the correct culprit commit; 0 for blaming an innocent deploy that just happened to land near the incident (the worst possible answer, because it sends the response team the wrong way); otherwise up to 0.5 partial credit when the commit is wrong but the diagnosis (failing service, blast radius, remediation) is right. Averaged over 108 trials with a 95% confidence interval; overlapping intervals mean the models are effectively tied.

Key finding

The v3 adversarial tier resolves the five-way tie at a perfect 1.000: kimi-k3 now leads at 0.991 graded, with claude-opus-5 and glm-5.2 at 0.981. The twelve new scenarios (guilty-looking decoys exonerable only by reading code semantics, beyond-context data volumes, degraded telemetry with clock skew and 1% trace sampling, and an abstention trap) land in the discriminating range by design: per-scenario pass rates across the field span 39% to 80%, so nothing is saturated and nothing is unsolvable. The no-code-cause column still measures confabulation resistance, and the tail still confabulates: gemini-3.1-flash-lite and claude-haiku-4.5 convict an innocent commit on most no-cause incidents.

Scenarios

ScenarioTypeWhat it tests
checkout-latency-n-plus-oneReal culpritAn added per-item catalog query inside the order loop spikes checkout p99 (N+1).
payment-nil-deref-panicReal culpritA missing nil-check on an optional 3DS field panics every charge.
inventory-connection-pool-exhaustionReal culpritInventory exhausts its pool, but the culprit is the shared DB client library.
recommendation-memory-leakReal culpritA package-level slice grows unbounded and OOMKills long after the deploy.
auth-jwt-validation-regressionReal culpritEvery service rejects tokens at once. The culprit is the shared JWT verify library.
cache-ttl-stampedeReal culpritA TTL change stampedes productdb minutes after the deploy.
frontend-race-condition-5xxReal culpritA removed mutex in the rate limiter races under load and throws 5xx.
grpc-deadline-too-tightReal culpritA tightened gRPC deadline on a catalog call starts failing slow requests.
unbounded-query-delayed-onsetReal culpritA deleted LIMIT clause makes a search query degrade as data grows.
logging-debug-disk-fillReal culpritA config flip to debug logging at full sample rate fills the disk.
search-mapping-query-breakReal culpritA renamed index field (title to name) breaks search queries.
dashboard-db-schema-missing-tableReal culpritCode queries a favorites table whose migration never shipped.
ai-agent-registration-missingReal culpritA bootstrap refactor deletes the agent-registration call at startup.
metric-ingestor-metadata-deserReal culpritA shared schema field rename (meta to metadata) breaks deserialization.
olapdb-tso-cas-retry-budgetReal culpritA shared TSO client drops its CAS retry budget, causing timeouts.
dynamodb-write-capacity-breachReal culpritA shared persistence-lib change drives writes past DynamoDB capacity.
transformer-dependency-startup-crashReal culpritA protobuf-runtime version clash crashes the transformer into CrashLoopBackOff.
bad-data-poison-recordNo code causeAn external partner feed sends one poison record. No commit. Answer: none.
upstream-payment-provider-outageNo code causeAn external Stripe outage, visible in the status feed. Answer: none.
cloud-region-impairmentNo code causeAn AWS S3 us-east-1 regional impairment. Answer: none.
dns-resolver-degradationNo code causeCluster DNS and upstream resolver degradation, not a commit. Answer: none.
tls-cert-expiryNo code causeThe payment service leaf certificate expired. Answer: none.
traffic-surge-flash-saleNo code causeA flash sale drives a 6x organic surge, not a regression. Answer: none.
noisy-neighbor-node-saturationNo code causeA batch pod lands on the node and starves its neighbors. Answer: none.
shared-config-pool-drainadversarialA guilty-looking decoy sits on the loud service; the real culprit is a de-fingerprinted shared-library pool refactor, provable only from derived evidence.
orders-index-migration-driftadversarialAn index-consolidation migration detonates roughly 40 hours after deploy; every recent deploy looks more guilty than the real one.
webhook-keepalive-default-flipadversarialThe culprit is a dependency bump that flips a keep-alive default; the failing service's own deploys are all innocent.
ingester-flush-interval-oomadversarialAn adaptive flush-scheduling change OOMs the ingester while the log patterns point somewhere else entirely.
notification-buffer-oom-silentadversarialThe failing service goes silent at onset: its own logs stop, and the comment-free culprit diff must be convicted on secondhand evidence.
session-cache-clockskewadversarialClock skew scrambles cross-service timestamps; ordering events correctly is the prerequisite to finding the eviction-change culprit.
config-fanout-sampled-tracesadversarialTraces are 1%-sampled; the per-record config-resolution culprit must be inferred from what sampling left behind.
catalog-cache-key-cardinalityadversarialBeyond-context: 307 commits and ~24MB of telemetry; only cache-key cardinality separates the culprit from cache-adjacent decoys.
ingest-partition-skewadversarialBeyond-context: 267 commits and >8MB of telemetry hiding a partition-skew culprit.
orders-fanout-nplusoneadversarialBeyond-context: 286 commits and >20MB of telemetry hiding an N+1 fanout.
report-scheduler-lock-removaladversarialBeyond-context: 259 commits and >8MB of telemetry; a removed scheduler lock.
payment-refund-poison-batchadversarialThe abstention trap: a malformed partner refund record is the trigger, not any commit. Saying "none" amid guilty-looking deploys is the only right answer.

Model-scenario matrix

Every model against every scenario. Toggle between pass rate, average cost, and average time per scenario to see which models handle specific failure patterns well, even when their overall score is lower. Hatched cells are scenarios a model never solved.

0%$0.0130s100%$1300s unsolved
payment-nil-deref-panic
dns-resolver-degradation
inventory-connection-pool-exhaustion
tls-cert-expiry
ai-agent-registration-missing
dashboard-db-schema-missing-table
dynamodb-write-capacity-breach
logging-debug-disk-fill
auth-jwt-validation-regression
checkout-latency-n-plus-one
frontend-race-condition-5xx
search-mapping-query-break
unbounded-query-delayed-onset
olapdb-tso-cas-retry-budget
noisy-neighbor-node-saturation
cloud-region-impairment
cache-ttl-stampede
ingester-flush-interval-oom
transformer-dependency-startup-crash
catalog-cache-key-cardinality
grpc-deadline-too-tight
session-cache-clockskew
traffic-surge-flash-sale
upstream-payment-provider-outage
webhook-keepalive-default-flip
config-fanout-sampled-traces
notification-buffer-oom-silent
recommendation-memory-leak
orders-fanout-nplusone
ingest-partition-skew
payment-refund-poison-batch
metric-ingestor-metadata-deser
orders-index-migration-drift
bad-data-poison-record
shared-config-pool-drain
report-scheduler-lock-removal
kimi-k3
glm-5.2
claude-opus-5
claude-fable-5
grok-4.5
gpt-5.6-sol
fugu-ultra
claude-opus-4.8
deepseek-v4-flash
gemini-3.5-flash
gpt-5.5
gemini-3.1-pro-preview
claude-sonnet-4.6
kimi-k2-thinking
gpt-5.4
kimi-k2.5
gpt-5.4-mini
qwen3-235b-a22b-2507
gemini-3.1-flash-lite
gpt-oss-120b
claude-haiku-4.5
qwen3-32b
gpt-oss-20b

Cost efficiency

Average API cost per scenario against pass rate. The dashed line is the Pareto frontier: the most cost-efficient models for a given level of accuracy. 2,484 runs cost $600.42 in total.

20%40%60%80%100%$0.003$0.029$0.26$2.31kimi-k3glm-5.2claude-opus-5claude-fable-5grok-4.5gpt-5.6-solfugu-ultraclaude-opus-4.8deepseek-v4-flashgemini-3.5-flashgpt-5.5gemini-3.1-pro-previewclaude-sonnet-4.6kimi-k2-thinkinggpt-5.4kimi-k2.5gpt-5.4-miniqwen3-235b-a22b-2507gemini-3.1-flash-litegpt-oss-120bclaude-haiku-4.5qwen3-32bgpt-oss-20bAverage cost per scenario (USD, log scale)

Speed vs quality

Average time per scenario against pass rate. The frontier shows the models that balance solution quality against how long they take to reason.

20%40%60%80%100%19s169s319s469skimi-k3glm-5.2claude-opus-5claude-fable-5grok-4.5gpt-5.6-solfugu-ultraclaude-opus-4.8deepseek-v4-flashgemini-3.5-flashgpt-5.5gemini-3.1-pro-previewclaude-sonnet-4.6kimi-k2-thinkinggpt-5.4kimi-k2.5gpt-5.4-miniqwen3-235b-a22b-2507gemini-3.1-flash-litegpt-oss-120bclaude-haiku-4.5qwen3-32bgpt-oss-20bAverage time per scenario (seconds)

What we measure

Given a frozen incident, the model writes a single JSON answer: the root-cause commit, the first failing service, the blast radius, and a remediation. Only one field gates pass or fail.

  • Graded reward (what the leaderboard ranks on): 1.0 for the right commit, 0 for blaming a decoy deploy, partial credit up to 0.5 for a correct diagnosis with the wrong commit.
  • Primary, binary: root_cause_commit must exactly match the ground-truth culprit SHA (a correct short prefix is accepted).
  • Commit messages are neutralized, so the model must reason from the diff, not the description.
  • Secondary, never fatal: first-failing-service, blast-radius overlap, remediation match, and whether the model fell for the innocent-deploy decoy.
  • Eight incidents have no code cause at all, including the adversarial tier's abstention trap. The correct answer is "none", which measures confabulation resistance.

How scenarios are built

Scenarios are fault injections on a real microservices app (a fork of Online Boutique) or reconstructions of representative production incident classes on a fictional platform. Each is a frozen window of alert, logs, metrics, traces, patterns, and full change context (commits, deploys, flags).

  • Author one regression commit (N+1 query, nil deref, pool exhaustion, memory leak) and surround it with dozens of innocent commits.
  • Plant an innocent deploy near onset to punish the "blame the latest change" heuristic.
  • Allow delayed onset, so the bad deploy can detonate minutes later.
  • Hand-label the ground truth and keep it out of the agent container.

Run it yourself

Requires Harbor, Docker, and an OpenRouter key. Re-score any published trajectory yourself, no API key needed.

git clone https://github.com/edgedelta/root-cause-bench.git
cd root-cause-bench

# put OPENROUTER_API_KEY=... in .env, then:
source .env && uv run harbor run -c configs/all-models-docker.yaml

# summarize a run into a per-model table:
uv run scripts/process_results.py jobs/<timestamp>

Put a real AI Teammate on call

Edge Delta's AI Teammates triage, investigate, and find root cause in your stack.