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.

Think
16m
Plan
9m
Build
22m
Verify
52m

Assertion ledger

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

IDSaysMatcher
A001Overwriting an artifact with new content preserves the previous timestamp and hashverifiedok
A002History entries include both the timestamp and the content hashverifiedok
A003Multiple overwrites accumulate history in chronological orderverifiedok
A004Re-saving identical content does not create a history entryverifiedok
A005SaveMetadata type in artifact.ts accepts a history arrayverifiedok
A006SaveEntry type in proofSummary.ts accepts a history arrayverifiedok
A007Two-phase builds report accurate build time by summing per-phase segmentsverifiedok
A008Two-phase builds report accurate verify time by summing per-phase segmentsverifiedok

Findings 5 total

riskpackages/cli/src/utils/proofSummary.tsclosed
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.tsclosed
writeSaveMetadata export scope widened for tests — only consumed by test files, widens module public API
debtpackages/cli/src/commands/artifact.tsclosed
Unbounded history array growth — each rejection cycle appends with no cap
obspackages/cli/tests/utils/proofSummary.test.tsclosed
A019 asserts on source code content — reads proofSummary.ts and checks string patterns instead of behavioral assertion
debtpackages/cli/src/utils/proofSummary.tsclosed
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