Document ID: DOC-2026-033 Owner: UX Lead Date: 2026-02-17 Status: Active Product: Legionis Scope: End-to-end journey audit across all existing components Supersedes: UX Concepts v1.0 (DOC-2026-017), UX Guidelines v1.0
This audit maps every user touchpoint from discovery to expert usage, identifying exactly what needs to change in built components given five alignment shifts: (1) repositioning from "Product Org OS" to general-purpose AI workforce, (2) agent roster expansion from 13 to 81, (3) new team-based pricing model, (4) brand token migration from zinc/teal to stone/amber, and (5) Week 5 features (BYOT, context layer, conversation persistence).
Total components audited: 18 files across 5 categories Critical changes (P0): 12 items that block Week 5 delivery Alignment changes (P1): 23 items needed for brand/positioning coherence Polish changes (P2): 9 items for post-Week 5 refinement
Current state: No landing page built in the app yet. Auth pages (sign-in/page.tsx, sign-up/page.tsx) show bare Clerk components centered on bg-zinc-950. The root layout.tsx metadata says "Legionis - Your AI Workforce" (correct), but the description mentions "Product, engineering, design, marketing and more" which is acceptable for general-purpose framing.
Required changes:
bg-zinc-950 must become bg-stone-900 (see token migration)dark base theme. Needs custom Clerk appearance with stone/amber token overrides for buttons, links, and focus ringsapp/(auth)/sign-in/page.tsx, app/(auth)/sign-up/page.tsx, app/(auth)/layout.tsx, app/layout.tsxPriority: P1 (brand alignment, not blocking Week 5 features)
Current state: Clerk handles the entire registration flow. Auth layout is a passthrough <>{children}>. Sign-up page is a centered Clerk component on zinc-950 background.
Required changes:
/dashboard. Week 5 needs this to redirect to an onboarding flow instead (see Stage 3)app/layout.tsx (ClerkProvider appearance), Clerk dashboard config (redirects)Priority: P0 for redirect change (blocks onboarding flow), P1 for brand tokens
Current state: No onboarding flow exists. After signup, users land directly on the dashboard chat interface. Storage connection exists only as a settings page (settings/storage/page.tsx). API key setup exists only as a settings page (settings/api-keys/page.tsx). The text "V2V context structure" in the storage page is product-org-specific terminology.
Required changes:
/dashboard/onboarding (new route)settings/storage/page.tsx (copy changes), NEW app/dashboard/onboarding/ routePriority: P0 (onboarding is a Week 5 requirement)
Current state: EmptyState in chat-container.tsx shows:
border-zinc-800, text-zinc-200, text-zinc-500, text-zinc-600components/chat/chat-container.tsx (EmptyState function)Priority: P1 (copy alignment + brand tokens)
Current state: The skill palette (skill-palette.tsx) groups skills by V2V phase category. The agent selector (agent-selector.tsx) groups agents by team with TEAM_ORDER defining 10 groups. Chat input placeholder says "Message your AI workforce... (/ for skills, @ for agents)" (good).
Required changes:
max-h-64 -- with 80+ skills this needs to be taller or have better section collapsingbg-teal-600/20 text-teal-300 in both palettes needs amber migrationbg-zinc-800 needs stone migrationcomponents/chat/skill-palette.tsx, components/chat/agent-selector.tsxPriority: P1 (functional for Week 5 as-is, but confusing for non-product users)
Current state: The agent selector already has team-based grouping via TEAM_ORDER array with 10 entries. The API endpoint /api/agents serves agent metadata including source, team, emoji, displayName, and description. The selector opens as a dropdown above the input area with max-h-72.
Required changes:
id, displayName, and emoji is good but should also search description (already partly there -- description shown but not fully searched)max-h-72 (288px) is too short for 81 agents. Increase to max-h-96 (384px) or use a modal/panel for the full rostercomponents/chat/agent-selector.tsx, /api/agents routePriority: P0 (81 agents in current flat-per-team list is information overload)
Current state: API keys page (settings/api-keys/page.tsx) shows two provider cards (Anthropic and OpenAI). Each card shows: provider name, description, docs link, configured/not-configured status badge, key input or masked key display, save/remove buttons. All copy is neutral and accurate.
Required changes:
bg-teal-500/10 text-teal-400 needs amber migration: bg-amber-500/10 text-amber-400focus:border-teal-500 needs focus:border-amber-600bg-teal-600 hover:bg-teal-500 needs bg-amber-600 hover:bg-amber-500text-teal-500 hover:text-teal-400 needs text-amber-500 hover:text-amber-400border-zinc-800 bg-zinc-900 needs border-stone-700 bg-stone-800app/dashboard/settings/api-keys/page.tsxPriority: P0 (BYOT is Week 5 feature), P1 for token migration
Current state: Billing page (billing-client.tsx) shows:
border-teal-600 bg-teal-950/20border-teal-600 -> border-amber-600bg-teal-950/20 -> bg-amber-950/20bg-teal-600 hover:bg-teal-500 -> bg-amber-600 hover:bg-amber-500text-teal-500 -> text-amber-500bg-teal-600/20 text-teal-400 -> bg-amber-600/20 text-amber-400bg-teal-500/10 text-teal-400 -> bg-amber-500/10 text-amber-400border-zinc-800 bg-zinc-900 -> border-stone-700 bg-stone-800app/dashboard/settings/billing/billing-client.tsx, app/dashboard/settings/billing/page.tsxPriority: P1 (pricing structure is correct, just needs token migration)
Current state: Chat input supports Enter to send, Shift+Enter for newline, Escape to dismiss palettes. Skill palette and agent selector support arrow key navigation. No Cmd+K global shortcut implemented yet (the skill palette only opens via / trigger in the input). No Meeting Mode rendering exists in the current message component.
Required changes:
message.tsx component renders all assistant messages the same way. When a PLT or gateway response contains multiple agent voices, it should render with:message.tsx
Cmd+/ shortcut help panel existscomponents/chat/chat-container.tsx, components/chat/message.tsx, global layout for keyboard shortcutsPriority: P1 (Cmd+K), P2 (Meeting Mode rendering, keyboard help)
Current state: No context panel exists. The file explorer (file-tree.tsx, file-preview.tsx) allows browsing Drive files but has no dedicated context dashboard. The sidebar shows file explorer and settings links but no context section. ROI tracking is not visible in the UI.
Required changes:
/dashboard/context for the full context dashboard (decisions, bets, feedback, learnings in tabbed view)text-teal-400 -> text-amber-400components/explorer/file-tree.tsx (token migration), NEW components (see Section 3)Priority: P0 for context panel (Week 5 feature), P2 for full context dashboard
app/layout.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Font import | Geist, Geist_Mono from next/font/google | Space_Grotesk, Inter, JetBrains_Mono from next/font/google | Structural | P0 |
| Font CSS vars | --font-geist-sans, --font-geist-mono | --font-display (Space Grotesk), --font-sans (Inter), --font-mono (JetBrains Mono) | Structural | P0 |
| Body classes | bg-zinc-950 text-zinc-100 | bg-stone-900 text-stone-100 | Token | P1 |
| Font class | font-sans: var(--font-geist-sans) | font-sans: var(--font-inter) or Inter as body default | Token | P0 |
| Metadata description | "Deploy specialized agent teams for any knowledge work domain. Product, engineering, design, marketing and more." | OK as-is (already general-purpose) | Copy | -- |
Copy changes: None needed. Description is already general-purpose.
app/dashboard/layout.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Container bg | bg-zinc-950 text-zinc-100 | bg-stone-900 text-stone-100 | Token | P1 |
| Structure | (two-panel) | (three-panel with toggleable right panel) | Structural | P0 |
Structural change: Week 5 introduces the context panel as a right sidebar, requiring the dashboard layout to become a three-column flex container with the right panel togglable via state.
components/shared/sidebar.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Aside bg | border-zinc-800 bg-zinc-900 | border-stone-700 bg-stone-800 | Token | P1 |
| Header border | border-zinc-800 | border-stone-700 | Token | P1 |
| Logo text | text-zinc-100 | text-stone-100 | Token | P1 |
| Beta badge | bg-teal-500/10 text-teal-400 | bg-amber-500/10 text-amber-400 | Token | P1 |
| Workspace selector border | border-zinc-700 bg-zinc-800 | border-stone-600 bg-stone-700 | Token | P1 |
| Workspace selector hover | hover:border-zinc-600 hover:bg-zinc-750 | hover:border-stone-500 hover:bg-stone-600 | Token | P1 |
| Workspace avatar bg | bg-teal-600 | bg-amber-600 | Token | P1 |
| Workspace dropdown bg | border-zinc-700 bg-zinc-800 | border-stone-600 bg-stone-700 | Token | P1 |
| Workspace dropdown item hover | hover:bg-zinc-700 | hover:bg-stone-600 | Token | P1 |
| Workspace separator | bg-zinc-700 | bg-stone-600 | Token | P1 |
| New conversation button | bg-teal-600 hover:bg-teal-500 | bg-amber-600 hover:bg-amber-500 | Token | P1 |
| Conversations label | text-zinc-500 | text-stone-400 | Token | P1 |
| ScrollArea thumb | bg-zinc-700 | bg-stone-600 | Token | P1 |
| Empty state text | text-zinc-600 | text-stone-500 | Token | P1 |
| Bottom nav border | border-zinc-800 | border-stone-700 | Token | P1 |
| Active link | bg-zinc-800 text-zinc-100 | bg-stone-700 text-stone-100 | Token | P1 |
| Inactive link | text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200 | text-stone-400 hover:bg-stone-700 hover:text-stone-200 | Token | P1 |
| Disabled link | text-zinc-600, text-zinc-700 | text-stone-500, text-stone-600 | Token | P1 |
| Conversations list | Placeholder "No conversations yet" | Actual conversation list from DB (Week 5 feature) | Structural | P0 |
Copy changes: None. Sidebar text is generic ("Legionis", "Conversations", "File Explorer", "Settings").
Structural changes: The conversations placeholder must be replaced with a real conversation list component that loads from the database and supports:
components/chat/chat-container.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Streaming indicator | bg-zinc-800, text-zinc-400 | bg-stone-700, text-stone-400 | Token | P1 |
| Animate pulse | animate-pulse (Thinking...) | Keep -- animation is neutral | -- | -- |
| Error border | border-red-500/30 bg-red-500/10 text-red-400 | Keep -- red is semantic, not brand | -- | -- |
| HintCard border | border-zinc-800 | border-stone-700 | Token | P1 |
| HintCard title | text-zinc-200 | text-stone-200 | Token | P1 |
| HintCard description | text-zinc-500 | text-stone-400 | Token | P1 |
| HintCard example | text-zinc-600 | text-stone-500 | Token | P1 |
| Default agentId | "product-manager" | Consider making this dynamic based on user's team selection or null (auto-route) | Structural | P1 |
| Hint card examples | Product-org-specific (PRD, authentication, pricing strategy) | Domain-diverse examples (see Stage 4 above) | Copy | P1 |
| Greeting subtitle | "Your AI workforce, ready to deploy." | OK as-is | Copy | -- |
Copy changes needed:
components/chat/message.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| User bubble bg | bg-teal-600 | bg-amber-600 | Token | P1 |
| User bubble text | text-white | text-white (keep) | -- | -- |
| User bubble radius | rounded-2xl rounded-br-sm | Keep | -- | -- |
| Assistant wrapper | No special background, just inline markdown | Consider subtle bg-stone-800/50 for visual separation | Token | P2 |
Structural changes:
components/chat/chat-input.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Container border | border-zinc-700 bg-zinc-800/50 | border-stone-600 bg-stone-700/50 | Token | P1 |
| Focus state | focus-within:border-zinc-500 | focus-within:border-amber-600 | Token | P1 |
| Textarea text | text-zinc-100 | text-stone-100 | Token | P1 |
| Placeholder | placeholder-zinc-500 | placeholder-stone-400 | Token | P1 |
| Send button | bg-teal-600 hover:bg-teal-500 disabled:hover:bg-teal-600 | bg-amber-600 hover:bg-amber-500 disabled:hover:bg-amber-600 | Token | P1 |
| Placeholder text | "Message your AI workforce... (/ for skills, @ for agents)" | OK as-is (general-purpose) | Copy | -- |
| Streaming placeholder | "Agent is responding..." | OK as-is | Copy | -- |
components/chat/skill-palette.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Container border | border-zinc-700 bg-zinc-800 | border-stone-600 bg-stone-700 | Token | P1 |
| Category header | bg-zinc-800 text-zinc-500 | bg-stone-700 text-stone-400 | Token | P1 |
| Selected item | bg-teal-600/20 text-teal-300 | bg-amber-600/20 text-amber-300 | Token | P1 |
| Unselected item | text-zinc-300 hover:bg-zinc-700/50 | text-stone-300 hover:bg-stone-600/50 | Token | P1 |
| Skill ID text | text-zinc-500 | text-stone-400 | Token | P1 |
| Skill description | text-zinc-400 | text-stone-300 | Token | P1 |
| Empty state | border-zinc-700 bg-zinc-800 text-zinc-500 | border-stone-600 bg-stone-700 text-stone-400 | Token | P1 |
| Category labels | Product-org V2V phases: "Strategic Foundation", "Strategic Decisions", etc. | Consider dual taxonomy: V2V phases for product users, functional groups for others | Copy/Structural | P1 |
| Max height | max-h-64 (256px) | max-h-80 or max-h-96 (320-384px) to accommodate 80+ skills | Structural | P1 |
| Recently Used section | Not implemented | Add "Recently Used" at top showing last 5 invoked skills | Structural | P2 |
components/chat/agent-selector.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Container border | border-zinc-700 bg-zinc-800 | border-stone-600 bg-stone-700 | Token | P1 |
| Team header | bg-zinc-800 text-zinc-500 | bg-stone-700 text-stone-400 | Token | P1 |
| Selected item | bg-teal-600/20 text-teal-300 | bg-amber-600/20 text-amber-300 | Token | P1 |
| Unselected item | text-zinc-300 hover:bg-zinc-700/50 | text-stone-300 hover:bg-stone-600/50 | Token | P1 |
| Agent description | text-zinc-500 | text-stone-400 | Token | P1 |
| Empty state | border-zinc-700 bg-zinc-800 text-zinc-500 | border-stone-600 bg-stone-700 text-stone-400 | Token | P1 |
| Max height | max-h-72 (288px) | max-h-96 (384px) or modal at 81 agents | Structural | P0 |
| Team collapsibility | All teams expanded by default | Subscribed teams expanded, others collapsed with agent count + "unlock" label | Structural | P0 |
| Gateway shortcuts | Not shown | Show gateway at top of each team section: "@design -- routes to the right specialist" | Structural | P1 |
| Description search | Searches id, displayName, emoji | Also search description field | Structural | P1 |
components/chat/tool-indicator.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Container border | border-zinc-700/50 bg-zinc-800/50 | border-stone-600/50 bg-stone-700/50 | Token | P1 |
| Hover state | hover:border-zinc-600 hover:text-zinc-300 | hover:border-stone-500 hover:text-stone-300 | Token | P1 |
| Calling indicator | text-teal-400 | text-amber-400 | Token | P1 |
| Done text | text-zinc-500 | text-stone-400 | Token | P1 |
| Args/result pre | bg-zinc-900 text-zinc-400 | bg-stone-800 text-stone-400 | Token | P1 |
| Chevron color | No explicit color (inherits) | Keep -- inherits parent | -- | -- |
components/chat/markdown.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Code block container | border-zinc-700 bg-zinc-900 | border-stone-600 bg-stone-800 | Token | P1 |
| Inline code | bg-zinc-800 text-teal-300 | bg-stone-700 text-amber-300 | Token | P1 |
| Table header | border-zinc-700 bg-zinc-800 text-zinc-300 | border-stone-600 bg-stone-700 text-stone-300 | Token | P1 |
| Table cell | border-zinc-700 text-zinc-400 | border-stone-600 text-stone-300 | Token | P1 |
| Link | text-teal-400 hover:text-teal-300 | text-amber-400 hover:text-amber-300 | Token | P1 |
| List items | text-zinc-300 | text-stone-300 | Token | P1 |
| Headings | text-zinc-100, text-zinc-200 | text-stone-100, text-stone-200 | Token | P1 |
| Paragraph | text-zinc-300 | text-stone-200 | Token | P1 |
| Blockquote | border-teal-500/50 text-zinc-400 | border-amber-500/50 text-stone-400 | Token | P1 |
| HR | border-zinc-700 | border-stone-600 | Token | P1 |
| Strong | text-zinc-100 | text-stone-100 | Token | P1 |
| Heading font | Inherits body font (Geist/Inter) | H1-H3 should use font-display (Space Grotesk) | Structural | P1 |
components/explorer/file-tree.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Labels | text-zinc-500 | text-stone-400 | Token | P1 |
| Tree item hover | hover:bg-zinc-800 | hover:bg-stone-700 | Token | P1 |
| Selected item | bg-zinc-800 text-zinc-100 | bg-stone-700 text-stone-100 | Token | P1 |
| Unselected text | text-zinc-400 hover:text-zinc-200 | text-stone-400 hover:text-stone-200 | Token | P1 |
| Chevron color | text-zinc-600 | text-stone-500 | Token | P1 |
| Directory icon | text-teal-400 | text-amber-400 | Token | P1 |
| File icon | text-zinc-500 | text-stone-400 | Token | P1 |
| Loading text | text-zinc-600 | text-stone-500 | Token | P1 |
| Empty text | text-zinc-700 | text-stone-600 | Token | P1 |
components/explorer/file-preview.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Empty state icon | text-zinc-700 | text-stone-600 | Token | P1 |
| Empty state text | text-zinc-500 | text-stone-400 | Token | P1 |
| Breadcrumb border | border-zinc-800 | border-stone-700 | Token | P1 |
| Breadcrumb separator | text-zinc-700 | text-stone-600 | Token | P1 |
| Breadcrumb active | text-zinc-200 | text-stone-200 | Token | P1 |
| Breadcrumb inactive | text-zinc-500 | text-stone-400 | Token | P1 |
| File icon | text-zinc-500 | text-stone-400 | Token | P1 |
| Error display | border-red-500/30 bg-red-500/10 text-red-400 | Keep (semantic) | -- | -- |
| Code preview | border-zinc-700 bg-zinc-900 text-zinc-300 | border-stone-600 bg-stone-800 text-stone-200 | Token | P1 |
app/dashboard/settings/layout.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Page heading | text-zinc-100 | text-stone-100 | Token | P1 |
| Subheading | text-zinc-500 | text-stone-400 | Token | P1 |
| Tab nav border | border-zinc-800 | border-stone-700 | Token | P1 |
| Active tab | border-teal-500 text-zinc-100 | border-amber-500 text-stone-100 | Token | P1 |
| Inactive tab | border-transparent text-zinc-500 hover:text-zinc-300 | border-transparent text-stone-400 hover:text-stone-200 | Token | P1 |
app/dashboard/settings/page.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Card | border-zinc-800 bg-zinc-900 | border-stone-700 bg-stone-800 | Token | P1 |
| Labels | text-zinc-500 | text-stone-400 | Token | P1 |
| Values | text-zinc-200 | text-stone-200 | Token | P1 |
| User ID (mono) | text-zinc-500 | text-stone-400 | Token | P1 |
app/dashboard/settings/billing/billing-client.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| All cards | border-zinc-800 bg-zinc-900 | border-stone-700 bg-stone-800 | Token | P1 |
| Labels | text-zinc-500 | text-stone-400 | Token | P1 |
| Plan name | text-zinc-100 | text-stone-100 | Token | P1 |
| Description text | text-zinc-500 | text-stone-400 | Token | P1 |
| Feature list | text-zinc-400 | text-stone-300 | Token | P1 |
| Checkmarks | text-teal-500 | text-amber-500 | Token | P1 |
| Highlighted plan border | border-teal-600 | border-amber-600 | Token | P1 |
| Highlighted plan bg | bg-teal-950/20 | bg-amber-950/20 | Token | P1 |
| Highlighted CTA | bg-teal-600 text-white hover:bg-teal-500 | bg-amber-600 text-white hover:bg-amber-500 | Token | P1 |
| Current plan badge | bg-teal-600/20 text-teal-400 | bg-amber-600/20 text-amber-400 | Token | P1 |
| Manage button | bg-zinc-800 text-zinc-300 hover:bg-zinc-700 | bg-stone-700 text-stone-300 hover:bg-stone-600 | Token | P1 |
| Standard CTA | bg-zinc-800 text-zinc-300 hover:bg-zinc-700 | bg-stone-700 text-stone-300 hover:bg-stone-600 | Token | P1 |
| Trial badge | bg-teal-500/10 text-teal-400 | bg-amber-500/10 text-amber-400 | Token | P1 |
| Period end text | text-zinc-600 | text-stone-500 | Token | P1 |
| BYOT footer | text-zinc-600 | text-stone-500 | Token | P1 |
Copy changes:
app/dashboard/settings/api-keys/page.tsx(Token changes listed in Stage 7 above)
| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| All cards | border-zinc-800 bg-zinc-900 | border-stone-700 bg-stone-800 | Token | P1 |
| Labels | text-zinc-200, text-zinc-500, text-zinc-600 | text-stone-200, text-stone-400, text-stone-500 | Token | P1 |
| Configured badge | bg-teal-500/10 text-teal-400 | bg-amber-500/10 text-amber-400 | Token | P1 |
| Not configured badge | bg-zinc-800 text-zinc-500 | bg-stone-700 text-stone-400 | Token | P1 |
| Input | border-zinc-700 bg-zinc-800 text-zinc-300 placeholder-zinc-600 focus:border-teal-500 | border-stone-600 bg-stone-700 text-stone-200 placeholder-stone-500 focus:border-amber-500 | Token | P1 |
| Save button | bg-teal-600 hover:bg-teal-500 | bg-amber-600 hover:bg-amber-500 | Token | P1 |
| Remove button hover | hover:border-red-500/50 hover:text-red-400 | Keep (semantic) | -- | -- |
| Docs link | text-teal-500 hover:text-teal-400 | text-amber-500 hover:text-amber-400 | Token | P1 |
| Masked key display | border-zinc-700 bg-zinc-800 text-zinc-400 | border-stone-600 bg-stone-700 text-stone-300 | Token | P1 |
app/dashboard/settings/storage/page.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| All cards | border-zinc-800 bg-zinc-900 | border-stone-700 bg-stone-800 | Token | P1 |
| Connected icon bg | bg-teal-500/10, icon text-teal-400 | bg-amber-500/10, icon text-amber-400 | Token | P1 |
| Connected text | text-teal-400 | text-amber-400 | Token | P1 |
| Success banner | border-teal-500/30 bg-teal-500/10 text-teal-400 | border-amber-500/30 bg-amber-500/10 text-amber-400 | Token | P1 |
| Connect/Select buttons | bg-teal-600 hover:bg-teal-500 | bg-amber-600 hover:bg-amber-500 | Token | P1 |
| Create button | bg-teal-600 hover:bg-teal-500 | bg-amber-600 hover:bg-amber-500 | Token | P1 |
| Disconnect button | border-zinc-700 text-zinc-400 hover:border-zinc-600 hover:text-zinc-300 | border-stone-600 text-stone-400 hover:border-stone-500 hover:text-stone-300 | Token | P1 |
| Input focus | focus:border-teal-500 | focus:border-amber-500 | Token | P1 |
| Folder picker | border-zinc-800 bg-zinc-900 | border-stone-700 bg-stone-800 | Token | P1 |
| Folder items | hover:bg-zinc-800 | hover:bg-stone-700 | Token | P1 |
| Code preview | bg-zinc-800 text-zinc-400 | bg-stone-700 text-stone-300 | Token | P1 |
| Labels | text-zinc-500, text-zinc-200 | text-stone-400, text-stone-200 | Token | P1 |
Copy changes:
app/(auth)/sign-in/page.tsx, app/(auth)/sign-up/page.tsx| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Background | bg-zinc-950 | bg-stone-900 | Token | P1 |
app/globals.css| Item | Current | Target | Type | Priority |
|---|---|---|---|---|
| Font vars | --font-geist-sans, --font-geist-mono | --font-display (Space Grotesk), --font-sans (Inter), --font-mono (JetBrains Mono) | Token | P0 |
| Light mode bg | #ffffff | #fafaf9 (stone-50 / warm white) | Token | P1 |
| Dark mode bg | #0a0a0a | #1c1917 (stone-900) | Token | P1 |
| Dark mode text | #ededed | #fafaf9 (stone-50) | Token | P1 |
| Body font-family | Arial, Helvetica, sans-serif | var(--font-sans), -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif | Token | P0 |
Location: components/shared/conversation-list.tsx
Replaces: Placeholder in sidebar.tsx
Requirements:
/api/conversations (new API route)bg-stone-700Priority: P0
Location: components/shared/context-panel.tsx
Integrated into: app/dashboard/layout.tsx
Requirements:
Cmd+] to togglebg-stone-800 border-stone-700text-stone-400 with font-display (Space Grotesk)/api/context/summary (new API route that reads context indexes from the user's Drive workspace)Priority: P0
Location: app/dashboard/onboarding/page.tsx + components/onboarding/
Steps (see Section 4 for full redesign):
Priority: P0
Location: components/chat/meeting-mode.tsx
Used by: message.tsx when detecting multi-agent responses
Requirements:
Location: components/shared/status-bar.tsx
Integrated into: app/dashboard/layout.tsx
Requirements:
bg-stone-800 border-stone-700 text-stone-400Location: Update components/chat/agent-selector.tsx or create components/chat/agent-roster-modal.tsx
Requirements:
Cmd+Shift+A or clicking a "Browse all agents" link, opens as a centered modal instead of inline dropdownNo onboarding exists. Users go directly from Clerk signup to the dashboard chat interface. Storage and API key setup are buried in Settings.
Without onboarding, users hit the chat interface without:
Sign Up (Clerk)
v
Step 1: Welcome
"Welcome to Legionis"
"Your AI workforce is ready to assemble."
Brief animated Formation L logo
[Get Started ->]
v
Step 2: Connect Your AI Provider (REQUIRED)
"Legionis agents need an AI brain."
"Bring your own API key -- you control costs."
[Anthropic card -- input key]
[OpenAI card -- optional]
"Don't have a key? Get one from Anthropic Console (link)"
[Continue ->] (only enabled after valid Anthropic key)
v
Step 3: Connect Storage (RECOMMENDED, skippable)
"Where should your agents save their work?"
[Connect Google Drive -- recommended]
[Skip for now -- files won't persist]
v
Step 4: Choose Your First Team
"Which team do you want to assemble first?"
Grid of 9+1 team tiles:
- Product Org (13 agents) -- "PRDs, roadmaps, strategy"
- Design (7 agents) -- "UI specs, research, prototypes"
- Architecture (7 agents) -- "API design, security, cloud"
- Marketing (16 agents) -- "Campaigns, SEO, content"
- Finance (9 agents) -- "Budgets, forecasting, fundraising"
- Legal (8 agents) -- "Contracts, compliance, privacy"
- Operations (8 agents) -- "Programs, process, risk"
- Executive (2+ agents) -- "Strategy, board prep"
- Corp Dev (5 agents) -- "M&A, partnerships"
- IT Governance (6 agents) -- "Security policy, data governance" User selects one. Others become "available add-ons".
[Start with [Team Name] ->]
v
Step 5: First Interaction (Dashboard)
Chat opens with a pre-populated prompt based on selected team:
- Product: "Help me write a product requirements document"
- Design: "Review these UI mockups and suggest improvements"
- Marketing: "Plan a launch campaign for my new feature"
- Finance: "Build a financial model for my SaaS product"
- Legal: "Review this vendor contract for risks"
- etc. EmptyState hint cards also tailored to selected team.
Why API Key first? Without it, the entire product is non-functional. Unlike storage (which has a graceful degradation path), no API key = no agent responses = immediate churn.
Why team selection? With 81 agents, showing all at once is overwhelming. Letting users choose their "first team" creates a manageable entry point (7-16 agents instead of 81) while implicitly communicating the breadth of the platform.
Why "AI workforce" framing throughout? Every step uses workforce/team/assemble language, not product-management-specific terminology. A marketing lead signing up will see "campaigns, SEO, content" not "PRDs, roadmaps, V2V phases."
| Do | Do Not |
|---|---|
| "Assemble your AI workforce" | "Set up your Product Org OS" |
| "Your agents need an AI brain" | "Configure your LLM provider" |
| "Choose your first team" | "Select your V2V phase focus" |
| "Where should agents save work?" | "Connect to V2V context layer" |
| "Contracts, compliance, privacy" | "Phase 2 strategic decisions" |
Severity: High Impact: Users abandon agent selector, default to auto-routing only, never discover specialist agents
Mitigation Strategy (Layered):
@ trigger with fuzzy search is the primary discovery path for experienced users. Keep it fast and accurate.Cmd+Shift+A. Shows team grid with expand/collapse, letting users browse at their own pace without blocking the chat input.Severity: High Impact: Users who don't have an API key may churn at onboarding. Users who misconfigure keys will get cryptic errors.
Mitigation Strategy:
Severity: Medium Impact: Right panel takes valuable horizontal space. Showing it at the wrong time distracts; hiding it at the wrong time loses organizational memory visibility.
Mitigation Strategy:
Cmd+] or a toggle button in the top bar.Severity: Medium Impact: Non-product users encounter V2V phase labels ("Strategic Foundation", "Strategic Commitments") and have no idea what they mean.
Mitigation Strategy:
Severity: Medium Impact: Partial migration creates visual inconsistency (some components zinc, some stone, some mixed).
Mitigation Strategy:
zinc- or teal- classes that should have been migrated. Allow zinc- only in the Clerk theme override (Clerk manages its own palette).Severity: Medium Impact: Users expect conversations to persist like ChatGPT. If the conversation list is empty or buggy, trust drops immediately.
Mitigation Strategy:
| Zinc (Current) | Stone (Target) | Usage |
|---|---|---|
zinc-950 / #09090b | stone-900 / #1c1917 | Page backgrounds |
zinc-900 / #18181b | stone-800 / #292524 | Surface backgrounds, cards |
zinc-800 / #27272a | stone-700 / #44403c | Elevated surfaces, borders |
zinc-700 / #3f3f46 | stone-600 / #57534e | Borders, dividers |
zinc-600 / #52525b | stone-500 / #78716c | Muted UI elements |
zinc-500 / #71717a | stone-400 / #a8a29e | Secondary text, labels |
zinc-400 / #a1a1aa | stone-300 / #d6d3d1 | Body text (dark mode) |
zinc-300 / #d4d4d8 | stone-200 / #e7e5e4 | Primary text (dark mode) |
zinc-200 / #e4e4e7 | stone-100 / #f5f5f4 | Headings (dark mode) |
zinc-100 / #f4f4f5 | stone-50 / #fafaf9 | Brightest text (dark mode) |
| Teal (Current) | Amber (Target) | Usage |
|---|---|---|
teal-600 / #0d9488 | amber-600 / #d97706 | Primary accent (buttons, badges, send button) |
teal-500 / #14b8a6 | amber-500 / #f59e0b | Accent hover states, active indicators |
teal-400 / #2dd4bf | amber-400 / #fbbf24 | Links, status text, icons |
teal-300 / #5eead4 | amber-300 / #fcd34d | Selected item text, code highlights |
teal-500/10 | amber-500/10 | Badge backgrounds, status pill backgrounds |
teal-500/50 | amber-500/50 | Blockquote borders, subtle accents |
teal-600/20 | amber-600/20 | Selected item backgrounds, current plan badge |
teal-950/20 | amber-950/20 | Highlighted card backgrounds |
| Current | Target | CSS Variable |
|---|---|---|
| Geist Sans | Inter (body, UI) | --font-sans |
| Geist Mono | JetBrains Mono (code) | --font-mono |
| (none) | Space Grotesk (headings, display) | --font-display |
layout.tsx (Geist -> Space Grotesk + Inter + JetBrains Mono)globals.cssglobals.css (Arial -> Inter)1-18. Token migration across all 18 component files (zinc -> stone, teal -> amber)
/dashboard/context)Document Status: Active Next Step: Prioritize P0 items for Week 5 sprint, batch P1 token migration as a single PR Review: Dir PM + Dir Design before implementation