From ab85b515e1e21e0afdb00797b0a2efe13d9df7f7 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 1 Sep 2026 01:55:16 +0000 Subject: [PATCH] fix(app-shell): reword the `app:launcher` palette-exclusion reason so a renderer cannot falsify it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PALETTE_EXCLUSIONS['app:launcher']` read "shell singleton — the app shell renders it, not a page". objectui#7091 registered a real `app:launcher` renderer, so a page CAN now render it and the "not a page" clause is false on `main`. The wording is the defect, not the decision. `app:launcher` stays out of the Studio page palette; the entry, its key and its position are unchanged. The new text mirrors the sibling `global:notifications`, which carries the identical shell-singleton marker and did NOT rot when objectui#6757 shipped it a real renderer — because it describes WHERE the thing lives rather than whether a renderer exists. Whether `app:launcher` should become palette-authorable is a separate product question; moving the entry rather than rewording it would have answered that silently, so the entry did not move. `exclusion-reason-truthfulness.test.ts` judges only reasons matching /\bno\s+(?:\w+\s+){0,2}renderer\b/i; neither the old nor the new text matches, so this entry was never in that guard's population and the guard's non-vacuity assertion is still satisfied by `ai:chat_window` and `element:form`. Changeset carries empty frontmatter, following objectui#6071 on this same ledger: the reason strings are developer-facing prose read by no runtime code path, and `PALETTE_EXCLUSIONS` is not exported from the package entry. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM --- .changeset/7092-launcher-exclusion-reason.md | 17 +++++++++++++++++ .../metadata-admin/previews/block-types.ts | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 .changeset/7092-launcher-exclusion-reason.md diff --git a/.changeset/7092-launcher-exclusion-reason.md b/.changeset/7092-launcher-exclusion-reason.md new file mode 100644 index 0000000000..19513e04b1 --- /dev/null +++ b/.changeset/7092-launcher-exclusion-reason.md @@ -0,0 +1,17 @@ +--- +--- + +Corrects the `PALETTE_EXCLUSIONS` reason string for `app:launcher` in the Studio +page-palette ledger. It read "shell singleton — the app shell renders it, not a page", +and objectui#7091 registered a real `app:launcher` renderer, so a page can now render it +and the "not a page" clause became false. The reason now reads "shell singleton — lives +in the app shell chrome", mirroring the neutral form its sibling `global:notifications` +has carried since objectui#6757 shipped that type a renderer without its wording rotting: +the entry describes WHERE the thing lives, not whether a renderer exists, so a later +renderer cannot falsify it. + +The exclusion itself is an unchanged decision — `app:launcher` stays out of the page +palette, and its key and position in the ledger are untouched. Whether it should become +palette-authorable is a separate product question this does not answer. No published +behaviour moves: the reason strings are developer-facing ledger prose, read by no runtime +code path, and `PALETTE_EXCLUSIONS` is not exported from `@object-ui/app-shell`'s entry. diff --git a/packages/app-shell/src/views/metadata-admin/previews/block-types.ts b/packages/app-shell/src/views/metadata-admin/previews/block-types.ts index 4e2990665e..186b4a2de8 100644 --- a/packages/app-shell/src/views/metadata-admin/previews/block-types.ts +++ b/packages/app-shell/src/views/metadata-admin/previews/block-types.ts @@ -148,7 +148,7 @@ export const BLOCK_TYPE_META: Record> = { */ export const PALETTE_EXCLUSIONS: Record = { // Shell singletons — chrome the app shell owns, not page content. - 'app:launcher': 'shell singleton — the app shell renders it, not a page', + 'app:launcher': 'shell singleton — lives in the app shell chrome', 'global:notifications': 'shell singleton — lives in the app shell header', 'user:profile': 'shell singleton — lives in the app shell header', // No renderer, by decision — and these two are the ones that MEASURE that way.