Skip to content

MetadataEventType 是 13 类型的封闭枚举,但可注册的 metadata 类型远多于此——枚举外类型的 realtime 事件合同缺位,需裁决覆盖面 #4627

Closed

Description

@os-zhuang

#4602 实施时的范围外发现,按第十条军规立案,unassigned。

现象

MetadataEventType(packages/spec/src/api/events.zod.ts)只声明 13 个 metadata 类型 × 3 动作:object/field/view/app/agent/tool/flow/action/workflow/dashboard/report/role/permission。但 MetadataManager.register() 接受任意 type 字符串,DEFAULT_METADATA_TYPE_REGISTRY 里可注册的类型(translation、datasource、page、hook、trigger、validation 等)远多于枚举覆盖。

#4602 落地后的行为(declared = enforced,已 pin 测试):枚举外类型不发布 realtime 事件(debug 日志),因为不存在可合法交付给 (event: MetadataEvent) => void 回调的事件形状——发一个每个合规消费者都必须拒绝的事件更糟。同时 client.subscribeMetadata(type: string) 的参数仍是宽的 string,订阅 translation 编译全绿、永远收不到事件——类型系统没把"这个类型没有 realtime 合同"暴露给作者。

需裁决(两轴)

  1. 收窄消费端:subscribeMetadata 的 type 参数改为从 MetadataEventType 派生的联合类型('object' | 'view' | …),订阅无合同的类型直接编译报错——AI 写订阅代码时结构性防错。
  2. 扩枚举:若产品上要求所有(或更多)可注册类型都有 realtime 事件,把枚举改为模板字面量类型或扩到与 type registry 对齐——但需要先回答"哪些类型该有事件"这一产品问题,且模板字面量会弱化 exhaustive 校验。

两者不互斥;1 是纯类型收紧,成本低、先行价值高。

参照:#4602(实施与 pin)、#3197(声明无消费的事件枚举)。

Activity

  1. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Aug 3, 2026
  2. os-zhuang commented on Aug 3, 2026

    @os-zhuang
    ContributorAuthor

    裁决(PM 代决,维护者可否决):先做轴 1,轴 2 不预答 ——

    • 轴 1(立即做):subscribeMetadata 的 type 参数从 string 收窄为由 MetadataEventType 派生的联合类型。订阅一个合同上永远不会来的事件(如 'translation')应当编译报错,而不是编译全绿、运行永盲。零迁移、纯类型收紧。
    • 轴 2(扩枚举给哪些可注册类型):这是产品覆盖面问题,由真实需求驱动 —— [i18n] 为 flow 与 workflow 提供可作者化的标签和节点翻译契约 #4426(flow/workflow i18n)若落地会把 translation 推上来,届时单独立项裁决,避免现在凭空猜一份清单。

    防 AI 轴:#4602 已把「枚举外不发布」pin 成 declared=enforced,本裁决把消费端也钉上,两端对齐后 AI 无法写出「看起来订阅了」的代码。已入队待派。


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Aug 3, 2026
  4. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    分诊级别建议:本单正文自述「需裁决覆盖面」——枚举外类型的 realtime 事件合同是公开契约形状问题,派发前需要维护者拍板——建议摘 pm:queue 换 needs-user-decision 进决策箱。交分诊座位定夺。背景:维护者 2026-08-06 拍板 spec 车道缩盘方案,见 #5837。


    Generated by Claude Code

  5. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 6, 2026
  6. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    标签落实(维护者 2026-08-06 指示,session_01LeEfA7CFwbJb7JJmXm2KM3):按 08-06 降级建议执行 pm:queue → needs-user-decision——正文自述「需裁决覆盖面」,枚举外类型的 realtime 事件合同属公开契约形状,进决策箱等拍板。


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:specDomain lane — seat card indexed by label:pm:seatpm:queueReady for the PM dispatch loop

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions