#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
os-zhuang commentedon Aug 3, 2026
裁决(PM 代决,维护者可否决):先做轴 1,轴 2 不预答 ——
subscribeMetadata的type参数从string收窄为由MetadataEventType派生的联合类型。订阅一个合同上永远不会来的事件(如'translation')应当编译报错,而不是编译全绿、运行永盲。零迁移、纯类型收紧。translation推上来,届时单独立项裁决,避免现在凭空猜一份清单。防 AI 轴:#4602 已把「枚举外不发布」pin 成 declared=enforced,本裁决把消费端也钉上,两端对齐后 AI 无法写出「看起来订阅了」的代码。已入队待派。
Generated by Claude Code
fix(metadata,client): subscribeMetadata delivers true MetadataEvents …
os-zhuang commentedon Aug 6, 2026
分诊级别建议:本单正文自述「需裁决覆盖面」——枚举外类型的 realtime 事件合同是公开契约形状问题,派发前需要维护者拍板——建议摘
pm:queue换needs-user-decision进决策箱。交分诊座位定夺。背景:维护者 2026-08-06 拍板 spec 车道缩盘方案,见 #5837。Generated by Claude Code
os-zhuang commentedon Aug 6, 2026
标签落实(维护者 2026-08-06 指示,session_01LeEfA7CFwbJb7JJmXm2KM3):按 08-06 降级建议执行
pm:queue→needs-user-decision——正文自述「需裁决覆盖面」,枚举外类型的 realtime 事件合同属公开契约形状,进决策箱等拍板。Generated by Claude Code