Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions documentation/architecture/PROFILE_ROUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ it, where in their nav, and how do they get there.*
| Founder Workspaces Canvas | `/validate` · `/build` · `/raise` · `/grow` · `/network` · `/research` | Headerless | Full page | Sidebar → Headerless → Validate | UPGRADE | High |
| Get Paid & Invoicing | `/payouts` · `/referrals` | — (no nav entry) | Full page | Deep link / in-page action | RESKIN | Medium |
| Graduation Certificate | `/spinout-lab/certificate` · `/verify/:token` | Headerless | Full page + print stylesheet | Sidebar → Headerless → Spin-Out Lab | OUT OF SCOPE | High |
| Incorporate | `/spinout-lab/incorporate` · `/incorporate` · `/incorporate/success` · `/incorporate/83b` · `/incorporate/cofounder-agreement` | Headerless | Full page (Spin-Out Lab — frozen) | Sidebar → Headerless → Spin-Out Lab | OUT OF SCOPE | High |
| Legal & Capital Engine | `/legal-capital` | — (no nav entry) | Full page | Deep link / in-page action | UPGRADE | Medium |
| Liquidity & Secondaries | `/liquidity` | Headerless | Full page | Sidebar → Headerless → Raise | UPGRADE | High |
| Incorporate | `/spinout-lab/incorporate` · `/incorporate` · `/incorporate/success` · `/incorporate/83b` · `/incorporate/cofounder-agreement` | Headerless | Full page (Spin-Out Lab — frozen) | Sidebar → Headerless → Raise | OUT OF SCOPE | High |
| Legal & Capital Engine | `/legal-capital` | Headerless | Full page | Sidebar → Headerless → Raise | UPGRADE | High |
| Liquidity & Secondaries | `/liquidity` | — (no nav entry) | Full page | Deep link / in-page action | UPGRADE | Medium |
| Metrics | `/build/metrics` | Headerless | Full page | Sidebar → Headerless → Build | UPGRADE | High |
| Office Hours | `/spinout-lab/office-hours` | Headerless | Full page (Spin-Out Lab — frozen) | Sidebar → Headerless → Spin-Out Lab | OUT OF SCOPE | High |
| Ops Page · Advisor practice (A1–A5, D573) | `/practice/deliverables` · `/practice/session-types` · `/practice/booking-links` · `/practice/access-log` · `/advisors/:uid` · `/b/*` | Headerless | Full page (proposed) | Sidebar → Headerless → Grow | CURRENT | Low |
Expand All @@ -68,7 +68,7 @@ it, where in their nav, and how do they get there.*
| Pages · Founder Build | `/build` · `/build/board` · `/build/roadmap` · `/build/kpi` | Headerless | Full page (proposed) | Sidebar → Headerless → Build | UPGRADE | Low |
| Pages · Founder Grow | `/grow` · `/grow/focus` | Headerless | Full page (proposed) | Sidebar → Headerless → Grow | UPGRADE | Low |
| Pages · Founder Network | `/network` | Headerless | Full page | Sidebar → Headerless → Network | RESKIN | High |
| Pages · Founder Raise | `/raise/pitch` · `/raise/capital` · `/raise/legal-engine` · `/liquidity` | Headerless | Full page (proposed) | Sidebar → Headerless → Raise | UPGRADE | Low |
| Pages · Founder Raise | `/raise/pitch` · `/raise/capital` · `/raise/legal-engine` · `/liquidity` · `/raise/liquidity?mode=workspace` | Headerless | Full page (proposed) | Sidebar → Headerless → Raise | UPGRADE | Low |
| Pages · Founder Research | `/research/ask` · `/research/library` | Headerless | Full page | Sidebar → Headerless → Research | CURRENT | High |
| Pages · Founder Validate | `/validate` · `/validate/{interviews` | Headerless | Full page (proposed) | Sidebar → Headerless → Validate | CURRENT | Low |
| Pages · Fund dossier | `/research/funds/:uid` · `/research/funds` | Headerless | Full page | Sidebar → Headerless → Research | CURRENT | High |
Expand Down Expand Up @@ -130,7 +130,7 @@ it, where in their nav, and how do they get there.*
| Fund Brief One-Pager | `/spinout-lab` · `/spinout-lab/investor-workspace` | Headerless | Full page + print stylesheet | Sidebar → Headerless → Spin-Out Lab | CURRENT | High |
| Investor LP Canvas | `/studio` · `/deals` · `/portfolio` · `/funds` · `/network` · `/research` | Headerless | Full page | Sidebar → Headerless → Studio | UPGRADE | High |
| InvRail | — | — (not routed) | Embedded rail | Not reachable yet | NEW | Low |
| Liquidity & Secondaries | `/liquidity` | — (no nav entry) | Full page | Deep link / in-page action | UPGRADE | Medium |
| Liquidity & Secondaries | `/liquidity` | Headerless | Full page | Sidebar → Headerless → Portfolio | UPGRADE | High |
| LP Investor Workspace | `/spinout-lab/investor-workspace` · `/lp-portal` · `/funds/lp-workspace` | Headerless | Full page | Sidebar → Headerless → Axal VC Fund | UPGRADE | High |
| Pages · Diligence file | `/research/diligence/:grantUid/files/:fileUid` | Headerless | Full page | Sidebar → Headerless → Research | CURRENT | High |
| Pages · Diligence room | `/research/diligence/:grantUid` | Headerless | Full page | Sidebar → Headerless → Research | CURRENT | High |
Expand All @@ -146,7 +146,7 @@ it, where in their nav, and how do they get there.*
| Research · Main | `/research` · `/market-intel` | Headerless | Full page | Sidebar → Headerless → Research | UPGRADE | High |
| Research · Markets | `/research/markets` | Headerless | Full page | Sidebar → Headerless → Research | CURRENT | High |
| Research · Sector | `/research/markets/sector/:slug` | Headerless | Full page | Sidebar → Headerless → Research | CURRENT | High |
| Scoring Engine v2 | `/scoring` | — (no nav entry) | Full page | Deep link / in-page action | UPGRADE | Medium |
| Scoring Engine v2 | `/scoring` | Headerless | Full page | Sidebar → Headerless → Deals | UPGRADE | High |

