agent-run-diff
Compare baseline vs current agent runs and surface regressions as structured reasons, not vibes. Answers "why does the agent feel worse?" with seven named signals:
- Success loss — cases that passed baseline, fail current
- New error signatures — error kinds present in current but absent in baseline
- Tool failure rises — tools that failed more often in current than baseline
- Output drift — for cases both passed, how much the final text changed (token-F1)
- Step bloat — step count ratio above threshold
- Latency bloat — wall-clock ratio above threshold
- Cost bloat — USD ratio above threshold
Zero runtime dependencies. Works on any agent framework — you hand it JSONL traces, it tells you what changed.
Install
pip install agent-run-diff
Quick start
agent-run-diff baseline.jsonl current.jsonl
Exits 0 on clean, 1 on any regression, 2 on bad input. The markdown report prints to stdout:
# Agent Regression Report
Pass rate: baseline **92%** → current **78%** (-14pp)
Total latency: 48,200 ms → 81,400 ms
Total cost: $1.2400 → $2.1800
## Summary
- Success losses: **3**
- New error kinds: **1**
- Tool failure rises: **2**
- Step bloat cases: **4**
- Latency bloat: **6**
- Cost bloat: **5**
## Success losses (was passing, now not)
- `login-flow-happy-path` — status: success → failed
...
## Tool failures rising
| Tool | Baseline | Current | Sample errors |
| --- | ---: | ---: | --- |
| browser.click | 0 | 4 | `Element not found: #submit` |
...
Trace format
A run is one JSON object. The shape is lenient — accepts snake_case or camelCase, and several common aliases:
{
"run_id": "run-2026-04-24-abc",
"case_id": "login-flow-happy-path",
"status": "success",
"final_output": "Logged in as alice.",
"steps": [
{
"type": "tool_call",
"tool_name": "browser.click",
"tool_args": {"selector": "#submit"},
"error": null,
"latency_ms": 420,
"cost_usd": 0.001
}
],
"total_latency_ms": 2300,
"total_cost_usd": 0.08
}
Aliases recognized:
case_id|caseId|test_id|testId(falls back torun_idif none present)status|outcome|result.status— values likepass/passed/ok/successall normalize to"success"final_output|finalOutput|outputsteps|trace|events- per-step:
tool_name/toolName/name,error/error.message,latency_ms/latencyMs/duration_ms - totals:
total_cost_usd/totalCostUsd,total_latency_ms/totalLatencyMs(auto-summed from steps if absent)
Runs are matched between baseline and current by case_id.
Configuring thresholds
Defaults are transparent (1.3x bloat, 0.7 output-drift F1) and overridable:
agent-run-diff base.jsonl curr.jsonl \
--step-ratio 1.5 \
--latency-ratio 2.0 \
--cost-ratio 1.2 \
--output-drift-f1 0.6 \
--min-latency-ms 200 \
--min-cost-usd 0.01
The --min-latency-ms and --min-cost-usd floors prevent noise on trivially-short or trivially-cheap runs.
CI usage
- name: Compare against baseline
run: |
agent-run-diff \
baselines/2026-04-20.jsonl \
runs/$GITHUB_SHA.jsonl \
--format json > regression.json
The workflow step fails when any regression is detected (exit 1). Attach regression.json as an artifact to make the seven signals browsable in the PR review.
Honest scope
- Not semantic similarity. Output drift is token-F1, not embeddings. Flagging is "text changed a lot," not "meaning changed." Labeled as such in every code path.
- Not a framework. The tool never touches your agent, never calls an LLM, never runs your tests. It only reads traces you already have.
- No pricing built-in. If your traces include
cost_usdwe use it; otherwise cost bloat is skipped. Pricing is your framework's job, not this tool's.
Library API
from pathlib import Path
from agent_run_diff import parse_runs_file, analyze, render_markdown, Thresholds
baseline = parse_runs_file("baseline.jsonl")
current = parse_runs_file("current.jsonl")
report = analyze(baseline, current, thresholds=Thresholds(latency_ratio=1.5))
print(render_markdown(report))
if report.has_regressions:
raise SystemExit(1)
License
MIT.
Metadata
Release files for agent-run-diff 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 | Provenance | |
|---|---|---|---|---|
| agent_run_diff-0.1.0.tar.gz | 14.7 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agent_run_diff-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 29.6 kB
Release files / agent_run_diff-0.1.0.tar.gz
| Download URL | agent_run_diff-0.1.0.tar.gz |
|---|---|
| Size | 14.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a1d3bcbcc1bdb8fafc3196c190c2e9b2e89b61e01abd54558adac4efa02388ff
|
|
BLAKE2b-256 checksum How to use checksums |
5a8d9e3d84f2059b17f5f7a4a8b63bec250b37a28b910eee52ddf9187a1f9ba8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.
Transparency logRelease files / agent_run_diff-0.1.0-py3-none-any.whl
| Download URL | agent_run_diff-0.1.0-py3-none-any.whl |
|---|---|
| Size | 15.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dcbf66f0f0c497b1a5f83d2584d34e18156f3dc714e698870f97f70289584a9c
|
|
BLAKE2b-256 checksum How to use checksums |
977e5752ee3c2af9e5a36a948471a322d73633b4caddb88b9dec08239f42dc94
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.
Transparency logSecurity for agent-run-diff 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for agent_run_diff-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.