Requirements that test themselves.

Intent Evidence Verified

The moving graph behind this headline is drawn from the public jsonparser project. It centres on the requirement SYS-REQ-009. Around it are the requirements that requirement rests on, the source files and test files that implement and verify it, the change that touched it, and the known issue and defect record that strengthened it. Every identifier in the graph is real and can be checked in the repository. The same requirement is set out in full in the next section.

Proof builds a living graph of what your software must do, what depends on it, and what proves it. The same graph guides your engineers and coding agents.

On real software

We audit the software everyone depends on.

The catalogues are public, the findings carry reproducers, and the misses are published beside the wins.

rsync

Thirty years old, on virtually every Linux system. Audited continuously through the development of the 3.5.0 security release — and still running.

99 findings filed by the audit · 10 of them in the code since the first release in 1996 · the 3.5.0 security release shipped 33 fixes, from this audit, a fuzzing pass, and external researchers together

Read the rsync audit →

On rsync we worked alongside Trail of Bits, through its Patch the Planet program.

We have run Proof on more of the software everyone depends on — jsonparser, google/grpc-go, graphql-hive/router and wundergraph/graphql-go-tools. See what we found and fixed → the public roster.

One living requirement

Live from the jsonparser audit

A requirement is not documentation anymore.

In Proof a requirement is an object in the system, not a paragraph in a document. It names its component, the intent it rests on, the code that implements it, the tests that verify it, the obligations it still owes, and the defects that changed it.

Open live requirement in the portal ↗

SYS-REQ-009

Approved

When Set is called with a provided path, the parser shall either replace the existing addressed value, create a type-consistent missing path and return the updated JSON document, or return KeyPathNotFoundError when the requested mutation path is not usable for the provided input.

Component
parser
Rests on
STK-REQ-005 Review not approved yet: a candidate, and nothing is judged against it
Implemented by
4 source files
Verified by
12 test files
Obligations
4
Defect history
3 records name it, latest DEFECT-260727-WWWY
Open live requirement in the portal
OBLIGATIONS — the specific checks this requirement must keep passing to stay approved.

Two graphs

A code graph tells you what calls what.Proof tells you what depends on what being true.

Select a component, requirement, issue, or change. Proof shows the intent it rests on, the promises downstream, and the code, tests, documents, and contracts that may need to be reconsidered.

Code graph

3 nodes · one kind of edge

function A function B function C calls calls

Proof

6 nodes · five kinds of edge

STAKEHOLDER NEED PAY-STK-005 rests on REQUIREMENT · PAY-SW-042 ✓ “Refunds cannot exceed capture.” REQUIREMENT PAY-SW-018 ✓ CODE refund.go:82-104 HAZARD 3 analyzed depends on implemented by challenged by EVIDENCE refund_test.go:41 ✓ proves STAKEHOLDER NEED PAY-STK-005 rests on REQUIREMENT · PAY-SW-042 ✓ “Refunds cannot exceed capture.” REQUIREMENT PAY-SW-018 ✓ depends on CODE refund.go:82-104 implemented by HAZARD 3 analyzed challenged by EVIDENCE refund_test.go:41 ✓ proves
Fig. 01 · Example service · The same system, seen two ways. Colour carries state: green is verified knowledge, the hazard branch marks how the requirement could fail, and grey is structure with nothing proving it.

See the blast radius before you touch the code.

Change this. What else did you change?

Select a requirementfour of them are live in this figure

THE CHANGE DEPENDENT INTENT COMPONENTS PUBLIC SURFACE PAY-042 Refunds neverexceed capture PAY-18 Card tokens expireafter 24 hours PAY-61 Partial capturessettle in full PAY-94 Webhooks retrywith backoff PAY-042 Refunds neverexceed capture PAY-18 Card tokens expireafter 24 hours PAY-61 Partial capturessettle in full PAY-94 Webhooks retrywith backoff

If this changesPAY-042PAY-18PAY-61PAY-94

5 files · 13 tests · 1 parent requirement · related obligations

2 files · 5 tests · 1 parent requirement · related obligations

1 file · 3 tests · 1 parent requirement · related obligations

2 files · 5 tests · 1 parent requirement · related obligations

