Skip to content

D563: retire the Workspaces launcher; its 28 pages light the profile rows that own them (#1164) - #1322

Draft
guillaumelauzier wants to merge 2 commits into
mainfrom
agent/claude-b/1164-workspaces-launcher
Draft

guillaumelauzier wants to merge 2 commits into
mainfrom
agent/claude-b/1164-workspaces-launcher

Conversation

@guillaumelauzier

Copy link
Copy Markdown
Contributor

Objective

This retires the Workspaces launcher (D284), a top-bar button drawn only on the HQ and Admin shells. Under S1's decision A, each of its 28 pages:

  • keeps its route;
  • lights the profile sidebar row that owns it;
  • is linked from that row's overview, in an "Also in" list.

The command palette still lists all 28 on an admin shell. D563.

Closes #1164

Mapping table

"Lab" means the guard is labRoles(...), which also admits the viewer's own role when their Lab is active. "Also in" means the page joins the row's match and is linked from the row's overview.

Page Guard (App.jsx) Profile page doing the job Decision
/pipeline admin, founder, partner, investor partner Pipeline row; investor Deals zone Keep: it is the partner row itself
/scoring Lab + admin, partner, investor none Keep: investor Deals, Also in. Code differs from the starting table: founders are not admitted, so it can't go to founder Validate
/portfolio/risk-matrix admin, partner, investor none Keep: investor Portfolio, Also in (already under /portfolio)
/market-intel Lab + admin, partner, investor, advisor Research match Keep: partner and advisor Research, Also in
/signals admin, founder, partner, investor, advisor Research match Keep: partner and advisor Research, Also in
/advisory admin, founder founder Validate tab and link Keep: founder Validate, Also in. Code differs: an 800-line working page (advisor directory, financial planner, diligence checker), so a redirect would remove features. The voice-rule problem was only the launcher's label; the palette now says "Advisory", the page's own heading
/deals admin, partner, investor investor Deals row Keep: it is the row itself
/capital admin, investor none Keep: investor Portfolio, Also in
/liquidity admin, founder, partner, investor founder Raise · Liquidity zone Founder redirect to /raise/liquidity?mode=workspace (the same LiquidityPage). Partner and investor keep the page; investor Portfolio, Also in
/portfolio/health admin, founder, partner, investor investor Portfolio overview Keep: it is the overview's alias
/portfolio/coverage admin, partner none Keep: partner Delivery, Also in
/portfolio/reserves admin, investor none Keep: investor Portfolio, Also in
/portfolio/waterfall admin, investor none Keep: investor Portfolio, Also in
/watchlist admin, partner, investor none Keep: investor Portfolio, Also in
/legal-capital admin, founder, partner, investor Raise · Legal is LegalEnginePage, a different page Keep: founder Raise, Also in
/incorporate Lab + admin, founder, partner, investor none Keep: founder Raise, Also in
/compliance Lab + admin, founder, partner none Keep: founder Raise, Also in. Code differs: #1002 (PR #1127, D417) stores fund-entity obligations and has no page apart from the HQ · Funds flag, so this is the only filings calendar
/network admin, founder, partner, investor, advisor every profile's Network row Keep: it is the row itself
/network-effects admin, founder, partner, investor founder Grow match and tab Keep: founder Grow, Also in. Admin Insights is #1155 (S08)
/my/jobs all five; founder redirected founder Grow (via the redirect) Keep: partner and advisor Network, Also in. Founder redirect unchanged
/services admin, founder, partner, investor; founder redirected partner Offers · Catalog Keep: partner Offers, Also in
/needs admin, founder, partner, investor; founder redirected partner Pipeline match Keep: partner Pipeline, Also in
/partner/insights admin, partner, investor partner Pipeline match Keep: partner Pipeline, Also in
/partner/office-hours admin, partner partner Offers match Keep: partner Offers, Also in
/comarketing admin, partner, founder, investor partner Offers; founder Grow Keep: both, Also in
/incorporate/cofounder-agreement Lab + admin, founder, partner none Keep: founder Raise, Also in (it sits under /incorporate; #1217 keeps it)
/spinout-lab/83b Lab + admin the Lab's arsenal Keep: founder Spin-Out Lab match. Code differs: it is already in the Lab's own tree, so there is nothing to redirect to
/perks all signed-in roles user menu; founder Grow Keep: founder Grow, Also in. The partner redirect is unchanged

No page was retired outright.

Implementation

  • lib/adminPlacement.js
    • PAGE_HOMES is the mapping as data: [role, row, door] per page.
    • alsoInFor(role, row) reads it.
    • The tier and form launcher are renamed palette.
    • WORKSPACE_GROUPS is removed; only the launcher read it.
  • workspaces/AlsoIn.jsx draws the list. It is rendered by:
    • BucketBoard and BucketOverview, for every bucket root;
    • FounderValidatePage, FounderRaiseDesk, FounderGrowDesk and InvestorPortfolioCanvas.
  • sidebarConfig.js adds match entries. No row is added and no count moves.
    • founder Raise: /legal-capital, /incorporate, /compliance. It drops /liquidity, which a founder can no longer render (D505).
    • founder Spin-Out Lab: /spinout-lab/83b. It is the founder row only, because the partner shell treats any row with a match as full-bleed.
    • investor Deals: /scoring.
    • investor Portfolio: /watchlist, /capital, /liquidity.
    • partner Delivery: /portfolio/coverage.
    • partner and advisor Network: /my/jobs.
  • App.jsx
    • The launcher import and mount are removed.
    • Founders on /liquidity are redirected.
  • FounderWorkspaceTabs
    • The Liquidity tab now matches /raise/liquidity too.
    • The wrapper passes a tab's match through; it used to drop it.

Files changed

  • frontend/src/components/WorkspacesLauncher.jsx: deleted
  • frontend/src/App.jsx: launcher mount removed; founder /liquidity redirect
  • frontend/src/lib/adminPlacement.js: PAGE_HOMES, alsoInFor, the palette tier, the /advisory label
  • frontend/src/lib/paletteIndex.js: comment
  • frontend/src/sidebarConfig.js: match lists
  • frontend/src/workspaces/AlsoIn.jsx: new
  • frontend/src/workspaces/BucketBoard.jsx, BucketOverview.jsx: render AlsoIn
  • frontend/src/pages/founder/FounderValidatePage.jsx, FounderRaiseDesk.jsx, FounderGrowDesk.jsx, pages/investor/InvestorPortfolioCanvas.jsx: render AlsoIn
  • frontend/src/pages/founder/FounderWorkspaceTabs.jsx: Liquidity tab match
  • Tests:
    • frontend/test/workspaces_retired_d563.test.mjs: new.
    • workspaces_launcher_d284.test.mjs, admin_placement_h35.test.mjs, founder_shell.test.mjs and investor_shell.test.mjs: updated to the new state.
  • Docs:
    • documentation/architecture/decisions/D563.md;
    • ROUTE_MAP.md: a new section with the table, plus the Raise row;
    • PROFILE_ROUTING.md: regenerated;
    • the lib/ and workspaces/ READMEs.

Testing

  • npm run build: exit 0.
  • npm run test:drift > drift.log 2>&1; echo EXIT=$?: EXIT=0.
  • New test (9 tests), checking every line of PAGE_HOMES:
    • it covers the 28 pages;
    • each home is a role the route's guard admits;
    • each page lights its row through that row's match, read SidebarNav's way;
    • no page lights two rows of one profile;
    • each "also" page is linked from the overview that renders <AlsoIn>;
    • the Lab page is in the arsenal;
    • the founder redirect and its tab;
    • no launcher remains.
  • 24 mutations, all caught, across sidebarConfig.js, adminPlacement.js, App.jsx, BucketBoard, BucketOverview, the two desks, FounderWorkspaceTabs, AlsoIn and the arsenal. The test also fails on main, which has no PAGE_HOMES.

Risks

  • Ships to production: the frontend build only. No Worker change, no migration, no wrangler.toml change.
  • Admins lose the top-bar launcher. Every page stays in ⌘K and keeps its route.
  • Founders following an old /liquidity link land on the same page under /raise/liquidity?mode=workspace.
  • Security: no secret is in the diff, and no auth gate changed.
  • Rollback: revert the PR.

Dependencies

Agent

S07 · Claude Code

Review requested

guillaumelauzier (owner)

🤖 Generated with Claude Code

https://claude.ai/code/session_01Q6MrbLAt5ETsDnEUFNzVSQ


Generated by Claude Code

…rows that own them (#1164)

S1 decided A. The profile sidebars keep the rows their canvases draw. Each
of the launcher's 28 pages joins the match list of the row that owns it,
and that row's overview links it under "Also in". The command palette
still indexes all 28 on an admin shell, and every page keeps its route.

- PAGE_HOMES / alsoInFor in lib/adminPlacement.js hold the mapping; the
  launcher tier is renamed palette.
- workspaces/AlsoIn.jsx is drawn by BucketBoard, BucketOverview, the
  founder Validate/Raise/Grow desks and the investor Portfolio canvas.
- A founder on /liquidity is sent to /raise/liquidity?mode=workspace,
  the same LiquidityPage inside Raise. Partners and investors still land
  on /liquidity.
- /advisory keeps its route (a working page); it is now labelled
  "Advisory" instead of "AI Advisory Suite".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q6MrbLAt5ETsDnEUFNzVSQ
@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Preview: https://studioos-pr-1322.guillaumelauzier.workers.dev (built from 49f4d5e)

The pull request's SPA build on a Worker with no bindings: pages and deep links work, /api/* is a 404, and nothing here can reach production data. Redeployed on every push; deleted when the PR closes.

…orkspaces-launcher

# Conflicts:
#	documentation/architecture/PROFILE_ROUTING.md

Co-authored-by: Guillaume Lauzier <guillaumelauzier@users.noreply.github.com>

Copy link
Copy Markdown
Contributor Author

S1: Review: fix first. The mapping holds up. Every guard column matches App.jsx, no role gains or loses a page, the palette still lists all 28 for admins, and each home renders its "Also in" list. Three things before merge. #1164 is now S06's, so S06 picks these up on this branch, with merge commits only.

  1. It conflicts with main.
    • The conflict is in the generated Confidence table of PROFILE_ROUTING.md: D619 added a row.
    • Fix: merge origin/main, run node scripts/build-profile-routing.mjs, and commit. A trial merge comes out at High 100 / Medium 44, and the frontend suite then passes.
    • In the same commit:
      • fix ROUTE_MAP.md:152, which still routes founders to /liquidity;
      • fix the regenerated founder Liquidity line ("no nav entry"). It should name /raise/liquidity.
  2. The new /liquidity redirect drops the query and the hash (App.jsx:3005, a fixed /raise/liquidity?mode=workspace).
  3. Two mutations survive. Workspaces launcher retired: its 28 pages move into the profiles' sidebars or redirect to the page that replaced them (D563) #1164 asks for every assertion to be mutation-checked both ways.
    • Swapping the arguments to alsoInFor(row, role) in AlsoIn.jsx empties every "Also in" list, and the D563 suite stays 9/9.
    • Reclassifying /my/jobs from also to row drops it from the partner and advisor Network lists, and every suite stays green.
    • Fixes:
      • render AlsoIn with renderToStaticMarkup and assert that its hrefs equal alsoInFor's routes;
      • for each row door, assert that the row's to is that page.

Non-blocking:

  • founder_existing lights two rows on /legal-capital. Raise's new match and the persona's extra row both claim it. getSidebarGroups should also skip an extra that a row's match claims.
  • The generator misreads one match. match: SPINOUT_LAB_PAGES is an identifier, and the generator parses only inline arrays. Inline ['/spinout-lab/83b'].
  • /spinout-lab/83b lights only the founder's Lab row, although its guard admits Lab members of every role.
  • No investor homes. S1 named investor homes for /my/jobs, /services and /needs. The guards admit investors, but there is no investor line and no reason given.
  • D563.md on /advisory says the voice-rule problem was only the launcher's label. The page itself still says "AI Advisor" (AdvisoryPage.jsx:46, :91, :139). Correct the decision; the copy change goes to the page's owner.
  • Stale "Workspaces" wording: the palette hint (paletteIndex.js:68, and "the 29" at :43).

Generated by Claude Code

This branch has not been deployed

No deployments
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.

Workspaces launcher retired: its 28 pages move into the profiles' sidebars or redirect to the page that replaced them (D563)

3 participants