Proof.continuous correctness audit

continuous correctness audit

Your codebase has a map. Nobody drew the part that says what it is for. Proof draws it, and a gate keeps it true.

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

everything except what it is for SYMBOLS · FILES · TESTS · ALL OF IT READABLE ALREADY EACH PROMISE · APPROVED · IMPLEMENTED · VERIFIED · DOCUMENTED the same territory, with intent drawn on it 1,990 REQUIREMENTS · 21,796 MACHINE-CHECKED EDGES EVERY COMMIT 4 SUSPECT and the gate holds the map true 190 CHECKS PER RUN · AND THE STALE LINKS COME BACK NAMED AND IT IS THE SAME MAP YOUR AGENTS READ, FROM THE COMMAND LINE
fig. 00 · what we install. Your repository already carries everything except a record of purpose. We write the promises down with the engineers who own the component, bind each one to the code, the tests and the documents that serve it, and put a gate on every commit. Counts are from Proof’s own corpus.

Proof’s own corpus: 1,990 requirements 21,796 machine-checked edges 190 checks per run 4 stale links reported today read the public audit

01 · the distinction fig. 01 · two maps of one repository

Two maps of the same repository.

Your code context tools draw the first map. It is built out of symbols, files and tests, and it answers where everything is. Proof draws the second map. Its nodes are the promises the software makes, and the code, the tests and the documents hang off the promise they serve.

A new engineer can read your repository in an afternoon. So can a coding agent. Intent is the one thing neither of them can read, because nobody wrote it down. They recover purpose by reading the implementation, and the implementation is the thing they were asked to change. That is how a confident, wrong change gets through review.

A graph of what the code is for, not only what it is.

Map 01 · read out of the code

  • Every node is a symbol. Every edge is inferred from the source as it stands today.
  • It answers where a function lives and which file it sits in.
  • It carries no record of what any of it was supposed to do.

Map 02 · written down and signed

  • Every node is a requirement, written down, and signed by the engineers who own the component.
  • Every edge says implemented by, verified by, or documented by, and every edge is checked on every commit.
  • The audit trail is the same object your agents read before they touch the code.

What that buys an agent

  • Before the change: the component states its promises, so purpose does not have to be guessed from the implementation.
  • After the change: the gate re-runs and says whether each promise still holds.
  • A change that reads well and breaks a promise turns the gate red.
MAP 01 · READ OUT OF THE CODE MAP 02 · WRITTEN DOWN AND SIGNED parser.go Decode escape() parser_test.go parser.go parser_test.go SYS-REQ-012 SYS-REQ-036 SYS-REQ-060 STK-REQ-019 SYS-REQ-014 a map of what the code is EVERY NODE A SYMBOL · EVERY EDGE INFERRED a map of what the code is for EVERY NODE A PROMISE · EVERY EDGE MACHINE CHECKED SAME REPOSITORY · SAME SYMBOLS · ONE OF THEM CARRIES WHAT THEY ARE FOR
fig. 01 · the two maps. Schematic, drawn over one set of symbols. The red marks on the left are the questions that map cannot answer. On the right the same symbols are still there, faint, and five requirements sit over them with their links drawn down into the code, the tests and the documents. Reading the left map tells you where a function is. Reading the right one tells you which promise it carries.

An inferred map ages the moment the code moves, and whoever trusts it does not get told. Proof holds its map against the code on every commit, and reports the links that no longer land.

findings and hazards are attached to requirements and checked separately. the dependency modelled here is intent dependency: what a promise needs, what verifies it, what documents it.

02 · the contents fig. 02 · one node and its edges

What is in the graph.

The numbers here are Proof’s own corpus, the codebase we run Proof against every working day. 21,796 machine-checked edges join 1,990 requirements to the code that implements them, the tests that verify them and the documents that describe them.

1,990
requirements, each one a node, each one approved before anything is enforced against it.
21,796
edges, each one re-checked by the gate on every commit.
41,985
functions indexed across 2,853 source files, 40,829 of them carrying at least one requirement ID.
190
audit checks per run, from annotation validity to coverage against intent.

The edges come from annotations your engineers and your agents write in the source: 13,406 // Verifies: lines and 3,285 // Implements: lines. 94.5% land on a symbol, one function inside a file, so the graph knows which function carries the promise and which tests answer for it.

