发现自 #4525 / PR #4561 的变异测试。未认领,先记录待讨论,不要直接开做。
事实
DecisionOutputDefSchema 是 .strict() 的:把 required 从 Zod 源里摘掉,作者写的 required: true 立即变成 unknown-key 拒绝——行为破坏。而在 #4561 补钉子之前,唯一能反映这次移除的防线是 authorable-surface.json,它是 gen:schema 重新生成的基线:跑一次生成,基线被无声改写,没有任何东西变红。变异实验证实:摘掉该键后,既有 40 条用例全绿。
这不是 DecisionOutputDef.required 一个键的问题:所有仅由该基线守护的 authorable 键都具有同样性质——移除是「可见的」(diff 里有),但不是「困难的」(没有闸门喊)。
与既有机制的关系
可能的方向(待维护者定,均未验证)
Refs #4525、PR #4561、#4001(strict unknown-key 体系)、ADR-0049。
发现自 #4525 / PR #4561 的变异测试。未认领,先记录待讨论,不要直接开做。
事实
DecisionOutputDefSchema是.strict()的:把required从 Zod 源里摘掉,作者写的required: true立即变成 unknown-key 拒绝——行为破坏。而在 #4561 补钉子之前,唯一能反映这次移除的防线是authorable-surface.json,它是gen:schema重新生成的基线:跑一次生成,基线被无声改写,没有任何东西变红。变异实验证实:摘掉该键后,既有 40 条用例全绿。这不是
DecisionOutputDef.required一个键的问题:所有仅由该基线守护的 authorable 键都具有同样性质——移除是「可见的」(diff 里有),但不是「困难的」(没有闸门喊)。与既有机制的关系
DecisionOutputDef.requiredat the schema level (#4525) #4561 的解法(schema 层钉子测试)是逐键的,靠人记得补;系统性的问题需要系统性的答案。可能的方向(待维护者定,均未验证)
check:authorable-surface区分「新增」与「移除」——移除项要求 PR 显式携带确认标记(类似 ADR-0087 转换注册或 ADR-0112 ledger 的形态),让删除变成一个响亮的、有记录的动作;DecisionOutputDef.requiredat the schema level (#4525) #4561 所暴露的:40 条用例全绿的情况下移除一个在用的键。Refs #4525、PR #4561、#4001(strict unknown-key 体系)、ADR-0049。