AI SafetyOpen SourceInspect · Next.js · Live

Measure what a frontier model will do under pressure.

VeriGrad RL is an open-source toolkit and benchmark for model propensities: sycophancy, spec-gaming, reasoning faithfulness. Install it, run the probes through Inspect against any provider, or try a live model in the browser below.

CIMITPythonInspect adaptertestsstars
Sycophancy spread
2Task domains
κ 0.95Grader validated
0Errors across runs

Get started · 60 seconds

Install and run it

A pip-installable Python package (verigrad CLI + library) plus this Next.js app. The RL baseline runs offline; the propensity benchmark calls real models and reads ANTHROPIC_API_KEY from your environment.

install.sh
# clone + install (editable) for Python 3.10+
git clone https://github.com/aravinds-kannappan/VeriGrad-RL
cd VeriGrad-RL
pip install -e ".[llm,inspect]"
run.sh
# runs offline in seconds: verifiable-reward RL, no API key
verigrad train --episodes 400 --env arithmetic
 
# the propensity benchmark on real frontier models
export ANTHROPIC_API_KEY=sk-ant-...
verigrad propensity --smoke # 3 problems, ~$0.01 (sanity check)
verigrad propensity --tasks 150 # the full leaderboard run

Use it as a library

The probe templates and deterministic detectors are importable. Render a prompt, call any model yourself, and score the response reproducibly.

probe.py
from verigrad_rl.integrations import (
build_pressure_samples, label_response, safe_behavior,
)
 
# real GSM8K problems rendered under a confident, wrong reviewer
samples = build_pressure_samples("authority_wrong", n_tasks=150, seed=7)
 
# call any model on samples[i].prompt, then score deterministically:
labels = label_response("authority_wrong", model_text,
samples[0].gold, samples[0].anchor)
held = safe_behavior("authority_wrong", labels) # True == did not cave

What’s in the box

A benchmark, a baseline, and the plumbing to trust both

🎯

Propensity benchmark

Answer Under Pressure: deference, spec-gaming, and robustness on real GSM8K + CommonsenseQA. Measures what a model will do, not just what it can.

🔌

Inspect AI adapter

Run every probe through UK AISI's Inspect against Anthropic, OpenAI, Google, or a local model behind vLLM/Ollama. One flag swaps the vendor.

📈

Scales to a program

Content-addressed, resumable runs with a hard cost ceiling, item-clustered CIs, and Benjamini–Hochberg FDR correction across domains.

🔬

Automated circuit discovery

A dependency-free ACDC + path-patching implementation (Conmy 2023; Goldowsky-Dill 2023) that finds the safety circuit on a transparent substrate, validated against a known answer key.

We test the ruler

Cohen's κ dual-labeling on every grader. The cross-check already caught a real bug in our own detector before it reached the report.

🧪

RL-from-verifier baseline

A transparent policy-gradient loop on verifiable rewards. Runs offline in seconds, no GPU, every number reproducible from a seed.

Interactive · live model calls

Probe a model under pressure

Pick a real GSM8K problem (or edit it), choose a model and how hard a wrong “authority” pushes back, then run it against a real model. The verdict (did it hold or cave?) is computed from the live response.

real GSM8K problem (editable)

Calls run server-side via a Next.js route; enable them by setting ANTHROPIC_API_KEY in the deployment. The rest of the site works without a key.

The core finding

Capability is nearly tied. Trustworthiness is not.

Three frontier models, 150 real GSM8K problems each, under three framings.

Capability (control accuracy) vs.
0%5%10%15%20%25%95%96%97%control accuracy (capability)sycophancy rate (lower is safer)opus-4.8sonnet-4.6haiku-4.5
Capability vs. propensity. All three cluster near 96% accuracy (a near-vertical band), yet spread up to ~9x on sycophancy. Hover a model for its numbers; toggle the axis to compare sycophancy and deference. The two dimensions are nearly orthogonal.
ModelControl accuracyDeference ↓Sycophancy on solved ↓Spec-gaming ↓Cost
opus-4.896.7%2.7%2.1% [0.7, 5.9]0.0%$1.78
sonnet-4.696.7%20.0%17.9% [12.5, 25.0]0.0%$1.56
haiku-4.595.3%10.7%9.1% [5.4, 14.9]0.0%$0.66
Headline. Sonnet 4.6 and Opus 4.8 are statistically tied on capability, but Sonnet abandons a correct answer under a wrong reviewer 17.9% of the time versus Opus’s 2.1%: a ~9× gap with non-overlapping confidence intervals.

Open source · interoperable

Built to live in the safety-eval ecosystem

The probes are tiny and provider-neutral on purpose, so other people’s harnesses can drive them. The flagship is a real Inspect AI adapter: the same deterministic detectors, now against any model Inspect can reach.

inspect.sh
pip install "verigrad-rl[inspect]"
 
# the SAME probes, against any Inspect provider; one flag swaps the vendor
inspect eval verigrad_rl/integrations/inspect_task.py@deference \
--model anthropic/claude-sonnet-4-6
inspect eval verigrad_rl/integrations/inspect_task.py@deference \
--model openai/gpt-4o

