Fix pipeline timing accuracy for multi-phase and rejection cycles
Pipeline timing records inaccurate build/verify splits for any proof with multi-phase builds or rejection cycles. A 3-phase, 108-minute pipeline run (content-pages) initially recorded 0 minutes due to a key-lookup bug. The hotfix (`getLatestTime`) fixed the lookup but still produces wrong splits: for dynamic-pages (2 phases), it records build=56m/verify=41m when the accurate values are build=46m/verify=22m. The same conflation affects all 19 rejected proofs (21% of the chain). The total is always correct — it's the build/verify attribution that's wrong, with verify time counted as build time.
verdict PASSscore 19 / 19findings 5 (1 risk · 2 debt · 2 obs)duration 2h 37mrejection cycles 1shipped May 14, 2026surface cli
Pipeline timeline
Intent to proven code in 2h 37m across Think, Plan, Build, and Verify.
Think16m
Plan9m
Build22m
Verify52m
Assertion ledger
19 claims, each independently verified. Showing 8 — show all →
| ID | Says | Matcher | |
|---|---|---|---|
| A001 | Overwriting an artifact with new content preserves the previous timestamp and hash | verified | ok |
| A002 | History entries include both the timestamp and the content hash | verified | ok |
| A003 | Multiple overwrites accumulate history in chronological order | verified | ok |
| A004 | Re-saving identical content does not create a history entry | verified | ok |
| A005 | SaveMetadata type in artifact.ts accepts a history array | verified | ok |
| A006 | SaveEntry type in proofSummary.ts accepts a history array | verified | ok |
| A007 | Two-phase builds report accurate build time by summing per-phase segments | verified | ok |
| A008 | Two-phase builds report accurate verify time by summing per-phase segments | verified | ok |
Findings 5 total
riskpackages/cli/src/utils/proofSummary.ts→ closed
Non-null assertion on missing verify phase — verifyPhases[i-1]! crashes if verify-report-(N-1) missing when build-report-N exists
obspackages/cli/src/commands/artifact.ts→ closed
writeSaveMetadata export scope widened for tests — only consumed by test files, widens module public API
debtpackages/cli/src/commands/artifact.ts→ closed
Unbounded history array growth — each rejection cycle appends with no cap
obspackages/cli/tests/utils/proofSummary.test.ts→ closed
A019 asserts on source code content — reads proofSummary.ts and checks string patterns instead of behavioral assertion
debtpackages/cli/src/utils/proofSummary.ts→ closed
proofSummary.ts continuing to grow — now ~1740 lines, past comfort threshold, known from prior cycles
Integrity seal
scopesha256:f401c2da92431...
contractsha256:8b3ed93f870ea...
plansha256:147eb386dd128...
specsha256:1850ca241594a...
build-reportsha256:f1261733255ee...
build-datasha256:733ac084cc878...
verify-reportsha256:a3bcc0f54004d...
verify-datasha256:8b375c04fc163...
audit cmd$ ana proof audit fix-timing-accuracy → all hashes match