Public audit register

The register, including the misses.

Proof’s formal public record: scope, findings, withdrawals, validators, misses, and evidence — dated and preserved. We publish our misses, because a record containing only wins has been edited. Counts are an index. The evidence is the argument.

How to read this

Six entries, five states.

Every entry is dated, publishes its own triage boundary, and says who validated it or why the name is withheld. A named reviewer validates each finding before it enters this register, so you never open a finding that nobody checked.

Open
Confirmed and unresolved.
Fixed
Closure evidence attached.
Withdrawn
Proof disproved its own finding.
Reviewed
Re-examined by a person and allowed to stand.
Miss
A defect escaped the declared evidence.

Proof names two things: the platform that builds the intent graph, and the assurance practice that audits against it. This register is where the practice publishes what it found, what it withdrew, and what it missed. Names go on the promises, on the methodology bar, and on every published miss.

The credit rule

Every finding on this register was reported by Proof, from a dated report that predates the fix. What varies is whether the upstream public record names us. A report routed through a vendor’s private security channel usually leaves no public trace, so each entry says what you can confirm from the public record and what rests on our own dated files.

Three labels carry that. Credited upstream: the public issue, pull request, advisory or release note names the report, or the filing is our own. Not credited upstream: the fix is public and our dated report predates it, and the upstream record does not name us. This is the normal outcome for anything reported through a vendor’s security process. Credited to another reporter: an upstream advisory names someone else for the same class. We publish ours and say so. Every entry below states which of the three it carries. Each count rests on our own dated report, with the public record cited wherever one exists.

Every count on this page was read from the public record on 30 August 2026. Upstream boards move; these numbers are a dated reading of a moving board.

01 · Entry: jsonparser

July 2026 · public audit · subject: jsonparser · validated by Leonid Bugaev

The two defects that got past us.

In July 2026, two defects in jsonparser’s Set() got past our review. One silently threw away data: asked to write at index [5] of a two-element array, Set returned a one-element array — valid JSON, nil error, the rest of the data gone. The other panicked on an empty path component, the same failure class a hazard sweep had already found at seven sites and missed at the eighth. The affected code carried 100% MC/DC at the time. That is the uncomfortable part, and the reason this entry leads the register: coverage was complete and the defects got through anyway, because the proof had a gap. The blameless postmortem naming that exact gap is published in the repository, next to the findings and the fixes, where you can re-run all of it. The gate stopped neither defect, and the project’s changelog credits an outside reporter for each — the full account, including where our own records and the changelog disagree, is on public proof.

The context. jsonparser is a Go library that Proof’s founder has maintained for a decade; it went first on purpose, as code we could not hide from. Formalizing its behavior produced 123 requirements — 7 stakeholder, 116 system — and judged against them, the review surfaced six defects on its own. Eight defect files sit on master; the two beyond the six are the outside reports, credited by name in the changelog, and they are the two published misses. The issue register shows four known-issue records, KI-1 standing for a whole panic class across several call sites. Every one of those numbers is a directory or a document in the public repository, and they are counted out object by object on public proof. Under the credit rule this entry is credited upstream: every record counted above is a file on the project’s public master branch, and the changelog credits the two outside reporters by name for the two we missed.

A person validated every finding in this entry before it shipped. People sign Proof’s promises and its methodology bar, and publishing a miss is a person’s decision. The postmortem itself carries no signature, and it says so.

123 requirements6 found by the review2 misses published8 defect files4 issue records, every one fixed

Triage boundary · entry 01

In scope: the library’s public API, formalized as 123 requirements. Both escaped defects sat inside that boundary with full evidence attached. Nothing about the scope excuses them, which is why they count as misses and why they get the postmortem.

02 · Entry: rsync

August 2026 · public audit · subject: rsync · fixes credited by name in the release notes

Ninety-nine findings against thirty years of C.

