Skip to content

derive the last eight hand-maintained page tab lists from the nav manifest - #6389

Merged
atomantic merged 1 commit into
mainfrom
claim/issue-6383
Sep 6, 2026
Merged

derive the last eight hand-maintained page tab lists from the nav manifest#6389
atomantic merged 1 commit into
mainfrom
claim/issue-6383

Conversation

@atomantic

Copy link
Copy Markdown
Owner

Summary

  • Brain, CoS, Digital Twin, MeatSpace, Media Gen, Music, Sharing and System Resources now derive their tab bars from getPageNavTabs(group) + a page-local presentation map, finishing the tabGroup conversion [code-quality-page-tabs-from-manifest] Derive the fourteen hand-maintained page tab lists from the nav manifest #6365 started for the other six. Each page keeps only the icon (and fullBleed) it owns; the nav manifest owns id, label and order.
  • Manifest entries were reordered inside each new group so file order is the page's deliberate tab order, and eleven entries gained a tabLabel where the page's short label differs from the qualified label ⌘K and voice need (Health vs Body Health, Goals vs Twin Goals, Generate vs Music Designer, Queues vs Active Queues, …).
  • TABBED_PAGES in navManifest.test.js drops all eight rows plus the now-dead kind: 'ids'/kind: 'links' parsers and allowBasePrefix. Three rows remain — Settings, Models, POST — because extractConstArrayBlock/extractConstIds/extractSwitchCases/nestedIdSources are still load-bearing for Models' LLM_NAV_SUBROUTES and the Settings header ↔ switch (activeTab) parity test.
  • Rolled in, since 14 pages were repeating them: buildPageNavTabs (client/src/lib/pageNavTabs.js) for the merge-and-throw, and expectPageNavTabs (client/src/test/pageNavTabAssertions.js) for the per-page test. The old per-page assertion compared the derived array back against its own source and so could not fail; each page now pins the literal id/label/order it means to render.

Two things the issue got slightly wrong

  • Brain's Spotify/YouTube tabs already had manifest entries — under the ids nav.settings.spotify/nav.settings.youtube, kept stable because they're persisted palette-history values. Both were already reachable from ⌘K and voice; they only needed the tabGroup tag, not new rows.
  • Sharing fits getPageNavTabs unchanged once path is read as to, so all eight ship together instead of carving Sharing into a follow-up.

Test plan

  • cd server && npx vitest run lib/navManifest.test.js — 61 passed
  • cd server && npm test — 2010 files, 39943 passed
  • cd client && npm test — 872 files, 10595 passed
  • cd client && npm run lint — clean
  • Bypass probes (reverted): relabelling a manifest tab fails the owning page's test; renaming a tabId with no matching presentation entry throws at module load.

Closes #6383

…ifest (#6383)

Brain, CoS, Digital Twin, MeatSpace, Media Gen, Music, Sharing and System
Resources each still hand-maintained a local tab array that duplicated
destinations already declared in server/lib/navManifest.js, kept in sync only by
a source-scraping drift test. They now carry `tabGroup` + `tabId` on their
manifest entries and build their tab bar from `getPageNavTabs(group)`, finishing
the conversion #6365 started for the other six.

Manifest entries in each new group were reordered so file order is the page's
deliberate tab order (getPageNavTabs returns declaration order), and eleven tabs
gained a `tabLabel` where the page's short label differs from the label ⌘K and
voice need to be unambiguous — "Health" vs "Body Health", "Goals" vs "Twin
Goals", "Legacy" vs "Legacy Bundle", "Generate"/"Artists"/"Albums"/"Tracks" vs
the "Music …" pages, "History"/"Three.js" vs "Media History"/"Three.js Models",
and "Overview"/"Storage"/"Queues" vs the "System Resources …" rows.

Brain's Spotify and YouTube tabs turned out to already have manifest entries
(under the ids nav.settings.spotify/youtube, kept stable because they're
persisted palette-history values), so both were already reachable from ⌘K and
voice and only needed the tabGroup tag. Sharing's SECTIONS list fits
getPageNavTabs unchanged once `path` is read as `to`, so all eight ship together
rather than carving Sharing into a follow-up.

The 14 converted pages were each repeating the same five-line merge-and-throw,
so that moves to `buildPageNavTabs` (client/src/lib/pageNavTabs.js), and the
per-page parity test moves to a shared `expectPageNavTabs` assertion. The old
per-page test compared the derived array back against its own source and so
could not fail; each page now pins the literal id/label/order it means to render,
which is what catches a manifest reorder or relabel.

navManifest.test.js's TABBED_PAGES drops all eight rows along with the now-dead
`kind: 'ids'`/`kind: 'links'` parsers and `allowBasePrefix`. It keeps
extractConstArrayBlock/extractConstIds/extractSwitchCases and nestedIdSources,
which are still load-bearing for Models' LLM_NAV_SUBROUTES and the Settings
header ↔ `switch (activeTab)` parity test, so three rows remain: Settings,
Models and POST.
@atomantic
atomantic merged commit f02d47d into main Sep 6, 2026
12 checks passed
@atomantic
atomantic deleted the claim/issue-6383 branch September 6, 2026 15:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Derive the remaining eight hand-maintained page tab lists from the nav manifest

1 participant