Development record
isAbsentValue 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
isAbsentValue 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
Found by the round-5 security review. Branch-introduced.
isAbsentValue special-cases the empty flow SEQUENCE and not the empty flow
MAPPING, and knows no explicit null tag:
if strings.HasPrefix(v, "[") && strings.HasSuffix(v, "]") { ... }
So grounds: {}, grounds: { }, grounds: {} # c and grounds: !!null
reach checkRecordRequiredFields as present and non-blank, draw zero findings,
and the admission is accepted. admittedProposals then keys the pair as
admitted and the proposal vanishes from the outstanding report: a groundless
admission answers a proposal and nothing says so.
What makes this an asymmetry rather than a missing feature is the siblings.
[], [ ], "", '', " ", ~, Null, |, |+ and >- are ALL caught.
One flow collection is handled and the other is not.
It also falsifies two claims this branch has already shipped. The resolution
note on iss-2608300935218982 says an empty, whitespace-only or quoted-whitespace
required field is refused in EVERY store that shares the check; and
commands/capture.md tells the user that record_schema refuses an admission
with a blank grounds. Both are currently false.
capture/blankrequired_parity_test.go enumerates exactly four blank spellings,
and neither of these is among them.
Remedy: one branch beside the flow-sequence one, plus the two spellings added to
blankSpellings and to the schema tests.
Frontmatter
| id | iss-2608301649337965 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | major |
.abcd/work/issues/resolved/iss-2608301649337965-isabsentvalue-reads-an-empty-flow.md
open on GitHub ↗ · commit history ↗
mentions5
- iss-2608300935218982record_schema's required-field check tests absence on the raw value with quotes intact, so a quoted-empty grounds or occasioned_by ("", '', or " ") passes as present while the writer-side model trims and refuses it; a groundless admission is lint-green and the report leg then counts its proposal as admitted, silencing the very report built to catch it. The iss store has the identical pre-existing gap (found_during: "" passes). Strip surrounding quotes before the absence test, using the rule's own issueScalar, and add the quoted-empty spellings to the tests.
- iss-2608301656192369the join and bucket legs strip the scalar twice so a doubly quoted empty value is present to one leg and absent to the other and no leg speaks
- 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-2608301744300631an empty collection in superseded_by is an absence to the gate and a rendered link to record Describe so the two readers disagree about whether the record names a successor
- iss-2608301808193750the blank grounds enumeration claims the trailing comment is the last gap while eleven further nothing carrying spellings pass green