Part of the #4001 strictness campaign's own failure class —— 账本 finding 12 / finding 18:
「a guidance entry is a claim about the schema」,而这条声明是假的,现在活在 main 上。
复现(measured 2026-08-03,在批 14 的策展体检中发现)
packages/spec/src/ui/report.zod.ts 的 ReportSchema 别名表里有 filter: 'filters'。
作者写 filter,得到:
Unrecognized key(s) on this report: `filter`. … Did you mean `filter` -> `filters`?
照做之后:
Unrecognized key(s) on this report: `filters`. …
—— 第二次拒绝,而且这次连建议都没有。ReportSchema 既不接受 filter 也不接受 filters;
它声明的是 runtimeFilter。
这正是 finding 7 反复记录的形状:本战役的修复把作者指进了它自己要消灭的失败模式,
而且对 AI 作者最致命 —— 它唯一的信号就是 parse 有没有抱怨,而这里抱怨了两次,第二次无话可说。
另有 5 条死条目(永远不会触发)
别名只在未识别的键上生效,所以一个本身已被声明的键做别名 key 就是死条目。
用 AST 扫 packages/spec/src 全部 strictObject( 调用:
| 文件 |
条目 |
为什么是死的 |
ui/report.zod.ts |
columns: 'values' |
columns 是 matrix 横轴,已声明 |
ui/report.zod.ts |
chart: 'chartConfig' |
chart 已声明;且 chartConfig 不存在于 ReportSchema |
ui/dataset.zod.ts |
measures: 'metrics' |
measures 已声明;metrics 不存在 |
ui/dataset.zod.ts |
filter: 'filters' |
filter 已声明 |
ui/action.zod.ts |
body: … |
body 已声明 |
死条目本身无害,但它们和上面那条真缺陷是同一个成因:别名表是对 schema 的断言,而没有任何东西拿它跟 schema 对过。
建议
- 把
ReportSchema 的 filter 别名改指 runtimeFilter(filters/where/criteria 建议一并指过去)。
- 清掉 5 条死条目。
- 把体检变成闸门:对每个
strictObject( 调用断言 (a) 每个别名 key 本身不是已声明键,(b) 每个别名 target 是该 schema 真正接受的键。判定必须走运行时 .shape(能看见 ...MetadataProtectionFields 这类展开),而不是读源码对象字面量 —— 批 14 第一版体检正因为读字面量而漏判,破坏测试时保持全绿。
批 14 在自己新增的表上已经带了这条断言(并用「先证红」证明它真的会红);这个 issue 是把它推广到全仓并修掉存量。
发现于 #4001 批 14 的范围外体检,未指派。
Part of the #4001 strictness campaign's own failure class —— 账本 finding 12 / finding 18:
「a guidance entry is a claim about the schema」,而这条声明是假的,现在活在
main上。复现(measured 2026-08-03,在批 14 的策展体检中发现)
packages/spec/src/ui/report.zod.ts的ReportSchema别名表里有filter: 'filters'。作者写
filter,得到:照做之后:
—— 第二次拒绝,而且这次连建议都没有。
ReportSchema既不接受filter也不接受filters;它声明的是
runtimeFilter。这正是 finding 7 反复记录的形状:本战役的修复把作者指进了它自己要消灭的失败模式,
而且对 AI 作者最致命 —— 它唯一的信号就是 parse 有没有抱怨,而这里抱怨了两次,第二次无话可说。
另有 5 条死条目(永远不会触发)
别名只在未识别的键上生效,所以一个本身已被声明的键做别名 key 就是死条目。
用 AST 扫
packages/spec/src全部strictObject(调用:ui/report.zod.tscolumns: 'values'columns是 matrix 横轴,已声明ui/report.zod.tschart: 'chartConfig'chart已声明;且chartConfig不存在于ReportSchemaui/dataset.zod.tsmeasures: 'metrics'measures已声明;metrics不存在ui/dataset.zod.tsfilter: 'filters'filter已声明ui/action.zod.tsbody: …body已声明死条目本身无害,但它们和上面那条真缺陷是同一个成因:别名表是对 schema 的断言,而没有任何东西拿它跟 schema 对过。
建议
ReportSchema的filter别名改指runtimeFilter(filters/where/criteria建议一并指过去)。strictObject(调用断言 (a) 每个别名 key 本身不是已声明键,(b) 每个别名 target 是该 schema 真正接受的键。判定必须走运行时.shape(能看见...MetadataProtectionFields这类展开),而不是读源码对象字面量 —— 批 14 第一版体检正因为读字面量而漏判,破坏测试时保持全绿。批 14 在自己新增的表上已经带了这条断言(并用「先证红」证明它真的会红);这个 issue 是把它推广到全仓并修掉存量。
发现于 #4001 批 14 的范围外体检,未指派。