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.touch、page.dnd、app.motion 这类槽位,也就是说作者在任何一份元数据里都写不出通向这些形状的键。

2. 图可达性 —— BFS 全不命中。 用 build-schemas.ts 给 #4650 删除检查所用的同一套闭包(24 个 metadata-type root,来自 listMetadataTypeSchemaTypes(),外加 defineStack 的 ObjectStackSchema)对本次构建的内存 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

  1. xuyushun441-sys commented on Aug 4, 2026

    @xuyushun441-sys
    CollaboratorAuthor

    维护者裁决(2026-08-04):A —— 退役(经三轴复评确认)

    touch/dnd/keyboard/animation/offline 五文件 22 站点整体退役,参考文档随删。业务定性:这五类是渲染器内建行为,不是作者逐页配置的元数据(离线是平台级能力,真做时词表长在同步引擎上);三仓零 parse + objectui helper 零调用是业务判断的实证。执行按 spec-property-retirement 套件:墓碑/整形状删除按 skill 判、ADR-0087 逐条论证、ratchet 自证路径、三仓精确名扫描带对照。⛔ 反推荐 D 的论证成立并归档:被精确校验的死槽位是更有说服力的谎言。哪类能力将来被产品拉动,随实现带自己的词表回归。

    needs-user-decision 摘除,入队(v17 窗口)。


    Generated by Claude Code

  2. self-assigned this
    on Aug 4, 2026
  3. os-zhuang commented on Aug 4, 2026

    @os-zhuang
    Contributor

    认领:PM 循环第 3 批补位(spec 车道,batch:5;v17 链)
    会话:session_01ErbEDVAg1No9gdg1pgDAGB
    分支:claude/issue-4988-interaction-files-retirement
    Worktree:objectstack-issue-4988
    域:domain:spec
    文件面:packages/spec/src/ui/ 五个交互配置文件(touch/dnd/keyboard/animation/offline 一族,以实测认定)及其测试、ui/index.ts barrel、ADR-0087 conversion/migration registry、spec 生成基线 + strictness 台账(⚠️ 落地链 #5289 已合并、#5293/#5300/#5304/#5306/#5308 正在串行进 main,末段同步必须按 os-regen 四步互保全部兄弟条目)、content/docs/references/** 随删、.changeset/*.md

    执行依据:维护者裁决 A(2026-08-04 00:21Z,三轴复评确认;⛔ 反推荐 D 论证已归档)。注意与 #5021 已落地的 theme 退役区分:ui/animation.zod.ts 的 ComponentAnimation 族与 theme 的 animation 块是两张面,manifest 条目名不同,勿混。


    Generated by Claude Code

  4. os-zhuang commented on Aug 4, 2026

    @os-zhuang
    Contributor

    验收:ACCEPT(PM 复核毕,PR #5321)

    复核依据(GitHub 实据,41 文件逐一核名):

    后续:PR #5321 进落地链尾部;objectui 适配单已按 dev 的逐文件测量立案(见下),含 useOffline.ts 生产耦合与 parity 测试的「解锁」项。


    Generated by Claude Code

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