This release is a pre-release and may not be stable for production use.
EvalRepro
Detect semantic drift in AI evaluation inputs and contracts before it silently changes benchmark results.
An evaluation can keep importing and its tests can stay green while a dependency, dataset revision, task configuration, or adapter changes sample membership, ordering, targets, choices, metadata, or types. EvalRepro creates hash-only manifests in isolated environments and compares the evaluation contract rather than relying on import success alone.
dependency / dataset / config change
↓
create two manifests
↓
compare scope + coverage +
samples + semantic fields
↓
reproducible | order drift | semantic drift
Status: public alpha. The manifest schema and adapter API may change before v1. Raw evaluation records are never written to a manifest, but hashes are not anonymisation; review the privacy notes before publishing manifests from sensitive datasets.
What EvalRepro checks
- evaluation identity, task version, adapter parameters, and selected semantic fields;
- complete versus partial coverage and declared/processed sample counts;
- ordered and unordered sample digests;
input,target,choices, andmetadatadigests by default;- top-level field type distributions;
- added/removed sample hashes and the first ordered mismatch;
- runtime and source provenance without treating dependency versions as semantic scope.
Verdicts
| Verdict | Meaning |
|---|---|
reproducible |
Scope, coverage, sample content/order, field digests, and types match. |
order_drift |
The same records remain, but their order changed. |
semantic_drift |
Record content, semantic fields, membership, or types changed. |
coverage_mismatch |
The manifests cover different ranges or completeness levels. |
scope_mismatch |
The manifests describe different tasks, parameters, or fields. |
Install
Install the public alpha from PyPI:
python -m pip install "evalrepro==0.1.0a2"
For the optional Inspect adapter:
python -m pip install "evalrepro[inspect]==0.1.0a2"
To install the same immutable release directly from source:
python -m pip install \
"evalrepro @ git+https://github.com/seva9523/EvalRepro.git@v0.1.0a2"
Quick start: JSONL
Create one JSON object per line:
{"id":"1","input":"What is 2+2?","target":"4","metadata":{"split":"test"}}
Snapshot the baseline and candidate:
evalrepro snapshot jsonl baseline.jsonl --name arithmetic-v1 -o baseline.manifest.json
evalrepro snapshot jsonl candidate.jsonl --name arithmetic-v1 -o candidate.manifest.json
If sample IDs should not appear in a published manifest, add --no-id-preview to either snapshot
command. The IDs still contribute to the sample digests, so this changes the diagnostic presentation
only.
Compare them:
evalrepro compare baseline.manifest.json candidate.manifest.json \
--json report.json \
--markdown report.md
Exit codes are 0 for a reproducible comparison, 2 for detected drift/mismatch, and 3 for an
invalid source or manifest.
Quick start: Inspect AI
Run the same task in two isolated environments:
evalrepro snapshot inspect inspect_evals.bbq.bbq:bbq \
--kwargs '{"subsets":"Age"}' \
-o artifacts/datasets-4.8.5.json
Repeat under the candidate dependency version, then compare the manifests. Inspect message IDs are removed by the adapter because they are runtime-generated rather than evaluation semantics. Local image content is represented by a content digest instead of an environment-specific path.
Quick start: Harvey LAB
The first-party Harvey LAB adapter reads a local benchmark checkout without importing the Harvey harness or running a model or judge.
evalrepro snapshot harvey-lab ./harvey-labs \
--task all \
-o artifacts/harvey-baseline.json
evalrepro snapshot harvey-lab ./harvey-labs-candidate \
--task all \
-o artifacts/harvey-candidate.json
evalrepro compare artifacts/harvey-baseline.json artifacts/harvey-candidate.json
--task accepts all, a practice-area/task prefix, or one exact task ID. The adapter hashes
effective instructions, rubrics, deliverables, unknown task fields, repository-relative source
paths, and source file bytes. Raw task text and document contents are not written to the manifest.
Use --no-id-preview when task IDs should also be omitted.
See the Harvey LAB adapter contract for scope, provenance, safety, and current semantic decisions.
GitHub Action
Use the immutable public-alpha tag:
- uses: seva9523/EvalRepro@v0.1.0a2
with:
baseline: artifacts/baseline.json
candidate: artifacts/candidate.json
report-json: artifacts/evalrepro-report.json
report-markdown: artifacts/evalrepro-report.md
fail-on-drift: "true"
The Markdown report is appended to the GitHub Actions job summary.
Founding case study
EvalRepro grew out of a dependency investigation for UKGovernmentBEIS/inspect_evals#2049. A
fork-side matrix compared Hugging Face datasets==4.8.5 and datasets==5.0.1 across seven complete
Inspect datasets and 22,773 records. The tested sample membership, ordering, inputs, targets,
choices, metadata, types, task scope, and provenance matched exactly. The case study is documented in
case-studies/inspect-datasets-5.md. Its status is explicitly
recorded as fork-validated, not upstream-accepted.
Built-in adapters
- Generic JSON Lines
- Inspect AI / Inspect Evals (optional extra)
- Harvey LAB task contracts from a local checkout
- Framework-neutral
SnapshotSourceAPI for custom adapters
Planned adapters are tracked in the roadmap. The most useful contributions are adapters backed by a real reproducibility case, not thin wrappers added only to increase framework count.
Contributing
External contributors are central to this project. There are three useful entry points:
- submit a reproducibility case or bug report;
- add fixtures, normalisers, reports, or platform tests;
- propose and implement a framework adapter using the public adapter contract.
Start with CONTRIBUTING.md, the
Adapter specification, and issues labelled
good first issue or
help wanted.
Non-goals
EvalRepro does not run or grade language models, replace evaluation frameworks, compare model quality, or claim that matching inputs guarantee identical model outputs. It protects the evaluation contract and data path so score changes can be interpreted with greater confidence.
Security and privacy
Manifests contain hashes, compact ID previews by default, runtime details, and provenance. They do not
contain raw sample text. Hashes of small or predictable values can still be brute-forced and ID
previews can be sensitive. Use --no-id-preview when the preview should be omitted, and do not
publish manifests from confidential evaluations without reviewing the remaining fields. See
docs/privacy.md, SECURITY.md, and METHODOLOGY.md.
Project stewardship
EvalRepro was created and is maintained by Sevinj Ahmadova, whose work focuses on AI evaluation, evaluation reproducibility, human-in-the-loop systems, and enterprise AI adoption. Research and professional background are available on LinkedIn.
Accepted external contributors are credited in the changelog and release notes. Substantive, sustained contributors can grow into component-maintainer roles through the governance process.
Licence
Apache-2.0. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file evalrepro-0.1.0a2.tar.gz.
File metadata
- Download URL: evalrepro-0.1.0a2.tar.gz
- Upload date:
- Size: 37.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b2a250ad7c4e0cbe63f03727da3e442c9c991880939c79c2018bc908b99f9778
|
|
| MD5 |
b542f3b5bef16c67c941ad91cc65d6c9
|
|
| BLAKE2b-256 |
6b8cd3627ad1c9cc3f6797a1071f0c3480beb13afde9657be0cf0c4c40c5877b
|
Provenance
The following attestation bundles were made for evalrepro-0.1.0a2.tar.gz:
Publisher:
publish.yml on seva9523/EvalRepro
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evalrepro-0.1.0a2.tar.gz -
Subject digest:
b2a250ad7c4e0cbe63f03727da3e442c9c991880939c79c2018bc908b99f9778 - Sigstore transparency entry: 2419442810
- Sigstore integration time:
-
Permalink:
seva9523/EvalRepro@e9c5d94aadf424b6458bc407eab73731b7de4cc4 -
Branch / Tag:
refs/tags/v0.1.0a2 - Owner: https://github.com/seva9523
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e9c5d94aadf424b6458bc407eab73731b7de4cc4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file evalrepro-0.1.0a2-py3-none-any.whl.
File metadata
- Download URL: evalrepro-0.1.0a2-py3-none-any.whl
- Upload date:
- Size: 28.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c519e62bb8d205ba418d6735dc5cfe54336a5279e281fe368d6293364c1acaff
|
|
| MD5 |
7c81c97eb7eeb3f6c7a05abfb40949c3
|
|
| BLAKE2b-256 |
ea32917a32f4fd43b357b374c52505ee2041fddac2e9f8bab75864f66f6d511a
|
Provenance
The following attestation bundles were made for evalrepro-0.1.0a2-py3-none-any.whl:
Publisher:
publish.yml on seva9523/EvalRepro
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evalrepro-0.1.0a2-py3-none-any.whl -
Subject digest:
c519e62bb8d205ba418d6735dc5cfe54336a5279e281fe368d6293364c1acaff - Sigstore transparency entry: 2419443668
- Sigstore integration time:
-
Permalink:
seva9523/EvalRepro@e9c5d94aadf424b6458bc407eab73731b7de4cc4 -
Branch / Tag:
refs/tags/v0.1.0a2 - Owner: https://github.com/seva9523
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e9c5d94aadf424b6458bc407eab73731b7de4cc4 -
Trigger Event:
push
-
Statement type: