Development record
2026-09-15 — An id written in a record's prose must resolve unless the author marks it illustrative or forward-looking (product thinker, ruling on iss-2609100518527863, where a spec composed in an autonomous run carried two invented ids in ordinary sentences and only a human reading it back noticed). `record_schema` already resolves the typed frontmatter references; the new `prose_citation_resolves` rule reads record bodies and free-text frontmatter fields through the one canonical resolver, folding case and padding, with a line-scoped `<!-- record-lint: illustrative -->` or `<!-- record-lint: forward-looking -->` marker as the only escape. A slug does not stop an id being an id, so a filename-shaped handle is a citation of its id. The corpus that predates the gate is carried by id, never by file, in `.abcd/prose-citations-baseline.json`, each entry declaring its class and reason, and the baseline ratchets: a new unresolvable id fails even in a file the baseline names, and a spent entry is reported so the list only shrinks. One entry is a probable defect, iss-2608231243286557, cited five times as settled fact with no record ever minted; it is carried as `suspect` for a human to correct. Rejected: only structured references count (would not have caught the case that prompted the rule); check prose but only warn (a warning nobody reads is the silent exemption the rule closes).
2026-09-15 — An id written in a record's prose must resolve unless the author marks it illustrative or forward-looking (product thinker, ruling on iss-2609100518527863, where a spec composed in an autonomous run carried two invented ids in ordinary sentences and only a human reading it back noticed). record_schema already resolves the typed frontmatter references; the new prose_citation_resolves rule reads record bodies and free-text frontmatter fields through the one canonical resolver, folding case and padding, with a line-scoped <!-- record-lint: illustrative --> or <!-- record-lint: forward-looking --> marker as the only escape. A slug does not stop an id being an id, so a filename-shaped handle is a citation of its id. The corpus that predates the gate is carried by id, never by file, in .abcd/prose-citations-baseline.json, each entry declaring its class and reason, and the baseline ratchets: a new unresolvable id fails even in a file the baseline names, and a spent entry is reported so the list only shrinks. One entry is a probable defect, iss-2608231243286557, cited five times as settled fact with no record ever minted; it is carried as suspect for a human to correct. Rejected: only structured references count (would not have caught the case that prompted the rule); check prose but only warn (a warning nobody reads is the silent exemption the rule closes).
Frontmatter
| id | dcn-2609150000000005 |
|---|---|
| type | decision |
| date | 2026-09-15 |
.abcd/work/decisions/dcn-2609150000000005-an-id-written-in-a-record-s-prose-must.md
open on GitHub ↗ · commit history ↗
mentions1
- iss-2609100518527863A record can cite a record id that does not exist, and for one record family an id cannot be resolved to a file mechanically at all. A session writing a spec during an autonomous run put two invented ids into it and caught them only by reading the document back afterwards; nothing in the record gates checks that an id written inside a record resolves to a record that exists. The gap is wider than a missing check. Two filename conventions coexist in the decisions family: the hand-numbered records carry a zero-padded ordinal in the filename whose value differs from the id in their own frontmatter, and the minted ones carry the timestamp id without the family prefix the id itself begins with. Neither shape lets a reader map a cited id to a file by name, so a resolver has to parse the frontmatter of every record in the family before it can answer, and an agent checking its own work by hand cannot do it reliably at all. Any check that lands has to resolve through frontmatter rather than filenames, which is also the reason the check does not exist yet.