Continuous Correctness Audit
Your agents write. Your humans sign. Proof remembers.
We find where your code breaks its promises, and hand you the failing test.
Proof is the written record of what your software promises, plus the gate that keeps checking it. The audit is how the record gets installed.
Public audit: buger/jsonparser · register open at portal.reqproof.com
01 · The receipts
What we audited, and what it found
One public audit, on the Go JSON library buger/jsonparser: 5,600 stars, more than ten years in production. 7 findings fixed upstream in public pull requests, and one published miss. The register is open, and every finding on it is a test you can run.
One release fixed three previously tracked issues and introduced two new High severity defects, inside otherwise valid fixes.
A 14 commit delta passed 1,870 tests, and review still found an incomplete stack overflow fix, a live sibling of another corrected bug, and non-determinism in a new feature.
Both releases passed their own test suites before the gate ran.
Set() could drop sibling values with no error. It escaped an audit of that code, and a downstream user found it. We published a blameless postmortem, signed by Leonid Bugaev, and pinned the whole defect class so the family cannot come back without failing the gate.
The affected code carried 100% MC/DC coverage at the time of the miss. Coverage of the code was full, and the promise still broke. The postmortem and the pinned class sit on the public register.
Open the live register and re-run any finding on it.
02 · The corpus
What Proof remembers
Three things, and they outlast the people and the agents who wrote the code.
-
01
Requirements your engineers signed.
We read the component and write down what it promises, in plain sentences. Then the engineers who own it approve each one by name. On jsonparser that came to 123.
-
02
A register of known issues.
Every open failure mode, with a severity, a status, and the promise it breaks. Fixed entries stay in the record, so a bug that came back is visible as a bug that came back.
-
03
A gate.
Each requirement compiles into checks. On jsonparser, 179 of them run on every change, and they run whether or not anyone is watching.
People change teams. Your agents get swapped for better agents. The sentence your engineer approved stays where it is, and the gate keeps checking it.
The record lives in your repository and in your dashboard. You can read it without opening the code.
03 · The finding
How a promise becomes a check that never stops running
One finding, start to finish. The figure follows a real one from the jsonparser audit.
- 01
Said.
An engineer wrote it in a review years ago: Set() replaces the value. Nobody wrote it down anywhere a machine could read.
- 02
Signed.
We write it as a requirement. The engineers who own the parser read it and approve it by name.
- 03
Broken.
A check fails. The finding is a test that fails on your main branch, and it names the promise it breaks. A person validates it before it reaches you.
- 04
Fixed.
The fix arrives as a pull request your engineers review. The same test passes on the merge commit.
- 05
Pinned.
The whole defect family gets pinned, so the class stays pinned on every release after. Removing the check fails the gate.
Severity is arguable, and we write the argument down so you can push back on it. The reproducer settles itself: it runs red on your main branch or it does not.
Why the pin matters more than the fix
A fix closes one bug. The same family comes back two releases later, in a different function, written by a different hand. That is the whack-a-mole every platform team knows.
When we close a finding we pin the class it belongs to. The check for the family runs on every release from then on, and deleting it fails the gate. The bug you paid to fix stays fixed.
04 · The checker
Who checks the checker
Machines and software run every check, on every commit. That is data crunching at a volume no person could do by hand. Then people take over.
You never open a finding nobody checked.
Machines run, every commit
- 179 checks on jsonparser, on every change.
- Every reproducer re-run against your current main branch.
- Coverage counted against the code, and against the written promises.
- The requirement set scanned for contradictions.
People do the rest
- A person validates every finding before it reaches your dashboard.
- Your engineers sign the promises, one requirement at a time.
- We sign the methodology bar, and it is public.
- We sign the published misses, with a blameless postmortem each.
Every finding arrives with a reproducer that fails on your current main branch. You run it yourself, so its authority never rests on our word.
Under the hood: requirements are formalized in FRETish and checked for contradictions with Z3 and Kind2 before any code is judged. Coverage is measured at condition level (MC/DC) in eleven languages, from Go and Rust to Solidity and Zig. None of that vocabulary is needed to read the register.
05 · Why now
Your agents write more of the code every quarter
Review did not speed up to match, and trust did not keep up either. Two industry surveys say the same thing from different angles.
of developers distrust the accuracy of AI output, against 33% who trust it.
Stack Overflow Developer Survey, 2025adoption of these tools, with about 30% reporting little or no trust in them.
DORA, 2025Reading every diff was already hard. It stops being possible once the diffs arrive faster than people can read them. The team still has to answer for the release.
So what a component promises has to be written down and machine-checked. A signed sentence and a failing test survive a review queue nobody can drain.
Both figures are self-reported industry surveys about developers and their tools. We cite them as context for the buying decision, and nothing on this page depends on them.
06 · What you keep
What you walk away with
Four artifacts, and they are yours to keep. They stay useful whether or not we are still working together.
Requirements, in writing
Plain sentences describing what the component promises, each one approved by the engineer who owns it. New hires read them. So do your agents.
Findings, as failing tests
Each one names the promise it breaks, carries a severity we argued in writing, and comes with a reproducer that fails on your current main branch.
A register of known issues
Open failure modes with severity and status, and the fixed ones kept on the record. This is the artifact you hand to a board member or a due diligence questionnaire.
A gate, and a dashboard
The checks re-run on the cadence you choose. The results land in one place people can read, including the people who will never open the repository.
07 · How it lands
How we install it
Two phases. The first one is done by people, and that is on purpose.
Onboarding is personal
Roughly four weeks to install, working with the engineers who own the component. We interview them, read the code, and write the promises down. This part is not self-serve, and that is why the requirements are yours rather than ours.
Then you live in the dashboard
Requirements, the register of known issues, evidence, and coverage, all in one place. Your engineers open it to check a claim. Everyone else opens it to see where the component stands.
Nothing arrives unchecked
Nothing lands in your dashboard until a person has checked it. That is the quality gate, and it is why the register stays worth reading in month nine.
One component, chosen with you. Fixed fee, agreed before work starts. After the install it re-runs on the cadence you choose. Fix sprints are optional and arrive as pull requests your engineers review.
08 · Whose problem this is
Three people who feel this first
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.
You get a written bar and a gate that holds it. A release you did not read personally is still a release you can answer for, and the register answers the due diligence questionnaire without a fire drill.
One bug in routing, auth, or billing hits every customer at once.
Then the blast radius sits in one component, and that is the component we install on first. Every promise it makes gets written down, and every Sev-1 you already survived becomes a pinned class.
A small correctness bug in my library ripples into thousands of downstream builds, and nobody funds the boring verification work.
jsonparser is the public one. The requirements, the register, the fixed findings and the published miss are all open, so you can judge the work before you talk to us.
The pattern behind all three: we fix one thing and break another, and nobody can promise it will not recur. A pinned class is that promise, in a form a machine enforces.
Start with one component
Pick the component where one mistake reaches every customer at once. We write down what it promises, your engineers approve it, and the gate takes it from there. Fixed fee, agreed before work starts.
We sign the promises, the methodology bar, and every miss we publish. MISS-001 is on the public register with a postmortem attached.