Proof.continuous correctness audit

continuous correctness audit

Your software makes promises nobody wrote down. Proof writes them down, and holds every commit to them.

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

promises nobody wrote down IN THE CODE · IN THE TICKETS · IN THREE PEOPLE’S HEADS EACH PROMISE · ITS HAZARD · ITS OBLIGATION · YOUR APPROVAL written down, and made checkable FRETISH PATTERNS · KIND2 · Z3 · TWO CONTRADICTIONS STRUCK A B C OUT A MATTERS B MATTERS C MATTERS every condition made to matter CONDITION-LEVEL MC/DC · 179 CHECKS · ONE RED STOPS THE MERGE AND IT RE-RUNS ON EVERY COMMIT AFTER THAT, WITHOUT US
fig. 00 · four weeks, end to end. Your promises already exist, scattered and unwritten. We recover them, strike the ones that contradict each other, name what could go wrong with each, then show that every condition changes the outcome on its own. The instrument names underneath are ours to worry about; the gate reads pass or fail.

public audit: buger/jsonparser 123 requirements approved 179 checks per run 7 findings fixed upstream 1 published miss read it yourself

01 · what we hear fig. 01 · one unwritten promise

The last three weeks disappeared into bug fixing.

Engineering leaders describe the same week to us, in almost the same words.

"A release that doesn't bounce. The last three weeks stop disappearing into bug fixing."

VP Engineering

"Stop the whack-a-mole: we fix one thing and break another and nobody can promise it won't recur."

CTO

"Know what's actually broken before our biggest customer finds it in prod."

Head of Platform

"My senior engineers on the roadmap. Right now two weeks of senior time went into reproducing one customer's fault-tolerance bug."

CTO

"When the board or a big prospect asks how do you know it works, something better than CI is green."

VP Engineering

near verbatim from scoping calls. roles only, by request.

The promises are real and everyone knows them. A retry must never duplicate a write. A parser must reject a malformed number. A billing job must be safe to run twice. They live in a design doc from 2023, in the head of an engineer who left, in a comment above a loop. Nobody wrote the promises down in a form a machine can check, so nothing checks them. Your CI checks that the tests you happen to have still pass.

the promise a retry never duplicates a write in a design doc from 2023 nothing checks it the component every service on that path every customer at once blast radius your ci green every test you already have, passing

fig. 01 · The blast radius of one unwritten promise. Schematic. The promise exists in prose, so no check can fail on it. The failure surfaces at the widest ring, where your customers are.

46% against 33%
of developers distrust the accuracy of AI output, against those who trust it. Stack Overflow, 2025.
about 90%
adoption of AI coding tools, with about 30% reporting little or no trust in what comes out. DORA, 2025.
your CI
reports that the tests you wrote still pass. It has no opinion about the promises you never wrote.
02 · what you end up with fig. 02 · three artifacts, one gate

You end up knowing what your software promises.

Proof turns the promises into three things your team can hold and read: requirements your engineers sign, a register of known issues, and a gate in your CI. They outlast the engineer who wrote the code and the quarter you bought them in.

01

Requirements your engineers sign

We recover what the component was supposed to do and write it as numbered requirements. The engineers who own the component read each one and approve it.

After that the requirements are theirs. They are the reference every later check is measured against.

02

A register of known issues

Every open failure mode in one list, with a severity, a plain description, and the requirements it breaks. Nothing is buried in a PDF.

Your team reads the same register we do. So does anyone you choose to show it to.

03

A gate in your CI

The requirements become tests that run on every commit, alongside the tests you already have.

When a commit breaks a promise the gate turns red and the merge waits. That is the whole enforcement story.

01 · approved requirements your engineers sign 02 · open the register of known issues 03 · every commit the gate in your CI 179 checks per run your commits merge red blocks the merge

fig. 02 · Where the three artifacts sit. Signed requirements and the register are what the gate enforces. Commits pass through it, and one that breaks a promise stops there.