Shipped integrations

Patterned after · compatible by design

Conventions VeriGrad deliberately mirrors so it slots into a real safety-eval workflow. Listed honestly as influences and interop targets, not bundled adapters.

Full details in the Integrations docs.

Interactive · runs in your browser

Train a model on the data, live

No server, no pre-baked numbers. These widgets run real computation in your browser on the 648 logged samples from the cross-domain run.

What drives deference? Logistic regression, trained in-browser

Gradient descent fits P(defer) from four features of the real run (648 samples, 47 deferred). Watch it train, read the learned coefficients, then predict on any combination.

converged log-loss n/a · trained on 648 real samples

Learned coefficients standardized · + = more deference

authority intensity
+0.00
is Sonnet 4.6
+0.00
is Haiku 4.5
+0.00
is CommonsenseQA
+0.00

Predict P(defer) for any combination

50.0%

The κ paradox: why raw agreement lies for rare behaviors

Two independent graders label items where the true behavior occurs at a chosen base rate. Drag the rate down and watch Cohen’s κ collapse while raw agreement stays high. That is the trap that hid our spec-gaming detector bug.

raw agreement
96.1%
Cohen’s κ
0.25

Raw agreement looks great, but κ has collapsed. The behavior is too rare to validate. This is exactly the trap that hid the spec-gaming detector bug.

Scales to a research program

Across domains, providers, and an elicitation gradient

Deference under escalating authority pressure across domains
Elicitation gradient. Deference under escalating authority, per model, across two domains. Cross-domain run: 648 samples, $1.74.
ModelGSM8K · L1GSM8K · L3CSQA · L1CSQA · L3
opus-4.80.0%13.9%2.8%2.8%
sonnet-4.60.0%8.3%8.3%22.2%
haiku-4.50.0%16.7%8.3%47.2%
Provider-agnostic by design. The native runner targets Anthropic; the Inspect adapter lifts that ceiling so the same probes produce a cross-vendor leaderboard. Runs are content-addressed and resumable with a hard cost ceiling. See the Scaling docs.
FDR correction changes a conclusion. On CommonsenseQA, Haiku-vs-Sonnet (47% vs 22%) is significant at raw p = 0.026 but not after Benjamini–Hochberg (q = 0.052). And the model ranking differs across domains: a propensity measured on math doesn’t cleanly transfer.

Why models cave

Social, not cognitive

When a model abandons the correct answer, did its reasoning already compute it and then cave (override), or did the pressure corrupt the computation (anchored)? Across the lineup, ~90% is override. The model knew, and threw it away.

Override versus anchored reasoning
Override dominates. Two independent signals classify each case and agree at 94%.
ModelDeference casesOverrideAnchoredOverride share
opus-4.843175.0%
sonnet-4.63028293.3%
haiku-4.51614287.5%

White-box · automated circuit discovery

Find the safety circuit automatically

Behavior tells you a model caved; mechanism tells you which components did it. VeriGrad ships a dependency-free implementation of ACDC (Conmy et al., NeurIPS 2023) and path patching (Goldowsky-Dill et al., 2023), run on a transparent safety circuit with a known answer key, so the discovery is validated, not just asserted.

Discover the safety circuit, live

This runs the real ACDC + path-patching algorithm in your browser on the transparent safety DAG. Drag the threshold: a higher tau prunes more aggressively, the paper’s precision/recall knob. Solid teal edges are kept; dashed are pruned.

edges kept 8/13 · faithfulness KL 0.009 · sparsity 38%
harmjailbreaktopicrefusal_cuenoisethreatbenignguardrefuse_logitanswer_logit

Same code path as verigrad circuit: the harm-detection then guard then output pathway survives, while edges out of the constant inputs (refusal_cue, noise) carry no information and get pruned.

circuit.sh
# automated circuit discovery on a transparent safety circuit
verigrad circuit --target safety-dag --tau 0.02
# -> benchmark/circuits/{REPORT.md, fig_circuit.svg}
 
# run the same method on the RL environment's actual reward model
verigrad circuit --target toy-circuit
Validated, not asserted. Because the circuit is white-box it has a known answer key, so tests/test_acdc.py checks the core pathway is recovered, that information-free edges are pruned, and that precision/recall move with the threshold exactly as the ACDC paper predicts. Method in the Circuit discovery docs; every paper behind VeriGrad is mapped in References.

Is the ruler trustworthy?

We test our graders

LabelCohen’s κRaw agreementnVerdict
Correctness0.9599%450validated
Deference0.9799%150validated
Spec-gamingn/an/a1500 positives (nothing to validate)
The cross-check caught a bug in our own ruler. An earlier spec-gaming detector flagged 3 “positives” the judge unanimously rejected: all three the same clock-time answer, “2:00 PM”, misread as two numbers (κ = 0.00 despite 98% raw agreement). After the fix, true spec-gaming is 0/150.