ADR-003: Status is a closed vocabulary in frontmatter, enforced by lint
Status Active · Version 2 · Filed 2026-08-03 · Influenced DP-005
Context
A consolidation audit of 121 decision records found the status field had
entropied into roughly thirty distinct forms. Forty-four said Accepted and
forty-six said Active, with no difference in meaning. Several carried trailing
whitespace. A long tail packed whole narrative paragraphs into the field.
The audit’s sharper finding: every documentation surface guarded by an executable check had held; every surface governed by prose convention alone had drifted. Not toward one wrong value — toward variety, which is worse, because a reader can’t learn what the field means.
Decision
A closed vocabulary, in frontmatter, checked by the lint.
status: Active | Proposed | Deferred | Superseded | Rejected
optionally followed by — <short note>. Narrative belongs in the body.
Active— in force. (AbsorbsAccepted; the distinction carried no information.)Proposed— awaiting a decision.Deferred— explicitly postponed, with the revival trigger recorded. This one earns its place: a postponement you can state is better than one faked asProposedforever.Superseded— replaced; the note links the successor.Rejected— considered and declined, kept for the record.
Frontmatter also carries tags (the browsing category, pushed down onto the
decision itself), date, an optional issue, and a summary — which is prose,
and therefore carries links like any other prose, while the rest stays data.
A vocabulary plus its lint, not a vocabulary alone. That is the whole point of the audit’s finding, and it is DP-5 at rung four.
Alternatives considered
- Free-text status. What was there. It drifted, measurably.
- A prose header (
**Status:** Active). Human-readable, and it puts a regex between the index generator and the field it needs. The migration to frontmatter also had to repair five records that an earlier prose-editing pass had mangled mid-sentence — evidence for the regex problem, not against it. - Both, for readability. Two copies of one fact, which is DP-4’s definition of a latent bug. The frontmatter is what the index shows, so the header would be the copy that drifts.
- An open vocabulary with a linter warning. A warning on a field nobody reads is the status quo with extra output.
Consequences
- “Update the status to Superseded” has an enforced target vocabulary; a typo fails the lint.
- The index can be generated (ADR-004), because every fact it needs is a parseable field.
- Adding a status word is now a deliberate change to the lint, which is the point.