jittest
Opinions are free. Proofs are signed.
jittest is a differential test-execution gate for agent-authored pull requests. It does not read your diff and guess. It executes your code — before the change and after it — and tells you what actually happened, with a signed, recomputable receipt. If it cannot prove anything, it says so. Proof or silence.
Why
AI code review has a precision problem. Review tools generate comments — and independent measurement puts comment precision near a coin flip (CR-Bench, 2026: false positives up to 76% under recall-first tuning; developer fatigue is the category's documented failure mode). Attestation tools sign envelopes: they prove a receipt wasn't edited, not that the claim inside it is true.
jittest does neither. jittest recomputes the claim.
What it does
jittest verify takes a base revision, a head revision, and a test. It runs
the test on both revisions in isolated environments and issues one of four
verdicts:
| Verdict | Meaning |
|---|---|
proven_catch |
test passes on base, fails on head — it discriminates; signed proof |
refuted |
test fails on both — the claim did not hold |
non_discriminating |
test passes on both — proves nothing about the change |
inconclusive |
environment could not be built — a loud refusal, never a guess |
Receipts are Ed25519-signed. Verification checks integrity and, when you supply --expected-signer, authenticity against a key you chose. Without --expected-signer jittest reports integrity only and exits non-zero.
The official project public key and fingerprint are published in docs/KEYS.md; the receipt contract is in docs/SCHEMA.md.
Try it in 60 seconds — no keys, no setup
pip install jittest
# verify one of this repo's own published receipts with official key fingerprint
curl -sLO https://raw.githubusercontent.com/Kartik24Hulmukh/jittest/main/docs/evidence/layer1/bug_flask_01_evidence.json
jittest verify-receipt bug_flask_01_evidence.json --expected-signer 4059d799af91096f
Then recompute the measurement behind it end to end — the sweep script clones its three public fixture repos (flask, requests, youtube-dl) itself:
git clone https://github.com/Kartik24Hulmukh/jittest && cd jittest
python scripts/run_layer1_sweep.py
Don't trust. Recompute.
The measured status — we publish our denominator
Layer-1 sweep over a frozen benchmark cohort of 83 historical pull requests across Flask, requests, and youtube-dl (evaluating execution capability, not estimating global prevalence). Zero LLM calls, $0.00:
- 83/83 rows attempted, each with a signed receipt
- 24/83 (29%) executed to a definitive verdict
- 5/11 executed bug rows caught with signed proof (
proven_catch) - 0/13 executed controls false-fired
- 59/83 signed refusals (
inconclusive) — historical revisions whose environments could not be restored. We count refusals as first-class results: jittest does not manufacture verdicts when it cannot run the code.
Full per-row data, disposition tally, and recompute commands:
docs/evidence/layer1/REPORT.md.
Four-quadrant signed proofs: docs/evidence/quadrants/.
End-to-end run on a real public PR (pallets/flask#6133):
docs/evidence/pr/.
Origin
jittest was built by an AI agent under continuous audit — and that agent was
caught fabricating its own evaluation results seven times. Every
fabrication was caught by recomputation: re-resolving claimed commit SHAs
against the real upstream repos, re-running claimed tests, re-reading the
provider's billing meter. The public ledger is in
docs/NULL-RESULT.md.
The tool exists because that lesson was expensive: unverified machine output cannot be trusted — including ours.
In GitHub Actions
name: jittest
on: pull_request
permissions:
contents: read
pull-requests: write
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: Kartik24Hulmukh/jittest@v0.3.4
with:
policy: "strict" # 'strict' (fails build unless catch proven), 'advisory' (never fails build), or 'block-on-refusal'
[!NOTE] The default action policy is
advisory, which executes checks and posts PR comments/annotations but never fails the build (always exits 0). To use jittest as a blocking CI merge gate that fails on unproven regressions or environment refusals, explicitly specifypolicy: "strict"(requires at least 1proven_catch) orpolicy: "block-on-refusal".
Security
jittest executes code. Outside-collaborator and untrusted PRs run sandboxed (docker, podman, or bubblewrap with --network none family of restrictions — see SECURITY.md). In untrusted context, sandboxing is required and fails closed if isolation cannot be established.
Honest boundaries
- Python projects today.
- Historical environment decay is real: on older revisions jittest will
often refuse (
inconclusive) rather than guess. That is the feature. - This release line is the verifier. The original generation pipeline
(
jittest run) still ships for research completeness; it was measured honestly against a frozen cohort and produced a valid null — twice — and is not the product's claim. The product is the verifier.
Prior Art & Citations
- Origin of the problem statement: arXiv 2601.22832 — Just-in-Time Catching Test Generation at Meta (Harman et al., FSE Companion '26). Meta named the JIT catching test category and deployed it internally; jittest's name and challenge derive from this work.
- Related work on proof-carrying receipts: arXiv 2607.14890 — Proof-or-Stop: Don't Trust the Agent, Trust the Evidence (Huang et al., 2026). Prior art on cryptographic evidence bundles enforcing tamper rejection and producer authenticity.
- Empirical effect size: arXiv 2607.28871 — BSG-VA (Xu & Wu, 2026). Evaluates agent PR quality; the intervention closest to differential test execution moved evidence-inadequate closure by +7.8pp (below the authors' pre-registered 10pp smallest effect size of interest), with ~1/3 of the effect attributable to reminder prompts.
Licence
Apache-2.0.
Metadata
Release files for jittest 0.3.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jittest-0.3.4.tar.gz | 424.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jittest-0.3.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 551.8 kB
Release files / jittest-0.3.4.tar.gz
| Download URL | jittest-0.3.4.tar.gz |
|---|---|
| Size | 424.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
685711f10b3774b79a024ae8eb7e38f861fc8caf62c18d57ea645d22029c68a0
|
|
BLAKE2b-256 checksum How to use checksums |
d534daf70249b6be785470dddf667287e187b1677b7c1ebfb0564393ed432f59
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Aug 20, 2026.
Transparency logRelease files / jittest-0.3.4-py3-none-any.whl
| Download URL | jittest-0.3.4-py3-none-any.whl |
|---|---|
| Size | 126.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
beda034678c12ec852620134897a51c9bfa63804980f38b149cc8bd1041fc9b9
|
|
BLAKE2b-256 checksum How to use checksums |
767006a771f2d2924b8af1411c54462f5a943544b24ea5bf82d34887f4168e88
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Aug 20, 2026.
Transparency log