## Partner / Operator — 12 canvases

Expand Down Expand Up @@ -260,8 +260,8 @@ it, where in their nav, and how do they get there.*

| Confidence | Rows | Meaning |
| --- | ---: | --- |
| High | 98 | Live route, reachable from that workspace’s sidebar. |
| Medium | 45 | Live route, but no sidebar row for that role — reached by deep link or an in-page action. |
| High | 100 | Live route, reachable from that workspace’s sidebar. |
| Medium | 43 | Live route, but no sidebar row for that role — reached by deep link or an in-page action. |
| Low | 36 | Not routed. Proposed route only. |

A Medium row is not a defect. Detail pages (`/deals/:id`), print artefacts
Expand Down
42 changes: 41 additions & 1 deletion documentation/architecture/ROUTE_MAP.md

Large diffs are not rendered by default.

106 changes: 106 additions & 0 deletions documentation/architecture/decisions/D563.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
## D563 — The Workspaces launcher is retired; its 28 pages light the profile sidebar rows that own them

**Issue:** #1164. **Decided by:** S1, option A, at the owner's request
(2026-10-06).

### What was decided

The Workspaces launcher (D284, "S23 · H37"), a top-bar button that only
the HQ and Admin shells drew, is removed. It was the only way into most
of its 28 pages: 24 of them were in no profile's sidebar.

The profile sidebars keep the rows their approved canvases draw. No row
is added, and no row or zone count moves. Instead:

- **Each kept page joins the `match` of the row that owns it**, so it
lights that row.
- **The row's overview links the page** in an "Also in <row>" list
(`workspaces/AlsoIn.jsx`).
- **On an admin shell, the command palette still indexes all 28.**
Admins reach the profile pages through View As and the palette; their
own sidebar stays the admin consoles.
- **Every page keeps its route.**

The mapping is data: `PAGE_HOMES` in `lib/adminPlacement.js`, one line
per page. Each line names `[role, row, door]`:

- `row`: the page is the row's own destination (`/pipeline`, `/deals`,
`/network`), or its overview alias (`/portfolio/health`).
- `also`: the row's `match` lists the page, and its overview draws the
"Also in" link.
- `lab`: `/spinout-lab/83b`. The founder's Spin-Out Lab row matches it,
and the Lab's own arsenal (`lib/spinoutLabArsenal.js`) links it.

The full table, with each route's guard, is in `ROUTE_MAP.md`, in the
section "The Workspaces launcher's 28 pages".

### Where the code disagreed with the starting table

