Findings ledger

The ledger, including the miss.

Proof is a correctness audit practice; this ledger is its public record. Two entries so far: dated, each publishing its own triage boundary, each naming its validator or saying why the name is withheld. We publish our misses, because a record that only contains wins has been edited. And no finding count will ever be a headline here; counts are the cheapest thing an audit produces.

Landing spot for the vetting staff engineer forwarded from index §7 ("dated entries, named validators, triage boundaries, one published miss"). The h1 echoes index §3's link copy for continuity. Smallness is deliberate: three honestly dated entries beat a padded portfolio, and §1 sets that expectation before anyone starts counting.
§ 1 · Entry: jsonparser

JULY 2026 · PUBLIC AUDIT · SUBJECT: jsonparser · VALIDATOR: Leonid Bugaev

The defect that got past us.

In July 2026, a silent data-loss defect in jsonparser's Set() escaped our audit and came back through a user report. The affected code carried 100% MC/DC at the time. That is the uncomfortable part, and the reason this entry leads the ledger: coverage was complete and the defect got through anyway, because the proof had a gap. The blameless postmortem naming that exact gap is published in the repo, next to the finding and the fix, where you can re-run both.

The context. jsonparser is our founder's own library, a decade old; it went first on purpose. Formalizing its behavior produced 123 requirements, and judged against them, seven real bugs surfaced, survivors of years of production use and fuzzing. The taxonomy, the OSS-Fuzz blind spot, and the fixes live in the case study below. The register is public and live: browse it.

Validated by the maintainer, who is also our founder, which is exactly why every artifact in this entry is public.

TRIAGE BOUNDARY

In scope: the library's public API, formalized as 123 requirements. The Set() defect sat inside that boundary with full evidence attached. Nothing about the scope excuses it, which is why it counts as a miss and why it gets the postmortem.

The full case study →  ·  the postmortem  ·  the 123 requirements  ·  the repository

Anchor entry. The own-miss postmortem is the highest-trust asset the firm owns (judge consensus; also promoted to index §3), so the miss is the centerpiece and the eight panic classes are context, in that order. A vetting engineer who reads one paragraph gets the miss first. VERIFIED 2026-08-02: postmortem (docs/proof-gap-root-cause.md), specs/ corpus, and proof/ tree are committed and public on github.com/buger/jsonparser master; links wired. Numbers corrected against the repo (one panic class, eight sites; 7 review bugs). Attribution guard: the Set() escape reached the practice via community reports (#286/#267); say "escaped the audit", never "we discovered it".
§ 2 · Entry: enterprise API gateway (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.

TRIAGE BOUNDARY

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

Job: the one entry showing the engagement shape working on private code; carries the week-one facts (47 requirements, two hours of the owners' time, seven design decisions) that continuous-correctness-audit.html sells. The anonymity line converts a weakness into a policy statement. ⚠ DECISION: can the firm-side validator be named while the client stays anonymous? Withheld for now; if yes, name them and drop the "on the engagement record" hedge. ⚠ Also chase written approval so this entry can eventually re-ship named.
§ 3 · The finding template

What a single finding looks like.

Every finding in an engagement ships in this structure. A finding without a runnable reproducer that fails on the client's current main, validated by a named reviewer, does not ship.

A REAL ONE, FROM THE PUBLIC LEDGER

KI-3 · Set() / array-index path under an object parent          status: fixed

expected     Set writes the value at the addressed path
observed     malformed JSON output on array-index paths under object parents
reproducer   set_spec_test.go · // Reproduces: KI-3 · red before the fix, green since
severity     our assessment, weighted by reachability and impact;
             a starting point for the maintainers' triage, not a CVSS determination
evidence     proof/known-issues/KI-3.yaml · evidence record
retest       fixed and pinned; the reproducer stays in CI as a regression test

When the reproducer goes green on a release, the retest record is appended and the test stays in the client's CI as a regression pin.

Job: show the vetting engineer the per-finding contract without fabricating a real finding. All values are obvious placeholders (F-XXX, main@<sha>) per the honesty rules; no realistic IDs anywhere. Carries the severity-provenance sentence for the page. Dark band echoes index §2's artifact viewport: same object, one level deeper.
§ 4 · Standing offer

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

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

Maintainers: the scoping form with “OSS audit” in the message is the application path. This ledger has to earn the right to be believed, and open source is the only place it can: a client's requirements corpus describes their product in enough detail that publishing it would publish the product; no permission fixes that. So public proof accumulates here one self-funded open-source audit at a time, and paying our own way keeps the entries free of anyone's release marketing.

Job: turn the ledger from a record into a pipeline; every quarter adds one fully checkable public entry. The quarterly cap is honest scarcity and bounds the cost. Two sentences on motive, per the ruling; the offer must never read as lead generation or the no-follow-up promise dies.
§ 5 · Where next

Check the bar itself.

/methodology

The bar we audit against, the checks that enforce each clause, and a table of what this audit cannot see.

/continuous-correctness-audit

The engagement, its shape, and its five commitments.

No form on this page by design: the vetting engineer is rarely the buyer; they forward a verdict. Two exits only: methodology for the skeptic's second pass, the offer page for the champion. Zero conversion pressure is the point; the page converts by being checkable.