Assevra

Open source · release evidence for AI agents

Trust your AI agents.
Let's prove it.

Assevra turns agent test runs into signed, statistically defensible scorecards that gate every release. Not a dashboard behind a login — one portable artifact you commit, attach to a PR, and can still verify a year later.

pip install assevra && assevra demo

A complete worked scorecard in two commands — no clone, no API key, no network.

  • MIT licensed
  • Python 3.10+
  • zero-dependency core
  • runs fully offline
  • DOI 10.5281/zenodo.21200852
Assevra Reliability Scorecard
Overall · PASS
DimensionScore95% CInResult
Groundingllm-judge0.940.87–0.9780PASS
Safety / refusalllm-judge1.000.94–1.0060PASS
PII-leakdeterministic1.000.95–1.0072PASS
Tool callsdeterministic0.980.93–0.9996PASS
Prompt injectiondeterministic1.000.92–1.0044PASS
signed · Ed25519 · verifiable offline
Speaks the language of your security review
  • EU AI Act
  • NIST AI RMF
  • ISO/IEC 42001
  • OWASP LLM Top 10

The difference

Most eval tools ask “how good is my model?”

Assevra asks the only question a release meeting cares about: can I safely ship this agent? Everything below follows from that one change of question.

A signed artifact, not a dashboard

One self-contained file — Markdown, JSON, and styled HTML — that you commit to git, attach to a PR, or mail to a reviewer. Sign it with Ed25519 so anyone can verify it was produced by you and never altered.

assevra sign · verify

Honest error bars, on every number

A bare "0.92" hides how few samples it came from. Every dimension carries its sample size and a 95% Wilson interval — and on a small dataset that width is the honest statement of what the number can support.

95% Wilson CI

Deterministic before judge

You scan for a leaked SSN; you do not ask a model whether it leaked one. Seven of the nine dimensions are rules — so most runs are free, reproducible, and identical on every machine, including a fork with no secrets.

7 of 9 need no model

Skipped is never passed

A dimension whose engine was unavailable is reported as SKIPPED and does not gate. It is the semantic that stops a build staying green for three months after CI quietly lost its API key.

fails closed

A published artifact contract

The scorecard, Agent Card, calibration report and dataset row all have versioned JSON Schemas served from this domain. Within major version 1, fields are only ever added — never removed or repurposed.

schema/v1

Any model vendor, or none

Anthropic, OpenAI, Azure, Bedrock, Gemini — or any OpenAI-compatible local endpoint, with no third-party package and no data leaving the machine. A jury can span vendors, and disagreement is reported as signal.

7 judge providers

Five minutes

Installed to gated, without reading a manual

The demo dataset ships inside the package, so the first artifact you see is real output from the real engine — not a screenshot.

  1. 1
    pip install assevra

    Zero-dependency core. No account, no backend, nothing to log into.

  2. 2
    assevra demo

    A complete worked scorecard — HTML, JSON, Agent Card — with no clone, no API key and no network.

  3. 3
    assevra init --from traces.jsonl

    Detects your traces, framework and providers, then writes the config, a drafted dataset and a CI gate.

  4. 4
    assevra run --gate

    Scores, gates the build, and writes the artifact you attach to the release.

How it works

From traces you already have to evidence you can defend

Six commands, no backend. Deterministic where it can be, judged where it must be, and always reporting the interval — not just the mean.

  1. 1bootstrap

    Draft a dataset from traces you already have

  2. 2validate

    LABELED / UNLABELED / INVALID — before scoring

  3. 3run

    Score every dimension, with its interval

  4. 4calibrate

    Prove the judge agrees with humans (κ ≥ 0.85)

  5. 5sign

    Seal the scorecard with Ed25519

  6. 6attest

    Map the evidence to governance frameworks

What it measures

Nine dimensions, each with a threshold and an interval

The verdict is a conjunction — one leak sinks the run. Every dimension ships a definition, a scoring method, a stated threshold, a confidence interval, and a stated limit.

Grounding

llm-judge

Is every factual claim traceable to the provided context, or invented?

≥ 0.90

Safety / refusal

llm-judge

Does it refuse what it must — and answer what it should? Over-refusal is a failure too.

1.00 · zero tolerance

PII-leak

deterministic

Does personal data escape into an output, outside the field it was sanctioned to echo?

1.00 · zero tolerance

Task-completion

deterministic

Are the facts a correct completion requires actually present?

≥ 0.90

Tool-call validation

deterministic

Was every call well-formed, permitted, and complete — arguments, types, enums and all?

≥ 0.95

Action correctness

deterministic

Did it do the right thing? A perfect refund call is still a catastrophe if it should have escalated.

≥ 0.95

Prompt injection

deterministic

Did it resist instructions planted in retrieved content, tool output, or another agent?

1.00 · zero tolerance

Cost budget

deterministic

Did each run stay inside its cost budget? Priced from your table, not guessed.

≥ 0.95

Latency budget

deterministic

Did each run finish in time? Reported as a pass rate with p50/p95, because averages hide the tail.

≥ 0.95

Plus pass^k and run-to-run consistency over repeated trials. A dimension scoring 0.667 with consistency 0.000 is not a quality problem — it is an agent that never behaves the same way twice, and that needs a different fix.

In your build

Gate the release, not a dashboard

One step. It validates the dataset, scores it, writes a summary and the failing rows to the job summary, uploads the artifacts, and fails the build when a dimension drops below its threshold.

The env: block is optional. Without a key, the deterministic dimensions still gate and the judged ones report as SKIPPED — never as passing. That is what lets a pull request from a fork get a real signal instead of a red build.

CI & the GitHub Action →
- uses: assevra/assevra@v1
  with:
    dataset: evals/agent.jsonl
    gate: true
    strict: true
    attest: true
  env:
    ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

Fits what you already run

Assevra does not run your agent — it scores what you captured

That boundary is why it works with every framework instead of competing with them. One command prints the wiring for the tool you already use.

OpenTelemetryOpenInference & OpenLLMetry spans
LangGraphstate + tool calls
Langfuseobservation export
Arize PhoenixOpenInference spans
OpenAI Agents SDKrun traces
AnthropicMessages API logs
$ assevra integrate langgraph

Judge providers

  • Anthropic
  • OpenAI
  • Azure
  • Bedrock
  • Gemini
  • Local / self-hosted

A local OpenAI-compatible endpoint needs no third-party package and sends nothing off the machine.

All integrations →

Verifiable evidence

Signed, so a reviewer can trust it

A shared HTML file is convenient; a signed one is evidence. Pin the maintainer's public key to confirm a scorecard was produced by them and not altered — verification fails if a single byte changed.

Security & signing →
Maintainer signing key · Ed25519dEcTKT/9ThXewTjRdBm2qyGIH69Ghy08kVuB19AJnSg=
$ assevra verify \
  --scorecard scorecard.json \
  --signature scorecard.sig.json \
  --public-key <key>

Prove your agent behaves — and hand someone the receipt.

Install once, run offline, commit the artifact. No backend, no login, MIT-licensed.

Cite Assevra

Divi, Veera Ravindra. Assevra: A Reliability Scorecard for LLM Agents, v0.4, 2026.

DOI 10.5281/zenodo.21200852