THE STAKEHOLDER PROMISE STK-REQ-019 DERIVED FROM SYS-REQ-012 IN THE WORDS OF THE PEOPLE WHO OWN IT IMPLEMENTED BY parser.go SYMBOL: PARSEBOOLEAN IMPLEMENTED BY path_compiler.go SYMBOL: COMPILEPATH VERIFIED BY parser_error_test.go FAILS IF IT BREAKS DOCUMENTED BY docs/parser.md RE-CHECKED WITH THE CODE WHERE THE EDGE COMES FROM // Implements: SYS-REQ-012 // Verifies: SYS-REQ-012 3,285 AND 13,406 SUCH LINES IMPLEMENTATION LINKS, BY GRANULARITY 94.5% LAND ON A SYMBOL 5.5% FILE LEVEL

fig. 02 · One node, and everything hanging off it. Schematic of a single requirement in the graph. The annotation lines at bottom left are what create the edges, and they live in your source under your licence. The bar at bottom right is the real split: most implementation links resolve to one function, so the graph can answer questions about a symbol.

the graph is checked in place. export is neighbourhood scoped: you name a node and get what surrounds it.

03 · three questions fig. 03 · one promise, 130 things affected

Ask it something.

These are real runs against Proof’s own corpus. Your engineers ask it what moves before they start, and so do your agents, from the same command line.

If I change this promise, what moves with it?

the command

proof trace impact STK-REQ-019

the answer
affected
130
requirements
31
implementation files
10
test files
33
documentation files
56
cycles
none

The walk follows requirements, tests and annotations, so it reaches the documents a code reader would have missed.

What is this function for?

the command

proof req show --file <path> --symbol <Symbol>

the answer

The requirements attached to the file, listed separately from the requirements attached to the symbol inside it. In the run we checked, the symbol resolved to a single requirement, which is the promise that one function answers for.

A reader who opens the file gets the file. A reader who asks about the function gets the function.

Which tests must run for this change?

the command

proof test affected

the answer

The specific test that answers for what you touched, and the exact tests to run printed as a command your engineer or your agent can paste.

The selection comes from the requirement links, so a test that guards the promise is selected even when the file you edited is nowhere near it.

STK-REQ-019 ONE PROMISE THE CHANGE STARTS HERE 31 REQUIREMENTS EACH ONE A PROMISE THE WALK FOLLOWS REQUIREMENTS, TESTS AND ANNOTATIONS 10 IMPLEMENTATION FILES 10 FILES THAT CARRY ONE OF THOSE PROMISES 33 TEST FILES 33 TESTS THAT FAIL IF ONE OF THEM BREAKS 56 DOCUMENTATION FILES 56 PAGES THAT DESCRIBE BEHAVIOUR THAT MOVES 130 affected NO CYCLES

fig. 03 · The blast radius of one promise. Every mark is a real count from proof trace impact STK-REQ-019 on Proof’s own corpus. The walk runs through requirements, tests and annotations, and it reports whether it found a cycle.

the same results are available as structured output for machines. a JSONL audit stream carries the run, and exit codes carry the verdict.

04 · upkeep fig. 04 · the same drift, two outcomes

The graph cannot go stale without the gate saying so.

The gate re-runs on every commit. All 190 audit checks run again, in the same order, with the same rules. When a commit moves the code out from under a link, that link is reported as suspect and a person looks at it.

On our own corpus today, proof trace suspect reports 4 stale links. We put the live number on the page because a graph held against a moving codebase carries some drift at any moment, and the honest thing is to publish the count.

A LINK THAT WAS INFERRED ONCE THE CODE MOVES WHERE THE SYMBOL IS NOW the answer does not change NOTHING REPORTS THE DRIFT SAME DRIFT, TWO OUTCOMES A LINK THE GATE HOLDS EVERY COMMIT WHERE THE SYMBOL IS NOW reported as suspect 4 TODAY ON OUR CORPUS

fig. 04 · The same drift, two outcomes. Schematic. In both rows the code moves the same way. The difference is whether anything re-checks the link afterwards, and whether the number that comes back is published.

structured exit codes and a JSONL audit stream carry the same verdict to whatever reads it, including your CI and your agents.

05 · accountability fig. 05 · who is allowed to approve

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

  • 190 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. A person decides what reaches 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.

