问题
metadata-type-schemas.ts 把 view 映射到 容器 ViewSchema({ list, form, listViews, formViews },四槽全 optional,Zod 默认 strip 未知键)。但 view 类型在运行时实际承载三种形态 :
defineView 聚合容器(裸 <object> 键,back-compat 保留);
展开/运行时创建的独立 ViewItem (name/object/viewKind/config,metadata-create-seeds.ts 的 create seed 就是这个形态);
Runtime view overlay drops viewKind/object — one grid sort permanently removes the view from the switcher #2555 个性化 overlay(裸 view config + viewIdentityPatch 补的 viewKind/object/label identity)。
形态 2/3 经 ViewSchema.safeParse 会被剥成 {} 然后通过 —— 即:
saveMetaItem 的 422 校验对 ViewItem/个性化写入形同虚设 (任意坏 config 都过);
computeMetadataDiagnostics 对枚举出的每个 ViewItem 返回 valid: true(空转);
metadata-create-seeds.test 里 view seed「通过」type schema 校验也是同一空转的假绿。
为什么没在 #3096 (flat-view 修复 PR)一并收
作者侧已经堵住(defineView() 零视图抛错 + os validate 新增 view-container-shape 检查)。运行时侧若直接给 ViewSchema 加 refine,会把上面 2/3 两种合法形态全部打红/422(Console 个性化保存直接回归);正确修法需要:
这需要独立的 runtime 测试面,不适合塞进 docs/skills 修复 PR。
验收
🤖 Generated with Claude Code
问题
metadata-type-schemas.ts把view映射到 容器ViewSchema({ list, form, listViews, formViews },四槽全 optional,Zod 默认 strip 未知键)。但view类型在运行时实际承载三种形态:defineView聚合容器(裸<object>键,back-compat 保留);name/object/viewKind/config,metadata-create-seeds.ts的 create seed 就是这个形态);viewIdentityPatch补的viewKind/object/labelidentity)。形态 2/3 经
ViewSchema.safeParse会被剥成{}然后通过 —— 即:saveMetaItem的 422 校验对 ViewItem/个性化写入形同虚设(任意坏 config 都过);computeMetadataDiagnostics对枚举出的每个 ViewItem 返回valid: true(空转);metadata-create-seeds.test里 view seed「通过」type schema 校验也是同一空转的假绿。为什么没在 #3096(flat-view 修复 PR)一并收
作者侧已经堵住(
defineView()零视图抛错 +os validate新增view-container-shape检查)。运行时侧若直接给ViewSchema加 refine,会把上面 2/3 两种合法形态全部打红/422(Console 个性化保存直接回归);正确修法需要:z.union([ViewItemSchema, 非空容器]),并给 Runtime view overlay drops viewKind/object — one grid sort permanently removes the view from the switcher #2555 形态定去向(补config嵌套归一化,或第三个显式 schema);/api/v1/meta/types/view的 JSON Schema 输出(union→anyOf)对 Studio SchemaForm/create seed 的影响(viewallowRuntimeCreate: true);这需要独立的 runtime 测试面,不适合塞进 docs/skills 修复 PR。
验收
config(如 kanban 缺groupByField)在 save 时 422、在 diagnostics 里报错;🤖 Generated with Claude Code