Structured Findings Companion

The proof chain's highest-value data — findings and build concerns — enters through 216 lines of regex parsing free-text LLM markdown. Every other data type (assertions, timing, hashes, modules) enters through structured sources at 100% reliability. The parser is adequate for what it captures (89% file resolution, 92% anchor accuracy post-F1.5). But two fields that would make the learning loop genuinely intelligent — `related_assertions` (which contract assertion a finding relates to) and `severity` (blocker vs observation vs note) — can't be parser-extracted. The agent knows which assertion it was checking when it found the issue. It just has no structured place to write it.

verdict PASSscore 29 / 37findings 6 (0 risk · 0 debt · 6 obs)duration 53mrejection cycles 0shipped Apr 28, 2026surface cli

Pipeline timeline

Intent to proven code in 53m across Think, Plan, Build, and Verify.

Think
10m
Plan
10m
Build
30m
Verify
13m

Assertion ledger

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

IDSaysMatcher
A001Valid verify companion YAML passes validationverifiedok
A002Verify companion missing schema field is rejectedverifiedok
A003Verify companion with invalid category is rejectedverifiedok
A004Verify companion with invalid severity is rejectedverifiedok
A005Verify companion with invalid related_assertions is rejectedverifiedok
A006Saving a verify report without its companion YAML is blockedverifiedok
A007Saving a build report without its companion YAML is blockedverifiedok
A008Verify report saves successfully with valid companionverifiedok

Findings 6 total

obspackages/cli/src/commands/artifact.tsclosed
Double YAML parse in companion success message — validateVerifyDataFormat/validateBuildDataFormat parses the file, then saveArtifact re-parses at lines 932-933 to count findings for the console message. Validation function could return the parsed count.
obspackages/cli/src/utils/proofSummary.tsclosed
PreCheckData interface retains seal_commit field despite seal_commit removal from ProofChainEntry and ProofSummary. Intentional — reads old .saves.json — but inconsistent with the removal theme.
obspackages/cli/src/utils/proofSummary.tsclosed
getProofContext uses conditional property assignment (if finding.line !== undefined) rather than always-present optional fields. Result object shape varies — fine for TypeScript consumers but JSON shape is polymorphic.
obspackages/cli/tests/commands/artifact.test.tsclosed
Pre-check tag collision: A022-A025 and A029 reported COVERED because @ana tags from OTHER features' contracts share the same IDs. The 'covering' tests (readme.test.ts, confirmation.test.ts) don't test this feature's assertions. No dedicated tests for writeProofChain spread, seal_commit removal, or template content.
obspackages/cli/tests/commands/artifact.test.tsclosed
blocks-save tests (A006, A007) use toThrow() without checking exit code or error message content. saveArtifact calls process.exit(1), which throws in test — the assertion confirms the throw but not the exit code value or the descriptive error message.
+1more findings

Integrity seal

scopesha256:9d672a19f8700...
contractsha256:111e5f5a4b103...
plansha256:70e27568f7371...
specsha256:5ba3a7e625947...
build-reportsha256:f4d327a1f516e...
build-datasha256:baebfd7240ab0...
verify-reportsha256:ad19447ffa5fb...
verify-datasha256:6c8445cf07f78...
audit cmd$ ana proof audit structured-findings-companion   → all hashes match