Filed by the domain:ui seat (session session_013hfmP9hoMd3dJwTh85J4yB) on the handback from #6661's implementer, which found this while being told not to touch PALETTE_EXCLUSIONS and correctly filed rather than fixed.
The defect, and its timing
packages/app-shell/src/views/metadata-admin/previews/block-types.ts, in PALETTE_EXCLUSIONS:
'app:launcher': 'shell singleton — the app shell renders it, not a page',
PR #7091 (closes #6661) registers a real app:launcher renderer, so a page can now render it. The moment that merges, the clause "not a page" is literally false — the entry will describe a state of the world that stopped being true in the same repo.
⚠️ This is a wording defect, not a decision defect. The exclusion itself stays correct: app:launcher should remain out of the Studio page palette. Only the stated reason goes stale.
Why the exclusion is still right (so nobody "fixes" it the wrong way)
The sibling entry proves the pattern:
'global:notifications': 'shell singleton — lives in the app shell header',
global:notifications carries the same shell-singleton marker, #6757 shipped a real renderer for it, and its palette exclusion survived untouched — because the marker means "not offered in the page palette", not "no renderer exists". Its wording is already neutral, which is exactly why it did not rot. app:launcher's wording made a claim about rendering that a renderer can falsify.
Scope: reword the clause, keep the decision verbatim
Direct precedent: #6071 did exactly this for element:text_input / element:record_picker — reasons that said "no renderer" for two types that did have registered renderers, corrected in place without moving the entries.
⛔ Not a decision about whether app:launcher becomes palette-authorable. That is a real product question, it is not carried by #6661 or by this card, and moving the entry rather than rewording it would answer it silently.
⛔ Not a rider on a renderer PR. The docblock immediately above that table records what happens when the palette and the placeholder registry drift apart — "an author dragged a block Studio advertised and got a red box" — so a palette-adjacent edit riding a renderer change is the specific drift that table warns about. #6661's dispatch fenced it out for that reason. A separate one-line PR.
Why this is worth a card rather than a shrug
No gate goes red: exclusion-reason-truthfulness.test.ts only judges reasons that claim "no renderer", and this one does not — it claims something subtler about where rendering happens. So the false clause sits green indefinitely.
That ledger is read as the decision record. #6071's own header records that #5837 had to re-derive registration state from source precisely because a stated reason could not be trusted. A wrong reason there costs the next reader real time even while CI stays green.
⭐ Same class as #7070, filed earlier today: a #3129 note in app-shell/ObjectView.tsx states that "the calendar and gantt branches below already use" the corrected two-rung shape, while the gantt branch beside it still uses the one-rung fabrication that note declares retired. A comment that certifies the code beside it is worse than no comment, because it is the artefact a future fixer consults instead of measuring.
Suggested repair
One line, mirroring the sibling's neutral form — e.g. 'shell singleton — lives in the app shell chrome' — keeping the entry, its key and its position unchanged.
Refs: #6661 · PR #7091 · #6757 · #6071 · #5837 · #7070.
Filed by the
domain:uiseat (sessionsession_013hfmP9hoMd3dJwTh85J4yB) on the handback from #6661's implementer, which found this while being told not to touchPALETTE_EXCLUSIONSand correctly filed rather than fixed.The defect, and its timing
packages/app-shell/src/views/metadata-admin/previews/block-types.ts, inPALETTE_EXCLUSIONS:PR #7091 (closes #6661) registers a real
app:launcherrenderer, so a page can now render it. The moment that merges, the clause "not a page" is literally false — the entry will describe a state of the world that stopped being true in the same repo.app:launchershould remain out of the Studio page palette. Only the stated reason goes stale.Why the exclusion is still right (so nobody "fixes" it the wrong way)
The sibling entry proves the pattern:
global:notificationscarries the same shell-singleton marker, #6757 shipped a real renderer for it, and its palette exclusion survived untouched — because the marker means "not offered in the page palette", not "no renderer exists". Its wording is already neutral, which is exactly why it did not rot.app:launcher's wording made a claim about rendering that a renderer can falsify.Scope: reword the clause, keep the decision verbatim
Direct precedent: #6071 did exactly this for
element:text_input/element:record_picker— reasons that said "no renderer" for two types that did have registered renderers, corrected in place without moving the entries.⛔ Not a decision about whether
app:launcherbecomes palette-authorable. That is a real product question, it is not carried by #6661 or by this card, and moving the entry rather than rewording it would answer it silently.⛔ Not a rider on a renderer PR. The docblock immediately above that table records what happens when the palette and the placeholder registry drift apart — "an author dragged a block Studio advertised and got a red box" — so a palette-adjacent edit riding a renderer change is the specific drift that table warns about. #6661's dispatch fenced it out for that reason. A separate one-line PR.
Why this is worth a card rather than a shrug
No gate goes red:
exclusion-reason-truthfulness.test.tsonly judges reasons that claim "no renderer", and this one does not — it claims something subtler about where rendering happens. So the false clause sits green indefinitely.That ledger is read as the decision record. #6071's own header records that #5837 had to re-derive registration state from source precisely because a stated reason could not be trusted. A wrong reason there costs the next reader real time even while CI stays green.
⭐ Same class as #7070, filed earlier today: a
#3129note inapp-shell/ObjectView.tsxstates that "the calendar and gantt branches below already use" the corrected two-rung shape, while the gantt branch beside it still uses the one-rung fabrication that note declares retired. A comment that certifies the code beside it is worse than no comment, because it is the artefact a future fixer consults instead of measuring.Suggested repair
One line, mirroring the sibling's neutral form — e.g.
'shell singleton — lives in the app shell chrome'— keeping the entry, its key and its position unchanged.Refs: #6661 · PR #7091 · #6757 · #6071 · #5837 · #7070.