Benchmarks / Blast Radius Bench

Can AI reconstruct the failure chain?

17Scenarios31Models1581Trials65%Top pass rateSep 11, 2026Updated

A cascading incident hands you traces, metrics, logs, k8s events, and a service dependency graph. One service failed first. Its failure propagated along call edges, but in causal terms a slow callee backs up its caller, so propagation runs opposite to the request flow. The service that pages is usually the last victim at the edge, not the source. Can the model reconstruct the chain, or does it blame the loudest box and invert the arrows? This is a neutral benchmark of the models, not of any vendor's product.

Model ranking

gpt-6-astra
0.726
glm-5.2
0.678
fugu-ultra
0.675
gpt-5.5
0.672
gpt-5.6-sol
0.655
glm-5.3
0.654
gemini-3.1-pro-preview
0.653
muse-spark-1.3
0.639
claude-fable-5
0.637
gpt-5.4
0.632
muse-glimmer-30b
0.631
gpt-5.4-mini
0.626
qwen3.8-27b
0.623
claude-fable-5.1
0.612
muse-spark-1.2
0.605
claude-opus-5
0.603
grok-4.5
0.602
claude-sonnet-4.6
0.587
claude-opus-4.8
0.562
kimi-k3
0.556
gemini-3.5-flash
0.554
deepseek-v4.1-flash
0.550
deepseek-v4-flash
0.548
gemini-3.1-flash-lite
0.542
qwen3-235b-a22b-2507
0.496
kimi-k2-thinking
0.494
kimi-k2.5
0.465
gpt-oss-120b
0.340
qwen3-32b
0.301
claude-haiku-4.5
0.262
gpt-oss-20b
0.049
#ModelGraded reward (95% CI)Pass rateeasymediumhard
1gpt-6-astra0.726 ± 0.11465%100%75%58%
2glm-5.20.678 ± 0.11659%100%83%47%
3fugu-ultra0.675 ± 0.11661%100%100%44%
4gpt-5.50.672 ± 0.11761%100%100%44%
5gpt-5.6-sol0.655 ± 0.11857%100%75%47%
6glm-5.30.654 ± 0.11757%100%92%42%
7gemini-3.1-pro-preview0.653 ± 0.12359%100%58%56%
8muse-spark-1.30.639 ± 0.11855%100%83%42%
9claude-fable-50.637 ± 0.12057%100%83%44%
10gpt-5.40.632 ± 0.12357%100%75%47%
11muse-glimmer-30b0.631 ± 0.11953%100%67%44%
12gpt-5.4-mini0.626 ± 0.12053%67%75%44%
13qwen3.8-27b0.623 ± 0.11955%100%92%39%
14claude-fable-5.10.612 ± 0.12355%100%75%44%
15muse-spark-1.20.605 ± 0.12453%100%50%50%
16claude-opus-50.603 ± 0.12153%100%75%39%
17grok-4.50.602 ± 0.12253%100%75%42%
18claude-sonnet-4.60.587 ± 0.12553%100%58%47%
19claude-opus-4.80.562 ± 0.12047%100%75%33%
20kimi-k30.556 ± 0.11945%100%67%33%
21gemini-3.5-flash0.554 ± 0.12347%100%58%39%
22deepseek-v4.1-flash0.550 ± 0.11943%100%58%33%
23deepseek-v4-flash0.548 ± 0.11641%100%67%28%
24gemini-3.1-flash-lite0.542 ± 0.11637%100%67%22%
25qwen3-235b-a22b-25070.496 ± 0.12641%67%58%33%
26kimi-k2-thinking0.494 ± 0.12139%33%50%36%
27kimi-k2.50.465 ± 0.12339%33%50%36%
28gpt-oss-120b0.340 ± 0.12529%67%42%22%
29qwen3-32b0.301 ± 0.11320%0%25%19%
30claude-haiku-4.50.262 ± 0.11122%0%42%17%
31gpt-oss-20b0.049 ± 0.0574%33%0%3%

How graded reward is scored: 0 if the model names a downstream victim as the origin or claims causality in the wrong direction (the two errors that misdirect a real incident response); 0.5 plus up to 0.5 more for how much of the failure chain it recovers when the origin is right; small partial credit otherwise. Averaged over 51 trials with a 95% confidence interval; overlapping intervals mean the models are effectively tied.

Key finding

Honesty is the product: if a model does badly here, that is a finding, not a bug. This is the hardest bench of the three, and gpt-6-astra is the first model to pull clear of the pack: 0.726 graded and 65% pass, ahead of glm-5.2 (0.678) and the fugu-ultra and gpt-5.5 pair at 61%. Even so it clears only 58% of the hard tier, and its misses are bimodal: six scenarios at 0 of 3, every other one at 3 of 3. The whole field still collapses on the hard tier, because the cause is often a shared resource that is not an edge in the service graph, and the single most diagnostic error remains reversed causality: claiming a downstream victim caused an upstream service. The non-LLM baselines make the traps concrete: blaming the loudest service names a victim in 17 of 17 scenarios.

Scenarios

ScenarioTierThe trap
shared-postgres-saturationmediumThe edge gateway is loudest and pages, but is the last victim. The cascade fans out into a small tree, not a line.
retry-storm-amplificationhardAggressive client retries put the observed load spike on the caller. The true origin is the slow downstream. Reversed-causality trap.
noisy-neighbor-nodehardThree unrelated services fail at once with no call edge between them. The only link is the shared node, visible only in infra events.
fdb-tso-flink-cascadehardThe loud FlinkJobUnhealthy page is the last victim. The origin is the Timestamp Oracle's FDB timeouts four hops upstream.
backend-connectivity-cascadehardThe loudest 5xx is at the http-receiver edge. The origin is the backend whose write shard lost capacity.
shared-kafka-saturationmediumThe edge shows the traffic and latency spike, but it is backpressure from a downstream slow queue consumer.
disk-pressure-noisy-neighborhardThree services in three namespaces evicted at once. The only link is the shared node, and each victim has its own red herring.
shared-redis-evictionmediumDependents page loudest with 5xx. The origin's app logs are clean. The kubelet is killing it on a misconfigured probe.
memory-pressure-eviction-cascadehardQuery-failure 5xx loudest on platform-api. The chain starts with a node eviction, then a service cascade.
shared-dynamodb-throttlemediumRetry amplification makes the caller look like the epicenter. The origin is the throttled DynamoDB-backed memory store.
cdn-origin-overloadeasycdn-edge serves the customer-facing 5xx and pages, but origin-web CPU saturated first.
dual-independent-incidentsmediumTwo unrelated incidents fire in one window. Separate them instead of merging into one chain.
fan-in-quiet-downstreammediumA lock plus GC pause in feature-flags-svc backs up every caller that fans into it.
grpc-deadline-chainmediumThe deepest hop, pricing-svc, is slow. The loud timeouts are four hops up the gRPC chain.
mid-chain-cache-originmediumA cache-key format change collapses the hit ratio. The cache, not the db, is the origin.
shared-dns-resolver-degradationhardA CoreDNS config change degrades resolution. The link is shared DNS, not a call edge.
shared-nat-egress-saturationhardA shared NAT gateway saturates SNAT ports, so unrelated egress paths fail together.

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
fan-in-quiet-downstream
backend-connectivity-cascade
grpc-deadline-chain
retry-storm-amplification
noisy-neighbor-node
fdb-tso-flink-cascade
cdn-origin-overload
mid-chain-cache-origin
shared-kafka-saturation
shared-redis-eviction
dual-independent-incidents
shared-dns-resolver-degradation
shared-nat-egress-saturation
disk-pressure-noisy-neighbor
memory-pressure-eviction-cascade
shared-dynamodb-throttle
shared-postgres-saturation
gpt-6-astra
gpt-5.5
fugu-ultra
gemini-3.1-pro-preview
glm-5.2
gpt-5.4
claude-fable-5
gpt-5.6-sol
glm-5.3
qwen3.8-27b
muse-spark-1.3
claude-fable-5.1
claude-sonnet-4.6
gpt-5.4-mini
grok-4.5
claude-opus-5
muse-spark-1.2
muse-glimmer-30b
gemini-3.5-flash
claude-opus-4.8
kimi-k3
deepseek-v4.1-flash
qwen3-235b-a22b-2507
deepseek-v4-flash
kimi-k2-thinking
kimi-k2.5
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. 1,581 runs cost $298.59 in total.

0%20%40%60%$0.002$0.022$0.20$1.87gpt-6-astragpt-5.5fugu-ultragemini-3.1-pro-previewglm-5.2gpt-5.4claude-fable-5gpt-5.6-solglm-5.3qwen3.8-27bmuse-spark-1.3claude-fable-5.1claude-sonnet-4.6gpt-5.4-minigrok-4.5claude-opus-5muse-spark-1.2muse-glimmer-30bgemini-3.5-flashclaude-opus-4.8kimi-k3deepseek-v4.1-flashqwen3-235b-a22b-2507deepseek-v4-flashkimi-k2-thinkingkimi-k2.5gemini-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.

0%20%40%60%10s150s291s432sgpt-6-astragpt-5.5fugu-ultragemini-3.1-pro-previewglm-5.2gpt-5.4claude-fable-5gpt-5.6-solglm-5.3qwen3.8-27bmuse-spark-1.3claude-fable-5.1claude-sonnet-4.6gpt-5.4-minigrok-4.5claude-opus-5muse-spark-1.2muse-glimmer-30bgemini-3.5-flashclaude-opus-4.8kimi-k3deepseek-v4.1-flashqwen3-235b-a22b-2507deepseek-v4-flashkimi-k2-thinkingkimi-k2.5gemini-3.1-flash-litegpt-oss-120bclaude-haiku-4.5qwen3-32bgpt-oss-20bAverage time per scenario (seconds)

What we measure

The model writes failure_chain.json: the origin service, the directed propagation path, the root cause, and the blast radius. Reconstructing the chain means recovering the causal edges, which run opposite to the request flow.

  • Graded reward (what the leaderboard ranks on): 0 for blaming a victim or inverting causality, 0.5 plus chain-recall credit for a correct origin, small partial credit otherwise.
  • Primary, binary: the origin service must be correct AND the propagation path must recover enough of the true directed causal edges.
  • Secondary, never fatal: blast-radius overlap and a root-cause keyword check.
  • Reversed-causality count: how many edges the model inverted, claiming a downstream victim caused an upstream service. This is the single most diagnostic error in incident reasoning.

How scenarios are built

Three scenarios are fault injections on a real microservices demo; the rest are reconstructions of representative production incidents with fictional names. Each captures a 10 to 15 minute window spanning baseline, onset, and escalation, downsampled to a few KB so the agent can read everything.

  • Pin every service to a commit, then inject a fault tied to one culprit commit.
  • Keep the buried first signal among innocent noise, with an innocent deploy planted at onset.
  • Feature-flag changes appear only as decoys. In v1 the root cause is always a code change.
  • Hand-label the ground truth: origin, directed edges, root cause, and blast radius.

Run it yourself

Runs on the external Harbor harness. You can also point any agentic CLI (Claude Code, Codex, Cursor) at a scenario's /workdir.

git clone https://github.com/edgedelta/blast-radius-bench.git && cd blast-radius-bench
cp .env.example .env   # add OPENROUTER_API_KEY=...

source .env && uv run harbor run -c configs/leaderboard-v2-docker.yaml
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.