Uh oh!
There was an error while loading. Please reload this page.
feat(spec): retire the nine dead contributes members and kinds[].globs (family: #10724 + #11169) - #12001
Conversation
…ibutes block (#10724) ADR-0049 enforce-or-remove, triage graded 2026-08-21, cloud census leg discharged clean 2026-08-24. #10627 measured exactly ONE non-test read of manifest.contributes monorepo-wide (engine.ts, member kinds), controlled and re-verified on current main at claim time (objectstack main@ac59744: engine.ts:4604-4606 only; objectui origin/main@65d3e76: 0 property reads, control 63 files carry the bare word; cloud: delivered clean reading 2026-08-24 @5b5925a). - events / menus / themes / translations / actions / drivers / fieldTypes / functions / commands are retiredKey() tombstones mirroring loading (the block is not .strict() — a plain deletion would silently strip) - kinds (live reader) and routes (open fork #10726) untouched - nine retired-key entries kernel/Manifest:contributes.<member> at major 18 + ONE D3 SemanticMigration plugin-manifest-contributes-dead-members-retired (no D2 conversion: a manifest is not a stack collection member — no seam would ever run it) - liveness ledger rows updated (tombstone rows STAY, the loading/orphans asymmetry) + README row; cloud-census provenance refreshed - in-repo authors corrected: plugin-hono-server (events — subscribes imperatively already), driver-memory (drivers — wired via driver.* service) - author-facing corrections: i18n-standard.mdx Plugin Integration rewritten to defineTranslationBundle + stack translations; the Commander.js JSDoc replaced by the commands tombstone; metadata-plugin.zod.ts ADR-0088 comment stops crediting contributes.functions - rejection pins assert the specific zod issue (path + prescription) per member; survivors pinned parsing - minor changeset with FROM → TO per member + adr-0087 registered marker Upgrade-guide/spec-changes projections cover majors <=17 today; the major-18 row materializes at the protocol bump, as with every shipped major-18 retirement (entries are registered now). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K93P8PbH7kVjsAXkqzH1zY
…ch patterns nothing ever read (#11169) ADR-0049 enforce-or-remove; maintainer ruling 2026-08-24 (verbatim provenance on the card: 「接受你的建议。」). The schema promised that declaring globs enables file-type discovery; real discovery globs filePatterns off the metadata type registry — which contributes.kinds does not extend, as metadata-plugin.zod.ts records outright — so an authored globs was accepted, stored, served back through GET /metadata/kind, and never consulted. Liveness dead confirmation re-run at claim with the card's positive control: filtered criterion empty; unfiltered returns the schema declaration (manifest.zod.ts:329) and the two type positions (registry.ts:3748/:3752 — anchors moved from the card's engine.ts citations). - globs is a retiredKey() tombstone inside the kinds item (non-strict shape); the kind bucket and id are NOT touched; kinds JSDoc stops promising discovery - registerKind/getAllKinds drop globs from their declared shapes (type-only; the parameter widens; nothing read the value) - retired-key entry kernel/Manifest:contributes.kinds.globs at major 18 + D3 SemanticMigration plugin-manifest-kind-globs-retired (no D2 conversion — no seam would ever run it) - rejection pin asserts the specific zod issue (path contributes.kinds[0].globs + prescription); positive pin: { id, description } still parses and keeps registering - breaking changeset naming the removed key + adr-0087 registered marker; ledger kinds row updated Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K93P8PbH7kVjsAXkqzH1zY
…contributes retirements (#10724, #11169) gen:strictness-ledger — kernel/ non-strict accepted-key count 296 -> 288: the nine tombstoned contributes members and kinds[].globs leave the accept set. Caught by scripts/strictness-ledger-doc.test.ts on the full spec suite run. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K93P8PbH7kVjsAXkqzH1zY
📓 Docs Drift CheckThis PR changes 4 package(s): 11 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 3 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 128 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin ef28e212bc4016260ceb02fe55dc11d4f8a62f64 && git checkout ef28e212bc4016260ceb02fe55dc11d4f8a62f64
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 227c1788d55da8f94127137bcf75ba2bf08b15d8 c415a378508e7372d362d0e38a6227d50037a9b4 && git checkout -B drift-repro 227c1788d55da8f94127137bcf75ba2bf08b15d8 && git merge --no-ff c415a378508e7372d362d0e38a6227d50037a9b4
node scripts/docs-audit/affected-docs.mjs --json 227c1788d55da8f94127137bcf75ba2bf08b15d8
|
…neration commit) os-regen-merge step 4: spec rebuilt on the merge of origin/main@497ded78, whole gen chain re-run; the two artifacts the driver took from main's side (references/kernel/manifest.mdx, strictness-ledger counts) now describe the merged source. Battery green: migration-registry / liveness / empty-state / authorable-surface / docs / api-surface / spec-changes / upgrade-guide / skill-refs / skill-docs / strictness-ledger / variant-docs all PASS. Family entries and tombstones verified present post-merge. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K93P8PbH7kVjsAXkqzH1zY
Uh oh!
There was an error while loading. Please reload this page.
…os-regen deferral) os-regen-merge.sh sequence: merge committed first, then the full gen chain on the merged source. check:generated --fix regenerated the 4 provably stale artifacts; the audit-door entries (this PR) and the #12001/#12006 sibling entries coexist in the regenerated set. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K93P8PbH7kVjsAXkqzH1zY
Fixes#10724
Fixes#11169
Family dispatch (chain head #10724): retires the nine dead members of the plugin-manifest
contributesblock, and the inertcontributes.kinds[].globssub-field, under ADR-0049 enforce-or-remove. One commit per card — each card's work is independently identifiable.Census re-verification (PM mechanism assumption — re-measured at claim time)
Measured on current merged
main(ac59744), monorepo-wide, non-test, with the card's own controls:manifest.contributes—packages/objectql/src/engine.ts:4604-4606, memberkinds(line drift from the card's:4499re-derived). Control: the same regex finds those three lines.origin/main@65d3e76): 0 property reads (\.contributes\b|contributes\?\.|contributes\[over*.ts,*.tsx); control: the bare wordcontributesappears in 63 files, so the zero is about the path, not the corpus.origin/main@5b5925a, zeromanifest.contributesreads, controls held. Not re-run per dispatch.contributes.kinds.globsis declared-but-unenforced: nothing reads it, and the file-type discovery it advertises globsfilePatternsoff a registrycontributes.kindsdoes not extend #11169's one-line executable criterion, re-run with its positive control:git grep -n "\.globs" -- packages | grep -v -e '\.test\.' -e 'zod.ts' -e 'registry.ts'→ empty; unfiltered, the query returns the schema declaration (manifest.zod.ts:329) and the two type positions (registry.ts:3748registerKindparam,:3752getAllKindsreturn — anchors moved from the card's engine.ts citations). Zero is a reading, not a broken query.premise_still_valid: truefor both cards, with one named sub-item exception (below).Card 1 — #10724: nine
retiredKey()tombstones (commit 1)events/menus/themes/translations/actions/drivers/fieldTypes/functions/commandsareretiredKey()tombstones inmanifest.zod.ts, mirroringloading— the block is not.strict(), so a plain deletion would silently strip.kinds(live reader) androutes(open forkcontributes.routeshas zero readers, yet a published skill, an ADR row and the dispatcher's own doc all present it as the way to serve a code-handler endpoint — enforce-or-remove fork #10726) untouched.kernel/Manifest:contributes.<member>, major 18) + ONE ADR-0087 D3 SemanticMigrationplugin-manifest-contributes-dead-members-retired(NOT a D2 conversion: a manifest is not a stack collection member —PLURAL_TO_SINGULARhas nopackages/pluginsentry — so a conversion would be a transform with no seam that ever runs; recorded verbatim in the entries).loading/orphans asymmetry);minorchangeset with FROM → TO per member and<!-- adr-0087: registered … -->marker.plugin-hono-server(contributes.events— already subscribes imperatively) anddriver-memory(contributes.drivers— wired via thedriver.*service), each with an in-place comment.content/docs/protocol/kernel/i18n-standard.mdxPlugin Integration section rewritten to the real mechanism (defineTranslationBundle+ stacktranslations); themanifest.zod.tsCommander.js comment replaced by thecommandstombstone (now consistent withcli-extension.zod.ts); the same false crediting inmetadata-plugin.zod.ts's ADR-0088 comment corrected (bounded in-place fix, same defect class).content/docs/plugins/development.mdx:334/:388— on current main thosecontributesblocks belong todefineStudioPlugin(the live Studio-plugin contribution surface,studio/plugin.zod.ts), notManifestSchema; the file's onlyManifestSchemaexample (line ~65) carries nocontributesblock. Nothing to correct there; evidence in the report.Card 2 — #11169:
contributes.kinds[].globsretired (commit 2)Maintainer-ruled 2026-08-24 (「接受你的建议。」): remove via the full ADR-0049 ceremony.
globsis aretiredKey()tombstone inside the kinds item;kindsbucket andiduntouched; the kinds JSDoc no longer promises file-type discovery (metadata-plugin.zod.ts:56-61records that discovery globs the metadata type registry'sfilePatterns, whichcontributes.kindsdoes not extend).registry.registerKind/getAllKindsdropglobsfrom their declared shapes (nothing read the value; the parameter widens).kernel/Manifest:contributes.kinds.globs+ D3 semantic entryplugin-manifest-kind-globs-retired; breaking changeset naming the removed key; ledgerkindsrow note updated.success: false; positive pin:kinds: [{ id, description }]still parses and registers.Runtime behaviour unchanged — evidence
Nothing read the nine members or
globs(census above), so removing them removes no behaviour. Verified:@objectstack/objectqlfull suite green (engine manifest reads / kinds registration included),@objectstack/specfull suite green; the one livecontributesread (kinds) still registers and its logging pin (engine-kind-registration-log.test.ts) still passes with globs-free fixtures. A stored manifest carrying a retired key degrades to one[metadata_spec_invalid]log line at registration (registryvalidate()is a diagnostic, not a gate), not a boot failure.Gates
Initial readings at
38c37ade; after the pre-PR merge oforigin/main@497ded78(the card's binding registry constraint) the union re-ran at the final headc415a378— every exit captured before any pipe; verdict lines quoted from the tools themselves.Union at final head
c415a378(post-merge, post-regeneration):@objectstack/specFULL suite + typecheck (locked) —Test Files 424 passed (424)/Tests 11292 passed (11292),os-verify-lock: VERDICT command-exit 0; the 12-gate generated-artifact battery (incl. strictness-ledger, variant-docs) ALL PASS on the identical tree; family entries and tombstones verified present post-merge (git grepcounts: 18 exact-key mentions, 10 entry files, 12 retiredKey sites). The merge brought one spec change (#11963,ui/object-master-detail— disjoint files); objectql was untouched by the incoming commits, so its232/232 · 4113/4113reading at38c37adestands (declared).os-verify-lock: VERDICT command-exit 0(build2, held 124s).@objectstack/specFULL suite + typecheck (locked):Test Files 424 passed (424)/Tests 11285 passed (11285)+tsc --noEmit—os-verify-lock: VERDICT command-exit 0.@objectstack/objectqlsuite + typecheck (locked):Test Files 232 passed (232)/Tests 4113 passed (4113)—os-verify-lock: VERDICT command-exit 0.@objectstack/plugin-hono-server/@objectstack/driver-memorytypecheck(script name verified, run echoed): both exit 0.✅ 256 prose examples type-check across 3 surface(s)(the new i18n-standard.mdx block included).node scripts/pm/dispatch-gates.mjs, no paths — 28-path change set derived at merge-base ac59744, provenance line: "gate list derived from the tree of 'objectstack-ai/objectstack' at commit 38c37ad"): check:driver-memory-census · check:spec-parsed-alias · check:test-source-alias · check:cross-package-test-inputs · check:adr-0087-registration · check:adr-anchors · check:doc-anchors · check:role-word · check:strictness-ledger · check:variant-docs — ALL PASS. check:nul-bytes:OK (scanned 6661 text file(s) … no raw ASCII control bytes).Declared narrowings (each a measurement, not a skip; CI runs the full farm regardless):
gen:*/check:*tsx scripts (2–11s each) ran directly instead of inside the lock; every BUILD and TEST run stayed under the lock (verdict lines above).check:i18nrefused its prerequisite (workspace CLI not built in this fresh worktree): "PREREQUISITE NOT MET — the workspace CLI is not built … Nothing was checked". Not run locally; my diff touches no i18n-extraction input (no*.form.ts, no bundles, no platform-objects metadata) — CI owns the fresh-build run.Expected-zero readings, stated so they are not misread:
authorable-surface/andjson-schema.manifest/are byte-identical — the retired keys live BELOW the one-level surface walk (kernel/Manifest:contributesis the walked key), so the four ratchets are structurally blind to them; the ledger drill-down rows andRETIRED_KEYS_BY_MAJORentries carry the record instead, and gate (b2) accepts entries for below-the-walk keys.spec-changes.json/docs/protocol-upgrade-guide.mdare byte-identical because both project majors ≤ 17 today — no shipped major-18 retirement appears in either yet; the rows materialize at the protocol-18 bump from the entries this PR registers.api-surface/unchanged: no export added or removed (theregisterKindnarrowing is a type-only edit inside objectql, not a spec export).Generated by Claude Code
Generated by Claude Code