Uh oh!
There was an error while loading. Please reload this page.
docs(kernel): list services.sms in the runtime-services stability matrix, and gate the matrix and every label it publishes (#9684) - #9753
Conversation
…rix, and gate the matrix and its labels (#9684) `versioning.mdx`'s "Current Matrix" carried seven rows for the chapter's eight pages: `services.sms` was missing from a FIFTH enumeration of the same chapter, after #9604 fixed it in two index lists and #9630 fixed the accessor/slot mismatch. Every enumeration of this chapter that the gate does not hold has drifted, and each one was found by a human noticing. So the row is the small half. `check-runtime-services-index.mjs` gains two additive limbs, leaving the five existing checks untouched: - check 6 holds the "Current Matrix" to the pages on disk — membership and order, exactly as check 3 holds the chapter list, because the matrix follows meta.json's nav order and that convention is the only thing that tells the next author where a new row goes; - check 7 holds every published stability LABEL to the page's own `- **Stability:** <label>` bullet, on BOTH tables that publish one — the matrix and the `services.*` table in `kernel/index.mdx`. This is the half with lasting value: membership checking catches a MISSING row, this catches a WRONG one, which is a live lie a reader plans an upgrade against. The page is the source of truth for its own label, so a disagreement is always reported against the table, and a page that declares no label at all is a finding. The `services.sms` label is derived, not invented: `sms-service.mdx` declares `- **Stability:** `stable``, which is what the row now says. #9629 is untouched: the stability row parser is anchored to `^|` table rows, so the Source-of-Truth list's prose `Security:` row — the one #9634 deliberately kept out of the gate — cannot enter any set here. The self-test pins that on the parser and again on a failing tree. Self-test 17 -> 27 assertions. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
✅ PM ACCEPT — #9684 / PR #9753Verified independently: 3 files ⭐ H1 — the census chose the shape, and it chose against generalisingSix enumerations of this chapter's eight
And the conclusion that matters:
That is my H1 question and my H3 warning answered by the same measurement. I said the census decides bespoke-vs-generalised and I genuinely did not know which way it would go; it went to bespoke for a reason, not by default. A generalised check would have looked more principled and quietly resolved an open maintainer question. The seventh was ruled out with reasons rather than by not finding it: H2 — checkable, and nothing needed normalisingAll 8 pages carry a parseable ⭐ And the bonus is a real one: ⭐ H3 — you proved the avoidance instead of asserting it
Then the part I did not ask for and should have: two self-test assertions pin it — H4 — four mutations, and one of them applies yesterday's lesson(a) And (c) carries a second result you called out:
That is exactly the trap #9681's dev hit hours ago — a narrowed regex making Plus per-limb ablation ( On the gate not run, and on labels
And #9751 and #9752#9751 — the stability vocabulary ( #9752 — Verdict: ACCEPT. Arming once the two running gates converge. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#9684
versioning.mdx's "Current Matrix" carried seven rows for eight pages —services.smsmissing from a fifth enumeration of the same chapter, the third landing of this defect class on one chapter in a day: #9604 added it to two index lists, #9630 corrected the accessor/slot mismatch, and each was found by a human re-reading the chapter rather than by machinery. So the row is the small half; the gate extension is the point.The row
| services.sms | stable |, inserted betweenemailandsettingsso the matrix keeps followingmeta.json's nav order. The label is derived, not chosen:sms-service.mdxdeclares- **Stability:** stable, which is the same source the other seven rows agree with (verified for all eight — no existing row contradicts its page, so there was nothing to normalise).The gate — two additive limbs, five existing checks untouched
scripts/check-runtime-services-index.mjs:meta.json'spagesorder today and that convention is the only thing telling the next author where a new row goes.services.*table inkernel/index.mdx. This is the half with lasting value. Membership checking catches a missing row; this catches a wrong one — a table that lists the page and contradicts it, which a reader plans an upgrade against. The kernel table was carrying an unchecked stability column all along; it agrees today, and now it has to.The page's own
- **Stability:** labelbullet is the source of truth (it is what a reader lands on), so a disagreement is always reported against the table, and a page that declares no label at all is a finding — the tables cannot be checked without it.Deliberately not checked, and recorded as such in the script header: the label vocabulary. Filed separately as #9751 with sizing — deriving
stable/experimentalfrom one of the two legends would make this gate the authority on which labels exist and would pick a winner between two hand-written legends nobody has declared canonical.#9629 is not decided here
STABILITY_ROW_REis anchored to^|table rows. The Source-of-Truth list's extraSecurity:row — the one #9634 deliberately kept out of the gate, because encoding it either way pre-judges an open maintainer question — is prose, so it cannot enter any set this limb builds; and the expected set is still derived from the pages on disk, never from a hand-written list, so no allowlist entry was introduced. Two self-test assertions pin it:readStabilityRowsover the fixture'sindex.mdx(which carries aSecurity:row) returns zero rows, and no finding on a failing tree mentions Security.Enumeration census (the measurement that chose this shape)
Six enumerations of this chapter's eight
services.*pages exist, found by scanning every file naming five or more of the accessors:runtime-services/meta.jsonpagesruntime-services/index.mdxchapter listkernel/index.mdxservices.*table*-service.mdxfiles on diskruntime-services/index.mdxSource-of-Truth listversioning.mdx"Current Matrix"No seventh.
.claude/workflows/docs-accuracy-audit.jslists all 11 chapter files, but as part of a repo-wide docs enumeration already held bycheck:docs-audit-scope.kernel/services.mdxandkernel/services-checklist.mdxenumerate the kernel registry /CORE_SERVICE_PROVIDER, a different and larger set. Since exactly one unheld membership enumeration remained, a bespoke limb beats a generalised "every enumeration agrees" check — the generalisation is precisely what would drag in row 5 and decide #9629 by accident.Verification
Self-test 17 → 27 assertions; every new limb observed red on a real mutation of the real tree and silent on the correct one, with byte-identical restores:
versioning.mdxtoorigin/main⇒exit=1, one finding:"Current Matrix" has no row for services.sms (sms-service.mdx exists)— theruntime-services/versioning.mdx's stability matrix omitsservices.sms— a fourth enumeration of the chapter that #9634's gate does not hold #9684 defect itselfexperimentalforservices.queue⇒exit=1, names both labels and the pagekernel/index.mdx'sservices.smsrow saysexperimental⇒exit=1againstkernel/index.mdx— which also proves its rows are really parsed on the real tree, rather than a false zero of the docs(kernel): name the registry slot on every runtime-services page, and gate it #9681 kindaudit-service.mdxloses its Stability bullet ⇒exit=1against the pageGates run locally at
8fc81320b, all green:check:runtime-services-index,check:doc-anchors,check:docs-audit-scope,check:docs-redirects,check:role-word,check:published-readme-links,check:nul-bytes,check:required-contexts,check:workflow-status-functions,check:node-version,check:shard-attestation,check:type-check-coverage,check:cross-package-test-inputs, and speccheck:liveness/check:empty-state/check:variant-docs/check:strictness-ledger. One derived gate was not run:check:type-check-debt, whose--re-measurerefuses to run without the built closure of all workspace packages (0dist/dirs in a fresh worktree) and which a docs + script + workflow-comment diff cannot move; CI runs it after the closure build.No changeset: nothing published changes (docs page, gate script, one workflow comment) —
skip-changeset, matching #9634 and #9681.Also filed while sweeping: #9752 —
IEmailService's JSDoc claims alignment with aCoreServiceNamemember that does not exist. Out of scope here; not addressed in this PR.Generated by Claude Code
Generated by Claude Code