rsync is widely shipped across Linux and Unix systems and has moved the world’s files since 1996. Proof audited it continuously through the development of rsync 3.5.0, alongside Trail of Bits, re-running the whole tripwire suite every time upstream moved. The audit filed 99 findings; the 3.5.0 security release shipped 33 security fixes, six more landed mid-development in the interim 3.4.3 security release, and the cycle carries 39 CVE IDs in all. Ten of the findings had been present since the first release in 1996.

The board keeps its own honest arithmetic: 45 findings open, 21 fixed, 28 withdrawn — the audit disproved its own findings and the board shrank — and 5 re-examined by a person and allowed to stand. That board was read on 30 August 2026, and the audit is still running, so open and fixed move. The release’s 33 fixes include findings from the daemon-protocol fuzzing pass and from researchers beyond this audit, and their work is never counted as ours. Every one of the 33 carries its own entry in the release notes, and the audit is still running. Under the credit rule this entry is credited upstream: the 3.5.0 release notes name Leonid Bugaev in their thanks and again as the reporter on individual fix entries, so the upstream record itself carries the credit.

99 findings filed33 security fixes in 3.5.039 CVE IDs across the cycle10 findings dating to 1996

Triage boundary · entry 02

In scope: rsync’s path-handling and daemon-protocol behavior, formalized into executable tripwires and re-run on every upstream change through the release. Severity labels are ours — 13 high, 41 medium, 43 low, 2 low-medium — our assessment, weighted by reachability and impact; a starting point for the maintainers’ triage, not a CVSS determination.

03 · Entry: grpc-go

June 2026 · public audit · subject: google/grpc-go · validated by Leonid Bugaev

Five fixed upstream, two as our own pull requests.

google/grpc-go is the Go implementation of gRPC, a security-critical RPC framework that carries authorization and transport for a large part of the cloud. Five issues are fixed on master — two of them landed as our own merged pull requests, and two are covered by the vendor’s own published security advisories. One more fix is in review, and one issue was withdrawn by agreement as intended behaviour.

Under the credit rule, the five split. Two are credited upstream: our own merged pull requests, filed under this practice’s public account, so the upstream record is our filing. Two more are not credited upstream — the report went through the vendor’s private security process, the fix is public, our dated report predates it, and the public record does not name us. The fifth is credited to another reporter: the vendor advisory covering that class names someone else. We publish ours because we hold a dated report that predates the fix, and the label says what the public record shows. The withdrawn issue and the fix in review are both our own public filings. Each of these, with its public evidence, is on the public roster. Reports still working through a vendor’s process, and anything we reported privately, are not published until they are public and closed.

5 fixed on master2 credited upstream2 not credited upstream1 credited to another reporter1 fix in review1 withdrawn by agreement

Triage boundary · entry 03

In scope for this public entry: the fixed, in-review and withdrawn issues, each classed at the level the roster shows. Severity and formal credit are the vendor’s to assign; where a fix carries someone else’s name, the roster still shows it fixed and says so.

04 · Entry: graphql-hive/router

June–July 2026 · public audit · subject: graphql-hive/router · validated by Leonid Bugaev

Six fixed on main in the Hive router.

graphql-hive/router is a GraphQL federation router. Six issues are fixed on main, and one was withdrawn by agreement as intended behaviour. Each one is a public pull request or issue you can open.

We publish these because the work should be checkable, not because it flatters us. Under the credit rule, two of the six are credited upstream: the upstream pull request that fixed each one links to our own dated public issue. The other four are not credited upstream — reported through the vendor’s own channel, fixed in public afterwards, with no mention of us in the upstream record. The withdrawn item is our own public issue, which we closed by agreement. Every fix here is on the public roster with its evidence. Reports still open, and anything we made privately, stay off the public page until they are public and closed.

6 fixed on main2 credited upstream4 not credited upstream1 withdrawn by agreement

Triage boundary · entry 04

In scope for this public entry: the fixed and withdrawn issues, each classed at the level the roster shows. Reports still open are held back entirely until they are fixed and public.

05 · Entry: wundergraph/graphql-go-tools

May–July 2026 · public audit · subject: wundergraph/graphql-go-tools · validated by Leonid Bugaev

Eight fixed on master after our reports.

wundergraph/graphql-go-tools is the GraphQL federation engine underneath a range of production gateways. A cluster of issues we reported was fixed on master, and the fixes landed as the vendor’s own pull requests.

This engagement also produced hardening items held off public disclosure by written agreement, and reports that are still open. Both are omitted here entirely, and this entry represents no count of either — it shows only what is fixed and public. Under the credit rule, all eight are not credited upstream: we reported them into the vendor’s own channel, the fixes are public and dated after our reports, and none of the eight upstream pull requests names us, which is the normal outcome for a report made through a vendor’s channel. Each fix, with its public pull request, is on the public roster.

8 fixed on master8 not credited upstreamreported through the vendor’s channelhardening items withheld by agreement

Triage boundary · entry 05

In scope for this public entry: the fixed, public issues, each classed at the level the roster shows. The privately-held hardening set and the reports still open are out of scope here, and no count of either is claimed.

Private work

Private work: bounded statements that cannot be independently inspected.

One entry sits under this heading. It is a real engagement, and nothing in it has a public evidence route, so you cannot check it the way you can check the five entries above. Its numbers stay inside this block and are added to no public count on this site.

06 · Entry: enterprise API gateway PRIVATE / ANONYMIZED

2026 · private engagement · subject: an enterprise API gateway · validator named in the engagement record; withheld here under the same permission rule as the client’s name

One component, and the crash class every existing test missed.

The engagement scoped one component of an enterprise API gateway. The engineers who owned the component approved 47 requirements in about two hours of their time, and the audit itself changed zero production code — it reads; it does not write. Against those requirements, the audit surfaced a nil-pointer crash class that every existing test missed. The approval step alone surfaced seven undocumented design decisions the team itself disagreed about.

The client is not named because we had not asked permission when this entry shipped. We publish names only with written approval; if permission is granted, this entry will be updated. The permission rule itself is on Trust. Every number in the paragraph above is a bounded statement from our own engagement record. There is no repository, issue, advisory or release note you can open to test it, so it carries no credit label under the credit rule and it is not evidence in the sense the rest of this register uses the word.

Triage boundary · entry 06

In scope: one component, chosen with the client and defined by the 47 approved requirements. Nothing outside that component is claimed here.

07 · What a finding is

What a single finding looks like.

Every finding in an engagement ships in one structure, and the structure is the promise: no reproducer, no finding. A finding without a runnable reproducer does not ship — the reproducer, not the signature, is its authority.

A reproducer pins the finding one of two ways: it fails until the fix lands, or it asserts the broken behavior while that behavior is live and flips when the fix lands. The record says which, and it never tells the easier story of the two. When a fix is verified, the reproducer stays in the client’s CI as a regression pin, and the defect record preserves the root cause, the severity basis and the evidence.

08 · Standing offer

One open-source pre-release audit per week, self-funded.

Coordinated with the maintainers, on their schedule. No invoice, no commercial follow-up.

This register has to earn the right to be believed, and open source is the only place it can. Proof does not publish private customer corpora, even for marketing, because the requirement graph can describe the product almost as completely as the source itself. So the public record grows one self-funded open-source audit at a time, and paying our own way keeps the entries free of anyone’s release marketing.

09 · Where next

Check the bar itself.

A register is only as good as the bar behind it. These pages hold the bar, the engagement it installs, and the evidence you can open.

Methodology

The bar we audit against, the check that enforces each clause, and a table of what the audit cannot see.

The engagement

The Continuous Correctness Audit: its shape, its five commitments, and what stays in your repository.

Life after the audit

What findings turn into after week four: register, fix loop, miss protocol.

Public proof

The jsonparser evidence, file by file: the chain, the ledger, the postmortem, the limits.

Trust

Why client names stay private until written approval, and how access works.

About

Who founded Proof, how the platform and the assurance practice fit together, and who stands behind the promises.