Found while working #6739. Filed separately: #6739 is about one showcase action's target; this is about the locations value that action declares.
What
global_nav is a canonical ACTION_LOCATIONS member (packages/spec/src/ui/action.zod.ts:454,463), documented as:
packages/spec/src/ui/action.zod.ts:454 — "global_nav — global navigation/command-palette level actions."
content/docs/protocol/objectui/actions.mdx:224 — "Global navigation / command-palette actions"
content/docs/ui/actions.mdx:192 — "App-level navigation"
No running-app surface renders it. Measured against the exact objectui commit this repo vendors — .objectui-sha = b1204af0a1f7256514bab4479f5e9c915fb91449:
$ git grep -n "global_nav" b1204af0a1f7256514bab4479f5e9c915fb91449 -- packages apps | grep -v "\.test\."
…/metadata-admin/inspectors/ActionDefaultInspector.tsx:132: global_nav: 'Global nav / command palette',
…/metadata-admin/previews/ActionPreview.tsx:581: {locations.includes('global_nav') && (
…/metadata-admin/previews/ActionPreview.tsx:582: Frame label="global_nav"
…/metadata-admin/previews/block-config.ts:366: { value: 'global_nav', label: 'Global nav' },
…/components/src/renderers/action/action-bar.tsx:19: * list_item, record_more, record_related, and global_nav locations.
Four of those five are the Studio designer; the fifth is a doc comment. The console's ⌘K palette — packages/app-shell/src/chrome/CommandPalette.tsx — builds its groups from nav items, objects, dashboards, pages, reports, recent items, record search and theme. Its seven CommandGroup headings at that SHA:
objects · dashboards · pages · reports · switchApp · preferences · actions
…and the actions group is hard-coded chrome (one "open full search" item). The file has no reference to global_nav, actionRendersAt, or any action-metadata source. So a locations: ['global_nav'] action never reaches a user.
The sharp edge
metadata-admin/previews/ActionPreview.tsx:581 draws the author a mock frame:
⌘K · Command palette
[ New Task ]
The designer promises a surface the product does not have. An author declares global_nav, sees it previewed, ships it, and it renders nowhere — the ADR-0078 "declares, 'renders', reports success, and does nothing" shape, arriving through the location vocabulary rather than through a missing locations key.
Who is hit today
examples/app-showcase/src/ui/actions/index.ts — two actions declare it: showcase_new_task and showcase_portfolio_snapshot. (The latter is still reachable over REST/MCP as an object-less action, so only its UI surface is dead.)
docs/qa/platform-checklist/areas/records-forms.json — item records-forms.action-location-matrix has a global_nav variant ("showcase_new_task in the command palette / global nav") and a step "new_task from the palette". That step cannot pass; the checklist item is unrunnable as written.
Why no existing rule catches it
packages/lint/src/validate-action-locations.ts:44-46 names this class and explicitly declines it:
Scope note: this rule asks only "did anyone place this action?". It deliberately does NOT check that a declared location is one a renderer actually serves […] distinct classes with their own rules.
The distinct rule does not exist. So this is a known-and-deferred gap, not a blind rule — the existing rule is correct about its own scope.
Directions (not a recommendation — needs triage)
- Serve it — teach
CommandPalette.tsx to read global_nav actions and dispatch them through the normal action runtime. Makes the docs, the designer preview and the checklist item all true. (objectui-side.)
- Retire it — drop
global_nav from ACTION_LOCATIONS under ADR-0087, and the designer frame with it. Cheapest, and consistent with "a declared surface with no pull is handled implementation-first". Costs the object-less-action story its only UI home.
Either way docs/qa/platform-checklist/areas/records-forms.json's global_nav variant needs updating, and the designer preview frame must stop drawing a surface that does not exist.
Found while working #6739. Filed separately: #6739 is about one showcase action's
target; this is about thelocationsvalue that action declares.What
global_navis a canonicalACTION_LOCATIONSmember (packages/spec/src/ui/action.zod.ts:454,463), documented as:packages/spec/src/ui/action.zod.ts:454— "global_nav— global navigation/command-palette level actions."content/docs/protocol/objectui/actions.mdx:224— "Global navigation / command-palette actions"content/docs/ui/actions.mdx:192— "App-level navigation"No running-app surface renders it. Measured against the exact objectui commit this repo vendors —
.objectui-sha=b1204af0a1f7256514bab4479f5e9c915fb91449:Four of those five are the Studio designer; the fifth is a doc comment. The console's ⌘K palette —
packages/app-shell/src/chrome/CommandPalette.tsx— builds its groups from nav items, objects, dashboards, pages, reports, recent items, record search and theme. Its sevenCommandGroupheadings at that SHA:…and the
actionsgroup is hard-coded chrome (one "open full search" item). The file has no reference toglobal_nav,actionRendersAt, or any action-metadata source. So alocations: ['global_nav']action never reaches a user.The sharp edge
metadata-admin/previews/ActionPreview.tsx:581draws the author a mock frame:The designer promises a surface the product does not have. An author declares
global_nav, sees it previewed, ships it, and it renders nowhere — the ADR-0078 "declares, 'renders', reports success, and does nothing" shape, arriving through the location vocabulary rather than through a missinglocationskey.Who is hit today
examples/app-showcase/src/ui/actions/index.ts— two actions declare it:showcase_new_taskandshowcase_portfolio_snapshot. (The latter is still reachable over REST/MCP as an object-less action, so only its UI surface is dead.)docs/qa/platform-checklist/areas/records-forms.json— itemrecords-forms.action-location-matrixhas aglobal_navvariant ("showcase_new_task in the command palette / global nav") and a step "new_task from the palette". That step cannot pass; the checklist item is unrunnable as written.Why no existing rule catches it
packages/lint/src/validate-action-locations.ts:44-46names this class and explicitly declines it:The distinct rule does not exist. So this is a known-and-deferred gap, not a blind rule — the existing rule is correct about its own scope.
Directions (not a recommendation — needs triage)
CommandPalette.tsxto readglobal_navactions and dispatch them through the normal action runtime. Makes the docs, the designer preview and the checklist item all true. (objectui-side.)global_navfromACTION_LOCATIONSunder ADR-0087, and the designer frame with it. Cheapest, and consistent with "a declared surface with no pull is handled implementation-first". Costs the object-less-action story its only UI home.Either way
docs/qa/platform-checklist/areas/records-forms.json'sglobal_navvariant needs updating, and the designer preview frame must stop drawing a surface that does not exist.