You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* feat(spec)!: resolve the notification-vocabulary dual sources — ./ui Notification(Config) removed, ./system NotificationConfig removed, ./api keeps the bare names (#4610)
The four #4535-C3 baseline rows were the #4411 trap on the notification
vocabulary: Notification(Schema) had a second declaration in ./ui diverging
from ./api, and NotificationConfig(Schema) had two declarations (./system vs
./ui) that shared nothing but the name.
Import-statement-level scan across framework, cloud and objectui:
- ./api Notification(Schema) is the live REST inbox-row contract: embedded in
ListNotificationsResponseSchema, part of NotificationProtocol, implemented
by @objectstack/client, served by the runtime notifications domain, and
mirrored by contracts' InboxNotification (ADR-0030: the bell reads this
shape).
- ./ui Notification(Schema) — a toast/banner instance shape — had zero
importers outside its own unit test; objectui pins only the presentation
enums (NotificationType/Position/ActionSchema), which stay.
- ./system NotificationConfig(Schema) — a channel+template+recipients+
schedule+retryPolicy+tracking wrapper — had zero importers, is wired into
no parent schema, predates ADR-0030's accepted delivery model
(NotificationService.emit / NotifyConfigSchema / sys_* objects), and
advertised unenforced capability (#3197 dead-letter channels).
- ./ui NotificationConfig(Schema) — a toaster global config — had zero
importers.
Disposal (route 1, dead-side delete, v17 major window): the ./ui pair and
BOTH NotificationConfig declarations removed; ./api is the sole owner of the
bare Notification(Schema) names and NotificationConfig left the export
surface entirely. Compile-time pins (typeof import conditional type, #4581
pattern) keep the bare names out of ./ui and ./system; the surviving ./api
declaration is already covered by api/protocol.test.ts.
dual-source-exports.baseline.json: exactly the 4 named rows removed
(28 -> 24). json-schema.manifest: system/NotificationConfig, ui/Notification
and ui/NotificationConfig retired deliberately; their 25 authorable-surface
rows hand-deleted per the #4458/#4568/#4581/#4603 precedent. api-surface +
reference docs regenerated via check:generated --fix (2 proved stale; the
api/notification.mdx page folds into api/protocol.mdx where the declaration
lives). docs-import-surface baseline (#4595): untouched. Changeset:
@objectstack/spec major with FROM -> TO migration lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M9uWvoEp9CoLzYjNExj9sL
* docs(audits): 严格性台账跟随 #4610 —— ui/notification.zod.ts 站点 3 → 1
删除 ./ui 的 Notification / NotificationConfig 两个形状后,台账里
`notification.zod.ts` 那行声明的站点数过期(gate 点名 ledger:454:
declares 3 site(s), found 1)。把它从「3 ea」的合并行拆出单列为 1,
并写明为何掉了两个站点;`ui/` 章节总计 200 → 198 相应收敛。
check:strictness-ledger 恢复绿(67 文件 / 5 目录,站点数与章节总计均衡);
同 job 的其余源码审计(liveness / empty-state / variant-docs /
exported-any / react-declaration-parity / skill-examples)一并复跑通过。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M9uWvoEp9CoLzYjNExj9sL
---------
Co-authored-by: Claude <noreply@anthropic.com>
feat(spec)!: the notification vocabulary has one owner per name — `@objectstack/spec/ui` no longer exports `Notification(Schema)` / `NotificationConfig(Schema)`, and `@objectstack/spec/system` no longer exports `NotificationConfig(Schema)` (#4610)
6
+
7
+
The names `Notification` / `NotificationSchema` (`./api` vs `./ui`) and
8
+
`NotificationConfig` / `NotificationConfigSchema` (`./system` vs `./ui`)
9
+
each resolved to **two different declarations** depending on the import
10
+
path — the #4411 dual-source trap. Resolution (three-repo,
0 commit comments