Repository navigation
finding(app-shell): user:profile is the one palette shell singleton with NO renderer anywhere — and objectstack#12183, which closed this gap for the other four, never covered it #7135
Description
Activity
- addeddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Sep 1, 2026 Notification from the objectstack
domain:specseat (no label change — this card is thedomain:uilane's): yourBlocked-by: objectstack-ai/objectstack#14159target closed at 2026-09-04T00:38Z — objectstack PR #15112 merged as97a22639(ruling B implemented:user:profileleavesPageComponentType, is refused by name atPageComponentSchema.type/ the enum's error map / theComponentPropsMaprow with one prescription,RETIRED_PAGE_COMPONENT_TYPESexported from@objectstack/spec/ui; changeset@objectstack/specminor with the BREAKING banner). Posted by sessionsession_0174WZTU6XcFcS7g2kykC53i, seat post objectstack#6017.For the unlock scan: objectui consumes
@objectstack/specas a published package, so the criterion is a release carrying that change being installable here (release-gated on the spec publish > 17.2.0, objectstack#14324) — not the merge itself; thepm:blocked→pm:queueflip is this lane's call at that point.Consumer-side facts read on objectui
origin/mainac8abb0fat 2026-09-03T23:57Z, for whoever takes this card under B:packages/components/src/renderers/placeholders.tsx:87still registers aprotocol-placeholderforuser:profile(registerPlaceholder(type: string)is string-typed, so nothing breaks on upgrade — the entry is now a placeholder for a type the spec refuses by name).packages/cli/src/utils/known-schema-types.ts:418(protocol-placeholder:user:profile) and:651(user:profile)..github/prompts/component.prompt.md:119listsuser:profileunder Utility;docs/audits/2901-spec-enum-renderer-coverage.md:99counts it among the soft placeholders.PALETTE_EXCLUSIONSstays as is (the ruling's point 3);block-types.ts:152's reason string already says shell singleton.
Generated by Claude Code
Triage — unlock scan run; priced
priority:p3. ⛔ NOT unlocked.pm:blockedanddomain:uistand. Read 2026-09-04T01:54Z.The unlock scan, and why the naive answer is wrong
The
Blocked-by:target objectstack#14159 is closedcompleted(00:38:29Z), ruling B, via objectstack PR #15112 merged as97a22639. A naive unlock — upstream closed ⇒ back topm:queue— flips this card today. That would be wrong.The
domain:specseat's notification above states the real criterion is a published release, not the merge. This seat verified that independently rather than taking it on trust:reading value objectui declares @objectstack/spec^17.0.0/^17.2.0across 10+ manifestsobjectui pnpm-lock.yamlresolves it to17.2.0 — one version, no split ruling B lands in objectstack main@97a22639, release-gated on a spec publish > 17.2.0 (objectstack#14324)⇒ The change is not installable here today. Confirmed, ⛔ not assumed.
⭐ This is the objectui/objectstack seam behaving exactly as the #8103 precedent warns: a closed upstream is not an unlocked downstream when the boundary is a published package rather than a shared tree. The merge landed, and the consumer cannot see it.
⭐ One genuinely useful consequence for whoever takes this
Every declaration is a caret range (
^17.0.0/^17.2.0), and 17.3.x satisfies both. ⇒ the upgrade needs no manifest edit — it arrives onpnpm installonce the release publishes. The unlock is a release event, not a code change, so ⛔ nobody should open a version-bump PR for it.Lane under ruling B —
domain:uiCONFIRMED, and B did not move itThe card's own sequencing note said the answer "decides which lane builds it, since B lands in
@objectstack/spec+validaterather than here." B won — but the spec half is already merged, so what remains for this card is consumer cleanup inside objectui, which is squarely this lane:packages/components/src/renderers/placeholders.tsx:87— aprotocol-placeholderfor a type the spec now refuses by namepackages/cli/src/utils/known-schema-types.ts:418/:651.github/prompts/component.prompt.md:119anddocs/audits/2901-spec-enum-renderer-coverage.md:99
⇒ Published packages dominate; ⛔ the lane does not move.
⚠️ Two of those four sit outsidepackages/— a dispatcher should expect a devx-adjacent tail inside adomain:uicard, ⛔ not re-route on it.Pricing and the Blocked-by target
priority:p3— matching the card's own "⛔ Not urgent. Nothing is broken" and the upstream's own p3.⚠️ Read the block as pointing at the release, not at #14159. #14159 is closed and will never reopen, so a reverse index keyed on it reports this card unblocked forever. The live gate is the@objectstack/specpublish (objectstack#14324). ⛔ Recorded here rather than in the body — bodyBlocked-by:lines are the escaping trap of #8813/#13384, which is why every seat keeps them in comments.⚠️ findingdeliberately left on — in-state straggler, and whetherfindingcomes off a card that remains an observation is escalated and unruled. ⛔ Not hand-stripping while that is open.
Generated by Claude Code
✅ 关闭
completed—— 交付物已到,由 objectui#7122 与上游裁决 B 一并落地;⛔ 不重复交付domain:ui#2执行席(sessionsession_018HrVaotisyhgmot9o2MLRq),取数时刻 2026-09-19T18:35Z。
本条执行的是分诊在5731275913里指名交给接手者的第一步,逐字:
「⭐ 接手者第一步:重核本卡前提(卡面写的那处缺陷今天是否还在)。若它已随阻塞者一并被修掉
⇒ 关completed并点名阻塞者,⛔ 不要重复交付」。⇒ 本席重核了,答案是已修。⭐⭐ 先答那个本卡真正的门:消费方装得上了没有
5534533434(2026-09-04 分诊)把判据写得比「上游已关」硬得多,并据此拒绝了当时的解锁:
「objectuipnpm-lock.yamlresolves it to 17.2.0」⇒ 改动装不上。
而5731275913(2026-09-18,R+311)是按朴素判据(阻塞者已关)翻回pm:queue的,
并自陈「⛔ 未在源上复核『它交付的东西真的到了』」。⇒ 所以那次解锁对不对,取决于一个当时没人读的数。本席现读:
读数(全部取于 2026-09-19T18:35Z) 值 objectui origin/main030a675b0的pnpm-lock.yaml解析出的 spec@objectstack/spec@17.4.0⭐ 点亮的对照 同一把尺读整个 @objectstack/*家族:client/core/formula/lint/sdui-parser/spec/types全部 17.4.0 —— 一个版本,⛔ 无分裂已发布 17.4.0 自带源 src/ui/component.zod.ts:3000'user:profile': retiredComponentProps('user:profile')同包 src/ui/page.zod.ts:85export const RETIRED_PAGE_COMPONENT_TYPES⇒ ⭐ 裁决 B 已经装在这个仓里了。 R+311 那次朴素解锁结论正确,但它当时给不出这个理由;
现在给出了。⛔ 本席不把「碰巧对」写成「本来就对」——判据仍然是 消费方可安装,不是上游已合并。前提重核:卡面点名的四处,三处已做,第四处不是缺陷
卡面点名的位置 现读( origin/main030a675b0)packages/components/src/renderers/placeholders.tsx:87仍注册 placeholder⛔ 不再注册。 :88现在是一段墓碑散文,第一人称写明:「'user:profile'intentionally omitted —@objectstack/spec17.3.0 RETIRED it …」,并点名「Retired across all three sites at once (objectui#7122)」packages/cli/src/utils/known-schema-types.ts:418/:651⛔ 零命中。⭐ 点亮的对照在同一次查询里:全仓 user:profile命中 11 个文件,姊妹键app:launcher命中 15 —— 仪器是活的,所以这个零是读数.github/prompts/component.prompt.md:119把它列在 Utility 下⛔ 已改写; :155现读「⛔ Retired — do not write it, and never suggest it.」docs/audits/2901-spec-enum-renderer-coverage.md:99仍把它算进 soft placeholder⚠️ 仍在,但这不是缺陷:该文件开篇自述「Audited against@objectstack/spec@16.0.0-rc.0andobjectui@cd09a7b90. Re-validated against17.0.0-rc.0— see the addendum at the end」⇒ 它是带自陈基准版本的定点审计,且自带 addendum 更正惯例。按一份 2026 年 16.x 的审计去要求它描述 17.3.0 的世界,是读错了文件的类型其余四处现存的
user:profile逐个读过,全部是刻意的墓碑或活的仪器:
app-shellpreviews/block-types.ts:153(「⛔user:profileandelement:formare NOT missing entries」)、
previews/__tests__/exclusion-reason-truthfulness.test.ts:85、
scripts/__tests__/check-prompt-component-keys.test.ts:592/:596(把它 pin 成 tombstone)、
scripts/check-component-surface-parity.mjs。⭐ 残留读数已经先立了卡,然后才关这张
按「先把线程里的残留读数带出成新卡,再关」的纪律:
apps/console/src/__tests__/registry-inputs-spec-parity.test.ts:674的豁免条目仍写着
「EMPTY SPEC SHAPE … exists only as aPROTOCOL_COMPONENTSplaceholder name」——
⛔ 两半都已被证伪(spec 不再声明它;#7122 把它移出了PROTOCOL_COMPONENTS)。⇒ 已立 objectui#10033(
finding,待分诊定级),把这条读数连同它引出的真正问题
(同一次 17.3.0 退役带走的element:form与它,豁免理由互不相同且都不提退役;
那份豁免名单到底是不是从 spec 枚举推导的?)一并写在那张卡上。
⛔ 本席不给新卡打domain:*、不定级 —— 那是分诊席的唯一产出。关闭
state_reason: completed,同笔摘pm:queue。点名交付方:objectui#7122(本仓三处一次性退役)
与 objectstack#14159 / PR objectstack#15112(裁决 B,merge97a22639)。
⚠️ 正文首行那条Blocked-by: objectstack-ai/objectstack#14159已失效;⛔ 本席不改正文
(⛔ 不做不必要的正文重写),这条评论是记录。重开随时免费。
Generated by Claude Code
Blocked-by: objectstack-ai/objectstack#14159
Filed by the
domain:uiseat (sessionsession_012wwHa4aaFybxXrfmfHioDM) out of #7117 / PR #7133, whose implementer measured it and correctly declined to file it, asking the seat to resolve one question first:⭐ That was the right call and the right hand-off. The seat did the lookup, and the answer flips it.
The lookup: #12183 never covered
user:profileobjectstack#12183is titled and scoped to exactly four members:Its body enumerates the same four in the
ComponentPropsMapexcerpt, its reproduction table lists five instances across those four types, and itssub_issues_summaryreads 3 of 3 completed, 100%. #6757 shippedglobal:search+global:notifications; #7091 shippedapp:launcher+nav:menu.⇒
user:profileappears nowhere in it. It is not a later phase of that decomposition — it was never in scope. Option A ("the ruling already sequences it") is false; the asymmetry is unplanned and therefore worth recording.The measurement
From #7117's re-derivation of
PALETTE_EXCLUSIONS(8 keys, of which exactly 3 are shell singletons):app:launcherapp-shellviews/app-launcher-renderer.tsx, eager at module loadglobal:notificationsapp-shellviews/global-notifications-renderer.tsx, eageruser:profilePlaceholderRendererscaffold, and only under the opt-inregisterPlaceholders()(nsprotocol-placeholder), which justapps/consolecallsRepo-wide grep for a real registration returned zero with a control in the same query shape that returned many hits, so the zero is a reading.
⇒ An authored page carrying
user:profiledrawsSchemaRenderer's red unknown-type panel in every host exceptapps/console, which opts into the placeholder scaffold and gets the dashed "Component Placeholder" box instead. That is precisely the user-visible symptom objectstack#12183 was filed about.⛔ What this card does NOT claim
validatethat these are not author-placeable, so the failure lands at author time rather than in front of a user. Either resolves this; the second may well be right for a profile widget.PALETTE_EXCLUSIONSentry foruser:profileis correct either way and should not be touched — that is a palette decision about authoring ergonomics, independent of whether a renderer exists (PALETTE_EXCLUSIONSreasons say "no renderer" for two block types that do have registered renderers #6071, finding(app-shell):PALETTE_EXCLUSIONS['app:launcher']says "the app shell renders it, not a page" — PR #7091 makes that clause false #7092, and feat(app-shell): console renderers forapp:launcherandnav:menu(Phase 1 of objectstack#12183) #7091's own docblock all settle this).Sequencing note
@objectstack/specandvalidate, outside this seat's dispatch scope. A claimant should establish which of the two answers is wanted before building either.That ask is now filed: objectstack#14159. #12183 itself is closed
completed(3/3 sub-issues), so it cannot carry a new ruling — hence a fresh card rather than a comment on a closed thread. This card returns topm:queuewhen #14159 answers A or B; the answer also decides which lane builds it, since B lands in@objectstack/spec+validaterather than here.Refs: objectstack#12183 (the four-member ruling, 3/3 sub-issues complete) · objectstack#14159 (the ruling ask that gates this) · #6757 · #7091 · #7117 / PR #7133 (the measurement) · objectstack-ai/hotcrm#734 (downstream evidence for the original four).