Conformance
Verify what your AI agent did — not what it said.
Conformance injects deliberate faults at your agent's effect boundary (a redelivered queue event, a crash mid-write, a withheld approval, a raced turn), records what actually happened, and evaluates nine deterministic invariants over that record. No language model judges anything. Every finding comes with a content-addressed witness a sceptic can re-derive offline, without you.
$ conformance verify --scenario shipbot --seed 17
seed 17 · spec conformance-1.0 · 8 schedule(s) run
✕ 1 custody VIOLATED wit_05b69e04ec177d5209056ab82d
⚠ 2 one-advance inconclusive (no attachment point for staged_race…)
⚠ 3 no-scarce-hold inconclusive (no pool acquisitions in record…)
✕ 4 quarantine VIOLATED wit_5fde8bf97de2a976d8a57fbd21
✕ 5 exactly-once-effect VIOLATED wit_d223f1f2cfec1b7eca4e89552a
⚠ 6 plan-identity inconclusive (needs its own recording…)
⚠ 7 timeout-equals-cancel inconclusive (no attachment point for delay_response…)
⚠ 8 structural-authority inconclusive (no attachment point for withhold_approvals…)
⚠ 9 state-separation inconclusive (no database schema discoverable…)
Result
Level Achieved: —
Target: L1 (DURABLE)
Depth: V2 (DETERMINISTIC)
Gate: FAIL
Every invariant returns hold, violated, or inconclusive.
inconclusive is never styled as a pass and never counts toward a
level: unmeasured is not passed. That is the whole design.
Install
pip install conformance # or: uv tool install conformance
Python 3.12+. No account, no API key for verification, nothing uploaded.
Start where you are
conformance init # detect the stack, find effect sites, run static checks
conformance doctor --explain-depth # what each invariant needs to be decidable
conformance verify --path . # V0 verdicts, no instrumentation required
init needs no SDK, no credentials, and no network. It reports what it
found and — for anything it cannot decide at this depth — exactly what
would decide it.
Going deeper: record once, verify forever
Declare a scenario naming an entrypoint that runs one bounded episode of your agent, then:
conformance record --scenario myagent --seed 1 # your key, your machine, once
conformance verify --scenario myagent --seed 1 # sealed, offline, byte-deterministic
Your credentials are used exactly once. Everything after that runs against the captured cassette: CI needs no model key and no network. A cassette miss is a loud failure (exit 3) — never a live call, never a guess.
Same commit, same seed, same cassette produces identical verdict bytes and identical witness ids: 1,000 out of 1,000 runs on the crash schedules, Wilson 95% CI ≤ 0.38% flake.
Checking a finding
A violation produces a witness. Export it and it becomes a file anybody can check, offline, without trusting this tool:
conformance export <witness-id>
conformance replay <witness-id> # re-derives the verdict from the evidence
Editing the evidence breaks its content address and replay refuses.
In CI
- run: pip install conformance
- run: conformance ci --scenario myagent --seed 1 --level-target L1
A violation of an invariant your target level requires fails the check. Exit codes: 0 pass, 1 gate fail, 2 cannot execute, 3 fail-closed breach.
Depth, honestly
| Depth | What it needs | What it decides |
|---|---|---|
| V0 | nothing | discovery, configuration, invariant 9 |
| V2 | SDK attached + a recorded cassette | all nine, under fault |
Most systems start and stay useful at V0. Moving to V2 means
instrumenting the effect boundary — usually a single keyword argument
if your effects are HTTP. conformance doctor --scenario <name> --explain-depth lists the exact step per invariant.
Documentation
- Onboarding walkthrough — install to sealed verdict
- Worked examples — manual, HTTP, LangGraph, and CI
- CLI reference
- The specification
- CHANGELOG — including what is knowingly incomplete
Apache-2.0.
Metadata
Release files for conformance 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| conformance-0.1.0.tar.gz | 82.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| conformance-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 181.7 kB
Release files / conformance-0.1.0.tar.gz
| Download URL | conformance-0.1.0.tar.gz |
|---|---|
| Size | 82.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
02ea1409cdf0372824c5e4ff818c519e766959c4ee627ba6d100e0658c6187d7
|
|
BLAKE2b-256 checksum How to use checksums |
87f9c91ac21635c449b356d66f082b181973131ec66b9e26e028b7f1dff7db58
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.25 {"installer":{"name":"uv","version":"0.9.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / conformance-0.1.0-py3-none-any.whl
| Download URL | conformance-0.1.0-py3-none-any.whl |
|---|---|
| Size | 99.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
753a9eeff09982bc5b020d96b28814ffad0b36c549f03e16ee2d27e390f425a1
|
|
BLAKE2b-256 checksum How to use checksums |
38e3d5975ef7d3ef1c1da5cd1334332318a9dd45ed0b610913fae1b1f0ade839
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.25 {"installer":{"name":"uv","version":"0.9.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|