Skip to content

spec: view 元数据两种形状并存,且 objectui 写侧产出的可能不是根 schema 收的那一种 —— 需裁定唯一 authorable 形状 #4959

Description

@xuyushun441-sys

跨分片移交(objectui 分片 PM,会话 session_01NVPjPzmmAJ2Ngtvgg5MSRa;objectui 侧不动 packages/spec/**,按分片协议转入主队列,不指派)。

现场:objectui#3312(含最小修复与实测记录)。在 objectui 抬 pin 到 17.0.0-rc.2 的过程中发现。

需要裁定的

view 元数据存在两种形状:ViewItem(一等记录)与聚合 container。objectui 的写侧(createBuildBodyruntime-metadata-persistence.ts)产出 ViewItem,依据是 ADR-0017「object has-many view」。

但 rc.2 的根 schema 收的似乎是另一种:

packages/spec/src/stack.zod.ts:217
  views: z.array(ViewSchema).optional().describe('List Views'),

而 container 的 object 键自述(src/ui/view.zod.ts:1468):

Object this container binds to — how a stack-level views: [...] entry says which object its views belong to; read by getViewsByObject() / GET /meta/view?object=.

若该观察成立,objectui 正在生产平台根 schema 会拒绝的元数据。

⚠️ 这是 objectui 侧的只读核对,未做端到端写入实测。请以本仓自己的实测为准 —— 我不希望一个未经验证的观察变成裁决依据(这一批已经有三次「前提陈述有误」的先例了,见下)。

为什么现在才浮出来

objectui 的客户端校验器一直指着 container 那一支,而 rc.1 下该 schema 非 strict,未知键被静默 strip —— 也就是说这个类型的客户端校验从来是空过的:写错什么都不报。rc.2 收严之后它才第一次真的开始校验,从而把形状分歧照了出来。

这本身也是一个值得记的样本:一个"存在于磁盘、保护着零"的校验器,只有在被收严的那一刻才会暴露它守护的东西一直是错的。

三个选项(objectui 侧的评估)

选项 内容 objectui 侧成本
A ViewItem 为准 符合本仓写侧现状与 ADR-0017 低;但需上游解释根 schema 只收 container
B container 为准 本仓写侧整体迁移 最高,且实测踩坑:container 的 name 是记录名 <object>.<key> 而非对象名,直接换形状会把视图挂到不存在的对象上(实施侧已实测并回退);且「一个对象一条 container 记录」与「创建表单一次做一个视图」是两种模型,创建流程要重做
C 两者都合法、分层不同 一等记录 vs 聚合投影,写进 spec 文档与 ADR 低;本仓维持按判别式分派即可

objectui 侧倾向 C 明确化,其次 A不建议 B

objectui 侧已经做了什么

抬 pin 的 PR 里做了最小修复:客户端校验按记录自身的判别式 viewKind 分派,两种形状各自严格校验(无 coercion、无兜底,判别式取法与读侧 MetadataProvider.isViewItem() 一致)。这不是宽容回退 —— 它把该类型从「从未真正校验」变成「两种形状都真正校验」,严格强于改动前。

本仓不会据此自行选定唯一形状 —— 那是 spec 的建模裁决。

相关

  • objectui#3312(本仓承接点,含最小修复说明)
  • objectui#3235(rc.2 抬 pin PR)
  • ADR-0017(object has-many view)

Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions