Development record
the blank grounds enumeration claims the trailing comment is the last gap while eleven further nothing carrying spellings pass green
the blank grounds enumeration claims the trailing comment is the last gap while eleven further nothing carrying spellings pass green
Found by the itd-189 delta security review. The CLAIM is branch-introduced; the hole it mis-describes is pre-existing in class.
commands/capture.md tells the user that a YAML null or an empty block scalar is
refused, "with a trailing comment on the value the one spelling it does not yet
read". schema.go mirrors it with a "Two things it does NOT decide" list that
enumerates the comment gap and one other and stops. Both say the enumeration is
complete. It is not.
Measured, gate verdict against report verdict, one line per spelling:
grounds="!!null" gateGreen=false proposalSilenced=true
grounds="!!null null" gateGreen=true proposalSilenced=true
grounds="!<tag:yaml.org,2002:null>" gateGreen=true proposalSilenced=true
grounds="!!str ''" gateGreen=true proposalSilenced=true
grounds="&anchor" gateGreen=true proposalSilenced=true
grounds="!!seq []" gateGreen=true proposalSilenced=true
At least eleven spellings carry nothing in YAML, pass the gate, and silence the
proposal -- which is verbatim the mechanism iss-2608301649337965 was opened
for, reached by spellings outside that record's enumeration and outside the
already-captured iss-2608301744268001.
Note where the dishonesty is and is not. iss-2608301649337965's own resolution
note is HONEST: it says it closes three of the four spellings the body
enumerates. The user-facing doc and the code comment are the two that overclaim.
Remedy for THIS record is the reword: scope both sentences to the spellings the
predicate actually tests. The gate is strictly better than it was either way;
what may not stand is a sentence telling a reader the hole is closed when it is
not. The widening is iss-2608301808198621 and is deliberately separate.
Correction, 2026-09-29
The resolution was true when it was written, and its "deliberately NOT
widened" is not true at this tip. 3eb4b549 ("fix: gate the cold-reading evals
and close the eval, ledger and ingest hygiene issues") took the widening this
record left to iss-2608301808198621: absence is decided by the class of YAML
node a value spells (internal/core/frontmatter.IsEmptyValue), not by a list of
spellings. The same commit removed TestIsAbsentValueIsASpellingTestNotANullTest,
which the resolution names; TestAbsenceIsDecidedByClassNotBySpelling in
internal/core/lint/schema_absence_test.go pins the class rule.
Frontmatter
| id | iss-2608301808193750 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | major |
.abcd/work/issues/resolved/iss-2608301808193750-the-blank-grounds-enumeration-claims-the.md
open on GitHub ↗ · commit history ↗
mentions5
- iss-2608301649337965isAbsentValue reads an empty flow sequence as absent but not an empty flow mapping or an explicit null tag so a blank grounds passes the gate and silences the report
- iss-2608301744268001a trailing comment on a frontmatter key defeats every blank spelling the record_schema gate refuses because the shared same-line scanner strips no comments
- iss-2608301808198621isAbsentValue decides on literal strings rather than the yaml null and empty class so chasing spellings cannot close it
- iss-2609261034583909Eight resolved records name, in their resolution notes, a test no longer in the tree; each was true when written, and RS006 reads only records entering a terminal folder, so none is refused, but a reader following the note finds nothing. Verified at b7646ff1, with the commit that removed each test: iss-184 names TestTokenizeRejectsUnterminatedHeredoc (16d50feb renamed it TestTokenizeFlagsUnterminatedHeredoc and changed the behaviour: an unterminated heredoc is a verdict, not ErrUnparsableCommand, so the note's part (2) is stale too); iss-2608301808193750 names TestIsAbsentValueIsASpellingTestNotANullTest (3eb4b549 replaced the spelling predicate with a class-based one, TestAbsenceIsDecidedByClassNotBySpelling, so the note's 'deliberately NOT widened' is superseded); iss-2608311632382737 names TestPreflightRunsBothEvalLanes (the test is TestPreflightRunsEveryTaggedEvalLane, which derives the lanes from the Makefile; the one clean rename of the eight); iss-2608311632439831 names TestComparativeRefusesToAssemble (3b62c967 made the comparative position assemble from the widening run's items, so the refusal the note describes no longer exists); iss-2609012039117381 names TestBinaryHooksFallBackToAPathBinary and iss-275 names TestGuardShimFallsBackToPATH (c637a734 removed the PATH rung those tests pinned: the shims run only the abcd the machine recorded); iss-354 names TestWorkflowGoVersionsMatchSubstitutions (removed in df377ee6, replaced by TestEverySetupGoResolvesTheToolchainFromGoMod under iss-2609090951291799); iss-2609090951291799 names TestWorkflowGoVersionsMatchSubstitutions only to say it was replaced, which stays accurate. Six of the eight need an amendment note stating what superseded the test and the claim, not a rename, so the set is not a mechanical fix.
- itd-189What the widening reading proposes is admitted or declined on the record — grounds on admission, dispositions on declines, and surprises as their own entries