Repository navigation
feat(service-messaging,spec,cli)!: retire sys_notification_subscription — no reader ever expanded a subscription (ADR-0030 L3, amended) - #25024
Conversation
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D6F9axfoPzR7t8G1J7Ytzz
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D6F9axfoPzR7t8G1J7Ytzz
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D6F9axfoPzR7t8G1J7Ytzz
…tire-notification-subscription
📓 Docs Drift CheckThis PR changes 4 package(s): 46 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 14 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. What this run could not see
Coarse fallback — 150 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 298ac2fc32c150b9c42a0fbd1a40b5191c1ce8f6 && git checkout 298ac2fc32c150b9c42a0fbd1a40b5191c1ce8f6
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 05b28c199b7408da7ca4bc3988635fa9342cd6de 356172a1f9912baa0c8a1a0a92f77ba9c5b0a557 && git checkout -B drift-repro 05b28c199b7408da7ca4bc3988635fa9342cd6de && git merge --no-ff 356172a1f9912baa0c8a1a0a92f77ba9c5b0a557
node scripts/docs-audit/affected-docs.mjs --json 05b28c199b7408da7ca4bc3988635fa9342cd6de
|
Contract reviewServed-tier: Inputs read: card #24923 body and its five comments (6294724028, 6301928267, 6302614923, 6303388568, 6305755241); parent #24770 decision 6290342354 and recording 6293376907; standing ruling #6015 comment 6292005854; the PR body and file list; the three-dot diff ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
… into 7b-0 One conflict: service-messaging notification-display-title.test.ts keeps main's removal of the retired NotificationSubscription import and this branch's Default Organization testkit import. Claude-Session: https://claude.ai/code/session_018EszgtA3V2KXBX5tf59Hi4 Co-authored-by: Claude <noreply@anthropic.com>
Closes #24923
Clause-②: yes (narrowing:
sys_notification_subscriptionretires, carried into 18.x by its ADR-0087 semantic entry under 「甲」)Tier H. This diff touches
docs/adr/0030-notification-platform-convergence.md, so it stays a draft until an authorized approval (and it owes aCONTRACT_REVIEW_TIERcontract review). No AI seat lands it.What and why
The maintainer's ruling D on the parent card (decision record 6290342354, recorded 6293376907) retires
sys_notification_subscription. ADR-0030 described it as Layer-3 audience expansion, and that expansion was never wired:EmitInput.audienceis required);The ruling supersedes #9807's keep-with-a-comment decision. The table stays in deployed databases, on the
scim-provider-object-retired/sys-view-definition-retiredprecedent. Under standing rule 「甲」 (#6015, record 6292005854) the ADR-0087 semantic entry carries the narrowing, so it ships in 18.x as aminorwith the BREAKING banner.Re-measured on current main (
e4d604efd3) before editingsys_notification_subscriptionsys_notification_preferencepackages/**/src, tests and generated bundles excludedpreference-resolver.ts,fan-out-system-context.ts)cf153eb2e5The 6 files are the object's own declaration, the plugin's registration and nav item, a translation-bundle comment,
PLATFORM_OBJECTS_BY_PACKAGE, theobject.zod.tsdoc comment, and the CLI ownership inventory. None of them reads a row. The cloud repository is out of reach from this session, so its readers are NOT MEASURED. The entry's reason says this repo and the Studio repo only.What changed
nav_notification_subscriptions), from both export barrels and from the i18n extract config. The generated object bundles were regenerated withnode scripts/check-i18n-bundles.mjs --write: 178 lines deleted, nothing added. The sibling tests drop the object.plugin-declares-event-object.test.tsgains an absence pin: the object is not registered and has no nav item. The same capture sees the surviving preference item, which is the vacuity control.nav_notification_subscriptionsis removed from the hand-written app translations (en,zh-CN,ja-JP,es-ES), along with its three recorded source hashes. This is outside the claim's listed file surface. It is the same retirement's translation half: the nav item it labelled no longer exists.PLATFORM_OBJECTS_BY_PACKAGE['service-messaging'], pinned inplatform-object-names.test.tswith the preference as control;object.zod.tssystem-datadoc comment no longer names it;18.sys-notification-subscription-retired.ts, in the precedents' shape: noRETIRED_KEYS_BY_MAJORentry and no D2 conversion, because no authorable spec key moves;STEP18_RATIONALEfragment, inserted at its sorted id position.organization-ownership-inventory.tskeeps a row for the retired-but-present table, now censusplatform-census-2026-08-31only. It moves from fate 3attributionto fate 4reportwithnotNullExempt, citing the ADR-0087 entry, on thesys_scim_providerprecedent (bef7bdc). It is notretired-before-census, because the first census counted this object.RETIRED_AFTER_FIRST_CENSUSpopulation, held to the same premises asRETIRED_BEFORE_CENSUS.organization-ownership-plan.integration.test.ts: the last declared table shape, underisolatedandsingle, plans as fate 4. The NULL row is reported, never attributed, andnotNull.willReceiveis false. Control: without the row, the plan refuses withuninventoried-platform-table.Amended (2026-10-20 …)entry on the status line, in the same form as the existing 2026-09-20 amendment. The L3 row is revised to preference-only, and the remaining-work "Subscription-driven fan-out" bullet is struck through and marked Withdrawn.FOLLOW-UPS.md§9d, which is append-never-rewrite, for the §9c row.scripts/platform-object-tenancy-census.jsonregenerated, 85 → 84 registered..changeset/24923-sys-notification-subscription-retired.md.minorfor service-messaging, spec and cli,patchfor platform-objects, with the BREAKING banner, ADR-0087 dispositionregistered sys-notification-subscription-retiredand the FROM → TO mapping.content/docs/releases/is untouched.Dogfood upgrade-harness fixtures: no edit, deliberately.
fixture-18.0andfixture-18.0.0are dumps of databases written by released code, and both hold the table with 0 rows. A retired-but-present table is exactly what they should hold. Regenerating them from the same refs would reproduce the same bytes. The two precedents predate the fixtures, so there is no fixture edit to mirror. The harness was run instead (below): HEAD boots over the fixture, and the ceremony plans and applies with the new fate-4 row.Verification (head
356172a1f9; the package suites ran on the pre-merge tree, andcheck:generatedwas re-run after the merge)pnpm --filter @objectstack/service-messaging test:Test Files 53 passed (53),Tests 589 passed (589).typecheck(both tsconfigs): exit 0.pnpm --filter @objectstack/spec test:Test Files 703 passed (703),Tests 21365 passed | 1 todo.typecheck: exit 0.pnpm --filter @objectstack/spec check:generated:All 14 generated artifacts are up to date(re-run after theorigin/mainmerge, on a rebuilt spec).--project unitin full exceeds the foreground cap, so this run is narrowed, as declared): everyorganization-ownership*test plustest/migrate-meta-engine-guidance.test.ts, which prints every semantic entry and pins it free of tracker numbers.Test Files 25 passed | 1 skipped (26),Tests 285 passed.pnpm --filter @objectstack/cli typecheck: exit 0. The rest of the unit and integration tiers is left to CI.test/upgrade-18x-harness.dogfood.test.ts:Tests 12 passed (12).@objectstack/platform-objectstest and typecheck: NOT MEASURED. Three attempts at the shared verify lock queued 9 minutes each without acquiring it (the holder was another worktree's long chain), and a fourth was cut by the foreground cap. The diff there is 7 deleted lines in the hand-written app translation dictionaries.check:i18n, which reads them, is green. CI owns the suite.node scripts/pm/dispatch-gates.mjs --commands: 101 commands, 99 exit 0. Among them:check-adr-0087-registration --base origin/main(registered sys-notification-subscription-retired (new here …)),check:i18n(all bundles in sync),check:platform-object-tenancy-census,check:spec-changes,check:upgrade-guide,check:doc-authoring,check:nul-bytes,check:cross-package-test-inputs,check:platform-checklist,check:changeset-no-majorandcheck:pm-governed-merges.check:i18n-coveragefirst hit its build prerequisite. After the closure build it was re-run:OK (14 config(s), 621 baselined untranslated string(s), none new).check:dual-build-cjs-loads: NOT MEASURED. Its prerequisite needsdist/for packages this diff does not touch (studio, client-react, connector-slack, …). CI owns it.Acceptance notes
organization-ownership'sinventoryDigestchanges with the row. A plan file written by an earlier CLI is refused withplan-digest-mismatch, as for any inventory change, and the changeset says to re-plan.single, NULL-organization subscription rows were previously planned to the Default Organization (fate 3). They are now listed and left alone (fate 4), because nothing reads them.registry.ts.template, in a different sorted gap. fix(platform-objects)!: a business unit with child units refuses its delete instead of silently re-rooting them #24984 edits platform-objects' generated object bundles, which are different files from the hand-written app translations edited here.docs/design/anddocs/handoff/. Notification templates and subscriptions authored in Setup have no effect on the app's notifications #24770 is not addressed here beyond its subscription half: the parent remains open for execution card ②, the template narrowing.维护者速读(草稿)
改了什么: 下线 Setup 里的「通知订阅」:对象、菜单项、导出与翻译都移除,平台对象名单去掉这个名字;数据库里的旧表原样保留不动。ADR-0030 的 L3 行与剩余工作清单按裁决 D 记一笔带日期的修订。
为什么改: 订阅从来没有接上线:所有发通知的地方都写明了收件人,没有任何代码读订阅表,管理员建了订阅也不会有人收到通知。你在 #24770 裁了 D:退役订阅(取代 #9807「保留并加注释」)。
风险与代价(含回滚): 引用了这个对象名的元数据会被提示「未知对象」;代码里 import
NotificationSubscription会编译失败(changeset 写明了改法)。旧表与旧数据不删,升级仪式把它列为「只报告、不归属」。回滚就是 revert 本 PR,对象与菜单即恢复,数据从未动过。席位意见:
你要做的: 审阅 ADR-0030 的修订文字;同意则批准本 PR(Tier H,需你的批准才能落地)。
Generated by Claude Code