- **`/scoring`** does not admit founders. Its guard is
`labRoles(['admin', 'partner', 'investor'])`. It lives on investor
Deals (diligence), not on founder Validate.
- **`/advisory` keeps its route.** It is an 800-line page (advisor
directory, financial planner, diligence checker) that founder Validate
already tabs and links, so redirecting it would have removed working
features, which is outside this issue's navigation-only scope. The
voice-rule problem was the launcher's label, "AI Advisory Suite". The
palette now labels the page with its own heading, "Advisory".
- **`/spinout-lab/83b` is already in the Lab's tree.** The arsenal links
it and `/incorporate/83b` redirects to it, so there is nothing to
redirect it to. It now lights the founder's Spin-Out Lab row.
- **`/compliance` is not a second filings calendar.** It is the founder's
company compliance calendar. D417 (#1002, PR #1127) stores fund-entity
obligations, and the only UI it has is HQ · Funds' deadline flag. The
page stays, under founder Raise ("stay legal").
- **`/network-effects` stays on founder Grow**, which already matched and
tabbed it. Admin Insights (#1155) is S08's page.

### The one redirect

A founder on `/liquidity` is sent to `/raise/liquidity?mode=workspace`.
That address renders the same `LiquidityPage` inside the Raise shell,
and it is the Raise · Liquidity zone that `shellConfig.js` records as
`/liquidity`'s successor.

Partners and investors still land on `/liquidity`. For investors it
lights Portfolio.

To match, founder Raise drops `/liquidity` from its `match`, because no
founder renders that path any more (D505). The Raise tab bar lights
Liquidity on both addresses. `FounderWorkspaceTabs` now passes a tab's
`match` through to `WorkspaceTabs`; before this change it dropped it.

### Also changed

- **`adminPlacement.js`:**
- the tier and form `launcher` are now `palette`;
- `WORKSPACE_GROUPS`, which only the launcher read, is removed;
- `WORKSPACES` stays for the palette.
- **The overviews that draw the list:**
- `BucketBoard` and `BucketOverview`, for every bucket root;
- `FounderValidatePage`, `FounderRaiseDesk` and `FounderGrowDesk`;
- `InvestorPortfolioCanvas`.

### Not touched

- The rail frame on these pages belongs to #1156 (S09).
- The admin pages' content belongs to #1155 (S08).
- Pages that redirect a founder (`/my/jobs`, `/services`, `/needs`) keep
their redirects.
- No migration.

### Verified

`frontend/test/workspaces_retired_d563.test.mjs` checks:

- the 28 pages, each with a home;
- each home is a role the route's guard admits;
- each kept page lights its row, by that row's `match`;
- no page lights two rows of one profile;
- each "also" page is linked from its row's overview;
- the Lab page is in the arsenal;
- the founder redirect;
- that no launcher remains.

Each of 24 mutations makes it fail. The D284 tests are updated to the
palette-only state.
17 changes: 9 additions & 8 deletions frontend/src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,10 @@ import BranchNotDeployedBar from './components/BranchNotDeployedBar';
import MobileTabBar from './components/MobileTabBar';
import ImpersonationBar from './components/ImpersonationBar';
import useBranchDeployment from './hooks/useBranchDeployment';
import WorkspacesLauncher from './components/WorkspacesLauncher';
import { LensProvider, useLensLocation } from './workspaces/lens';
import HqSubNavStrip, { StripLink } from './components/HqSubNavStrip';
import { RailStripSlot } from './ui/RailFrame';
import { ADMIN_SHELLS, MESSAGES_ROLES } from './lib/paletteIndex';
import { MESSAGES_ROLES } from './lib/paletteIndex';
import { stripFor } from './lib/hqStrips';
import { clearSupportSession } from './lib/supportSession';
import { disablePush } from './lib/pwa';
Expand Down Expand Up @@ -1262,11 +1261,10 @@ function ProtectedLayout({ children, user, onLogout, viewMode, onViewModeChange,
Messages
</Link>
)}
{/* S23 · H37 — the 29 working pages, one launcher on the HQ and
Admin shells. Not on the branch shell: S7–S19 draw none, and
the pages are the studio's own working surfaces, not a
branch's consoles. */}
{ADMIN_SHELLS.includes(shellRole) && <WorkspacesLauncher />}
{/* D563 — no Workspaces launcher. Its 28 pages each light the
profile sidebar row that owns them and are linked from that
row's overview ("Also in"); an admin reaches them through
View As and the command palette. */}
<Suspense fallback={<span className="inline-block w-8 h-8" />}>
<NotificationBell userId={user?.id} />
</Suspense>
Expand Down Expand Up @@ -3001,7 +2999,10 @@ function AppInner() {
<Route path="/trust" element={guard(['admin', 'founder', 'partner', 'investor', 'advisor', 'exploring'], investorWorkspace('trust', <TrustCenterPage chromeless={effectiveRole === 'investor'} />))} />
<Route path="/api-bridge" element={guard(['admin'], <ApiBridgePage />)} />
<Route path="/monitoring" element={guard(['admin'], <MonitoringPage />)} />
<Route path="/liquidity" element={guard(['admin', 'founder', 'partner', 'investor'], founderWorkspace('raise', <FounderWorkspaceTabs set="raise" user={user}><LiquidityPage currentUser={user} /></FounderWorkspaceTabs>))} />
{/* D563: a founder's /liquidity was the same LiquidityPage that
/raise/liquidity?mode=workspace renders inside the Raise shell, so
the founder is sent there; a partner or investor still lands here. */}
<Route path="/liquidity" element={guard(['admin', 'founder', 'partner', 'investor'], effectiveRole === 'founder' ? <Navigate to="/raise/liquidity?mode=workspace" replace /> : <FounderWorkspaceTabs set="raise" user={user}><LiquidityPage currentUser={user} /></FounderWorkspaceTabs>)} />
<Route path="/funds" element={guard(['admin', 'investor'], effectiveRole === 'investor' ? <InvestorFundLanding fundUnlocked={hasInvestorTier(user, 'institutional')} /> : <FundOpsWorkspace />)} />
<Route path="/funds/capital-calls" element={<FundCapitalCallsRedirect />} />
<Route path="/lp-portal" element={<LpPortalRedirect />} />
Expand Down
90 changes: 0 additions & 90 deletions frontend/src/components/WorkspacesLauncher.jsx

This file was deleted.

Loading
Loading