Development record
Quoted YAML nulls split capture and record-lint verdicts: capture unquotes before IsNull, record-lint reads the raw value
Quoted YAML nulls split capture and record-lint verdicts: capture unquotes before IsNull, record-lint reads the raw value
An issue record carrying impact: "NULL": capture's decodeScalar
(internal/core/capture/parse.go:188) strips the double quotes before
validateStrict calls frontmatter.IsNull, so abcd capture resolve
accepts the record — while record-lint's checkIssueImpact reads the raw
value with quotes intact, ParseImpact fails, and the issue_impact_valid
blocker fires on the record capture just accepted. The comment at
internal/core/lint/lint.go:2397 claims this split is impossible. PR #294
widened the disagreement window from one spelling ("null") to three; its
own tests pin both sides of the contradiction
(internal/core/frontmatter/frontmatter_test.go:76 vs
internal/core/lifeboat/graveyard_abandoned_test.go:167). The fix is to
normalise quoting on one side, not to widen literal sets. Evidence:
.abcd/work/reviews/2026-08-19-pr-294-null-predicate/ (F1, F2).
Forge mirror: #372
Frontmatter
| id | iss-285 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | major |
.abcd/work/issues/resolved/iss-285-quoted-yaml-nulls-split-capture-and.md
open on GitHub ↗ · commit history ↗
mentions3
- iss-2608211140410761abcd <id> ADR dispatch (record.go describeADR) confirms the frontmatter id with a byte-exact 'fields["id"].Value != id' compare (frontmatter.Field.Value is TrimSpace-only, quotes not stripped), while record-lint schema.go compares parsed handles (a tested tolerance, TestRecordSchemaFilenameIDComparesNumerically) and the citation resolver rebuilds ids from the parsed integer. So an ADR written id: "adr-12" (quoted), adr-0012 (padded), or ADR-12 (cased) is lint-green and citation-resolvable but abcd adr-12 reports 'not found'. A live facet against the shipped corpus: abcd adr-0003 (padded, admitted by IDRe) routes to the file then refuses. Second site under iss-285's quote-normalisation-split principle.
- itd-128One canonical YAML scalar resolver: frontmatter exports the single null/bool/quote resolution helper and the capture, lint, lifeboat, and memory decoders all delegate to it, so a cross-package verdict split on any scalar axis becomes unrepresentable
- itd-129Forge mirror as an opt-in adapter: the ledger mirrors out to forge issues one way, the forge id lives in the record schema, closures without import self-heal, and the whole surface is loudly absent without forge auth