Fig. 02 · Example service · One requirement, walked out to everything that rests on it. The PAY-* service is invented, and so are its counts.

Change and defect lineage

Every change should explain itself.

A commit says what text moved. A Proof change record says why the behavior moved, what it touched, and which evidence made the result acceptable.

CHANGE RECORD feature refactor behavior change defect fix

Change recordfeaturerefactorbehavior changedefect fix

Fig. 03 · Four kinds of change record. Two are shown below — a routine feature, and the real defect fix the evidence section walks end to end.

CHANGE-1042

Verified

KINDfeature

INTENT

Support nested array updates.

COMPONENTS

parser

REQUIREMENTS

2 added · 3 affected

requirements this change added or touched

IMPLEMENTATION

4 files

DOCUMENTATION

1 document updated

EVIDENCE

8 tests · 2 properties · hazard review

the checks that had to pass before approval

APPROVED BY

maintainer

DEFECT-260726-MFPA

Covered by requirement

KINDdefect fix

ORIGIN

Known issue KI-3

the known issue that opened this record

VIOLATED INTENT

SYS-REQ-009

the promise this defect broke

REPRODUCER

pins the break on the affected revision

FIX

parser.go

INSTANCE

fixed

DEFECT CLASS

evidence attached / status explicit

the class stays open until sibling evidence lands

REGRESSION

permanent test retained

Open problems remain known issues. When the fix is verified, Proof creates a defect record using the same evidence-bearing model as any other change. The issue closes; the proof stays.

See a change move through Proof →

Self-invalidation

The graph knows when it needs to be proven again.

Software knowledge becomes dangerous when it silently goes stale. When code, a requirement, or documentation changes, Proof identifies the relationships and evidence that may no longer be current.

It does not automatically declare the requirement false. It withdraws yesterday’s confidence until the affected obligations are reviewed or rerun.

BEFORE REQUIREMENT CODE DOC EVIDENCE CHANGE DETECTED REQUIREMENT CODE DOC EVIDENCE STALE ? * ? AFTER VERIFICATION REQUIREMENT CODE DOC EVIDENCE

Change recordCHANGE-1042

EVIDENCE REQUIRED

VERIFIED

Fig. 04 · One requirement and the three things attached to it, before the change, at the moment the change lands, and after verification runs. The record stays open until the affected obligations are reviewed or rerun.

Proof does not just remember what was true.It knows what must be checked again.

Agents

Give your agents the same understanding.

Your agent shouldn’t have to rediscover your system every time. Coding agents query the intent graph directly — the same components, requirements, dependencies, hazards, issues, changes, reproducers, and verification obligations that your engineers see.

Code tells an agent what the system does.Proof tells it what the system must not stop doing.

The connection

DEVELOPER a person AGENT claude code, cursor PROOF the intent graph DEVELOPER a person AGENT claude code, cursor PROOF the intent graph
agent session proof · jsonparser

~/src/jsonparser

I need to change Set() for nested arrays.

What can this affect?

Proof

RELEVANT INTENT

SYS-REQ-009 · SYS-REQ-069 · SYS-REQ-110

BLAST RADIUS

1 component · 3 files · 8 tests · 3 hazard obligations

HISTORY

1 related defect record · 2 known issue classes

REQUIRED BEFORE COMPLETION

  • reproducer
  • boundary obligation
  • nested-mutation property
  • documentation review

answered from the intent graph

Fig. 05 · The answer is not a file list. It is the intent the change touches, what the change can reach, what already went wrong here, and the evidence the change has to produce before it can be called done. The requirement identifiers are real and published.

A normal issue hands the agent one reported sentence, and the work starts with archaeology: reproduce the problem, infer the intent, find the code, guess the blast radius. A Proof issue arrives with the violated requirement, the reproducer that pins the failure, the blast radius, and the evidence required to close it — no reproducer, no finding.

The agent begins at the fix loop,not at the archaeology loop.

Compounding knowledge

Every change makes the next change safer.

Features, fixes, incidents, misses, reproducers, approvals, and evidence stay attached to the intent they changed — so the next engineer, or the next agent, starts with the accumulated model instead of reconstructing it from raw code.

