从 #5775 拆出。维护者 2026-08-06 裁决评论明写:「page:card.visible 属页面改写(正统 visibleWhen,ADR-0089),可顺带或拆小单 」。#5775 的实施 PR 选择拆单,理由记在下面。
事实(对 origin/main + objectui HEAD 7dfbeb7 实测)
page:card.visible 是把组件级 可见性谓词写进了 properties,靠 SchemaRenderer 的 hoist 生效(packages/react/src/SchemaRenderer.tsx 读 schema.visible)。ADR-0089 的正统拼法是组件级 visibleWhen —— visible 连别名表都不在。所以这是页面写错了位置 ,不是 PageCardProps 少一个键:给它补声明会把一个第三方拼法固化成契约(Prime Directive #12 ),正是 #5775 在 displayField 上刚拆掉的形状。
站点(2 处,同一文件):
文件
行
现状
examples/app-showcase/src/ui/pages/my-work.page.ts
properties.visible on the "Leadership View" page:card
visible: "user.email == 'admin@objectos.ai'"
(#5068 的 warning 清单里 page:card.visible 记为 1 条 component-props-unknown-key。)
不是工作量,是一处语义待确认 ,做错了会静默改变 showcase 的渲染:
页面现在写的绑定名是 user.email(该行的注释说「the renderer now feeds user into the expression context」);
而 ADR-0089 visibleWhen 声明绑定的是 record / current_user / page.<var>,没有 user 。
所以机械改写 visible → visibleWhen 会得到一个恒假谓词 —— 卡片直接消失,且没有任何诊断。正确的改写多半是 visibleWhen: "current_user.email == 'admin@objectos.ai'",但这需要一次浏览器实测(以 admin 与非 admin 两个身份各看一次)来确认绑定名,而不是靠读 ADR 推断。#5775 是 spec 车道的退役单,把一个需要 dogfood 半径的页面语义改写夹带进去会让那个 PR 的验收面失焦。
验收
确认 visibleWhen 环境里管理员身份的实际绑定名(current_user 还是 user);若 objectui 侧两者都不通,先在 objectui 提对应单。
改写 my-work.page.ts 的 2 处 page:card(其中 1 处带 visible),properties.visible → 组件级 visibleWhen(注意是组件节点的兄弟键,不是 properties 里的键)。
pnpm --filter @objectstack/example-showcase typecheck + 该 example 的测试。
按 .claude/skills/dogfood-verification 以 admin / 非 admin 两个身份各看一次 My Work 页,确认卡片该显示时显示、该隐藏时隐藏。
复跑 SDUI 组件 props 没有解析闸门:PageComponent.properties 是开放 record,ComponentPropsMap 的 29 个站点从不被 parse(#4001 批 17 的 no gate 判定) #5068 闸门,确认 page:card.visible 这条从 component-props-unknown-key 清单里消失。
关系
从 #5775 拆出。维护者 2026-08-06 裁决评论明写:「
page:card.visible属页面改写(正统visibleWhen,ADR-0089),可顺带或拆小单」。#5775 的实施 PR 选择拆单,理由记在下面。事实(对 origin/main + objectui HEAD
7dfbeb7实测)page:card.visible是把组件级可见性谓词写进了properties,靠SchemaRenderer的 hoist 生效(packages/react/src/SchemaRenderer.tsx读schema.visible)。ADR-0089 的正统拼法是组件级visibleWhen——visible连别名表都不在。所以这是页面写错了位置,不是PageCardProps少一个键:给它补声明会把一个第三方拼法固化成契约(Prime Directive #12),正是 #5775 在displayField上刚拆掉的形状。站点(2 处,同一文件):
examples/app-showcase/src/ui/pages/my-work.page.tsproperties.visibleon the "Leadership View"page:cardvisible: "user.email == 'admin@objectos.ai'"(#5068 的 warning 清单里
page:card.visible记为 1 条component-props-unknown-key。)为什么 #5775 没有顺带做
不是工作量,是一处语义待确认,做错了会静默改变 showcase 的渲染:
user.email(该行的注释说「the renderer now feedsuserinto the expression context」);visibleWhen声明绑定的是record/current_user/page.<var>,没有user。所以机械改写
visible→visibleWhen会得到一个恒假谓词 —— 卡片直接消失,且没有任何诊断。正确的改写多半是visibleWhen: "current_user.email == 'admin@objectos.ai'",但这需要一次浏览器实测(以 admin 与非 admin 两个身份各看一次)来确认绑定名,而不是靠读 ADR 推断。#5775 是 spec 车道的退役单,把一个需要 dogfood 半径的页面语义改写夹带进去会让那个 PR 的验收面失焦。验收
visibleWhen环境里管理员身份的实际绑定名(current_user还是user);若 objectui 侧两者都不通,先在 objectui 提对应单。my-work.page.ts的 2 处page:card(其中 1 处带visible),properties.visible→ 组件级visibleWhen(注意是组件节点的兄弟键,不是properties里的键)。pnpm --filter @objectstack/example-showcase typecheck+ 该 example 的测试。.claude/skills/dogfood-verification以 admin / 非 admin 两个身份各看一次 My Work 页,确认卡片该显示时显示、该隐藏时隐藏。PageComponent.properties是开放 record,ComponentPropsMap的 29 个站点从不被 parse(#4001 批 17 的 no gate 判定) #5068 闸门,确认page:card.visible这条从component-props-unknown-key清单里消失。关系
component.zod.ts那一半清单清空。PageComponent.properties是开放 record,ComponentPropsMap的 29 个站点从不被 parse(#4001 批 17 的 no gate 判定) #5068:error 升级的前置清单。本单 + component.zod.ts 的 I18nLabelSchema 键声明为纯字符串,但 3 个平台页在 31 处授权内联多语言 map #5728 + showcase 的 project-detail 页在page:tabs上授权items[].key,renderer 读的是items[].value—— 两个 tab 的稳定 URL token 从未生效 #5776 落地后该清单才为空。PageComponent.properties是开放 record,ComponentPropsMap的 29 个站点从不被 parse(#4001 批 17 的 no gate 判定) #5068 warning 期清单的剩余项,但不同族:那是 schema 的I18nLabelSchema形状问题,这是页面写错了键的位置。