Proof.continuous correctness audit

Proof — Continuous Correctness Audit

We find where your code breaks its promises — and hand you the failing test.

Your application makes promises. We turn them into verifiable requirements that run in CI — and hold every commit to them. If we can’t hand you a failing test, we don’t file a finding — no finding, no noise.

one question before the receipts

How sure are you?

the receipts answer — keep scrolling ↓

01 · the receiptsfig. 01 — receipts, not references

Don’t take our word. Rerun it.

We don’t show customer logos. We show ledgers. Every number without a † on this page traces to a public audit you can open, re-run, and argue with — today.

case study — buger/jsonparser

A 5,600★ Go JSON library, more than ten years in production. 123 requirements signed by name, 7 findings fixed upstream in public PRs — and 1 published miss with a public postmortem.

projectrequirementsfindingsstatusledger
buger/jsonparserGo JSON parser · 5,600★ · 10+ yrs in production 123 signed 7 fixed · 1 miss published gate live open ledger →
message queuedelivery & ordering promises in scoping dossier on request
payments SDKidempotency & retries in scoping
feature-flag servicetargeting & kill switches in scoping
workflow engineexactly-once execution in scoping

† illustrative — engagements in scoping; the rows show the shape of the table, not claims. We list an engagement only after the owner signs the requirements. The table is built for ten rows; it fills as they sign.

123requirements signed
179checks per run
7findings fixed upstream
1published miss

every number above traces to the public jsonparser ledger — nothing aggregated, nothing projected.

02 · the promisefig. 02 — three objects, one product

What does your code actually promise?

More than anyone wrote down. An engineer says: “Set() replaces the value.” Proof turns that sentence into an object your CI can enforce. Three objects, in fact.

1 · the promise

“Set() replaces one value. Every other value survives.”

Lives in a doc comment and three engineers’ heads. Tested nowhere.

2 · the requirement

“When Set() writes one value, every other value survives.”

  • acceptance criteria attached
  • contradiction-checked, by machine
  • signed by your engineer — by name

3 · the gate

Runs in your CI. Every commit, forever.

  • 179 checks per run
  • a broken promise fails the build
  • exit 1 blocks the merge

a“Your code knows what it does — not why. We dig the promises out.”

b“Each promise becomes a requirement your engineers sign — with its acceptance criteria.”

fine print — formalization runs on Kind2 and Z3 with FRETish patterns; vacuous requirements are rejected before they count. You never need those names: the gate reads pass or fail.

03 · the breakfig. 03 — anatomy of one finding

What happens when a promise breaks?

This is the part we hand you. One real finding from the public jsonparser audit, start to finish — it plays itself in about twenty seconds.

fig. 03 · plays itself — ~20 shover to pause · click a bar to jump

01 / 05 · the reproducer

check run · jsonparser @ your mainexit 1
Get_StringValuepass
Set_ReplacesValuepass
ArrayEach_Callbackpass
TestGetNegativeIndexFAIL
panic: index out of range — reachable from 8 call sitesa test your suite never had. We wrote it. It fails on the code you ship today.
statusRED on main @ e1af7b2

01A finding is not a paragraph in a report. It is a test — and it fails on your main.

02 / 05 · the violated promise

requirement · SW-REQ-041signed

“When Get() receives an index outside the array, it returns an error — it never stops your program.”

an in-range index returns the value
an out-of-range index returns a clean error
no panic, for any input — violated
approved before any code is judgedsigned · your engineer ✓

02Every failure points back to a promise — written in plain English and signed before we judged a line.

03 / 05 · the severity

severity assessmenthigh

High — a crash in a data path, not a wrong answer.

the process dies; nothing downstream can catch it
8 call sites reach the same line
cost to trigger: one malformed index
assessed against a signed, public barreasoning written down — open to challenge

03Severity comes with reasons attached. Argue with the reasons — not with a score.

04 / 05 · the fix

upstream fix · public PRopenmerged

bounds check at the parse boundary — the fix lands in your tree, upstream, in the open.

TestGetNegativeIndexFAILpass
call sites re-checked8 reachable0 reachable
the reproducer stays in the suiteexit 1 · merge blockedexit 0 · earned

04The fix lands upstream. The reproducer flips green — and never leaves.

05 / 05 · the retirement

the corpus · class: out-of-bounds accessretired

One finding retires a whole class — pinned as a permanent check.

green on every release since — the class cannot quietly come back

PINNED · EVERY COMMIT
now one of the 179 checksno finding, no noise

