Proof · a record of what your software promises

Prove your software does what you promised.

Proof writes down the promises in your code. Your engineers sign them. A gate checks every commit against them.

Machines find the promises. Your engineers sign them. The gate enforces them.

public on buger/jsonparser123 promises signed

  1. 01 Promise

    Set() replaces one value and changes nothing else.

  2. 02 Enforced

    Proof writes a test that fails if that promise breaks.

  3. 03 Broken

    The test fails on main.

  4. 04 Fixed

    Merged in the project's own repository.#421

  5. 05 Forever

    The test stays. Every commit is checked.

One real promise on buger/jsonparser. The break is KI-3 in the public register.

Public receipt

Seven real bugs, found and fixed.

We ran Proof on a mature open-source project. Everything below is public, and you can run it again.

buger/jsonparser, a 5,600-star Go library, more than ten years in production.

123

Promises signed

7

Real upstream bugs found and fixed

1

Missed promise published

Each finding is a test that failed on main.

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

Finding Promise Result
KI-1

A boolean is only true for the exact token true.

Fixed upstream #268
KI-2

A unicode escape is rejected unless four hex digits follow it.

Fixed upstream #271
KI-3

Set() on an array-index path never drops a sibling value.

Fixed upstream #276
KI-4

An integer too large for int64 returns an error and never wraps.

Fixed upstream #279
KI-5

A UTF8 decode never reads past the length the config declares.

Fixed upstream #283
KI-6

An empty array returns the empty sentinel and never a nil slice.

Fixed upstream #287
KI-7

EachKey visits a key once, even when the document repeats it.

Fixed upstream #290

Seven promises, seven failing tests, seven merges in the project's own repository.

We publish the promises we get wrong on the same register as the ones we get right. That is the only way you can check us.

How it works

Find, sign, test, gate, remember.

Five stages. Your engineers own the second one. The gate owns the last two.

01

Find

Proof reads your code and writes down the promises it already makes.

02

Sign

Your engineers read each promise and sign it. Nothing counts before a person signs.

03

Test

Each signed promise gets a test that fails when that promise breaks.

04

Gate

The gate runs on every commit. A broken promise stops the merge.

05

Remember

The test stays in your suite. The same break cannot return unseen.

The promise graph

One promise, then all of them.

Every promise is joined to the code that carries it and to the tests that check it. The gate reads those joins on every change.

Now picture 123 of these across one repository.

example · a payments service promisecodetestknown issue affects implemented by implemented by implemented by implemented by verified by verified by verified by verified by verified by SYS-REQ-011 · SIGNED amounts are stored in minor units SYS-REQ-012 · SIGNED a refund never exceeds the captured amount SYS-REQ-018 · SIGNED an idempotency key replays the same response SYS-REQ-023 · SIGNED a webhook is retried with backoff for 24 hours SYS-REQ-031 · SIGNED a declined card is never charged twice code · go refund.go commit code · go idempotency.go code · go webhook.go code · go charge.go test · go TestAmountsInMinorUnits test · go TestRefundNeverExceedsCapture test · go TestIdempotentReplay test · go TestWebhookRetryBackoff test · go TestDeclinedCardNotRecharged --- FAIL: TestRefundNeverExceedsCapture KI-07 · OPEN refund exceeded captured amount validated by a person register example · payments affects SYS-REQ-011 · SIGNED amounts are stored in minor units SYS-REQ-012 · SIGNED a refund never exceeds the captured amount SYS-REQ-018 · SIGNED an idempotency key replays the same response code · go refund.go commit test · go TestAmountsIn MinorUnits test · go TestRefundNever ExceedsCapture test · go TestIdempotent Replay KI-07 · OPEN refund exceeded captured amount validated by a person register

A commit changes refund.go. The map shows the promises of that file.

the promise a refund never exceeds the captured amount written in a design doc nothing checks it this component every service on that path every customer at once blast radius your ci green every test you already have, passing the promise a refund never exceeds the captured amount written in a design doc nothing checks it this component every service on that path every customer at once your ci green every test you already have, passing

Fig. 02 · The blast radius of one promise that is not written down. Example. The promise is only in a document. No check can fail on it. The failure occurs at your customers.

The product

What your engineer sees.

The product is two screens. One asks a person to accept a promise, and the other refuses a merge that broke one.

proof review payments-api · pull request #128
New promises 1 of 3

Proof found 3 new promises in this pull request.

SYS-0182 candidate

“A refund never exceeds the captured amount.”

Evidence refund.go:82-104

