diff --git a/skills/adr/SKILL.md b/skills/adr/SKILL.md index b9058d0..596c61e 100644 --- a/skills/adr/SKILL.md +++ b/skills/adr/SKILL.md @@ -58,8 +58,8 @@ adr: 0004 title: status: proposed | accepted | superseded | amended date: 2026-08-29 -deciders: " while proposed> -supersedes: +deciders: " (QUOTED) while proposed> +supersedes: --- # ADR-0004 — @@ -97,6 +97,25 @@ the condition that fires a revisit. An ADR with no validation section is a prefe with a template around it. ``` +### The frontmatter must actually parse + +It exists to be machine-read, so a block that does not load is worse than no block at +all: it drops that ADR silently out of every "what is still open?" query, while looking +correct. Two shapes this template used to suggest are invalid YAML, and both were found +live in the estate on 2026-09-05 — `openbanking-api` ADR-0001 and `infra` ADR-0019, each +copied verbatim from here: + +| Wrong | Why | Right | +|---|---|---| +| `supersedes: -` | a bare dash is a YAML *sequence entry*, not a string | `supersedes: null` | +| `deciders: pending: Mathias` | the second, unquoted colon reads as a nested mapping | `deciders: "pending: Mathias"` | + +Check before committing: + +```sh +python3 -c "import yaml,sys;yaml.safe_load(open(sys.argv[1]).read().split('---')[1]);print('ok')" docs/adr/0004-*.md +``` + ## Preserving a productive tension Some tradeoffs are not unresolved because nobody thought hard enough. They are