Proof chain health signal

The proof chain is write-only at the moment of writing. `ana work complete` says "Proof saved to chain." — a write confirmation that tells the developer what the system did, not what they have. After 14 pipeline runs and 62 callouts, the developer has no signal that institutional memory is accumulating. The completion moment, when they just contributed fresh intelligence, gives them nothing back.

verdict PASSscore 9 / 9findings 5 (0 risk · 0 debt · 5 obs)duration 7h 6mrejection cycles 0shipped Apr 26, 2026surface cli

Pipeline timeline

Intent to proven code in 7h 6m across Think, Plan, Build, and Verify.

Think
410m
Plan
410m
Build
4m
Verify
11m

Assertion ledger

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

IDSaysMatcher
A001Completion output shows the chain balance instead of a static confirmationverifiedok
A002The old write confirmation no longer appearsverifiedok
A003Callout count is zero when the entry has no calloutsverifiedok
A004Singular 'run' is used when chain has exactly one entryverifiedok
A005Cumulative run count reflects all entries in the chainverifiedok
A006Plural 'runs' is used when chain has more than one entryverifiedok
A007Chain balance line uses the dot separator conventionverifiedok
A008writeProofChain returns run and callout countsverifiedok

Findings 5 total

obspackages/cli/src/commands/work.tsclosed
Inline return type instead of named interface: `work.ts:744` — `Promise<{ runs: number; callouts: number }>` is an anonymous object type. If other consumers ever need these counts (e.g., a JSON output mode for `work complete`), this shape would need to be extracted into a named interface. Low priority — the function is internal and has one call site.
obspackages/cli/tests/commands/work.test.tsclosed
A008/A009 tag collision with prior feature: `work.test.ts:423` — Tags `@ana A008, A009` exist from a previous feature's contract (configurable branchPrefix). Pre-check tools that grep for `@ana A008` will find both. No functional impact today, but as tag density grows, disambiguation may be needed (e.g., feature-scoped tag namespaces).
obsclosed
No test exercises nonzero callout counts: Both test paths (single entry and existing chain) produce `0 callouts` because neither fixture includes callouts in the verify report or prior chain entry. A test with a fixture that has actual callouts would exercise the accumulation arithmetic beyond `0 + 0`. The `reduce` logic is correct by inspection (`(e.callouts || []).length` summed), but it's untested with nonzero values.
obspackages/cli/src/commands/work.tsclosed
chalk.gray verified only by absence of failure: The spec requires `chalk.gray()` wrapping (constraint). The tests confirm the text content but not the styling — chalk strips ANSI in non-TTY. This is standard for CLI tests and not a gap per se, but the chalk.gray requirement is verified by code reading (`work.ts:1107`), not by test assertion.
obsclosed
Contract A008/A009 block names imply unit tests: Contract blocks "returns chain health counts" and "returns cumulative callout counts with existing chain" suggest direct unit assertions on the return value (`result.runs equals 1`). The builder used integration tests instead, which is the right call since `writeProofChain` is internal. But the contract's `target: result.runs` / `matcher: equals` framing doesn't match `toContain` on console output. Future contracts for internal functions could use `target: output` to match the actual test approach.

Integrity seal

scopesha256:c8b2040c11e30...
contractsha256:c93755baac76b...
plansha256:2be634c38900b...
specsha256:eec3939fad722...
build-reportsha256:e5d147bbcee2d...
verify-reportsha256:b18445cc53641...
audit cmd$ ana proof audit proof-chain-health-signal   → all hashes match