OPEN SOURCE · MIT LICENSED · GO

Run with proof.

A local verification receipt for AI coding agents. ProofRun doesn't judge whether your code is correct — it proves, cryptographically, which checks actually ran against the exact code you have right now.

go 1.22+linux · macos · windowszero network callsgithub action included

The problem

An AI coding agent says "all tests pass." Is that true?

Maybe. It was true the last time the agent actually ran the tests. But that might have been three edits ago. The agent might not even remember running them — it might just be inferring "the change looks right, tests probably still pass." From the words alone, you have no way to tell "I ran it and it passed" apart from "I'm pretty sure it would pass."

ProofRun closes that gap. Not by making the agent more honest — by making the claim itself checkable.

How it works

Every check result is bound to a fingerprint of your exact code state: the git commit, plus a SHA-256 hash of everything uncommitted — staged or not, tracked or not. Change a single byte, and the result flips to STALE automatically. Nobody has to remember to ask "does this PASS still count?"

$ proofrun run test -- pytest
...
test: pass (exit 0, 1841ms)

$ proofrun status
test                 PASS    (exit 0, 1841ms)

# code changes after this point — agent or human, doesn't matter

$ proofrun status
test                 STALE   (last run: pass, exit 0 — code changed since)

Why this, not just trusting the agent

●No LLM calls, anywhere

ProofRun doesn't use AI to verify AI. It starts a real subprocess and reads its real exit code — that's the entire mechanism.

●Four statuses, never a guess

PASS, FAIL, STALE, NOT RUN — each one comes from an observed execution, or the documented absence of one. There's no fifth "probably fine."

●Fully offline

Zero network calls, zero telemetry, zero accounts. Your code never leaves your machine.

●Argv-exact, not string-matched

A check declared as pytest -k "foo bar" can't be satisfied by a command that merely looks similar — ProofRun compares real argument arrays, not strings.

Quick start

# install (linux amd64; other platforms on the releases page)
$ curl -L https://github.com/yebiguo/proofrun/releases/download/v0.3.0/proofrun_linux_amd64.tar.gz | tar xz

# or build from source
$ go install github.com/yebiguo/proofrun/cmd/proofrun@latest

$ proofrun init # writes .proofrun.yml
$ proofrun run test -- pytest # runs pytest for real, binds the result
$ proofrun status --strict # non-zero exit if anything isn't PASS

Wire status --strict into a pre-commit hook or CI gate. A GitHub Action is included — it re-runs everything against the exact PR head commit and never trusts a checked-in receipt.

Tamper-evident receipts

Every stored result is signed (HMAC-SHA256) with a machine-local key. A hand-edited receipt.json — even one with a perfectly matching fingerprint — no longer verifies, and it never shows a false PASS. Tamper-evident, not tamper-proof: it catches a naive edit or an agent trying to fake a result, which is exactly the threat it was built for.

Deliberately out of scope: parsing test output, judging code quality, auto-fixing anything. ProofRun proves what ran. Nothing more.