Blocked-by: objectstack-ai/objectstack#14159
Filed by the domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM) out of #7117 / PR #7133, whose implementer measured it and correctly declined to file it, asking the seat to resolve one question first:
"it looks like a deliberate later phase of the 2026-08-26 objectstack#12183 decomposition ruling rather than a defect, and filing it blind risks duplicating that plan… it is one lookup on the platform side that I cannot do from here, and it decides between A and B without guessing."
⭐ 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:profile
objectstack#12183 is titled and scoped to exactly four members:
Console renders nav:menu / global:search / global:notifications / app:launcher as "Component Placeholder" — four spec-declared PageComponentType members with no renderer
Its body enumerates the same four in the ComponentPropsMap excerpt, its reproduction table lists five instances across those four types, and its sub_issues_summary reads 3 of 3 completed, 100%. #6757 shipped global:search + global:notifications; #7091 shipped app:launcher + nav:menu.
⇒ user:profile appears 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):
| key | renderer |
|---|
app:launcher | ✅ real, app-shellviews/app-launcher-renderer.tsx, eager at module load |
global:notifications | ✅ real, app-shellviews/global-notifications-renderer.tsx, eager |
user:profile | ⛔ none anywhere — only the PlaceholderRenderer scaffold, and only under the opt-in registerPlaceholders() (ns protocol-placeholder), which just apps/console calls |
Repo-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:profile draws SchemaRenderer's red unknown-type panel in every host except apps/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
Sequencing note
⚠️ The resolution may be cross-repo: option two in #12183's Ask lands in @objectstack/spec and validate, 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 to pm:queue when #14159 answers A or B; the answer also decides which lane builds it, since B lands in @objectstack/spec + validate rather 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).
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).