现象(P0-19 / P0-8,app-showcase 实测)
showcase_task 的 defineView 容器里 formViews.default 展平后被静默改名为 showcase_task.default_2:
GET /api/v1/meta/view?object=showcase_task
→ showcase_task.default_2 (viewKind: form) ← 作者写的是 formViews.default
→ showcase_task.default (viewKind: list) ← 主 list 隐式占用了 'default'
结果:form action target: 'showcase_task.default'(examples/app-showcase/src/actions/index.ts:120 Log Time)解析到 list 视图,/forms/showcase_task.default 渲染黑屏(标题取 list 的 "All Tasks"、零字段、裸 Submit)。冲突静默发生,build/boot 无任何告警。
根因(扫码)
packages/spec/src/ui/view.zod.ts:
expandViewContainer(:1183)把 list 与 form 家族展平进同一个 <object>.<key> 命名空间(共享 used 集合);主 list 无 name 时隐式占用 key 'default'(:1205)。formViews.default 是最自然的作者写法,展平时必然撞名,被 uniqueViewName(:1157-1163)静默加 _2 后缀:while (used.has(name)) name = \${base}_${i++}``。- 两个 loader(
packages/objectql/src/engine.ts:1062、packages/metadata/src/plugin.ts:560)共用该函数,均不输出任何告警。
修复方案
expandViewContainer 在被改名的 ExpandedViewItem 上附 _diagnostics 警告(既有诊断机制),说明原始 key、实际注册名、以及 action target 会解析到谁。- 两个 loader 检测到改名诊断时输出
logger.warn,作者在 dev/boot 日志可见。 - app-showcase 示例修正:
formViews.default 改用不冲突的 key,LogTimeAction.target 指向真实存在的 form 视图名。
命名行为本身(_2 后缀)保持不变以免破坏既有引用;命名空间分离(list/form 分家)留待 ADR。
现象(P0-19 / P0-8,app-showcase 实测)
showcase_task的defineView容器里formViews.default展平后被静默改名为showcase_task.default_2:结果:form action
target: 'showcase_task.default'(examples/app-showcase/src/actions/index.ts:120 Log Time)解析到 list 视图,/forms/showcase_task.default渲染黑屏(标题取 list 的 "All Tasks"、零字段、裸 Submit)。冲突静默发生,build/boot 无任何告警。根因(扫码)
packages/spec/src/ui/view.zod.ts:expandViewContainer(:1183)把 list 与 form 家族展平进同一个<object>.<key>命名空间(共享used集合);主list无 name 时隐式占用 key'default'(:1205)。formViews.default是最自然的作者写法,展平时必然撞名,被uniqueViewName(:1157-1163)静默加_2后缀:while (used.has(name)) name = \${base}_${i++}``。packages/objectql/src/engine.ts:1062、packages/metadata/src/plugin.ts:560)共用该函数,均不输出任何告警。修复方案
expandViewContainer在被改名的ExpandedViewItem上附_diagnostics警告(既有诊断机制),说明原始 key、实际注册名、以及 action target 会解析到谁。logger.warn,作者在 dev/boot 日志可见。formViews.default改用不冲突的 key,LogTimeAction.target指向真实存在的 form 视图名。命名行为本身(
_2后缀)保持不变以免破坏既有引用;命名空间分离(list/form 分家)留待 ADR。