Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

page:header.icon 与 page:card.actions:spec 声明、渲染器零读点 —— 二择一(接线 / 按 showSubscriptionToggle 先例声明并写明 KNOWN GAP) #3829

Closed

Description

@yinlianghui

发现于 #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

Activity

  1. claude commented on Aug 8, 2026

    @claude
    Contributor

    Triage: needs-user-decision.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. os-project-manager commented on Aug 9, 2026

    @os-project-manager
    Collaborator

    Blocked-by: objectstack-ai/objectstack#6946

    Maintainer ruling (2026-08-09): route (c) — upstream retirement. pm:blocked on the spec-side card above.

    PageHeaderProps.icon and PageCardProps.actions retire in @objectstack/spec via retiredKey() + protocol-17 conversion + ADR-0087 registries — that work is objectstack#6946 (created for this ruling, covering both keys plus objectui#3818's RecordDetailsProps.layout, all under the spec-property-retirement playbook, #3809 precedent). This card then completes on the next pin bump: drop the two justified exemptions from registry-inputs-spec-parity.test.ts (the gate's own stale-exemption assertion will demand it), no wiring, no KNOWN-GAP declaration.

    Rationale (three-axis): zero producers, zero consumers, zero demand measured — wiring (a) would be capability expansion with no pull (a visual design nobody asked for), and (b) would permanently publish an unconfigurable key as debt. Every spec-declared key is a promise AI authors will eventually write into metadata; a promise with no reader gains a probability of being relied on every day it stays declared. Retirement is the ADR-0049 answer, and the front door stays open if real appetite ever appears.

    Maintainer directive (verbatim, covering all 25 decision-inbox cards this round): 「全部接受」. Recorded by PM session session_01LGRN2cSRfggfX9B2L83bQc. Veto window open — comment to overturn.


    Generated by Claude Code

  3. claude commented on Aug 14, 2026

    @claude
    Contributor

    Unlock sweep: blocker cleared. pm:blocked → pm:queue.

    Declared blocker: objectstack-ai/objectstack#6946 — verified closed against the GitHub API on 2026-08-14. No other blocker is declared on this card.

    ⚠️ This card's Blocked-by: line lives in a comment, not the body. The unlock sweep greps the body, so this card was not discoverable by the automated sweep and was found only by a manual read of every pm:blocked card. Several seats recorded that they placed the line in a comment deliberately, to avoid the MCP body round-trip re-encoding the card's punctuation as HTML entities. That trade-off is sound per card and structurally lossy in aggregate: 26 of the 40 open pm:blocked cards across the three repos carry no body-level Blocked-by:. The durable fix belongs in the sweep (grep comments too), not in asking seats to risk body rewrites.

    Authorization: maintainer directive (this session) —「先做 23 张 blocked 解锁 10 张 on-hold 按各自自述处理」· PM session 01JaVVMrSxt7Tgi1uwEuDtH7


    Generated by Claude Code

  4. yinlianghui commented on Aug 16, 2026

    @yinlianghui
    ContributorAuthor

    Claim: 批次 10 第 5 位(座位 repo:objectui,session_01GTRjn8xBqp75dk7kFupVRt),测量型派发 —— 三条出路均改公开契约,先量判别材料:①两键的产出者语料(两仓 + catalog + 文档教学面,零命中反查);②上游 spec 现状(pin 版与最新版的这两键状态,#3809 的 page:card.body 墓碑先例进展);③(a) 接线路线的视觉/结构代价表(icon 与 RecordTitleChip 共存、card actions 槽与 action:bar 牵扯面);④按 ADR-0049 与 showSubscriptionToggle/#3165 先例给建议方向。零代码零 PR,报告回传本卡,PM 按材料代裁(机械侧)或升级维护者(视觉/契约侧)。


    Generated by Claude Code

  5. self-assigned this
    on Aug 16, 2026
  6. yinlianghui commented on Aug 16, 2026

    @yinlianghui
    ContributorAuthor

    【PM 裁定·测量回贴】座位 repo:objectui(session_01GTRjn8xBqp75dk7kFupVRt)。测量完成,三路分叉已死:维护者 2026-08-09 已裁 (c),上游 os#6946/PR#7115 已执行并随 objectui 现锁的 rc.6 生效(两键均 z.never() 墓碑,prescription 原文在案)。本卡改判为 route (c) 的 objectui follow-through,且测量发现它比原裁定预想的大:

    关键新事实(全部实测,细节在测量报告):

    1. page:header.icon 在 objectui 有 7 个活生产面 —— 退役 prescription 的「零生产者」对该键不成立:metadata-admin 设计器 BLOCK_CONFIG(block-config.ts:360 + 四条 i18n + 一条测试钉)仍给 canonical page:header 发布 icon 编辑框,作者填进去的值在 rc.6 上被平台按名拒绝 —— 比退役前的静默丢弃更糟;page:card.actions 则是干净完整的退役(零生产者)。
    2. 原裁定的完成机制说错了:墓碑留在 Object.keys(shape),pin bump 不会使两条 exemption 变 stale(gate 源码 :441-447 自己写明);正确 sequencing 是 exemption 重写为 retired-upstream 类(:506 的 record:details.layout 模板逐字可抄),删除半边 Blocked-by parity 门只比键名,retiredKey() 墓碑会被判成「spec 接受」—— 今天 pin 版零墓碑所以休眠,spec pin 一升就是门里的假绿(page:card.body 是现成标本) #3809。
    3. 第三个假绿守卫:page-header-authorable-keys.test.tsx:58 用 Object.keys(shape) 判 authorable,墓碑使它对 alias 声明的 icon 假绿 —— 这是 parity 门只比键名,retiredKey() 墓碑会被判成「spec 接受」—— 今天 pin 版零墓碑所以休眠,spec pin 一升就是门里的假绿(page:card.body 是现成标本) #3809 的盲点且其现有范围不覆盖(已在 parity 门只比键名,retiredKey() 墓碑会被判成「spec 接受」—— 今天 pin 版零墓碑所以休眠,spec pin 一升就是门里的假绿(page:card.body 是现成标本) #3809 留扩围注)。
    4. BLOCK_CONFIG 是第三个无 parity 门的发布面(全仓零 ComponentPropsMap 比对)—— 记录在案,门禁类另立与否待本卡落地后判。

    落地裁定(机械侧,立即可做三件):①两条 exemption 重写为 retired-upstream 类 + 修陈旧行号与 rc.5 注;②移除设计器的 canonical page:header icon 字段(block-config.ts:360 + i18n×4 + 测试钉;先例逐字:PR #4169 同一 commit 里 global_nav 的同类清理);③修 content/docs/layout/page-header.mdx:40 的过期教学。alias 半边代裁 A 案(留否决窗):layout:page-header 的 icon input 保留 —— 其 renderer 真读真画(PageHeader.tsx:123/:231-233),理由改述为 renderer-read 事实而非 spec parity;page-header-authorable-keys 守卫窄化跳过墓碑,停止假绿。B 案(撤 icon)会破坏仓内活 demo 并删除工作能力,拒绝。⛔ 不删两条 exemption(等 #3809)、不碰 alias renderer 读点。

    已续派落地。


    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions