proofpage v0.1 · MIT

receipts, not screenshots

Every number names the command that actually ran.

proofpage executes your repo's real test, typecheck, build and lint commands, then writes one self-contained HTML page from what happened. A check that did not run gets no number at all.

zero dependencies zero JavaScript in output Node 22+

proof.html — generated 2026-09-05 real run
commit
550dfe6c517156fbf3117a04ac5b2fd7fa8b96aa
branch
main
node
v24.15.0 · win32 x64
discovered
auto-detected from package.json scripts

⚠ working tree was DIRTY — uncommitted changes may not be in the commit above

exit 0
npm test

54 pass · 0 fail — parsed from a real node:test summary, 7.87s

exit 0
npm run lint

output shape unrecognised — recorded as unparsed, and deliberately not scored

no run
npm run typecheck

no such script in this repo

no number printed

2 of 2 discovered checks passed. The third row is what most tools would render as 0.

54tests passedparsed from the real summary
0tests failedexit code 0, measured
1check unparsedlabelled, never scored
0numbers inventedenforced by --check

the refusal

A zero you did not measure is a lie with a number on it.

Three tools, one repo, one missing typecheck script. Only the third tells you the truth about what it knows.

badge generator
typecheck 0 errors never executed

Defaults an absent check to a passing number. The badge is green and the claim is fictional.

dashboard
typecheck status unknown

Silently drops the row. You cannot tell a check that passed from one that was never wired up.

proofpage
typecheck did not run no such script — no count shown

The absence is the finding. Every rule here is a test in the repo, not a policy in a README.

enforced mechanically

Four laws, each pinned by a fixture that violates exactly it.

proofpage --check <file> re-runs all four against any page, including one you did not generate.

01 A check that did not run shows nothing — not zero
No exit code, no count, and a line saying it did not run. 0 is a measurement; printing it for "unknown" is the exact lie this tool exists to prevent.
02 Unrecognised output is marked unparsed, with the reason
Only node:test and tsc shapes are unambiguous enough to parse. proofpage's own lint script renders as unparsed rather than being handed a score it did not earn.
03 A dirty tree is stated next to the commit SHA
A receipt from an uncommitted tree is a receipt for code nobody else can check out. If git is unavailable at all, the header says so rather than showing a fabricated commit.
04 Every <details> ships open, because print drops the closed ones
Zero JavaScript, zero network requests. A receipts page that silently loses its evidence when printed to PDF is worse than no receipts page at all.

two commands

Generate it, then let CI verify it.

bash
$ npx proofpage --out proof.html
  ✓ npm test            exit 0   54 pass · 0 fail
  ✓ npm run lint        exit 0   unparsed
  · npm run typecheck   did not run
  wrote proof.html (18 KB, 0 network requests)

$ npx proofpage --check proof.html
  ✓ 4 of 4 structural rules hold

exit codes

0 everything measured passed 1 a check failed — this is the CI signal 2 used wrongly, so nothing was measured and nothing is claimed

stated up front

What it will not tell you.

N01

Whether your tests are any good

A green proofpage over a suite of empty tests is an honest report of a worthless suite. It measures that the commands ran, not that they were worth running.

N02

Counts outside node:test and tsc

Vitest, Jest and pytest summary shapes are not parsed yet. Those rows are labelled unparsed rather than guessed at.

N03

Anything about another commit

It is a snapshot, not a monitor — and the page names the exact commit and working-tree state it measured.