越界发现,记录于 #3713(重写 skills/objectui/guides/console-development.md)期间 —— 为把「Schema-driven detail pages」一章改写成真实机制,需要确认该工厂函数今天由谁调用,结果是没人。按纪律只报不改,单独立单,未认领。
观察类,已打 finding:今天没有用户碰得到的行为差异 —— 工厂函数不可达,widget 仍注册但不由它驱动。记录下来是因为它落在「declared but never exercised」这一类,且与 #3699 删掉的 SystemObjectViewPage / systemObjects 是同一个删除动作留下的另一半。
基线:origin/main @ 0cf8f0f70。
事实
apps/console/src/schemas/objectDetailPageSchema.ts:36 导出 buildObjectDetailPageSchema(objectName, item?),91 行左右,构造带 4 个 tab 的 PageNodeSchema。
全仓 grep(--include='*.ts' --include='*.tsx',packages + apps,排除 node_modules)命中仅三处:
| 命中 |
性质 |
apps/console/src/schemas/objectDetailPageSchema.ts:36 |
定义本身 |
同文件 :10 |
自己 docblock 里的用法示例 |
packages/react/src/hooks/usePageAssignment.ts:126 |
注释,说明 pageType:'record_detail' 是「metadata designer page schemas(buildObjectDetailPageSchema)」用的、不可被记录页拾取 |
第三处代码调用:零。
它的历史消费者就是 #3713 记录的 MetadataDetailPage(pages/system/MetadataDetailPage.tsx,今天零文件零引用) —— 旧 guide 的原话是「MetadataDetailPage calls the factory and renders via SchemaRenderer」。页面随 cccdf84d7 退场,工厂留下。
不是「顺手删掉」那么简单 —— 两侧都要看
与 #3672(纯孤儿文件)不同,这里有活的一半:
apps/console/src/main.tsx:35 仍 import './components/schema/registerObjectDetailWidgets',该文件 ComponentRegistry.register() 7 次(object-detail-tabs / object-properties / object-relationships / object-keys / object-data-experience / object-data-preview / object-field-designer)。
- 也就是说这些 widget 对任何引用了这些 type 的 schema 都可达 —— 不需要经过本工厂。删工厂 ≠ 删 widget。
objectDetailPageSchema.ts 自己的 docblock 已经写了 post-删除的意图:
Render via SchemaRenderer (e.g. inside a custom metadata-admin EditPage).
即「留着,等有人把它接到 metadata-admin 的自定义 EditPage 上」。这是一个有据可查的意图,不是遗忘 —— 所以本单不预判 remove,只把「零调用者」这个事实钉住,让分诊按 ADR-0049 enforce-or-remove 裁:
- enforce:注册一个
registerMetadataResource({ type:'object', EditPage }),把工厂接回 metadata-admin(需要先确认它和 app-shell 现有的 object 编辑面是否重复 —— 未测)。
- remove:删工厂,widget 注册按各自可达性单独判定。
- 保持现状:接受它作为「给 fork 者的样板」而非产品路径,但那应当写在文件里,而不是靠读者去 grep 才发现没人调用。
复核方式
grep -rn 'buildObjectDetailPageSchema' --include='*.ts' --include='*.tsx' apps packages | grep -v node_modules
grep -rn 'objectDetailPageSchema' --include='*.ts' --include='*.tsx' apps packages | grep -v node_modules
grep -c 'ComponentRegistry.register(' apps/console/src/components/schema/registerObjectDetailWidgets.ts # 7
grep -rn 'registerObjectDetailWidgets' apps/console/src/main.tsx # 仍 import
关联
已就关键词(buildObjectDetailPageSchema、objectDetailPageSchema、registerObjectDetailWidgets)搜过本仓开放 issue,无同源单。
Generated by Claude Code
越界发现,记录于 #3713(重写
skills/objectui/guides/console-development.md)期间 —— 为把「Schema-driven detail pages」一章改写成真实机制,需要确认该工厂函数今天由谁调用,结果是没人。按纪律只报不改,单独立单,未认领。观察类,已打
finding:今天没有用户碰得到的行为差异 —— 工厂函数不可达,widget 仍注册但不由它驱动。记录下来是因为它落在「declared but never exercised」这一类,且与 #3699 删掉的SystemObjectViewPage/systemObjects是同一个删除动作留下的另一半。基线:
origin/main@0cf8f0f70。事实
apps/console/src/schemas/objectDetailPageSchema.ts:36导出buildObjectDetailPageSchema(objectName, item?),91 行左右,构造带 4 个 tab 的PageNodeSchema。全仓 grep(
--include='*.ts' --include='*.tsx',packages+apps,排除 node_modules)命中仅三处:apps/console/src/schemas/objectDetailPageSchema.ts:36:10packages/react/src/hooks/usePageAssignment.ts:126pageType:'record_detail'是「metadata designer page schemas(buildObjectDetailPageSchema)」用的、不可被记录页拾取第三处代码调用:零。
它的历史消费者就是 #3713 记录的
MetadataDetailPage(pages/system/MetadataDetailPage.tsx,今天零文件零引用) —— 旧 guide 的原话是「MetadataDetailPage calls the factory and renders viaSchemaRenderer」。页面随cccdf84d7退场,工厂留下。不是「顺手删掉」那么简单 —— 两侧都要看
与 #3672(纯孤儿文件)不同,这里有活的一半:
apps/console/src/main.tsx:35仍import './components/schema/registerObjectDetailWidgets',该文件ComponentRegistry.register()7 次(object-detail-tabs/object-properties/object-relationships/object-keys/object-data-experience/object-data-preview/object-field-designer)。objectDetailPageSchema.ts自己的 docblock 已经写了 post-删除的意图:即「留着,等有人把它接到 metadata-admin 的自定义
EditPage上」。这是一个有据可查的意图,不是遗忘 —— 所以本单不预判 remove,只把「零调用者」这个事实钉住,让分诊按 ADR-0049 enforce-or-remove 裁:registerMetadataResource({ type:'object', EditPage }),把工厂接回 metadata-admin(需要先确认它和 app-shell 现有的 object 编辑面是否重复 —— 未测)。复核方式
关联
buildObjectDetailPageSchema()today … treat the pattern below as the recipe for a new bespoke editor, not as a description of a live route」),所以文档侧不再误导;本单管代码侧的去留。SystemObjectViewPage.tsx+systemObjects.ts自 2026-04 起全仓零引用,且其内嵌对象定义用的是已废弃/不存在的对象名 #3672 / PR chore(console): 删除全仓零引用的 SystemObjectViewPage + systemObjects (#3672) #3699 —— 同一次删除留下的另一半(那两个文件已删)。cccdf84d7—— 成因。已就关键词(
buildObjectDetailPageSchema、objectDetailPageSchema、registerObjectDetailWidgets)搜过本仓开放 issue,无同源单。Generated by Claude Code