ACCUMULATED MODEL WHAT STAYS ATTACHED FEATURE new behavior CHANGE RECORD what changed, and what proved it NEW REQUIREMENT + EVIDENCE requirements and evidence retained ISSUE an open known issue REPRODUCER the failure, kept as a test DEFECT RECORD evidence-bearing history after closure CLASS KNOWLEDGE hazard and class knowledge retained NEXT CHANGE starts with more context everything above is still attached ACCUMULATED MODEL WHAT STAYS ATTACHED FEATURE CHANGE RECORD NEW REQUIREMENT + EVIDENCE ISSUE REPRODUCER DEFECT RECORD CLASS KNOWLEDGE NEXT CHANGE
Fig. 06 · One lap. One line open beside the first step, seven beside the last; the band carries all of it back to the start.

Public proof

We ran it on real software.

Public project

github.com/RsyncProject/rsync

rsync — thirty years old, shipping on virtually every Linux and Unix system on earth — audited continuously through its 3.5.0 security release. The review filed 99 findings; the release shipped 33 security fixes, most of them credited to Leonid Bugaev by name in the release notes. The audit is still running.

Every fix shipped upstream — with a CVE ID and a regression test.

99

findings filed by the audit

33

security fixes in rsync 3.5.0

39

CVE IDs across the release cycle

Each fix carries a test that fails on the unfixed code.

Not an opinion, not a warning, not a suggestion.

We publish what we withdrew, and what we don't take credit for, next to what we found. That is the only way you can check us.

Want this on your own code? Request demo →

How Proof knows

“Verified” should mean something you can rerun.

The Proof CLI checks the requirement before it judges the code, connects the claim to implementation and evidence, analyzes how it can fail, and leaves the resulting checks in your CI.

  1. 01

    APPROVE THE INTENT

    Engineers sign what the component must do.

  2. 02

    ANALYZE THE OBLIGATIONS

    Formal semantics and hazard analysis define what evidence is needed.

  3. 03

    BIND THE EVIDENCE

    Code, documentation, tests, proofs, reproducers, and coverage attach to the claim.

  4. 04

    RE-EARN THE RESULT

    Changes invalidate affected evidence and the gate runs again.

ON EVERY CHANGE ON EVERY CHANGE

Instruments

FRETish · Kind2 · Z3 · hazard analysis · MC/DC

FRETish spec language · Kind2 + Z3 model checkers

property tests · fuzzing · executable reproducers · CI gate

Accountability

Who checks the checker.

Machines check everything, every time. People decide what a machine must not decide alone. This limit is written in the configuration. You can move it.

Agents

Run every check, on every commit. The quantity is more than a person can read.

A person

One person validates each finding before it reaches you. People sign the bar and the promises that require a person’s judgment, and decide that a miss gets published. The published postmortem carries no personal signature, and we say so where we publish it.

Your engineers

Approve where the assurance level demands a person. Below that line an agent may approve its own requirement, and the record names the agent and the level. The level is yours to set.

1 · counted against code ci green every line your tests touch, executed 2 · counted against the promises ci green covered by a test that can fail promises no test can fail on 1 · counted against code ci green every line your tests touch, executed 2 · counted against the promises ci green a test that can fail promises no test can fail on

Fig. 07 · CI is green in the two pictures. The second picture is possible only after the promises are written down.

Installation

Install Proof on one consequential component.

The Continuous Correctness Audit builds the first intent graph inside your software. We recover and formalize the requirements, your engineers approve them, and Proof binds the component to its hazards, code, documentation, issues, changes, and evidence. Scoping is confidential.

Continuous Correctness Audit

The installation

Scope

ONE COMPONENT

  • roughly four weeks
  • fixed fee after scoping

What you keep

  • approved requirements
  • intent graph
  • hazard analysis
  • executable findings
  • change and defect evidence
  • agent access
  • CI gate

You finish with the graph, the evidence corpus, and a gate in your CI. Everything that runs stays yours.

The audit is how Proof gets installed. Proof is what stays.

See the full engagement →

What you get is a file tree in your repository, not a PDF in your inbox.

Prove your software does what you promised.

What requirements are hiding in your codebase?

We run Proof on one public project each quarter, at our own cost. There is no invoice and no follow-up.

Leonid Bugaev · founder
sets the bar these promises are judged against, and publishes the misses on the same register