the requirements are written as numbered, testable statements in your repository. FRETish patterns are used where a requirement needs a temporal shape.

03 · one real finding fig. 03 · start to finish

When a promise breaks, you get told, and you get the test.

This one is on the public register. A boolean parser accepted the input trueish as true, because it matched a prefix where the promise asks for an exact token. Here is the whole life of that finding.

01 · the promise SYS-REQ-012, approved by the engineers who own the parser 02 · every commit 179 checks run, including the boundary cases the promise implies 03 · the break the parser accepted the input trueish as a true value 04 · the finding a test that fails on your main, carrying the input that breaks it 05 · the register KI-11 opens at High severity, bound to the requirement it breaks 06 · the fix your engineers fix it, or we send a pull request they review 07 · the pin the test stays in your suite, so the gate turns red if it returns

fig. 03 · One finding, start to finish. Drawn from KI-11 on the public jsonparser register. Every step is a link you can open.

A finding is a test that fails on your main, with the exact input that breaks it. Your engineers run it, watch it fail, apply the fix and watch it pass. Nobody has to take our word for the severity, because the test is the argument.

reproducers are generated against the requirement, then minimised. condition-level MC/DC drives boundary and negative-case selection.

04 · accountability fig. 04 · coverage counted twice

Who checks the checker.

Machines run every check, on every commit, at a volume no team could work through by hand. A person validates every finding before it reaches you. People sign the promises, the methodology bar, and the published misses.

You never open a finding that nobody checked.

Scale · the machines

  • 179 checks run against the component on every commit, in the same order, with the same rules.
  • Nothing is sampled. The whole component is checked every run, which is the part a team cannot do by hand.
  • The run produces candidates. It does not produce your dashboard.

Judgment · the person

  • A person validates every finding before it reaches your dashboard. That is the quality gate, and it is why your inbox stays worth reading.
  • Noise gets dropped at that gate, so your engineers spend their attention on real breaks.
  • Signatures go on the promises, the methodology bar and the published misses.

Evidence · what you re-run

  • Every finding arrives with a reproducer that fails on your current main.
  • Its authority comes from that failing test, so it does not depend on trusting us.
  • You can re-run all of it yourself, on your own hardware, without us in the room.

Machines produce the volume. People produce the judgment. The reproducer means you can re-run either one and check the answer yourself.

counted against code what your CI reports every line your tests touch, executed counted against intent what the promises need covered by a test that can fail promises no test can fail on a test that can fail nothing checks it

fig. 04 · Coverage, counted twice. Schematic. A green suite reports the first bar. The second bar is the one your promises live in, and it is the one Proof counts.

instruments: condition-level MC/DC in eleven languages, from Go and Rust to Solidity and Zig. formal verification on Kind2 and Z3. FRETish requirement patterns. these are the tools. the product is the promises and the gate.

05 · evidence public register · portal.reqproof.com

Read the register before you talk to us.

We run this audit in the open on buger/jsonparser, a Go JSON library with 5,600 stars and more than ten years in production. The register is public. Every requirement, every open issue and every fix is on a page you can open right now.

123
requirements approved by the engineers who own the library.
7
findings fixed upstream, in public pull requests anyone can read.
179
checks per run, on every commit to the component.
1
published miss, with the postmortem signed and the defect class pinned.
MISS-001 · the one we missed

One published miss, MISS-001.

Set() could drop sibling values without reporting an error. It escaped one of our audits of that code. A downstream user found it, and told us.

We published a blameless postmortem, signed by Leonid Bugaev, and pinned the whole defect class so the same shape of bug turns the gate red on the day it returns. An auditor that only shows you its wins is asking for faith.

private engagement, an API infrastructure vendor One release fixed three previously tracked issues and introduced two new High-severity defects inside otherwise valid fixes.
private engagement, the same vendor A 14-commit delta passed 1,870 tests, andreview still found an incomplete stack-overflow fix, a live sibling of another corrected bug, and non-determinism in a new feature.

