ADR-051: Prose frontmatter is what the generator renders, not what the author prefers
Status Active · Filed 2026-08-15
Context
ADR-005 drew a line: frontmatter is data — read by value,
never rendered — with one exception, summary:, which the generator renders as
markdown into the index and the tag pages. So the summary may carry links, and
the reference machinery scans it; everything else stays plain, because a link
in a data field is just noise inside a value.
origin: did not fit that split. It is rendered — into a principle’s metadata
line, beside the version and the shaped by backlinks — but it was not scanned.
A reference written there was in the worst of both worlds: a hand-written link
displays correctly, so an author is encouraged to write one, while the fixer
never maintains it and the lint never checks it. A rot with no alarm.
Downstream, this produced advice rather than a fix. strata-g moved every
principle’s origin into frontmatter and then documented “keep it plain prose,
because only summary: is scanned” — a workaround written into a template, for
a limitation we own.
Decision
A key is prose exactly when the generator renders its value as markdown.
PROSE_KEYS = ("summary", "origin"), and the reference machinery — the mask,
the skip list, the rewritability guard and the frontmatter-survival check —
reads that set rather than naming summary four times.
Alternatives considered
- Leave it, and tell authors to keep
origin:plain. What was happening. It asks every downstream project to remember a limitation instead of fixing it once, and the limitation is invisible until someone writes a reference and watches it never get linked. - Make the set configurable. Tempting, and wrong in a way worth recording: a project cannot make a field prose by declaring it so. The rendering is what makes it true. A knob would let a project ask for links in a field that displays them as raw text — a promise the config cannot keep.
- Scan all of frontmatter. Puts links in
status:,tags:andissue:, which are parsed by value; the survival check exists precisely because a rewrite can break YAML.
Consequences
- Adding a prose key is a one-line change here, but the rule says when it is allowed: render it first, then add it.
- The frontmatter-survival check now compares every prose key rather than the
summary alone, so a rewrite that damages an
origin:block is declined the same way. - Downstream guidance can drop the workaround: a reference in
origin:is written bare and the fixer links it, like prose anywhere else.