发现于 #3808 / 反方向 parity 门的实施过程(围栏外,本 PR 未夹带 —— 判级评论明确「B 类不许无脑补 input,若处理须逐条按 #3797 的两向判定另立」)。未认领,交 PM triage。
机制
pin 版 @objectstack/spec@17.0.0-rc.5 声明这两个顶层键,渲染器一个读点都没有(objectui origin/main @ c85268256 实测):
| 键 |
spec |
渲染器 |
证据 |
page:header.icon |
PageHeaderProps.icon,describe Icon name |
零读点 |
packages/components/src/renderers/layout/containers.tsx 的 PageHeaderRenderer(822-1570)里 icon 只出现在每个 action 自己的 action.icon(:1321 / :1365)与导航项 item.icon(:604);schema?.icon / properties?.icon 全仓零命中 |
page:card.actions |
PageCardProps.actions |
零读点 |
PageCardRenderer(containers.tsx:666-695)只渲染 title / body(或 children)/ footer;没有任何 actions 槽 |
两者 inputs 也都不声明(containers.tsx:1583-1590 / :703-706),所以今天发布面与运行时是一致的「都没有」—— 这就是它不是 P0 的原因。但 spec 是平台契约:os validate / os build 侧的 validateComponentProps(objectstack#5068)按 spec 判定,一个写了 properties.icon 的页面在上游不报错(spec 接受),到了本仓渲染器却什么都不发生,零诊断。作者的心智模型里「spec 声明了 = 可配」,这是 record:activity.showSubscriptionToggle(#3165)同一个失效家族,只是那一条至少在 inputs 里写明了 NOT IMPLEMENTED,这两条连这层告知都没有。
为什么不在 #3808 里顺手做
#3808 的判级评论把 B 类明确排除,理由正确:方向是二择一,不是补声明。
三条路改的都是公开契约,不该由实施 agent 猜。
当前的兜底
#3808 落的反方向门(apps/console/src/__tests__/registry-inputs-spec-parity.test.ts)把这两条列为带理由的显式豁免并引用本单,所以它们不会静默通过;豁免纪律断言要求每条豁免引用一个 tracking issue,本单就是那个 issue。一旦有人声明了这两个键,门里的 carries no stale exemption 断言会立刻要求删掉豁免条目。
参考位置
packages/components/src/renderers/layout/containers.tsx:666-695(page:card 渲染)/ :703-706(page:card inputs)
packages/components/src/renderers/layout/containers.tsx:822-1570(page:header 渲染)/ :1583-1590(page:header inputs)
packages/plugin-detail/src/index.tsx 的 record:activity.showSubscriptionToggle —— (b) 路线的现成先例
关联:#3808、#3797 / PR #3806、#3165、#3809、objectstack#5068、objectstack#6776、ADR-0049
发现于 #3808 / 反方向 parity 门的实施过程(围栏外,本 PR 未夹带 —— 判级评论明确「B 类不许无脑补 input,若处理须逐条按 #3797 的两向判定另立」)。未认领,交 PM triage。
机制
pin 版
@objectstack/spec@17.0.0-rc.5声明这两个顶层键,渲染器一个读点都没有(objectuiorigin/main@c85268256实测):page:header.iconPageHeaderProps.icon,describeIcon namepackages/components/src/renderers/layout/containers.tsx的PageHeaderRenderer(822-1570)里icon只出现在每个 action 自己的action.icon(:1321/:1365)与导航项item.icon(:604);schema?.icon/properties?.icon全仓零命中page:card.actionsPageCardProps.actionsPageCardRenderer(containers.tsx:666-695)只渲染title/body(或children)/footer;没有任何 actions 槽两者
inputs也都不声明(containers.tsx:1583-1590/:703-706),所以今天发布面与运行时是一致的「都没有」—— 这就是它不是 P0 的原因。但 spec 是平台契约:os validate/os build侧的validateComponentProps(objectstack#5068)按 spec 判定,一个写了properties.icon的页面在上游不报错(spec 接受),到了本仓渲染器却什么都不发生,零诊断。作者的心智模型里「spec 声明了 = 可配」,这是record:activity.showSubscriptionToggle(#3165)同一个失效家族,只是那一条至少在inputs里写明了 NOT IMPLEMENTED,这两条连这层告知都没有。为什么不在 #3808 里顺手做
#3808 的判级评论把 B 类明确排除,理由正确:方向是二择一,不是补声明。
page:header.icon在 record chip / bare-h1 两种布局里放哪、和RecordTitleChip的对象图标怎么共存,是视觉决定;page:card.actions要不要CardHeader右侧动作区、用不用action:bar,牵扯components/renderers/action/**(components/action/**: 同一真值可见性门在动作面上未收口 ——action:group/action:menu成员动作声明visible: false照样渲染(#3758 的同族部分) #3812 / PR fix(components): 动作面成员动作的 visible 门按「已声明」判定,visible: false 不再渲染 (#3812) #3825 刚动过那片)。showSubscriptionToggle先例声明 + description 写明 KNOWN GAP。双向 parity 成立、作者被告知「声明了但不兑现」,零运行时风险,但发布了一个不可配的键。retiredKey()),本仓跟随。注意page:card已有一个同类墓碑在路上(parity 门只比键名,retiredKey()墓碑会被判成「spec 接受」—— 今天 pin 版零墓碑所以休眠,spec pin 一升就是门里的假绿(page:card.body是现成标本) #3809:PageCardProps.body已在上游退役)。三条路改的都是公开契约,不该由实施 agent 猜。
当前的兜底
#3808 落的反方向门(
apps/console/src/__tests__/registry-inputs-spec-parity.test.ts)把这两条列为带理由的显式豁免并引用本单,所以它们不会静默通过;豁免纪律断言要求每条豁免引用一个 tracking issue,本单就是那个 issue。一旦有人声明了这两个键,门里的carries no stale exemption断言会立刻要求删掉豁免条目。参考位置
packages/components/src/renderers/layout/containers.tsx:666-695(page:card 渲染)/:703-706(page:card inputs)packages/components/src/renderers/layout/containers.tsx:822-1570(page:header 渲染)/:1583-1590(page:header inputs)packages/plugin-detail/src/index.tsx的record:activity.showSubscriptionToggle—— (b) 路线的现成先例关联:#3808、#3797 / PR #3806、#3165、#3809、objectstack#5068、objectstack#6776、ADR-0049