The rule for agents

  • Anything a coding agent creates through Proof is stamped ai_generated: true, status draft, review pending.
  • An agent cannot approve its own requirement. The product enforces it.
  • A person approves the draft, and only then does the gate start enforcing it.

Machines produce the volume. People produce the judgment. Every finding arrives with a reproducer that fails on your current main, so you can re-run the whole argument on your own hardware.

WHAT A CODING AGENT WROTE ai_generated: true status: draft review pending THE AGENT CANNOT APPROVE ITS OWN REQUIREMENT ENFORCED IN THE PRODUCT THE ENGINEER WHO OWNS THE COMPONENT APPROVED, AND NOW IT COUNTS SYS-REQ-1991 IN THE GRAPH, ENFORCED ON EVERY COMMIT

fig. 05 · Who is allowed to approve. Schematic of a rule the product enforces. A coding agent can draft a requirement and can write the annotations that bind it, and the draft stays a draft until a person with the authority to own it approves.

instruments: condition-level MC/DC in eleven languages, formal verification on Kind2 and Z3, FRETish patterns where a requirement needs a temporal shape. these are the tools. the product is the graph and the gate.

06 · 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.
279
functions traced into the graph, each bound to the promises it answers for.
7
findings fixed upstream, in public pull requests anyone can read.
179
checks per run recorded on the public audit, on every commit to the library.
MISS-001 · the one we missed

One published miss.

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

We published a blameless postmortem, signed by Leonid Bugaev, and pinned the 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.

the register · findings bound to requirements

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 a context column listing the requirement IDs each finding affects.
Ten open known issues on the public jsonparser register. Five High, two Medium, two Low, one Info. Read the Context column: each row carries the requirement IDs the finding affects, which is the graph doing the binding. Findings are attached objects, checked separately from the graph.

the graph · one finding, traced to its 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 including parser.go, path_compiler.go and three test files.
This is the second map, on screen. One known issue, the two requirements it affects, and for each of those the code that implements it and the tests that verify it: parser.go, path_compiler.go, parser_error_test.go and two more. Every edge on this canvas is one the gate re-checks. Click any card and you land on the line of code.

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.

07 · the deliverables four artifacts, under your licence

What you walk away with.

Four artifacts, and you keep the graph and the tests whatever happens to us afterwards. They sit in your repository under your licence, in plain text your engineers can read and edit.

01

The graph of intent over your component

Numbered, testable requirements approved by the engineers who own the component, each bound to the code that implements it, the tests that verify it and the documents that describe it.

02

A register of known issues

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

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. Red blocks the merge.

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.

during feature work

Your engineers use it before the change

They ask what a component promises, what a change moves, and which tests answer for it. The graph gives the same answer to the engineer who wrote the code and the one who joined last week.

during review

The gate answers after the change

190 checks run on the commit. A promise that no longer holds turns red with a failing test attached, so the review argues about evidence.

during onboarding

A new engineer reads intent, then code

The requirements are the reading order. The code, the tests and the documents hang off the promise they serve, so purpose arrives before implementation.

08 · how it is delivered one component · four weeks · then it runs

How we install it.

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 graph is yours from the first day.

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, binding each one to the code and the tests, and putting every requirement in front of its owner for approval.

from week 5

Then you live in the graph and the dashboard

Requirements, the register of known issues, the evidence behind each finding and the coverage numbers, in one place. Your product managers, your board and your customers under NDA can read it without opening the repository.

every run

A person validates it before it reaches you

The machines run all 190 checks on every commit and produce candidates. A person decides which of them your team ever sees.

Your agents drive Proof from the command line.

The graph is built for the tools your team already runs. Everything an engineer can ask, an agent can ask the same way, and the gate answers to both.

  • Hooks install into Claude Code and Codex, so a failed audit blocks the agent from finishing its turn.
  • 41 embedded doctrine playbooks can be emitted agent ready, so the working rules travel with the repository.
  • A structured exit-code contract carries the verdict, and a JSONL audit stream carries the run, both built for machines to read.
  • Anything an agent drafts arrives stamped ai_generated: true and waits for a person to approve it.
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.
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. You end up with the map, and a gate that keeps it true.

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

drawn by the audit 1,990 requirements · 21,796 edges
checked by the gate, every commit 190 checks · 4 stale links reported today
approved by Leonid Bugaev founder · postmortems signed by name

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