Accept promise Edit Reject
Signed by leonid Test added Gate enabled
Accepting a promise. A person reads the sentence, checks the code it points at, and signs it. Nothing is enforced until someone does.
ci payments-api · pull request #131
$proof gate --base mainloading 123 signed promises123 checked in 4.2s122 passFAIL  TestRefundNeverExceedsCapture      promise   SYS-0182      “A refund never exceeds       the captured amount.”      broke at  refund.go:96      signed by leonid, 14 Jul 2026exit 1merge blockedread the promise:portal.reqproof.com/p/SYS-0182
A gate failing. The run names the promise that broke and the person who signed it. Your CI stops the merge.

The register it all lands in

portal.reqproof.com/projects/jsonparser/findings
The Proof portal issue catalogue for the jsonparser project: ten open known issues listed by severity, each with an identifier, a status and the requirements it touches.
The register your team gets. Every open break, its severity, and the promises it touches. This one is public.

The objection

“We already have tests.”

Of course.

Tests check what your engineers remembered to write down.Proof finds the promises they never wrote down.

the usual direction something true about your code your engineer remembers it a test written by hand it guards that one thing remembers writes guards the same person what proof does your code, its behaviour, your intent candidate promises in plain words your engineer reads each one and signs it a test that fails when it breaks proof finds proposes signs every commit is checked from then on the usual direction something true about your code your engineer remembers it a test written by hand it guards that one thing what proof does every commit is checked a test that fails when it breaks your engineer reads each one and signs it candidate promises in plain words your code, its behaviour, your intent

Fig. 05 · The arrows run opposite ways. A test starts in one person's memory and ends at one assertion. A promise starts in the code, passes through a person who signs it, and ends at every commit after that.

Attached

A promise stays attached to the code it governs, so it moves with the code as the code changes.

Named

A failure tells you which promise broke, not only which assertion failed.

Before the merge

You can see everything one change touches before you merge it.

Who it is for

Who this helps first.

The CTO who signs releases

“We ship ten times faster now. Review speed did not increase ten times. I approve releases that I cannot examine myself.”

What Proof gives you: a map and a gate that you keep. The gate held the release to its promises before you sign it.

The engineer sent to check us

“I open the register and search for bad work.”

What Proof gives you: a live map, a published miss, and tests that fail on main. Run the tests again. Then tell your CTO.

The platform owner

“One bug in routing, auth, or billing touches every customer at the same time.”

What Proof gives you: the shared path as signed promises. A break on that path is a test that fails.

The engineer who ships with agents

“My agents write most of the code now. I need a record that they must obey.”

What Proof gives you: a written record of the promises in the code. Agents can read the record. Agents cannot approve the record.

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 promises, the bar, and our misses.

Your engineers

Sign the promises. Each item an agent writes has a draft mark. An agent cannot approve its own requirement.

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. 03 · CI is green in the two pictures. The second picture is possible only after the promises are written down.

Enterprise

What enters your environment.

Proof sits between your repository and your CI. Nothing else about your setup changes.

GitHub or GitLab read only PROOF between the two finds candidate promises a person approves each one a test per promise the gate the gate runs here your CI your runners, your secrets GitHub or GitLab read only PROOF between the two finds candidate promises a person approves each one a test per promise the gate the gate runs here your CI your runners, your secrets

Fig. 06 · One box in the middle. Your repository on one side, your CI on the other, and a person inside the box on every promise.

The six questions we are asked first

Does our source code leave our infrastructure?
Two models. A public repository, or your private code under NDA with read-only access.
Does Proof change our code?
No. Proof reads code and proposes promises. Fixes arrive as pull requests your engineers review.
Who approves a promise?
Your engineers. An agent cannot approve its own requirement.
Where do the promises live?
As plain files in your repository, under your licence. You keep them if we stop.
What happens when a requirement changes?
The gate reports the stale link on the next commit, and names the promise it belongs to.
How is our data handled?
NDA countersigned first. A 72 hour breach notification, deletion within 30 days on request, and three named model providers.

Three questions we answer in writing rather than on a page: running Proof on your own hardware, which models we may use, and where the data sits. Ask at [email protected] and you get a written answer.

What you keep

What you keep.

Four artifacts. They stay in your repository, under your licence.

01

The promises, written down and signed

We recover every promise of your component from the code. Your engineers sign each one.

02

A register of known breaks

Each break has a test that fails on your current main. A person validates each break before you see it.

03

A map you can ask

Select a function or a promise. The map shows what else changes. Your engineers, your CI, and your agents use the same map.

04

A gate on every commit

The gate reads the map on each change. A broken promise stops the merge.

If we stop work tomorrow, your map, your gate, and your register continue to operate.

Final receipt

Set() replaces one value and changes nothing else.

This promise was implicit for years. Proof made it explicit, found the violation, produced the failing test, and the maintainer fixed it upstream.

What promises 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
signs the promises we publish, and the ones we miss