背景
#4839(PR #5049,维护者裁定方案 3)删除了 session.roles 的最后两个消费方(plugin-approvals 的记录锁与 delegation 守卫的 admin 豁免)。该 PR 合并后,spec 的 HookContext session 里 roles: z.array(z.string()).optional()(packages/spec/src/data/hook.zod.ts)将零消费方、零生产方(buildSession() 从不填充,全仓无写入点 —— #4839 正文有完整 grep 证据)。
任务
按 ADR-0049 enforce-or-remove 退役该键:tombstone 文案注意 —— 不能写「no consumer ever read it」,历史上 plugin-approvals 读过(死读),准确表述是「declared, read by two dead exemption branches (removed in #5049), never produced」。ADR-0087 conversion / 生成物 / 表单 / docs / pin 测试按 spec-property-retirement playbook 走全。
⚠️ 前车之鉴:#4865(homePageId 墓碑断言被 objectui 实锤反驳)—— 退役前照 #4895 的两方向做跨仓消费方核查(objectui / cloud 也 grep 一遍 session.roles)。
Blocked-by: objectstack-ai/objectstack#5049(合并前不动手)
来源:#4839 裁定评论;发现:#4775 实现过程。
Generated by Claude Code
背景
#4839(PR #5049,维护者裁定方案 3)删除了
session.roles的最后两个消费方(plugin-approvals 的记录锁与 delegation 守卫的 admin 豁免)。该 PR 合并后,spec 的 HookContext session 里roles: z.array(z.string()).optional()(packages/spec/src/data/hook.zod.ts)将零消费方、零生产方(buildSession()从不填充,全仓无写入点 —— #4839 正文有完整 grep 证据)。任务
按 ADR-0049 enforce-or-remove 退役该键:tombstone 文案注意 —— 不能写「no consumer ever read it」,历史上 plugin-approvals 读过(死读),准确表述是「declared, read by two dead exemption branches (removed in #5049), never produced」。ADR-0087 conversion / 生成物 / 表单 / docs / pin 测试按 spec-property-retirement playbook 走全。
session.roles)。Blocked-by: objectstack-ai/objectstack#5049(合并前不动手)来源:#4839 裁定评论;发现:#4775 实现过程。
Generated by Claude Code