SafeActionBench

How often does an AI agent's proposed production action make things worse, and how much does an independent guard prevent? 224 replayed incidents (112 dev, 112 held out) with red herrings, missing data and prompt injection, scored deterministically. Any MCP agent can take it.

Leaderboard: dev split

SystemHarmful, as proposedHarmful, after the system's own checksHarmful, behind the reference guardFix rateFix rate, guardedEscalates when it shouldInjection attacks followed, as proposedGood fixes the guard blocked
Symptom-matching reference agent agent
safeactionbench baseline symptom-agent --split dev · 2026-10-24
0.0%0.0%0.0%95.7%94.6%100.0%0.0%1
Sentinel agent, rule baseline (no LLM) agent
evals/rca/results/scripted.json · 2026-10-24
0.0%0.0%0.0%82.6%81.5%100.0%0.0%1
gemma4 8B (Ollama) in Sentinel's agent, with runbook preconditions agent
evals/rca/results/ollama.json · 2026-10-20
33.9%0.0%0.0%45.6%45.6%100.0%50.0%0
Always escalate baseline
safeactionbench baseline always-escalate --split dev · 2026-10-24
0.0%0.0%0.0%0.0%0.0%100.0%0.0%0
gemma4 8B (Ollama) in Sentinel's agent, first guardrails agent
evals/rca/results/ollama-before-preconditions.json · 2026-10-20
33.9%11.6%0.0%45.6%45.6%45.0%50.0%0
gemma4 8B (Ollama), the model's own proposals with no agent-side checks agent
evals/rca/results/ollama.json (raw proposals) · 2026-10-20
33.9%33.9%0.0%45.6%45.6%35.0%50.0%0
Always restart (the 3 a.m. reflex) baseline
safeactionbench baseline always-restart --split dev · 2026-10-24
83.0%83.0%0.0%20.6%20.6%0.0%75.0%0
Always roll back baseline
safeactionbench baseline always-rollback --split dev · 2026-10-24
85.7%85.7%0.0%17.4%17.4%0.0%100.0%0

Held-out test split

SystemHarmful, as proposedHarmful, after the system's own checksHarmful, behind the reference guardFix rateFix rate, guardedEscalates when it shouldInjection attacks followed, as proposedGood fixes the guard blocked
Symptom-matching reference agent agent
safeactionbench baseline symptom-agent --split test · 2026-10-24
0.0%0.0%0.0%95.7%93.5%100.0%0.0%2
Sentinel agent, rule baseline (no LLM) agent
evals/rca/run.py --scenarios scenarios-holdout.jsonl · 2026-10-24
0.0%0.0%0.0%82.6%80.4%100.0%0.0%2
Always escalate baseline
safeactionbench baseline always-escalate --split test · 2026-10-24
0.0%0.0%0.0%0.0%0.0%100.0%0.0%0
Always restart (the 3 a.m. reflex) baseline
safeactionbench baseline always-restart --split test · 2026-10-24
83.0%83.0%0.0%20.6%20.6%0.0%75.0%0
Always roll back baseline
safeactionbench baseline always-rollback --split test · 2026-10-24
85.7%85.7%0.0%17.4%17.4%0.0%100.0%0

How to read it

Take it

pip install "safeactionbench @ git+https://github.com/abdulmdev/sentinel-incident-copilot#subdirectory=bench"
safeactionbench serve --split dev --out predictions.jsonl     # an MCP server: point your agent at it
safeactionbench score predictions.jsonl --split dev

Or write predictions directly (one JSON object per incident: {"id", "action", "target"}). Submit a result by pull request: add bench/results/<name>.json with your predictions; the page is regenerated from them.