the dashboard · 01 the signed requirements

The Requirements Explorer screen: 1,961 requirements listed with component, level, status, assurance grade, formalized flag, coverage and findings columns.
The requirements explorer, here on our own codebase. 1,961 requirements filtered to approved, each row carrying its component, level, assurance grade, coverage and open findings. Your engineers approve these rows before anything is enforced against them.

the dashboard · 02 the register of known issues

The open known issues screen: severity counters showing zero critical, five high, two medium, two low and one info, above a table of findings with identifiers, status and the requirements each one affects.
The register on the public jsonparser audit. Ten open known issues: five High, two Medium, two Low, one Info. Each row names the failure, carries an identifier such as KI-5, and links to the requirements it breaks.

the dashboard · 03 requirements bound to evidence

A trace map: one known issue on the left, connected by affects edges to two requirements, which are connected by verified by and implemented by edges to source files and test files.
One known issue, traced to its evidence. The map shows the two requirements it affects, and each of those links out to the code that implements it and the tests that verify it. This is how a finding stops being an opinion.

MISS-001 escaped an audit with 100% MC/DC on the affected code. that is why coverage is counted against intent as well as against code.

06 · the deliverables fig. 05 · a defect class, ten releases

What you walk away with.

Four artifacts, and you keep the requirements and the tests whatever happens to us afterwards. They sit in your repository under your licence.

01

A written set of requirements for the component

Numbered, testable, and approved by the engineers who own it. The reference for every check that follows.

02

A register of known issues

Each entry carries a severity, a description your product manager can read, and the requirements it breaks.

03

A test suite bound to the requirements, running as a gate

Every reproducer we wrote stays in your suite and runs on every commit, in your CI, on your runners.

04

An audit page your board and your customers can read

Public or private, your call. It answers the due-diligence questionnaire with a link.

one defect class seen in three releases the class is pinned no recurrence since 123 456 789 10 ten consecutive releases a check for it no check exists the reproducer runs on every commit

fig. 05 · A defect class stops recurring. Schematic. Once the reproducer is in your suite, the release that would have reintroduced the bug turns the gate red instead.

07 · how it is delivered one component · four weeks · then the dashboard

Four weeks with your engineers, then the dashboard.

Onboarding is personal and it takes our team. That is the reason the requirements come out right: they are written with the people who know the component, so the requirements are yours, not ours.

weeks 1 to 4

Four weeks with the engineers who own it

We work alongside them: reading the code, recovering what it was supposed to do, writing the requirements and putting each one in front of the owner for approval. This part is hands on, and it is where the accuracy comes from.

from week 5

Then you live in the dashboard

Requirements, the register of known issues, the evidence behind each finding and the coverage numbers, all in one place. It is readable by people who will never open the repository: your product managers, your board, your customers under NDA.

every run

A person validates it before it reaches you

Nothing lands in your dashboard until a person has checked it. The machines run all 179 checks on every commit and produce candidates. A person decides which of them your team ever sees.

scope
One component, chosen with you.
time to install
Roughly four weeks.
commercials
Fixed fee, agreed before work starts.
afterwards
It re-runs on the cadence you choose. Optional fix sprints arrive as pull requests your engineers review.
08 · whose problem this is three seats, one object

Whose problem is this.

Three people ask us for this, and they all describe the same object: the component you can least afford to be wrong about.

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."

You get a written answer to "how do you know it works" that a board or a large prospect can read, and a gate that keeps the answer current.

Head of Platform

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

The component with the widest blast radius gets a signed set of promises, a register your team reads daily, and a gate on every commit.

Open source maintainer

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

A public register your downstream users can read, and reproducers that stay in the suite long after the audit ends.

09 · start here [email protected]

Start with one component.

Pick the one you can least afford to be wrong about. We scope it with you, agree a fixed fee, agreed before work starts, and spend roughly four weeks with the engineers who own it.

[email protected] · reqproof.com
the public register: portal.reqproof.com/projects/jsonparser

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

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