Findings Lifecycle Foundation

The proof chain records intelligence but can't act on it. Verify produces findings every pipeline run. Those findings sit in a flat list with no lifecycle state — no way to distinguish "needs attention" from "already handled," no way to mark stale observations, no way to classify informational upstream findings separately from actionable code/test findings. Agents consuming `ana proof context` receive 82 undifferentiated findings including observations about deleted files, absent code anchors, and superseded older observations alongside genuine active findings.

verdict PASSscore 31 / 31findings 6 (0 risk · 2 debt · 4 obs)duration 1h 8mrejection cycles 0shipped Apr 27, 2026

Pipeline timeline

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

Think
25m
Plan
25m
Build
18m
Verify
0m

Assertion ledger

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

IDSaysMatcher
A001Each proof chain entry stores its findings with the renamed fieldverifiedok
A002Findings can have a lifecycle status: active, lesson, promoted, or closedverifiedok
A003The old 'callouts' field name is removed from TypeScript type definitions, variable names, and interface names. The parser regex matching ## Callouts in verify report markdown and test fixture strings containing that markdown heading are intentionally retained.verifiedok
A004Chain health stats include counts for each finding statusverifiedok
A005Chain health stats include maintenance activity counts when maintenance occurredverifiedok
A006Existing findings without a status are treated as active during backfillverifiedok
A007Findings from upstream observations are classified as lessonsverifiedok
A008New code and test findings start with active statusverifiedok

Findings 6 total

obspackages/cli/src/commands/work.tsclosed
Dead ternary on new finding status: `packages/cli/src/commands/work.ts:810` — `(c as { category: string }).category === 'upstream' ? 'active' : 'active' as const` — both branches evaluate to `'active'`, making the expression a no-op. The correct assignment happens at lines 818-824. This is dead logic that should either be removed (let lines 818-824 handle it alone) or corrected to `'lesson' : 'active'` and the redundant loop removed.
obspackages/cli/src/utils/proofSummary.tsclosed
Redundant status filter in Hot Modules: `packages/cli/src/utils/proofSummary.ts:535-536` — double-checks `finding.status` both as truthy and not-undefined, then re-checks on the next line. A single `if (finding.status !== 'active' && finding.status !== undefined) continue;` would be clearer.
debtpackages/cli/src/utils/proofSummary.tsclosed
Dashboard duplicates Active Issues logic: `packages/cli/src/utils/proofSummary.ts:566-616` — reimplements the collection, filtering, capping, and file-grouping from `generateActiveIssuesMarkdown` (lines 385-473). The format differs (### vs ## headings, no truncation), but extracting shared helpers for the filtering and grouping would reduce the ~50 lines of duplication.
obspackages/cli/tests/commands/work.test.tsclosed
A015/A016 edge cases not behaviorally exercised: `packages/cli/tests/commands/work.test.ts:1278` — the supersession test proves the core mechanism but doesn't include an unresolved-basename finding (to prove A015's skip) or two same-entry findings with matching file+category (to prove A016's guard). The code guards are trivial and correct by inspection, but the test coverage gap means a regression in those guards wouldn't be caught.
debtpackages/cli/tests/commands/work.test.tsclosed
A024 warning test doesn't trigger the warning: `packages/cli/tests/commands/work.test.ts:1372` — the test is tagged `@ana A024` but only asserts the entry has `result === 'PASS'`. The UNKNOWN warning path is unreachable through `completeWork` because of pre-validation. A direct `writeProofChain` test with an UNKNOWN-result proof object would exercise the actual warning.
+1more findings

Integrity seal

scopesha256:8c307761a591b...
contractsha256:7e78e329cd74f...
plansha256:a47449633ff62...
specsha256:3587d5e411c01...
verify-reportsha256:195c7c1fb835c...
audit cmd$ ana proof audit findings-lifecycle-foundation   → all hashes match