v0.2.0 on PyPI · AGPL-3.0 · zero ML dependencies

Your agent didn't crash.
It just quietly got worse.

Model updates, prompt edits, silent provider changes — none of them throw errors. dedrift catches the behavioral shift, tells you what moved and by how much, and points at the config change that did it.

Get started in minutes Watch a real catch
$ pip install dedrift
dedrift check — production agent, 18 canaries × 4 reps
$ dedrift check Current cycle: cycle-20260802T121457Z Sudden (vs rolling 2 cycles): DRIFT DETECTED Cumulative (vs golden 3 cycles): DRIFT DETECTED Alerts: 36 (q=0.05, materiality-gated) [golden] adversarial/semantic_displacement ks: effect=+0.972, p_adj=1.5e-08 [golden] adversarial/tokens_out ks: effect=+0.806, p_adj=6.6e-05 [golden] edge_case/latency_ms levene: effect=+4.734, p_adj=0.015 # attribution: model fingerprint change, 0.11 h before onset # consistent with the swap. nobody told it anything.
1.4%
measured null alert rate — 7 of 500 stable-agent checks, Wilson-bounded < 5% in CI
1 cycle
to catch a real silent model swap, on both baselines, correctly attributed
100%
of stable checks falsely flagged by the industry-standard PSI at canary scale — measured; dedrift refuses to compute it there
every
p-valued detector calibration-tested against a documented band, on every commit
Why agents need this

Observability catches crashes.
It doesn't catch character changes.

LLM systems fail differently: outputs stay well-formed while length, refusals, tool use, latency tails, and meaning quietly shift.

model@v2 → model@v3

Silent provider updates

The API alias stays the same. The model behind it doesn't. Nobody emails you.

git diff prompt.txt

Prompt & tool-schema edits

A colleague "improves" the system prompt. Refusal behavior moves 8 points. No test fails.

reindex --all

RAG & pipeline refreshes

New embeddings, new chunking, new retrieval order — same code, different agent.

How it works

A designed experiment, not a dashboard

Frozen canary prompts, run N times per cycle, compared as distributions — because single LLM runs are noise.

Freeze canaries

A versioned suite across six behavioral families: happy-path to adversarial.

Run N× per cycle

Every record carries a config fingerprint of your model, prompt, and tools.

Detect, gated twice

One primary test per channel → BH-FDR → materiality. Fewer, higher-confidence alerts.

Attribute

"Behavior shifted 0.1 h after the model fingerprint change" — consistent with, never caused by.

A real silent model swap: output tokens collapse after the swap; latency tails thicken
Proven on a real agent

We swapped the model.
Nobody told the detector.

Four cycles on one production model, then a silent switch to another — same prompt, same canaries.

  • First post-swap check: DRIFT DETECTED on both baselines
  • 36 gated alerts; output tokens D = 0.81, semantic shift D = 0.97
  • All alerts attributed to the fingerprint change, 0.11 h before onset
Read the case study Reproduce it ↗
The differentiator

Measured, not asserted

Monitoring tools love p-values and hate publishing their false-alarm rates. We enforce ours in CI — a release cannot ship if the statistics fail their own audit.

  • Every detector's null rate measured against a documented band
  • Pipeline-level: 7/500 stable checks alerted — Wilson bound < 5%
  • Limitations measured too: power tables, flag rates, all published
Read the statistics
Measured null false-alarm rate of every detector, with acceptance bands
Pricing

Open core, honestly priced

The statistics are free forever. The advanced tier funds the work.

Open source

$0
AGPL-3.0, forever
  • Full detector battery, FDR + materiality gating
  • Dual baselines, attribution, reports
  • Calibration suite — audit us
  • Runs on a laptop: JSONL + SQLite
pip install dedrift

Design partner

Free
for teams running production agents
  • Hands-on setup on your agent
  • Canary suite designed for your failure modes
  • A statistician reading your drift reports
  • Priority input on the roadmap
Apply →

A commercial tier with advanced inference is in development — write to us to hear when it ships.

Principles

The bar we hold ourselves to

calibration ∈ CI

No unmeasured claims

If a number carries a p-value, the simulation proving its false-alarm rate runs on every commit. A release that fails its own audit doesn't ship.

significant ∧ material

Alerts must earn it twice

FDR-controlled significance and an effect worth acting on. Statistically real but practically trivial doesn't page you — alert fatigue kills monitoring.

power(2pp) ≈ 0.11

We publish what we can't detect

Small suites have limited power, and the docs show that math instead of hiding it. Overclaiming is just drift of another kind.

Don't take our word for any of it — audit the statistics.