Repository navigation
runtime-services/versioning.mdx's stability matrix omits services.sms — a fourth enumeration of the chapter that #9634's gate does not hold #9684
Copy link
Copy link
Closed
Labels
Description
Activity
Claiming this card.
- Session:
session_01XqDQYVU5smx29ts9pAErja - Branch:
claude/issue-9684-versioning-matrix - Worktree:
../objectstack-9684offorigin/main(6cb88d9f2), which already carries docs(kernel): name the registry slot on every runtime-services page, and gate it #9681 /338dcfd2d.
Plan: (1) census of every enumeration of the runtime-services chapter before designing the gate extension, (2) the missing
services.smsmatrix row derived from the page's own declared stability, (3) an additive sixth check inscripts/check-runtime-services-index.mjsholding theversioning.mdxmatrix to the pages on disk and each row's label to that page'sStabilitybullet. Files I expect to touch:content/docs/kernel/runtime-services/versioning.mdx,scripts/check-runtime-services-index.mjs.
Generated by Claude Code
- Session:
- added a commit that references this issue
on Aug 18, 2026 { "issue": 9684, "status": "done", "branch": "claude/issue-9684-versioning-matrix", "pr": "https://github.com/objectstack-ai/objectstack/pull/9753", "premise_still_valid": true, "summary": "H1 CENSUS (the measurement that chose the shape) — six enumerations of this chapter's eight services.* pages exist, found by scanning every file in the tree that names five or more of the accessors: (1) runtime-services/meta.json 'pages' [held: checks 1+3]; (2) runtime-services/index.mdx chapter list [held: checks 2+3]; (3) kernel/index.mdx services.* table [membership+href held since #9634 — but its STABILITY COLUMN was unheld, and is a second place the same label is published]; (4) the *-service.mdx files on disk [the derivation source]; (5) runtime-services/index.mdx Source-of-Truth list [deliberately unheld, #9629]; (6) versioning.mdx 'Current Matrix' [this card]. No seventh: .claude/workflows/docs-accuracy-audit.js lists all 11 chapter files but only as part of a repo-wide docs enumeration already held by check:docs-audit-scope (and is a governed surface); kernel/services.mdx and kernel/services-checklist.mdx enumerate the kernel registry / CORE_SERVICE_PROVIDER, a different and larger set; CHANGELOG.md and docs/audits/*.md are historical records. Because exactly ONE unheld membership enumeration remained, I shipped a bespoke limb rather than a generalised 'every enumeration agrees' check — the generalisation is exactly what would drag row 5 in and decide #9629 by accident. || H2 — the label IS independently checkable: all 8 pages carry a parseable '- **Stability:** `label`' bullet at line 8 (audit=experimental, other 7=stable), no prerequisite work needed. All 7 pre-existing matrix rows AND all 8 kernel-table stability cells already agreed with their pages, so there was no source disagreement to report and nothing was normalised; the sms label was derived from sms-service.mdx, not chosen. Both halves of the card shipped, plus the kernel table's stability column, which is the same 'wrong row' class and closes it rather than one instance. || H3 — #9629 untouched: the new parser (STABILITY_ROW_RE) is anchored to '^|' table rows, and the Source-of-Truth list's Security row is prose ('- Security: `path`'), so it cannot enter any set the new limbs build; the expected set is still derived from the pages on disk, never from a hand-written list, so no allowlist entry exists. Two self-test assertions pin this: readStabilityRows over the fixture's index.mdx (which carries a Security row) returns ZERO rows, and no finding on a failing tree matches /[Ss]ecurity/. || SHAPE — additive only: five existing checks byte-untouched (the only deletions in the diff are the header prose, the readPages/check/summarise/run signatures and the self-test fixture writer, extended exactly as #9681 extended them). Doc half: one row, '| `services.sms` | `stable` |', between email and settings so the matrix keeps meta.json's nav order.", "tests": "All at final commit 8fc81320b (clean tree; the union was run after the last commit). H4 REVERSE-VERIFICATION on the real tree, four mutations, all observed red with the expected finding and byte-identical restores (git checkout HEAD -- path, then git diff --quiet clean): (a) versioning.mdx reverted to origin/main => exit=1, exactly one finding, 'content/docs/kernel/runtime-services/versioning.mdx: \"Current Matrix\" has no row for `services.sms` (sms-service.mdx exists)' — the #9684 defect itself; (b) matrix row for services.queue changed stable->experimental => exit=1, '\"Current Matrix\" labels `services.queue` `experimental`, but queue-service.mdx declares `stable` -- fix the table, the page is the source of truth'; (c) kernel/index.mdx's services.sms row changed stable->experimental => exit=1, '`services.*` table labels `services.sms` `experimental`, but sms-service.mdx declares `stable`' — this also disproves a false-absence of the #9681 kind: the kernel table's 8 rows really are parsed on the real tree, not a silent zero; (d) audit-service.mdx stripped of its Stability bullet => exit=1 against the page. ABLATION of each new limb (if (false && ...)): limb 6 => self-test red on exactly its 3 assertions ('...omitting a real page is caught -- got []', stale row, order); limb 7 => red on exactly its 3 (matrix label, kernel label, missing bullet); byte-identical restore verified with diff -q against a pre-ablation copy. Self-test 17 -> 27 assertions, green. GATES green locally at 8fc81320b, derived with 'node scripts/pm/dispatch-gates.mjs' over the three changed paths (the dispatch prompt named no gate list): check:runtime-services-index ('8 chapter page(s) ... 8 stability-matrix row(s) ... all enumerations agree, every declared slot is really registered, and every published stability label matches its page'), 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 spec check:liveness / check:empty-state / check:variant-docs / check:strictness-ledger. ONE derived gate NOT run and why: check:type-check-debt — its --re-measure refuses to run without the built closure of all workspace packages (0 dist/ dirs in a fresh worktree; it names 55 missing dependency type entry points and points at issue #6376), so running it would have meant a full monorepo turbo build under the shared verify lock for a gate that a docs + gate-script + workflow-comment diff cannot move; CI runs it after the closure build. Control-byte scan clean (grep -naP over all three changed files, plus check:nul-bytes green). skip-changeset applied and READ BACK on the PR: ['documentation','ci/cd','size/m','skip-changeset'] (added with POST, not a set-replacing PUT, so the labeler bot's three survived); no changeset, matching #9634 and #9681 which published nothing either.", "open_questions": [], "out_of_scope_findings": [ "filed as #9751 (label `finding`, unassigned): the stability label VOCABULARY (stable/experimental) is hand-written in two legends — index.mdx's 'Stability Legend' table and versioning.mdx's 'Stability Labels' bullets — and nothing holds them to each other or to the labels in use, so an invented label such as `beta` stays green even after this PR. Left out deliberately: deriving the vocabulary from one legend makes the gate the authority on which labels exist and picks a winner between two legends nobody has declared canonical. Sizing: small (~20-line limb + self-test) once the maintainer says which legend is canonical, or whether the vocabulary belongs in code. Recorded as deliberately-not-checked in the script header too.", "filed as #9752 (no label beyond domain:devx, unassigned): packages/spec/src/contracts/email-service.ts:11 says 'Aligned with CoreServiceName email in core-services.zod.ts', but CoreServiceName has no `email` member (email is subsumed under `notification`). The runtime slot `email` is real and registered by plugin-email, so only the JSDoc's provenance claim is false — same class as #9630, and the plausible 'fix' of adding an enum member would invent a core-service identifier nobody registers. Recorded in the 2026-06 docs-accuracy audit followups and never filed until now." ] }
Generated by Claude Code
- added a commit that references this issue
on Aug 19, 2026
Found during #9630 while re-reading the runtime-services chapter. Not fixed there — #9630's diff is the accessor/slot naming defect, and this is the enumeration-drift class #9604/#9634 own.
What was measured
content/docs/kernel/runtime-services/versioning.mdxcarries a "Current Matrix" table of stability labels. It has seven rows for the chapter's eight pages:services.data,services.sharing,services.audit,services.queue,services.email,services.settings,services.storageservices.smssms-service.mdxexists, declares- **Stability:** \stable`, is inmeta.json'spages, is in the chapter list, and is in thekernel/index.mdx` table. Only this matrix omits it.Why nothing caught it
This is the same defect as #9604 (
services.smsmissing from index lists) in a fourth location.scripts/check-runtime-services-index.mjsholds three enumerations plus the files on disk —meta.jsonpages, theindex.mdxchapter list, and thekernel/index.mdxtable. Theversioning.mdxmatrix is not among them, so the gate is green over this.It is a near-perfect candidate for that gate: the matrix rows are already in the machine-readable form the existing
readChapterList/readKernelTableparsers handle (| \services.` | `` |), and each page already declares its own- Stability: ``` bullet — so the check could verify both membership and that each row's label matches the page it describes, with no new convention to introduce.Worth noting the second half is not hypothetical: a matrix that lists a page but contradicts its stability label is the same "trustworthy map" failure, and nothing checks it today either.
Suggested resolution
Two parts, and the second is the one with lasting value:
| \services.sms` | `stable` |row (matchingsms-service.mdx`'s own declared stability).check-runtime-services-index.mjsto hold theversioning.mdxmatrix to the pages on disk and each row's label to the page'sStabilitybullet.Refs: #9604, #9630