05They run in your CI on every change. Forever.

04 · the checkerMISS-001 — the public error bar

Who checks the checker?

Machines check everything, every time. People sign what machines can’t: the promises, the bar, and our mistakes.

machines check

every commitall 179 checks, re-run in your CI — no sampling, no schedule
every reproducerre-executed on every change; a fixed defect must stay impossible
coverage, twiceonce against the code, once against the intent — a requirement without evidence fails the gate
the logic itselfrequirements are checked for contradictions before they count

instruments: MC/DC · Kind2/Z3 · vacuity checks — the tools, not the point.

people sign

the promisesevery requirement carries a named approval from your side
the barthe methodology and the severity bar every call is graded against — signed, public, open to challenge
the mistakesevery miss gets a public, blameless postmortem — signed

what people do not do: re-read your diffs one by one. That job belongs to the machines.

Findings never wait on a person. Their authority is a reproducer that fails on your main — you can re-run it without trusting anyone.

Software agents re-run every check and reproducer on every commit. We build on AI in the open — what no machine signs is the promises, the bar, and the mistakes.

MISS-001 · the one we missedpublished

Set() could silently drop sibling values. It passed our audit with every audited branch covered (100% MC/DC). A downstream user caught it. We published the postmortem under the founder’s name — Leonid Bugaev — blameless and public, and pinned the whole defect class so it cannot return.

“An auditor that only shows you its wins is asking for faith.”
read MISS-001 — the postmortem is public →mistakes are part of the record
05 · the deliverablesfour artifacts — all of them stay when we leave

What you walk away with

01

A signed source of truth

Every promise the component makes, recovered from its code, history, and tickets — written down and approved by your engineers. The spec exists outside the code and outside whoever wrote it.

02

A register of known issues

Every break between promise and code becomes a finding with a reproducer that fails on your current main — severity assessed against a signed, public bar, reasoning written down, open to challenge.

03

Coverage counted twice

Once against the code: every branch shown to matter. Once against the intent: every approved requirement bound to evidence — or the gate fails.

04

A gate in your CI

Plain YAML and executable tests that re-run on every release without us. Fixed defects can’t quietly come back, and every finding carries a prompt to start the fix.

fine print — condition-level MC/DC in eleven languages, Go and Rust to Solidity and Zig; formal verification on Kind2 and Z3; per-requirement hazard analysis. If you recognize the names, you know the lineage.

portal.reqproof.com/projects/jsonparserstylized render of the live page

Known issues — jsonparser

123 requirements179 checksMC/DC 100% · audited paths
HIGH boundary: negative index → panic reproducer: TestGetNegativeIndex · 8 call sites fixed upstream ✓
MISS MISS-001 — Set() silent data loss escaped 100% MC/DC · caught downstream postmortem public
+ 6 more findings — every one fixed upstream in a public PR · open the live register →

every issue carries its reproducer, its severity rationale, and the requirements it affects — live, public, re-runnable.

stack overflow 202546% of developers distrust ai-generated code · 33% trust it dora 2025~90% ai adoption · ~30% report little or no trust the gap between shipping and knowing is the job
06 · the seatsthree seats feel it first

Whose problem is this?

CTO / VP Engineering

“We ship ten times faster now. Review didn’t get ten times faster. I sign off on releases I can’t personally vouch for anymore.”

what proof changes

You stop vouching from memory and start pointing at evidence — signed requirements, a live gate, findings with proof attached.

Platform / Infra lead

“One bug in routing, auth, or billing hits every customer at once.”

what proof changes

Intent recovered and formalized, with coverage concentrated on the branches with the blast radius. The next change lands against a spec, not a guess.

OSS maintainer

“A small correctness bug in my library ripples into thousands of downstream builds — and nobody funds the boring verification work.”

what proof changes

High-signal external review, findings disclosed on your terms, and a regression corpus that protects every future release.

07 · the closetitle block — one signature on this page

Stop hoping. Start knowing.

“Security firms audit whether your software can be broken into. We audit whether it works — and staying unbroken is part of working.”

See a live audit →

Private by default. We countersign your NDA before reading a line of private code.

Start with one component — the one you’d least like to be asked about under oath. The gate installs in your CI, and the corpus compounds from there.

drawn by the audit requirements recovered · evidence attached
checked by the gate — every commit 179 checks · red blocks the merge
approved by Leonid Bugaev postmortems signed by name

proof · reqproof.com · sheet 01 of 01 · rev — continuous