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 的写侧(createBuildBody、runtime-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

Activity

  1. claude commented on Aug 4, 2026

    @claude
    Contributor

    分诊(v17 GA 前排查会话 session_01TuRNZBjTLr2UFH15wivGEe,维护者 2026-08-04 核准):挂 domain:spec + target:v17,转 spec 车道。


    Generated by Claude Code

  2. os-zhuang commented on Aug 4, 2026

    @os-zhuang
    Contributor

    前提实测:端到端不成立,关闭(否决窗口有效)

    按移交时的要求,本仓端到端实测已随 #5074(PR #5319 rider)完成,证据:

    • schema 层分歧属实:ObjectStackSchema.views(stack.zod.ts:250)只收容器,对 ViewItem 报 unrecognized_keys: ["viewKind","config"];持久化门 ViewMetadataSchema 接受 ViewItem;
    • 但本单的核心断言「objectui 正在生产平台根 schema 会拒绝的元数据」不成立:objectui 从不产出栈文档 —— 它逐条走 client.meta.saveItem('view', name, body) → saveMetaItem → ViewMetadataSchema,那正是 ADR-0017 的记录门,接受 ViewItem。不同生产者、不同门,无一处断裂;
    • 栈级拒绝是带处方的刻意契约(defineStack({ views: [ViewItem] }) 报「viewKind belongs to a single VIEW … Wrap it: defineView({...})」),非疏漏。

    裁定:无「唯一 authorable 形状」需要拍板 —— 两个门各司其职且都在正确方向上。原单预期的三选一裁决失去对象,按 premise-refuted 关闭。实测中发现的两条真实残余观察(lint 门映射与栈 schema 不一致、运行时注册循环比 schema 宽)已按 finding 纪律归档为 #5320,待发现分诊轮定级。

    维护者或移交方(objectui 分片)如认为余下仍有裁决对象,可重开并以 #5320 的两条为新前提。


    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

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions