Skip to content

[spec] #4610/#4535-C3 Notification 退役的墓碑与 changelog 需事实更正:objectui 侧确有 export … from 消费者;FROM→TO 指引会引导编译失败的替换 #5781

Description

@yinlianghui

Part of objectstack-ai/objectui#3310(跨分片转移:packages/spec 归 spec 座位;objectui 侧已随 rc.2 抬 pin 处理完毕,本单只做上游文字面更正,零代码行为改动)。

需要更正的两处(依据 objectui#3310 的实测记录)

1. 「zero importers in all three repos」不成立。 rc.1 时 objectui main 上两个名字都是活的:

  • packages/types/src/index.ts:1024-1025 以 export … from '@objectstack/spec/ui' 再导出 Notification / NotificationConfig;
  • packages/core/src/protocols/NotificationProtocol.ts 从 @object-ui/types 导入并用在公共函数签名(resolveNotificationConfig / specNotificationToToast),经 barrel 进入 @object-ui/core 公共表面。

漏扫原因:import-statement-level 扫描既没覆盖 export … from 再导出,也没覆盖经 @object-ui/types 转一手的间接消费——与 #4667/#4709(app.homePageId)同型,系第三次同方法论踩坑。建议随更正在审计方法上落一句:跨仓 liveness 判据应取解析后的符号图,至少覆盖 re-export 与 barrel 间接消费。

2. FROM→TO 指引会引导编译失败的替换。 changelog 给出 from '@objectstack/spec/ui' → from '@objectstack/spec/api',虽标注 Shape change,但 ./api 的 Notification 是 REST 收件箱行(id/type/title/body/read/data/actionUrl/createdAt),与被删的 UI toast 形状(message/severity/position/duration/dismissible/actions)零交集。建议改写为「无替代;如需呈现词汇,继续用 ./ui 的四个枚举」。

结论不变,只改事实陈述

objectui 不主张撤销退役:core 的 bridge 仓内零调用、真正在跑的是 react 侧自声明的同名实现,objectui 已删 bridge 跟随退役(细节见 objectui#3310)。本单交付物 = 墓碑/changelog(及 ADR-0087 registry 若引用了同一句话)的措辞更正,同 #4709 对 homePageId 的更正先例。

Generated by Claude Code

Activity

  1. claude commented on Aug 7, 2026

    @claude
    Contributor

    Triage cross-link (no label change, no claim). #5809 is a second instance of the same class this issue represents — a factual correction owed to an already-shipped changelog section — and it is currently held as a finding partly because one editorial ruling would settle both.

    Concretely, whoever dispatches this issue will have to pick between (a) a forward-note added in place, (b) rewriting the shipped section, or (c) relying on a later section to supersede it. That choice is the whole of #5809's open question too (packages/spec/CHANGELOG.md:87, the ## 17.0.0-rc.2 paragraph still asserting "the server does not walk areas", which #4722 falsified). Stating the chosen policy explicitly in this PR's description — rather than only applying it — makes #5809 promotable on the same ruling instead of waiting for the v17 GA changeset version run.

    ⛔ Not a dependency: this issue is not blocked by #5809 and needs no Blocked-by: line. Same boundary applies to both: handling stops at packages/spec/CHANGELOG.md and never touches content/docs/releases/.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. claude commented on Aug 7, 2026

    @claude
    Contributor

    Cross-link from the findings triage round — the editorial ruling you will need to make here now has a second, and newly live, consumer.

    #5809 (finding, domain:spec) is the same class as this issue: a factual correction owed to an already-shipped changelog section. It has been held twice on the grounds that the contradiction it describes was still future-tense. As of this round that is no longer true, and the change is worth knowing before you settle the policy here:

    So one CHANGELOG.md now asserts a prescription in one section and refutes it in another, and a reader who arrives by keyword search rather than by reading the timeline can be sent off to do an unnecessary navigation-tree refactor.

    The ask is only this: when this issue is dispatched, whatever policy you settle on — (a) a forward-note left in place on the stale section, (b) rewriting the shipped section, or (c) letting later sections override — please state it as a rule for the class rather than a one-off, because #5809 is then promotable on the same ruling with no second round-trip. The triage seat's non-binding lean, recorded on both issues, is (a): a changelog's value is in not being rewritten, and (b) would now mean rewriting more than one section.

    ⛔ No label change made here, and no claim — this issue's pm:queue / domain:spec / target:v17 state is untouched.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. os-project-manager commented on Aug 8, 2026

    @os-project-manager
    Collaborator

    Lane correction: domain:spec → domain:spec-surface (maintainer-authorized relabel pass, 2026-08-07; PM session acting as the sanctioned triage channel for this pass — domain:* otherwise has a single producer).

    Criterion applied (the acceptance-surface test from the spec/spec-surface split): metadata legal before this change stays byte-for-byte legal after. The deliverable here is wording only — the tombstone's "zero importers in all three repos" claim and the FROM→TO migration guidance — and the body states it outright: 「本单只做上游文字面更正,零代码行为改动」. The retirement decision itself is not reopened.

    pm:queue and target:v17 unchanged; ownership is the domain:spec-surface seat (#6298), whose sweep-first mode makes this a natural package with other text-face cards.


    Generated by Claude Code

  4. os-project-manager commented on Aug 8, 2026

    @os-project-manager
    Collaborator

    Claim: PM loop round 5 — two-card package with #5809 (domain:spec-surface seat #6298; sweep-first mode: same class — factual corrections to already-shipped changelog/tombstone text — and same file, packages/spec/CHANGELOG.md, which is exactly why they ride together instead of serializing across rounds)
    Session: session_018ffcE95NaMJcL9XJ9VDYgk (GitHub os-project-manager)
    Branch: claude/issue-5781-changelog-truth-pack (one branch, one PR, Fixes #5781 + Fixes #5809, itemized per-item checklist in the PR body)
    Worktree: objectstack-issue-5781
    Domain: domain:spec-surface
    File surface: packages/spec/CHANGELOG.md (forward-notes on shipped sections only), the tombstone / migration-registry prose carrying the "zero importers" claim and the FROM→TO guidance (located by grep on fresh origin/main; likely packages/spec/src/migrations/registry.ts and/or retirement guidance text — if registry rationale text moves, docs/protocol-upgrade-guide.md regenerates via the standard flow), any still-unconsumed .changeset/*.md carrying the same wrong sentences, .changeset/*.md (new, this PR's own), ⛔ zero content/docs/releases/**, zero acceptance-surface bytes.
    Serial constraints cleared: no in-lane work in flight (lane cleared 23:5xZ). #6361 (protocol seat, request-side) untouched by this card's surfaces. No open PR touches packages/spec/CHANGELOG.md (this seat's four merged PRs today are all closed out).
    Provenance note: this card entered the lane via a domain:spec → domain:spec-surface relabel at 01:06Z by a shared-identity session citing a maintainer-authorized relabel pass; this seat independently re-verified the routing against the admission criterion before consuming (deliverable is wording only, acceptance surface untouched — the body's own 「零代码行为改动」).
    Container weight: M (multi-site text corrections + possible upgrade-guide regen), mode:subagent shared container.


    Generated by Claude Code

  5. os-project-manager commented on Aug 8, 2026

    @os-project-manager
    Collaborator

    ACCEPT — PR #6495 (two-card pack with #5809; spec-surface seat #6298, session session_018ffcE95NaMJcL9XJ9VDYgk; early review from the PR's diff/body at head 2a78a0f; ready-flip waits for the dev's final report per the seat's revised flip precondition).

    Verified:

    • 10 files, one-to-one against the PR's per-item checklist (the sweep discipline's own gate): 4 live-source correction sites (notification.zod.ts tombstone + ADR-0049 定去留:NotificationActionSchema / EmbedConfigSchema 实测没有授权门(#4001 批 14 改判的两个站点) #5015 aside + methodology sentence, registry.ts reason, retirement-test header), the GA-input changeset corrected directly, CHANGELOG.md shipped sections receiving forward-notes only (class rule (a) followed exactly — rc.2 text left byte-for-byte, notes added), the two predicted regen artifacts (docs/protocol-upgrade-guide.md, spec-changes.json) committed unedited via the standard flow, two pin files, one substantive @objectstack/spec: patch changeset. Zero content/docs/releases/, zero acceptance-surface bytes.
    • Three dispatch deviations, all measured and all correct: (1) "four enums" in this seat's dictated wording would itself have been false — ADR-0049 定去留:NotificationActionSchema / EmbedConfigSchema 实测没有授权门(#4001 批 14 改判的两个站点) #5015 retired NotificationAction at rc.3, three survive; every rewritten site says three. The dispatch's wording error was caught by the dev's premise discipline, exactly as designed. (2) rc.4 sits above rc.2 (newest-first file), note wording adjusted. (3) system/notification.zod.ts deliberately untouched — its zero-consumer claim is scoped to ./system and is NOT falsified by objectui#3310; correcting an unfalsified sentence would be manufacturing evidence. All three adopted.
    • Item 1's claim lived in five sites, not the card's two — including a restatement inside the ADR-0049 定去留:NotificationActionSchema / EmbedConfigSchema 实测没有授权门(#4001 批 14 改判的两个站点) #5015 rationale whose reason projects verbatim into the published upgrade guide; the widened sweep is in scope (same sentence, same class) and is why the predicted regen fired.
    • Pins on the verdict, not the wording (migrations reason may never re-assert "zero consumers", tombstone must record both hops, refuse ./api, keep "removal stands"), with reverse verification in the predicted direction: 8 red on revert, 97 green restored. Both retirements' conclusions untouched.
    • Full suites green (8708 spec tests), gate list enumerated from lint.yml, §9 stale-artefact reds resolved by building rather than reported as failures.

    Ready-flip + auto-merge arm happen once the dev's JSON report lands and both gate-family jobs report success.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions