#4535 C 组第三簇(C3)。两对同名跨入口分叉,同属通知语汇,同一 PR 处理;合并后 packages/spec/dual-source-exports.baseline.json 恰好 28 → 24 (删除下列 4 行,只减不增):
Notification — [./api (type)] ≠ [./ui (type)]
NotificationConfig — [./system (type)] ≠ [./ui (type)]
NotificationConfigSchema — [./system (const)] ≠ [./ui (const)]
NotificationSchema — [./api (const)] ≠ [./ui (const)]
先判真源 :import 语句级扫描三仓(本仓 + cloud + objectui),裸名从哪个入口被真实 import、有没有 runtime 读取(接进 schema / 校验路径 / 事件发布),不要用名字出现次数。./api vs ./ui 与 ./system vs ./ui 要分别判——两对可能不同路线。
零消费方一侧 ⇒ 死删 (v17 rc 是 major 窗口);两侧都活 ⇒ 收敛 + re-export (MetadataManagerConfig 模式);真是两个概念 ⇒ 改名一侧 (参考 C1 的 OpenApiWebhookEvent 先例:UI 的「通知横幅/toast 配置」与 system/api 的「通知投递语汇」完全可能是两个概念——如判改名且命名可争议,报 needs_decision,不要自作主张)。
收敛 ≠ 无行为变化:存活形状比被删侧窄/宽时,changeset 里写清消费方类型如何变。
导出类型,非可作者化 metadata key,一般不需要 tombstone / ADR-0087。
验收
基线恰好 −4(28 → 24),check:dual-source-exports 绿(stale 分支点名的行即删行凭证)
若涉及被删/改名导出的类型别名,build-docs 的 import-surface 基线(fix(#4570): reference 页的 import 示例改由真实导出面生成,并加只减不增的棘轮兜底 #4595 新 ratchet)按 shrink-only 规则处理
changeset:@objectstack/spec major,写明 FROM→TO 导出面变化
⛔ 不碰 content/docs/releases/
回归 pin:编译期条件类型优先(C1 先例,不吃 vitest 超时)
关联:#4535 (主账本)、#4587 → PR #4603 (C2 先例)、#4572 → PR #4581 (C1 先例)、ADR-0049
#4535 C 组第三簇(C3)。两对同名跨入口分叉,同属通知语汇,同一 PR 处理;合并后
packages/spec/dual-source-exports.baseline.json恰好 28 → 24(删除下列 4 行,只减不增):处置手册(#4411 先例;#4535 正文有完整版)
cloud+objectui),裸名从哪个入口被真实 import、有没有 runtime 读取(接进 schema / 校验路径 / 事件发布),不要用名字出现次数。./apivs./ui与./systemvs./ui要分别判——两对可能不同路线。MetadataManagerConfig模式);真是两个概念 ⇒ 改名一侧(参考 C1 的OpenApiWebhookEvent先例:UI 的「通知横幅/toast 配置」与 system/api 的「通知投递语汇」完全可能是两个概念——如判改名且命名可争议,报needs_decision,不要自作主张)。验收
check:dual-source-exports绿(stale 分支点名的行即删行凭证)build-docs的 import-surface 基线(fix(#4570): reference 页的 import 示例改由真实导出面生成,并加只减不增的棘轮兜底 #4595 新 ratchet)按 shrink-only 规则处理@objectstack/specmajor,写明 FROM→TO 导出面变化content/docs/releases/关联:#4535(主账本)、#4587 → PR #4603(C2 先例)、#4572 → PR #4581(C1 先例)、ADR-0049