Continuous Correctness Audit

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

We recover the requirements your code was supposed to meet, get them signed by your engineers, and hold every line to them — continuously, in your CI. Unlike a code review, every finding arrives as a reproducer that fails on your main. No finding, no noise.

Fixed fee · ~4 weeks to first gate · findings signed by name

Receipts, not references

Public audits you can re-run yourself

We don't show customer logos. We show ledgers. Every public audit below is a real engagement with every requirement, finding, and miss published — and a gate you can re-run against the repo today.

Public audits — re-runnable receipts

source: portal.reqproof.com · updated continuously
Project Requirements Findings Headline defect Status
buger/jsonparser
Go JSON library · 10+ yrs in production · 5.5k★
123 approved & signed 7 confirmed, each with a failing test 1 panic class reachable from 8 call sites 1 open finding
gate live
— and one published miss
The defect our audit did not catch. Documented below, postmortem and all.
1published miss Set() silent data loss — passed with 100% MC/DC coverage read the postmortem
More public audits in progress. We list engagements only after the owner signs the requirements. Open the full ledger →
0
requirements approved
0
checks per gate
0
languages supported
0
findings confirmed
0
published miss

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

How it works

From unwritten promises to a gate in your CI

Three steps. The first two are the audit; the third is why it keeps paying after we leave.

01

We recover the promises

We read your component the way a formal-methods team would: extracting the requirements it implicitly makes — then your engineers review and sign each one. Nothing counts until a human with a name approves it.

id: SW-REQ-041
statement: "Get() with a negative
  index returns ErrOutOfRange,
  never panics."
approved_by: human:buger
status: approved
02

We hold code to them

Every signed requirement is checked against the implementation — SMT solvers (Z3), model checking (Kind2), and MC/DC coverage counted against intent, not lines. Findings must reproduce or they don't ship.

$ proof verify SW-REQ-041
✗ FAIL  boundary: idx < 0
  reproducer written:
  TestGetNegativeIndex
--- FAIL on main (e1af7b2)
03

The gate lives in your CI

The full requirement set, tests, and 52-check gate land in your repo. Findings arrive as failing tests with agent-ready fix prompts — your team (or your coding agents) fix; the gate grades.

your-repo/
├── specs/
│   └── software/  123 reqs
├── .github/workflows/
│   └── proof-gate.yml  
└── proof.yaml

How this differs

Not a review. Not a scanner. A gate.

Honest marks — the other columns are good tools that we use too. They just answer a different question.

Capability Code review Test coverage Static analysis Proof audit
Finds unwritten promises partial
Findings arrive as failing tests partial
Coverage counted against intent
Re-runs without the vendor
Signed by a named reviewer partial
"partial" means it can happen, but the process doesn't guarantee it. Our process does — or the finding doesn't count.

The honesty section

We publish our own misses

Any audit vendor will show you what they caught. Here's what we didn't — on our own public ledger, because an audit you can't falsify is marketing.

PUBLISHED MISS · jsonparser

The Set() data-loss defect our gate passed

During the jsonparser audit, a silent data-loss defect in Set() slipped through our verification — with the requirement approved and 100% MC/DC coverage on the function. The tests exercised every branch. None of them checked the property that mattered.

We wrote the postmortem, published it on the same ledger as our findings, and turned the failure class into a check the gate now runs on every audit.

Coverage tells you the code ran. It doesn't tell you the promise held. That's the gap this audit exists to close — including on itself.

Why now

Everyone ships AI code. Almost no one trusts it.

46%vs33%

of developers distrust the accuracy of AI output — versus 33% who trust it. Distrust now outweighs trust.

— Stack Overflow Developer Survey 2025

90%/30%

of teams have adopted AI coding tools — while 30% report little or no trust in what those tools produce.

— DORA State of AI-assisted Software Development 2025

The gap between shipping code and trusting code is the fastest-growing liability in software. We close it with signed requirements and a gate — not vibes.

Engagement

Fixed fee. Agreed before work starts.

No hourly meters, no seat licenses, no surprise renewals. One number, quoted after scoping.

One component. ~4 weeks to the first gate. Then flat, month to month.

1
Confidential scoping — freeWe look at the component and quote a fixed fee. You see the number before anything is signed.
2
The audit — fixed fee, ~4 weeksRequirements recovered and signed, findings delivered as failing tests, gate live in your CI.
3
Continuous — flat monthlyThe gate runs on every change; new findings signed by name as your code evolves.
Stop any time. Everything keeps running — the requirements, the tests, and the gate are in your repo, not ours.

The questions worth asking

What do we keep if we stop?
Everything. The requirement YAML, the reproducer tests, and the CI gate live in your repository and re-run without us — proof audit is a command your team runs, not a service you call. Stopping ends new findings, not the ones you have.
Do you fix what you find?
Optionally. Fix sprints are separately scoped so the audit stays independent — and every fix is graded by the same gate that flagged the defect, not by the person who wrote it.
What can't the audit see?
Plenty — and we say so up front. Requirements nobody approves, behavior outside the scoped component, and properties that only manifest in production topologies we can't reproduce. The methodology section covers scope limits, and our published miss shows what a blind spot looks like when we hit one.
How is the fee set?
By component size and hazard surface, quoted after a scoping call and fixed in the agreement. If scope grows mid-engagement, we re-quote — we don't meter.

Start with scoping

Pick the component that keeps you up at night.

Send an email address and, if you like, a sentence about the component. An engineer — not a salesperson — replies within one business day with scoping questions and a fixed quote.

Confidential — scoping is under NDA by default
Fixed fee quoted before any agreement is signed
Every finding signed by name, on a ledger you keep

No newsletter. No sequence. One engineer, one reply.
Prefer email? [email protected]