Worktrees V2 — Phase Timing + Danger Map + Prune

V1 proved worktree isolation works — the trust model is enforced physically. But Build enters the worktree blind: no knowledge of which files have caused trouble before, and the proof chain is just a record nobody reads at build time. Meanwhile, phase timing lies — it measures gaps between artifact saves (which include developer idle time, sometimes days) instead of actual phase durations. And health display is missing the plan phase entirely.

verdict PASSscore 21 / 23findings 7 (0 risk · 1 debt · 6 obs)duration 1h 25mrejection cycles 0shipped May 6, 2026surface cli

Pipeline timeline

Intent to proven code in 1h 25m across Think, Plan, Build, and Verify.

Think
2m
Plan
9m
Build
65m
Verify
10m

Assertion ledger

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

IDSaysMatcher
A001Build gets a ranked list of risky files before starting workverifiedok
A002Files with more severe findings appear first in the risk profileverifiedok
A003Risk scores use severity weights: risk=3, debt=2, observation=1verifiedok
A004No empty risk section appears when files have no known issuesverifiedok
A005Bad contract YAML doesn't crash the build setupverifiedok
A006Risk profile shows findings but not build concernsverifiedok
A007Build duration measures actual build time, not idle time between savesverifiedok
A008Verify duration measures actual verify time, not idle time between savesverifiedok

Findings 7 total

debtpackages/cli/src/utils/worktree.tsclosed
Double H2 heading in risk profile — worktree.ts pushes '## Proof Findings' then proofFindings content starts with '## Risk Profile'
obspackages/cli/tests/utils/proofSummary.test.tsclosed
A013/A014 are type-level sentinels — construct PipelineStats manually, don't test computePipelineStats computes median_plan
obspackages/cli/tests/commands/work.test.tsclosed
A017 (build_agent) and A020 (verify_agent) lack direct tagged tests — covered by source inspection only
obsclosed
Contract A007 value stale — says timing.build equals 60 but test fixture correctly produces 45
obsclosed
Contract A011 value stale — says timing.build equals 60 but gap-timing fallback produces 1500 in test fixture
+2more findings

Integrity seal

scopesha256:4b9455adf11ba...
contractsha256:b215f463e78e8...
plansha256:6ea35534eff9f...
specsha256:e3660c81ecfd7...
build-reportsha256:b391a4f4f5fe9...
build-datasha256:24145779fcaee...
verify-reportsha256:8051bca2e58f9...
verify-datasha256:2d21da193c060...
audit cmd$ ana proof audit worktrees-v2-timing-danger-prune   → all hashes match