Proof Health V2

The health dashboard is the proof system's face. It's what a founder screenshots for their co-founder, what a developer checks before scoping work, what Learn reads at startup. Three gaps: the stats don't tell the full story (no verification effectiveness, no pipeline velocity), the timing data lies (think and plan show identical values), and nothing stops failed work from entering the proof chain. Three phases, one goal: the dashboard tells the truth and the proof chain guards its own integrity.

verdict PASSscore 31 / 31findings 14 (0 risk · 6 debt · 8 obs)duration 2h 43mrejection cycles 0shipped May 2, 2026surface cli

Pipeline timeline

Intent to proven code in 2h 43m across Think, Plan, Build, and Verify.

Think
28m
Plan
28m
Build
128m
Verify
8m

Assertion ledger

31 claims, each independently verified. Showing 8 — show all →

IDSaysMatcher
A001Quality section replaces the old Trajectory headingverifiedok
A002Hot Spots section replaces the old Hot Modules headingverifiedok
A003Promote and Recurring sections are merged into Next Actionsverifiedok
A004Old Promote section heading no longer appearsverifiedok
A005Old Recurring section heading no longer appearsverifiedok
A006Verification section shows first-pass rate as a percentageverifiedok
A007Verification section shows total issues caught before shippingverifiedok
A008A project with zero rejections shows 100% first-pass rateverifiedok

Findings 14 total

debtpackages/cli/tests/commands/proof.test.tsclosed
A014 cap test uses toBeLessThanOrEqual(5) instead of toBe(5) — passes even if cap logic is broken and returns 0 items
debtpackages/cli/src/utils/proofSummary.tsclosed
computeFirstPassRate exported but never imported outside proofSummary.ts — only called internally by computeHealthReport
obspackages/cli/tests/commands/proof.test.tsclosed
No direct unit tests for computeFirstPassRate or computePipelineStats — only covered through integration tests via runProof(['health'])
obspackages/cli/src/utils/proofSummary.tsclosed
computePipelineStats maps timing.think to 'scope' display label (line 951: think ?? scope) — naming mismatch between data field and display is intentional per spec but may confuse future maintainers
obsclosed
Spec predicted ~18 new tests but only ~11 were added (1773 vs 1762 baseline) — edge case tests for zero-entry verification, empty timing fields, and mixed promote+recurring sorting exist but inline, reducing count
+9more findings

Integrity seal

scopesha256:d2fe97db3061e...
contractsha256:793cfcd0e7a8a...
plansha256:2c2b593cab11b...
specsha256:673182936f46b...
build-reportsha256:be0c129506f80...
build-datasha256:af067af74876b...
verify-reportsha256:cf02492523f93...
verify-datasha256:6fbf2cf8ef4fe...
audit cmd$ ana proof audit proof-health-v2   → all hashes match