Found while extending scripts/check-runtime-services-index.mjs for #9684. Deliberately not fixed there — #9684's gate holds the tables to the pages; this is one level up, about which labels are allowed to exist at all.
What was measured
stable / experimental is the whole vocabulary, and it is written out by hand in two places that nothing compares:
content/docs/kernel/runtime-services/index.mdx — the "Stability Legend" table (| \stable` | Backward-compatible within a major version |, | `experimental` | ... |`)content/docs/kernel/runtime-services/versioning.mdx — the "Stability Labels" bullets (- \stable`: backward-compatible within the current major version., - `experimental`: ...`)
There is no third definition in code: the label is a hand-asserted maturity claim with no enum behind it (the 2026-06 docs-accuracy audit reached the same conclusion for audit-service.mdx and email-service.mdx — docs/audits/2026-06-handwritten-docs-accuracy-followups.md).
After #9684 the gate holds the two tables that use a label to the page that declares it, so stable in the matrix can no longer contradict experimental on the page. What it does not hold is a label nobody defined: a page declaring - **Stability:** \beta`with a matrix row that faithfully repeatsbeta` is green today and after #9684, and the two legends can drift apart from each other indefinitely.
Why it was left out of #9684
Deriving the vocabulary from one of the two legends makes that gate the authority on which labels exist — a strictly bigger claim than "the tables agree with the pages", and it picks a winner between the two legends without anyone deciding which is canonical. #9684 records this as deliberately-not-checked in the script header instead.
Sizing
Small, once the maintainer answers one question: which of the two legends is canonical (or should the vocabulary move into code, next to the ledger of what "stable" promises?). After that it is roughly a 20-line limb in the existing gate plus self-test assertions — the labels already parse, readStabilityRows and the page bullet reader exist.
Refs #9684, #9604, #9630.
Found while extending
scripts/check-runtime-services-index.mjsfor #9684. Deliberately not fixed there — #9684's gate holds the tables to the pages; this is one level up, about which labels are allowed to exist at all.What was measured
stable/experimentalis the whole vocabulary, and it is written out by hand in two places that nothing compares:content/docs/kernel/runtime-services/index.mdx— the "Stability Legend" table (| \stable` | Backward-compatible within a major version |,| `experimental` | ... |`)content/docs/kernel/runtime-services/versioning.mdx— the "Stability Labels" bullets (- \stable`: backward-compatible within the current major version.,- `experimental`: ...`)There is no third definition in code: the label is a hand-asserted maturity claim with no enum behind it (the 2026-06 docs-accuracy audit reached the same conclusion for
audit-service.mdxandemail-service.mdx—docs/audits/2026-06-handwritten-docs-accuracy-followups.md).After #9684 the gate holds the two tables that use a label to the page that declares it, so
stablein the matrix can no longer contradictexperimentalon the page. What it does not hold is a label nobody defined: a page declaring- **Stability:** \beta`with a matrix row that faithfully repeatsbeta` is green today and after #9684, and the two legends can drift apart from each other indefinitely.Why it was left out of #9684
Deriving the vocabulary from one of the two legends makes that gate the authority on which labels exist — a strictly bigger claim than "the tables agree with the pages", and it picks a winner between the two legends without anyone deciding which is canonical. #9684 records this as deliberately-not-checked in the script header instead.
Sizing
Small, once the maintainer answers one question: which of the two legends is canonical (or should the vocabulary move into code, next to the ledger of what "stable" promises?). After that it is roughly a 20-line limb in the existing gate plus self-test assertions — the labels already parse,
readStabilityRowsand the page bullet reader exist.Refs #9684, #9604, #9630.