You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Studio block designer publishes three page-component inputs no renderer reads (objectui, found by #4001 batch A) #7973
Filed from #4001 batch A (ui/component.zod.ts strictness conversion) under AGENTS.md Prime Directive #10 — out of that PR's scope, and the fix lives in the sibling repo objectstack-ai/objectui.
Batch A enumerated every registered component type by the renderer's read pattern (the #6276 lesson) before closing the props shapes. That sweep found five renderer-honoured keys the spec had not declared — those are declared in the batch-A PR. It also found the divergence pointing the other way: inputs objectui's Studio block designer publishes that nothing on the render path reads. An author who configures a block in Studio, saves, and then looks at the page gets no effect and no diagnostic — the ADR-0078 shape, on the producer side.
Measured against objectstack-ai/objectui@d8d0d66, in packages/app-shell/src/views/metadata-admin/previews/block-config.ts:
Designer input
Read path
Verdict
page:accordion → title
PageAccordionRenderer (renderers/layout/containers.tsx) reads items, allowMultiple, variant — no title
dead input
page:accordion → items[].value
the renderer overwrites it: items.map((it, idx) => ({ ...it, value: \panel-${idx}` })) (containers.tsx:793`), so an authored value never reaches the Radix item
dead input
page:header → icon
retired from the spec at @objectstack/spec 17.0.0 (#6946, ADR-0087 D2) — no renderer ever read it
designer has not caught up with the retirement
Two notes that matter for whoever picks this up:
The accordion value case is not symmetric with page:tabs. One component over, an authored items[].valueis read (containers.tsx:566, with a tab-<idx> fallback), which is why the spec declares it there and showcase 的 project-detail 页在 page:tabs 上授权 items[].key,renderer 读的是 items[].value —— 两个 tab 的稳定 URL token 从未生效 #5776 exists for the key → value rewrite. The accordion's is genuinely derived. Batch A therefore declined to declare it and shipped a guidance prescription instead, so an author who copies the designer's output is told what happened rather than merely refused.
Suggested fix, objectui side: drop the three inputs from block-config.ts (page:accordion.title, page:accordion.items[].value, page:header.icon). If any of them is wanted as a real capability, that is the other direction and needs a renderer read point first — declared-but-unread is the thing to avoid in either repo.
Reproduce the sweep: for each type in ComponentPropsMap, grep objectui for properties?.<key> / hoisted schema?.<key> reads and diff against the declared shape. It is cheap and it is what turned both directions up.
Triage: pm:queue for the repo:objectui seat, type Bug. One label correction: removed domain:spec — the fix lands wholly in objectui (packages/app-shell/src/views/metadata-admin/previews/block-config.ts: drop the three dead designer inputs), and domain:* labels route objectstack lanes only; per the card body, the spec-side halves (declaring the five renderer-honoured keys, closing the shapes, the accordion guidance prescription) already shipped with #4001 batch A, so nothing objectstack-side remains here. Seam-card shape (repo:objectui, filed at the finder's repo with the cross-repo evidence) is the established pattern (#7494 / #7366 / #7345).
Dispatch note for the objectui seat: the suggested fix is subtractive (three input removals); if any of the three is instead wanted as a real capability, that reverses into a renderer-first feature and should come back through the decision channel — the card says this itself.
Moved to objectstack-ai/objectui#5212 — closing as moved, not resolved. Unfixed.
Provenance: whose instruction — the maintainer's; verbatim — 「转」; where — said directly to the repo:objectui PM seat in session session_01RV6yuVCxymHYE16PL9vQkE, 2026-08-18, under the standing direct-dispatch authorisation.
Why: file-at-destination, and this card said so itself — "the fix lives in the sibling repo objectstack-ai/objectui", with a suggested fix naming only objectui files. It was filed here because the batch-A sweep that found it ran here.
Already dispatched on the destination card, at sonnet with a premise check first: the d8d0d66 baseline and the containers.tsx line numbers are six days old and will have moved, so all three verdicts get re-derived before anything is deleted. The page:tabs warning — that an authored items[].valueis live one component over — carried across verbatim and is called out as the one way to get this wrong.
The 1 comment here was not copied and stays readable. Anyone tracking this: follow objectstack-ai/objectui#5212.
Filed from #4001 batch A (
ui/component.zod.tsstrictness conversion) under AGENTS.md Prime Directive #10 — out of that PR's scope, and the fix lives in the sibling repoobjectstack-ai/objectui.Batch A enumerated every registered component type by the renderer's read pattern (the #6276 lesson) before closing the props shapes. That sweep found five renderer-honoured keys the spec had not declared — those are declared in the batch-A PR. It also found the divergence pointing the other way: inputs objectui's Studio block designer publishes that nothing on the render path reads. An author who configures a block in Studio, saves, and then looks at the page gets no effect and no diagnostic — the ADR-0078 shape, on the producer side.
Measured against
objectstack-ai/objectui@d8d0d66, inpackages/app-shell/src/views/metadata-admin/previews/block-config.ts:page:accordion→titlePageAccordionRenderer(renderers/layout/containers.tsx) readsitems,allowMultiple,variant— notitlepage:accordion→items[].valueitems.map((it, idx) => ({ ...it, value: \panel-${idx}` }))(containers.tsx:793`), so an authored value never reaches the Radix itempage:header→icon@objectstack/spec17.0.0 (#6946, ADR-0087 D2) — no renderer ever read itTwo notes that matter for whoever picks this up:
valuecase is not symmetric withpage:tabs. One component over, an authoreditems[].valueis read (containers.tsx:566, with atab-<idx>fallback), which is why the spec declares it there and showcase 的 project-detail 页在page:tabs上授权items[].key,renderer 读的是items[].value—— 两个 tab 的稳定 URL token 从未生效 #5776 exists for thekey→valuerewrite. The accordion's is genuinely derived. Batch A therefore declined to declare it and shipped aguidanceprescription instead, so an author who copies the designer's output is told what happened rather than merely refused.page:header.iconwill now be refused, not dropped. Batch A closed these shapes, so a designer-authorediconraises the [spec] Retire three zero-reader UI keys per maintainer ruling: PageHeaderProps.icon, PageCardProps.actions, RecordDetailsProps.layout (objectui#3829 / objectui#3818) #6946 tombstone (with itsos migrate meta --from 16prescription) at the authoring gate instead of being stripped in silence. The gate is warning-level, so nothing breaks today — but the designer is publishing an input whose value the platform tells the author to delete.Suggested fix, objectui side: drop the three inputs from
block-config.ts(page:accordion.title,page:accordion.items[].value,page:header.icon). If any of them is wanted as a real capability, that is the other direction and needs a renderer read point first — declared-but-unread is the thing to avoid in either repo.Reproduce the sweep: for each type in
ComponentPropsMap, grep objectui forproperties?.<key>/ hoistedschema?.<key>reads and diff against the declared shape. It is cheap and it is what turned both directions up.