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.
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.ts→ closed
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.ts→ closed
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.
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.
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.