Skip to content

ui/ 五个交互配置文件(22 个 z.object 站点)没有任何承载键:实测「无授权门」,按 ADR-0049 定去留 #4988

Description

@xuyushun441-sys

#4001 批 13 拆出(发现,不是缺陷修复)。批 13 的任务是把 ui/ 六个交互/呈现配置文件从 .strip 收紧。其中五个在「收紧前先验证可授权性」这一步上实测为负,所以没有收紧 —— 本 issue 记录测量结果与它引出的那个真正的问题。

测量结果

文件 z.object 站点 是否可从授权路径到达
packages/spec/src/ui/touch.zod.ts 7
packages/spec/src/ui/animation.zod.ts 4
packages/spec/src/ui/dnd.zod.ts 4
packages/spec/src/ui/keyboard.zod.ts 4
packages/spec/src/ui/offline.zod.ts 3
合计 22

同批的第六个文件 ui/responsive.zod.ts(4 站点)测量为可达(page.components[].responsive / .responsiveStyles),已在 #4001 批 13 收紧,不在本 issue 范围内。

三条独立证据(2026-08-03,origin/main fe83042)

1. 静态 —— 没有承载键。 packages/spec/src 里除了 ui/index.ts 这个 barrel 之外,没有任何模块 import 这五个文件。协议里不存在 component.touchpage.dndapp.motion 这类槽位,也就是说作者在任何一份元数据里都写不出通向这些形状的键。

2. 图可达性 —— BFS 全不命中。build-schemas.ts#4650 删除检查所用的同一套闭包(24 个 metadata-type root,来自 listMetadataTypeSchemaTypes(),外加 defineStackObjectStackSchema)对本次构建的内存 Zod 图做 BFS,6849 个节点,这 22 个 schema 一个都没走到。同一次运行里三个阳性对照全部命中 root-graph:

  • PageSchema(metadata-type root)
  • WebhookSchema(批 11 判定「可授权」所依据的 defineStack({ webhooks }) 那条门)
  • StateMachineSchema(批 10 判定「可授权」所依据的 agent.lifecycle 那条门)

对照通过,说明「不可达」是关于图的事实,而不是仪器坏了 —— 这正是 #4852 重测留下的教训:先证明尺子是准的。

3. 调用点 —— 没有 parse。 objectstack / objectui / 三个示例应用里,除各文件自己的单测外,不存在对这些 schema 的 .parse() / .safeParse()。objectui 只 re-export 推断出的类型,并且明确写了不 re-export 校验器(@object-ui/types,#2561 的注释)。

由此引出的问题

这不是「要不要 strict」的问题。strict 是 parse 的属性,而这里根本没有 parse —— 收紧它们不会拦住任何东西,只会花掉一次 v17 的破坏性变更让文件「看起来完成了」,并留下本仓账本自己警告过的那件东西:「一个被精确校验的死槽位是更有说服力的谎言」(docs/audits/2026-07-unknown-key-strictness-ledger.md,#4583 DatasourceCapabilities 那一行)。

真正要决的是 ADR-0049 enforce-or-remove:

为什么这条不能拖着不判

content/docs/references/ui/{touch,dnd,keyboard,animation,offline}.mdx已生成并已发布的,读起来就是一张授权表(| **dragItem** | … | optional | Configuration for draggable item |)。authorable-surface.json 里也躺着这五个文件的 58 个键,而那份文件的自述是「every AUTHORABLE key in the spec — what a metadata author may write, which for this platform IS the third-party API」。

也就是说,对 AI 作者而言,当前状态的失效模式不是DndConfigSchema 里的静默剥离」,而是文档在宣传一套没有承载键的词汇:AI 照着 dnd.mdx 往页面组件上写一个 dnd: 块,会被 PageComponentSchema.strict()(ADR-0089 D3a)直接拒绝,因为任何组件上都没有 dnd 这个键。这正是 Prime Directive #10 那句「never advertise or demo a capability the runtime doesn't actually deliver」。

相关

按 AGENTS.md Prime Directive #10 归档,未指派。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions