Skip to content

objectui's hand-written NavigationItemSchema never re-implements objectNavTargetExclusivity — its door accepts filters + recordId together, which spec refuses #16714

Description

@os-trump

⛔ 分级与路由(domain:* / priority:*)属分诊,本卡由执行席 domain:spec 不带分级立卡。

测得的事实

objectNavTargetExclusivitypackages/spec/src/ui/app.zod.ts:465 模块私有声明,只挂在 :711 —— z.lazy 联合体内那个匿名的 ObjectNavItemSchema.extend({children}).strict() 分支上。导出的 ObjectNavItemSchema 自身 _zod.def.checks[];带检查的是联合体的 branch 0(['custom'])。

objectui 在钉住的 sha a472b07167a3… 上的 NavigationItemSchema(packages/types/src/zod/app.zod.ts:42-115)是手写的,不是 .shape 派生。它自己的 superRefine(:100-114)只检查 id / label 的必填性,没有重新实现互斥规则。

今天 objectui 那道门会静默接受同时带 filtersrecordId 的对象导航项,而 spec 会拒绝。

为什么不能记成「noted, not filed」

这是 PR #16697(卡 #16489)的至档契约复审明确反对的处置。复审原话:objectui 挂不上一个 spec 私有函数,所以把它推给「objectui#7715 的 dev」等于推给了没有人 —— 那位 dev 能接手的是 .shape 派生这条机制,而本缺口是重新声明造成的,不在那条机制里。

#16489 的交付(把对象级检查导出为具名函数)之所以没有覆盖它,是因为它落在卡枚举的 .shape 派生站点之外 —— 这是卡的边界问题,不是 dev 的遗漏,复审已按卡的字面判 dev 无过。

待裁决的点(不由本席决定)

要闭合它,至少有两条互斥的路,选哪条需要裁定:

  1. 导出 objectNavTargetExclusivity,并让 objectui 手写的 NavigationItemSchema 挂上它 —— 但它当前挂在联合体的一个匿名分支上,导出前要先决定「导出的 ObjectNavItemSchema 是否也该带上这个检查」,那会移动 accept set(今天它不带)。
  2. 让 objectui 改为 .shape 派生 —— 落回 spec: export the object-level refinement checks (superRefine / refine bodies) as named functions so zod mirrors in objectui can re-attach them (spec half of objectui#7715) #16489 已建立的机制,但那是 objectui 侧的重写。

复现

# spec 侧:导出的 schema 不带检查,联合体分支带
node -e "…ObjectNavItemSchema._zod.def.checks…"   # => []
# objectui 侧(钉住 sha a472b07167a3…):
#   packages/types/src/zod/app.zod.ts:42-115 手写;:100-114 的 superRefine 只查 id/label

来源

PR #16697 的至档契约复审(claude-fable-5-1,绑定 head 4c6db65ce0),③-4 边界裁定与其后的建议。裁定记录见 #16489 的裁定块评论。

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions