Legionis UX Journey Audit V3

Full User Journey Review: Alignment with General-Purpose AI Workforce Positioning

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


Executive Summary

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


Table of Contents

  • [End-to-End Journey Map (10 Stages)](#1-end-to-end-journey-map)
  • [Component Change Register](#2-component-change-register)
  • [New Components Needed for Week 5](#3-new-components-needed-for-week-5)
  • [Onboarding Flow Redesign](#4-onboarding-flow-redesign)
  • [Critical UX Risks](#5-critical-ux-risks)

  • 1. End-to-End Journey Map

    Stage 1: Discovery (Landing Page to Signup Intent)

    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:

    Impacted components: app/(auth)/sign-in/page.tsx, app/(auth)/sign-up/page.tsx, app/(auth)/layout.tsx, app/layout.tsx

    Priority: P1 (brand alignment, not blocking Week 5 features)


    Stage 2: Registration (Sign-Up via Clerk)

    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:

    Impacted components: app/layout.tsx (ClerkProvider appearance), Clerk dashboard config (redirects)

    Priority: P0 for redirect change (blocks onboarding flow), P1 for brand tokens


    Stage 3: Onboarding (Connect Storage, Connect API Key, Workspace Setup)

    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:

    Impacted components: settings/storage/page.tsx (copy changes), NEW app/dashboard/onboarding/ route

    Priority: P0 (onboarding is a Week 5 requirement)


    Stage 4: First Value (First Skill/Agent Use, First Document Created)

    Current state: EmptyState in chat-container.tsx shows:

    - "Help me write a PRD for authentication" -- product-org-specific - "/prd, /decision-record, /business-case" -- product-org-specific skills - "@competitive-intelligence, @bizops" -- product-org agents only - "Analyze our pricing strategy" -- product-org-specific Required changes: - Card 1: "Help me draft a project brief" (neutral) - Card 2: Show diverse skills: "/prd, /business-case, /campaign-brief, /contracts-review" (cross-team) - Card 3: Show diverse agents: "@pm, @cfo, @general-counsel, @cmo" (cross-team) - Card 4: "Review this contract for risks" or "Plan a product launch" (varied domains) Impacted components: components/chat/chat-container.tsx (EmptyState function)

    Priority: P1 (copy alignment + brand tokens)


    Stage 5: Habit Formation (Week 1 -- Skill Discovery, Context Accumulation)

    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:

    Impacted components: components/chat/skill-palette.tsx, components/chat/agent-selector.tsx

    Priority: P1 (functional for Week 5 as-is, but confusing for non-product users)


    Stage 6: Team Discovery (Discovering 81 Agents Across 9 Teams)

    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:

    - Show the user's subscribed team(s) first with full agent list - Show other teams collapsed with just the team name and agent count - "Unlock [Team Name] -- $5/mo add-on" for unsubscribed teams - This ties agent discovery to the pricing model Impacted components: components/chat/agent-selector.tsx, /api/agents route

    Priority: P0 (81 agents in current flat-per-team list is information overload)


    Stage 7: BYOT Setup (Connecting API Keys, Understanding Cost Model)

    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:

    Impacted components: app/dashboard/settings/api-keys/page.tsx

    Priority: P0 (BYOT is Week 5 feature), P1 for token migration


    Stage 8: Upgrade Decision (Free to Pro/Team/Org, Understanding New Pricing)

    Current state: Billing page (billing-client.tsx) shows:

    Required changes: Impacted components: app/dashboard/settings/billing/billing-client.tsx, app/dashboard/settings/billing/page.tsx

    Priority: P1 (pricing structure is correct, just needs token migration)


    Stage 9: Power Usage (Keyboard Shortcuts, Batch Operations, Meeting Mode)

    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:

    - Header: Gateway name + "Meeting" + topic - Collapsible agent sections with emoji + display name - Alignment / Tension / Synthesis sections with distinct visual treatment - This requires a new sub-component or structured rendering logic in message.tsx Impacted components: components/chat/chat-container.tsx, components/chat/message.tsx, global layout for keyboard shortcuts

    Priority: P1 (Cmd+K), P2 (Meeting Mode rendering, keyboard help)


    Stage 10: Context Compounding (3+ Months, Switching Cost Established)

    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:

    - Recent decisions (from context/decisions/) - Active strategic bets (from context/bets/) - Recent feedback count - Session ROI running total - Context health indicator (green/yellow/gray based on freshness) - Operation count: "[N] / 500 ops (free tier)" or unlimited for paid - Token cost estimate for current session - Context health dot Impacted components: components/explorer/file-tree.tsx (token migration), NEW components (see Section 3)

    Priority: P0 for context panel (Week 5 feature), P2 for full context dashboard


    2. Component Change Register

    2.1 Root Layout: app/layout.tsx

    ItemCurrentTargetTypePriority
    Font importGeist, Geist_Mono from next/font/googleSpace_Grotesk, Inter, JetBrains_Mono from next/font/googleStructuralP0
    Font CSS vars--font-geist-sans, --font-geist-mono--font-display (Space Grotesk), --font-sans (Inter), --font-mono (JetBrains Mono)StructuralP0
    Body classesbg-zinc-950 text-zinc-100bg-stone-900 text-stone-100TokenP1
    Font classfont-sans: var(--font-geist-sans)font-sans: var(--font-inter) or Inter as body defaultTokenP0
    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.


    2.2 Dashboard Layout: app/dashboard/layout.tsx

    ItemCurrentTargetTypePriority
    Container bgbg-zinc-950 text-zinc-100bg-stone-900 text-stone-100TokenP1
    Structure +
    (two-panel)
    +
    + (three-panel with toggleable right panel)
    StructuralP0

    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.


    2.3 Sidebar: components/shared/sidebar.tsx

    ItemCurrentTargetTypePriority
    Aside bgborder-zinc-800 bg-zinc-900border-stone-700 bg-stone-800TokenP1
    Header borderborder-zinc-800border-stone-700TokenP1
    Logo texttext-zinc-100text-stone-100TokenP1
    Beta badgebg-teal-500/10 text-teal-400bg-amber-500/10 text-amber-400TokenP1
    Workspace selector borderborder-zinc-700 bg-zinc-800border-stone-600 bg-stone-700TokenP1
    Workspace selector hoverhover:border-zinc-600 hover:bg-zinc-750hover:border-stone-500 hover:bg-stone-600TokenP1
    Workspace avatar bgbg-teal-600bg-amber-600TokenP1
    Workspace dropdown bgborder-zinc-700 bg-zinc-800border-stone-600 bg-stone-700TokenP1
    Workspace dropdown item hoverhover:bg-zinc-700hover:bg-stone-600TokenP1
    Workspace separatorbg-zinc-700bg-stone-600TokenP1
    New conversation buttonbg-teal-600 hover:bg-teal-500bg-amber-600 hover:bg-amber-500TokenP1
    Conversations labeltext-zinc-500text-stone-400TokenP1
    ScrollArea thumbbg-zinc-700bg-stone-600TokenP1
    Empty state texttext-zinc-600text-stone-500TokenP1
    Bottom nav borderborder-zinc-800border-stone-700TokenP1
    Active linkbg-zinc-800 text-zinc-100bg-stone-700 text-stone-100TokenP1
    Inactive linktext-zinc-400 hover:bg-zinc-800 hover:text-zinc-200text-stone-400 hover:bg-stone-700 hover:text-stone-200TokenP1
    Disabled linktext-zinc-600, text-zinc-700text-stone-500, text-stone-600TokenP1
    Conversations listPlaceholder "No conversations yet"Actual conversation list from DB (Week 5 feature)StructuralP0

    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:


    2.4 Chat Container: components/chat/chat-container.tsx

    ItemCurrentTargetTypePriority
    Streaming indicatorbg-zinc-800, text-zinc-400bg-stone-700, text-stone-400TokenP1
    Animate pulseanimate-pulse (Thinking...)Keep -- animation is neutral----
    Error borderborder-red-500/30 bg-red-500/10 text-red-400Keep -- red is semantic, not brand----
    HintCard borderborder-zinc-800border-stone-700TokenP1
    HintCard titletext-zinc-200text-stone-200TokenP1
    HintCard descriptiontext-zinc-500text-stone-400TokenP1
    HintCard exampletext-zinc-600text-stone-500TokenP1
    Default agentId"product-manager"Consider making this dynamic based on user's team selection or null (auto-route)StructuralP1
    Hint card examplesProduct-org-specific (PRD, authentication, pricing strategy)Domain-diverse examples (see Stage 4 above)CopyP1
    Greeting subtitle"Your AI workforce, ready to deploy."OK as-isCopy--

    Copy changes needed:


    2.5 Message: components/chat/message.tsx

    ItemCurrentTargetTypePriority
    User bubble bgbg-teal-600bg-amber-600TokenP1
    User bubble texttext-whitetext-white (keep)----
    User bubble radiusrounded-2xl rounded-br-smKeep----
    Assistant wrapperNo special background, just inline markdownConsider subtle bg-stone-800/50 for visual separationTokenP2

    Structural changes:


    2.6 Chat Input: components/chat/chat-input.tsx

    ItemCurrentTargetTypePriority
    Container borderborder-zinc-700 bg-zinc-800/50border-stone-600 bg-stone-700/50TokenP1
    Focus statefocus-within:border-zinc-500focus-within:border-amber-600TokenP1
    Textarea texttext-zinc-100text-stone-100TokenP1
    Placeholderplaceholder-zinc-500placeholder-stone-400TokenP1
    Send buttonbg-teal-600 hover:bg-teal-500 disabled:hover:bg-teal-600bg-amber-600 hover:bg-amber-500 disabled:hover:bg-amber-600TokenP1
    Placeholder text"Message your AI workforce... (/ for skills, @ for agents)"OK as-is (general-purpose)Copy--
    Streaming placeholder"Agent is responding..."OK as-isCopy--


    2.7 Skill Palette: components/chat/skill-palette.tsx

    ItemCurrentTargetTypePriority
    Container borderborder-zinc-700 bg-zinc-800border-stone-600 bg-stone-700TokenP1
    Category headerbg-zinc-800 text-zinc-500bg-stone-700 text-stone-400TokenP1
    Selected itembg-teal-600/20 text-teal-300bg-amber-600/20 text-amber-300TokenP1
    Unselected itemtext-zinc-300 hover:bg-zinc-700/50text-stone-300 hover:bg-stone-600/50TokenP1
    Skill ID texttext-zinc-500text-stone-400TokenP1
    Skill descriptiontext-zinc-400text-stone-300TokenP1
    Empty stateborder-zinc-700 bg-zinc-800 text-zinc-500border-stone-600 bg-stone-700 text-stone-400TokenP1
    Category labelsProduct-org V2V phases: "Strategic Foundation", "Strategic Decisions", etc.Consider dual taxonomy: V2V phases for product users, functional groups for othersCopy/StructuralP1
    Max heightmax-h-64 (256px)max-h-80 or max-h-96 (320-384px) to accommodate 80+ skillsStructuralP1
    Recently Used sectionNot implementedAdd "Recently Used" at top showing last 5 invoked skillsStructuralP2


    2.8 Agent Selector: components/chat/agent-selector.tsx

    ItemCurrentTargetTypePriority
    Container borderborder-zinc-700 bg-zinc-800border-stone-600 bg-stone-700TokenP1
    Team headerbg-zinc-800 text-zinc-500bg-stone-700 text-stone-400TokenP1
    Selected itembg-teal-600/20 text-teal-300bg-amber-600/20 text-amber-300TokenP1
    Unselected itemtext-zinc-300 hover:bg-zinc-700/50text-stone-300 hover:bg-stone-600/50TokenP1
    Agent descriptiontext-zinc-500text-stone-400TokenP1
    Empty stateborder-zinc-700 bg-zinc-800 text-zinc-500border-stone-600 bg-stone-700 text-stone-400TokenP1
    Max heightmax-h-72 (288px)max-h-96 (384px) or modal at 81 agentsStructuralP0
    Team collapsibilityAll teams expanded by defaultSubscribed teams expanded, others collapsed with agent count + "unlock" labelStructuralP0
    Gateway shortcutsNot shownShow gateway at top of each team section: "@design -- routes to the right specialist"StructuralP1
    Description searchSearches id, displayName, emojiAlso search description fieldStructuralP1


    2.9 Tool Indicator: components/chat/tool-indicator.tsx

    ItemCurrentTargetTypePriority
    Container borderborder-zinc-700/50 bg-zinc-800/50border-stone-600/50 bg-stone-700/50TokenP1
    Hover statehover:border-zinc-600 hover:text-zinc-300hover:border-stone-500 hover:text-stone-300TokenP1
    Calling indicatortext-teal-400text-amber-400TokenP1
    Done texttext-zinc-500text-stone-400TokenP1
    Args/result prebg-zinc-900 text-zinc-400bg-stone-800 text-stone-400TokenP1
    Chevron colorNo explicit color (inherits)Keep -- inherits parent----


    2.10 Markdown Renderer: components/chat/markdown.tsx

    ItemCurrentTargetTypePriority
    Code block containerborder-zinc-700 bg-zinc-900border-stone-600 bg-stone-800TokenP1
    Inline codebg-zinc-800 text-teal-300bg-stone-700 text-amber-300TokenP1
    Table headerborder-zinc-700 bg-zinc-800 text-zinc-300border-stone-600 bg-stone-700 text-stone-300TokenP1
    Table cellborder-zinc-700 text-zinc-400border-stone-600 text-stone-300TokenP1
    Linktext-teal-400 hover:text-teal-300text-amber-400 hover:text-amber-300TokenP1
    List itemstext-zinc-300text-stone-300TokenP1
    Headingstext-zinc-100, text-zinc-200text-stone-100, text-stone-200TokenP1
    Paragraphtext-zinc-300text-stone-200TokenP1
    Blockquoteborder-teal-500/50 text-zinc-400border-amber-500/50 text-stone-400TokenP1
    HRborder-zinc-700border-stone-600TokenP1
    Strongtext-zinc-100text-stone-100TokenP1
    Heading fontInherits body font (Geist/Inter)H1-H3 should use font-display (Space Grotesk)StructuralP1


    2.11 File Tree: components/explorer/file-tree.tsx

    ItemCurrentTargetTypePriority
    Labelstext-zinc-500text-stone-400TokenP1
    Tree item hoverhover:bg-zinc-800hover:bg-stone-700TokenP1
    Selected itembg-zinc-800 text-zinc-100bg-stone-700 text-stone-100TokenP1
    Unselected texttext-zinc-400 hover:text-zinc-200text-stone-400 hover:text-stone-200TokenP1
    Chevron colortext-zinc-600text-stone-500TokenP1
    Directory icontext-teal-400text-amber-400TokenP1
    File icontext-zinc-500text-stone-400TokenP1
    Loading texttext-zinc-600text-stone-500TokenP1
    Empty texttext-zinc-700text-stone-600TokenP1


    2.12 File Preview: components/explorer/file-preview.tsx

    ItemCurrentTargetTypePriority
    Empty state icontext-zinc-700text-stone-600TokenP1
    Empty state texttext-zinc-500text-stone-400TokenP1
    Breadcrumb borderborder-zinc-800border-stone-700TokenP1
    Breadcrumb separatortext-zinc-700text-stone-600TokenP1
    Breadcrumb activetext-zinc-200text-stone-200TokenP1
    Breadcrumb inactivetext-zinc-500text-stone-400TokenP1
    File icontext-zinc-500text-stone-400TokenP1
    Error displayborder-red-500/30 bg-red-500/10 text-red-400Keep (semantic)----
    Code previewborder-zinc-700 bg-zinc-900 text-zinc-300border-stone-600 bg-stone-800 text-stone-200TokenP1


    2.13 Settings Layout: app/dashboard/settings/layout.tsx

    ItemCurrentTargetTypePriority
    Page headingtext-zinc-100text-stone-100TokenP1
    Subheadingtext-zinc-500text-stone-400TokenP1
    Tab nav borderborder-zinc-800border-stone-700TokenP1
    Active tabborder-teal-500 text-zinc-100border-amber-500 text-stone-100TokenP1
    Inactive tabborder-transparent text-zinc-500 hover:text-zinc-300border-transparent text-stone-400 hover:text-stone-200TokenP1


    2.14 Settings Profile: app/dashboard/settings/page.tsx

    ItemCurrentTargetTypePriority
    Cardborder-zinc-800 bg-zinc-900border-stone-700 bg-stone-800TokenP1
    Labelstext-zinc-500text-stone-400TokenP1
    Valuestext-zinc-200text-stone-200TokenP1
    User ID (mono)text-zinc-500text-stone-400TokenP1


    2.15 Settings Billing: app/dashboard/settings/billing/billing-client.tsx

    ItemCurrentTargetTypePriority
    All cardsborder-zinc-800 bg-zinc-900border-stone-700 bg-stone-800TokenP1
    Labelstext-zinc-500text-stone-400TokenP1
    Plan nametext-zinc-100text-stone-100TokenP1
    Description texttext-zinc-500text-stone-400TokenP1
    Feature listtext-zinc-400text-stone-300TokenP1
    Checkmarkstext-teal-500text-amber-500TokenP1
    Highlighted plan borderborder-teal-600border-amber-600TokenP1
    Highlighted plan bgbg-teal-950/20bg-amber-950/20TokenP1
    Highlighted CTAbg-teal-600 text-white hover:bg-teal-500bg-amber-600 text-white hover:bg-amber-500TokenP1
    Current plan badgebg-teal-600/20 text-teal-400bg-amber-600/20 text-amber-400TokenP1
    Manage buttonbg-zinc-800 text-zinc-300 hover:bg-zinc-700bg-stone-700 text-stone-300 hover:bg-stone-600TokenP1
    Standard CTAbg-zinc-800 text-zinc-300 hover:bg-zinc-700bg-stone-700 text-stone-300 hover:bg-stone-600TokenP1
    Trial badgebg-teal-500/10 text-teal-400bg-amber-500/10 text-amber-400TokenP1
    Period end texttext-zinc-600text-stone-500TokenP1
    BYOT footertext-zinc-600text-stone-500TokenP1

    Copy changes:


    2.16 Settings API Keys: app/dashboard/settings/api-keys/page.tsx

    (Token changes listed in Stage 7 above)

    ItemCurrentTargetTypePriority
    All cardsborder-zinc-800 bg-zinc-900border-stone-700 bg-stone-800TokenP1
    Labelstext-zinc-200, text-zinc-500, text-zinc-600text-stone-200, text-stone-400, text-stone-500TokenP1
    Configured badgebg-teal-500/10 text-teal-400bg-amber-500/10 text-amber-400TokenP1
    Not configured badgebg-zinc-800 text-zinc-500bg-stone-700 text-stone-400TokenP1
    Inputborder-zinc-700 bg-zinc-800 text-zinc-300 placeholder-zinc-600 focus:border-teal-500border-stone-600 bg-stone-700 text-stone-200 placeholder-stone-500 focus:border-amber-500TokenP1
    Save buttonbg-teal-600 hover:bg-teal-500bg-amber-600 hover:bg-amber-500TokenP1
    Remove button hoverhover:border-red-500/50 hover:text-red-400Keep (semantic)----
    Docs linktext-teal-500 hover:text-teal-400text-amber-500 hover:text-amber-400TokenP1
    Masked key displayborder-zinc-700 bg-zinc-800 text-zinc-400border-stone-600 bg-stone-700 text-stone-300TokenP1


    2.17 Settings Storage: app/dashboard/settings/storage/page.tsx

    ItemCurrentTargetTypePriority
    All cardsborder-zinc-800 bg-zinc-900border-stone-700 bg-stone-800TokenP1
    Connected icon bgbg-teal-500/10, icon text-teal-400bg-amber-500/10, icon text-amber-400TokenP1
    Connected texttext-teal-400text-amber-400TokenP1
    Success bannerborder-teal-500/30 bg-teal-500/10 text-teal-400border-amber-500/30 bg-amber-500/10 text-amber-400TokenP1
    Connect/Select buttonsbg-teal-600 hover:bg-teal-500bg-amber-600 hover:bg-amber-500TokenP1
    Create buttonbg-teal-600 hover:bg-teal-500bg-amber-600 hover:bg-amber-500TokenP1
    Disconnect buttonborder-zinc-700 text-zinc-400 hover:border-zinc-600 hover:text-zinc-300border-stone-600 text-stone-400 hover:border-stone-500 hover:text-stone-300TokenP1
    Input focusfocus:border-teal-500focus:border-amber-500TokenP1
    Folder pickerborder-zinc-800 bg-zinc-900border-stone-700 bg-stone-800TokenP1
    Folder itemshover:bg-zinc-800hover:bg-stone-700TokenP1
    Code previewbg-zinc-800 text-zinc-400bg-stone-700 text-stone-300TokenP1
    Labelstext-zinc-500, text-zinc-200text-stone-400, text-stone-200TokenP1

    Copy changes:


    2.18 Auth Pages: app/(auth)/sign-in/page.tsx, app/(auth)/sign-up/page.tsx

    ItemCurrentTargetTypePriority
    Backgroundbg-zinc-950bg-stone-900TokenP1


    2.19 Globals CSS: app/globals.css

    ItemCurrentTargetTypePriority
    Font vars--font-geist-sans, --font-geist-mono--font-display (Space Grotesk), --font-sans (Inter), --font-mono (JetBrains Mono)TokenP0
    Light mode bg#ffffff#fafaf9 (stone-50 / warm white)TokenP1
    Dark mode bg#0a0a0a#1c1917 (stone-900)TokenP1
    Dark mode text#ededed#fafaf9 (stone-50)TokenP1
    Body font-familyArial, Helvetica, sans-serifvar(--font-sans), -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serifTokenP0


    3. New Components Needed for Week 5

    3.1 Conversation List (Sidebar)

    Location: components/shared/conversation-list.tsx Replaces: Placeholder in sidebar.tsx

    Requirements:

    Data model: Conversations table already exists (Week 4). Needs a list API endpoint.

    Priority: P0


    3.2 Context Panel (Right Sidebar)

    Location: components/shared/context-panel.tsx Integrated into: app/dashboard/layout.tsx

    Requirements:

    1. Active Context -- Recent decisions (last 5), active bets, recent feedback count. Each item is a clickable link that opens the file in the main panel. 2. Session ROI -- Running total of time saved this session, with sparkline-style visual. 3. Context Health -- Green/yellow/gray indicator based on context freshness (green = entries within 7 days, yellow = within 30 days, gray = empty). Data source: /api/context/summary (new API route that reads context indexes from the user's Drive workspace)

    Priority: P0


    3.3 Onboarding Flow

    Location: app/dashboard/onboarding/page.tsx + components/onboarding/ Steps (see Section 4 for full redesign):

  • Welcome -- Greeting + brief value prop + "Let's set up your workspace" CTA
  • Connect API Key -- Embedded version of the API key card (Anthropic required, OpenAI optional)
  • Connect Storage -- Embedded version of the Drive connection flow
  • Choose Starter Team -- Grid of 9 team tiles (Product, Design, Architecture, Marketing, Finance, Legal, Operations, Executive, Corp Dev, IT). User picks 1 to start. Others shown as expandable later.
  • First Interaction -- Redirect to dashboard with a pre-populated prompt based on chosen team
  • Priority: P0


    3.4 Meeting Mode Renderer

    Location: components/chat/meeting-mode.tsx Used by: message.tsx when detecting multi-agent responses

    Requirements:

    - Left border in agent's accent color - Emoji + display name header - Agent response text (markdown rendered) - Collapse/expand toggle (chevron) Priority: P2 (not blocking Week 5, but needed for full product experience)


    3.5 Token Count / Usage Display (Status Bar)

    Location: components/shared/status-bar.tsx Integrated into: app/dashboard/layout.tsx

    Requirements:

    Priority: P1


    3.6 Enhanced Agent Selector (Modal Mode)

    Location: Update components/chat/agent-selector.tsx or create components/chat/agent-roster-modal.tsx

    Requirements:

    Priority: P0 (critical for making 81 agents discoverable without overwhelm)


    4. Onboarding Flow Redesign

    Current State

    No onboarding exists. Users go directly from Clerk signup to the dashboard chat interface. Storage and API key setup are buried in Settings.

    Problem

    Without onboarding, users hit the chat interface without:

  • An API key (chat will fail immediately)
  • Storage connected (no file persistence)
  • Understanding of what 81 agents across 9 teams can do
  • A mental model for how the platform works
  • Proposed Flow

    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.

    Key Design Decisions

    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."

    Copy Guidelines for Onboarding

    DoDo 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"


    5. Critical UX Risks

    Risk 1: 81 Agents = Information Overload

    Severity: High Impact: Users abandon agent selector, default to auto-routing only, never discover specialist agents

    Mitigation Strategy (Layered):

  • Onboarding team selection (described above): Reduces initial exposure to 7-16 agents
  • Collapsible teams in selector: Unsubscribed teams collapsed by default with "N agents" badge
  • Gateway-first routing: Prominently suggest gateways ("Not sure? Try @design and we'll route to the right specialist") at top of each team section
  • Smart suggestions: After 5+ sessions, suggest unused agents from the same team based on work patterns: "You've been working on requirements -- have you tried @ux-lead for user research?"
  • Search-first: The @ trigger with fuzzy search is the primary discovery path for experienced users. Keep it fast and accurate.
  • Full roster modal: Separate from the inline dropdown. Accessible via Cmd+Shift+A. Shows team grid with expand/collapse, letting users browse at their own pace without blocking the chat input.

  • Risk 2: BYOT Friction -- Users Must Provide API Keys

    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:

  • Onboarding makes it mandatory: Step 2 requires a valid key before proceeding. This is better than letting users reach the chat and fail.
  • Direct link to Anthropic Console: One-click navigation to the key generation page with brief instructions: "1. Create account at Anthropic. 2. Go to Settings > API Keys. 3. Create a key and paste it here."
  • Key validation on save: The existing API key save endpoint should validate the key by making a minimal API call. If invalid, show a specific error: "This key is invalid or expired. Please check and try again."
  • Estimated cost display: After key is connected, show: "Estimated cost per typical operation: $0.01-0.10. You control this via your API provider."
  • Fallback messaging: If the user's key runs out of credits mid-session, show: "Your Anthropic account has insufficient credits. Add credits at console.anthropic.com."
  • "Try without a key" option: Consider a limited free trial mode using platform-provided tokens (5 operations) to demonstrate value before requiring BYOT setup. This is a business decision but would significantly reduce onboarding friction.

  • Risk 3: Context Panel -- When to Show/Hide

    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:

  • Desktop (1280px+): Show by default but collapsible. User preference persisted.
  • Tablet (768-1279px): Hidden by default. Accessible via Cmd+] or a toggle button in the top bar.
  • Mobile (<768px): Never shown inline. Accessible as a bottom sheet.
  • Auto-show triggers: When an agent response references a decision (DR-), bet (SB-), or learning (L-*), flash the context panel toggle to indicate related context is available.
  • Auto-hide triggers: During active streaming, collapse the context panel to maximize conversation visibility (unless pinned by user).
  • Empty state: When context is empty (new user), show a "Getting Started" card instead: "As you work with agents, decisions and learnings accumulate here."

  • Risk 4: Skill Palette Taxonomy Confusion

    Severity: Medium Impact: Non-product users encounter V2V phase labels ("Strategic Foundation", "Strategic Commitments") and have no idea what they mean.

    Mitigation Strategy:

  • Dual taxonomy: Keep V2V phase grouping as one view mode. Add a "By Function" view mode that groups skills by domain: Strategy, Finance, Legal, Marketing, Product, Operations, etc.
  • Default based on team: If user selected Marketing team in onboarding, default to "By Function" view. If user selected Product Org team, default to "By Phase" view.
  • Search is the equalizer: Power users will type what they need regardless of grouping. Ensure fuzzy search matches skill descriptions, not just IDs.
  • Contextual suggestions: Above the skill list, show "Suggested for you" based on recent work and team selection.

  • Risk 5: Brand Token Migration Breaks Consistency

    Severity: Medium Impact: Partial migration creates visual inconsistency (some components zinc, some stone, some mixed).

    Mitigation Strategy:

  • Centralize tokens in globals.css: Define CSS custom properties for all brand tokens. Components reference variables, not hardcoded Tailwind classes. This makes future migrations trivial.
  • Batch migration: Do all 18 components in a single PR. Don't ship partial migration.
  • Grep audit before merge: Search for any remaining zinc- or teal- classes that should have been migrated. Allow zinc- only in the Clerk theme override (Clerk manages its own palette).
  • Visual regression: After migration, screenshot every page/state and compare. Pay special attention to:
  • - Focus rings (must be visible on stone backgrounds) - Disabled states (must be distinguishable) - Error states (red should still contrast well with stone backgrounds)


    Risk 6: Conversation Persistence UX

    Severity: Medium Impact: Users expect conversations to persist like ChatGPT. If the conversation list is empty or buggy, trust drops immediately.

    Mitigation Strategy:

  • Auto-save every message: Conversations persist server-side after every message exchange. No manual "save" needed.
  • Conversation titles: Auto-generated from the first user message (truncated to 50 chars). Users can rename later.
  • Conversation switching: When switching conversations, the current conversation state is preserved. Coming back loads it from DB.
  • New conversation: The existing "New conversation" button creates a fresh conversation and navigates to it. The old conversation appears in the sidebar list.
  • Delete confirmation: "Delete this conversation? This cannot be undone." -- Simple confirm dialog.

  • Appendix A: Token Migration Quick Reference

    Zinc to Stone Mapping

    Zinc (Current)Stone (Target)Usage
    zinc-950 / #09090bstone-900 / #1c1917Page backgrounds
    zinc-900 / #18181bstone-800 / #292524Surface backgrounds, cards
    zinc-800 / #27272astone-700 / #44403cElevated surfaces, borders
    zinc-700 / #3f3f46stone-600 / #57534eBorders, dividers
    zinc-600 / #52525bstone-500 / #78716cMuted UI elements
    zinc-500 / #71717astone-400 / #a8a29eSecondary text, labels
    zinc-400 / #a1a1aastone-300 / #d6d3d1Body text (dark mode)
    zinc-300 / #d4d4d8stone-200 / #e7e5e4Primary text (dark mode)
    zinc-200 / #e4e4e7stone-100 / #f5f5f4Headings (dark mode)
    zinc-100 / #f4f4f5stone-50 / #fafaf9Brightest text (dark mode)

    Teal to Amber Mapping

    Teal (Current)Amber (Target)Usage
    teal-600 / #0d9488amber-600 / #d97706Primary accent (buttons, badges, send button)
    teal-500 / #14b8a6amber-500 / #f59e0bAccent hover states, active indicators
    teal-400 / #2dd4bfamber-400 / #fbbf24Links, status text, icons
    teal-300 / #5eead4amber-300 / #fcd34dSelected item text, code highlights
    teal-500/10amber-500/10Badge backgrounds, status pill backgrounds
    teal-500/50amber-500/50Blockquote borders, subtle accents
    teal-600/20amber-600/20Selected item backgrounds, current plan badge
    teal-950/20amber-950/20Highlighted card backgrounds

    Font Migration

    CurrentTargetCSS Variable
    Geist SansInter (body, UI)--font-sans
    Geist MonoJetBrains Mono (code)--font-mono
    (none)Space Grotesk (headings, display)--font-display


    Appendix B: Priority Summary

    P0 -- Blocks Week 5 (12 items)

  • Font imports in layout.tsx (Geist -> Space Grotesk + Inter + JetBrains Mono)
  • Font CSS variables in globals.css
  • Body font-family in globals.css (Arial -> Inter)
  • Onboarding flow (new route + components)
  • Post-signup redirect to onboarding
  • Conversation list in sidebar (replace placeholder)
  • Context panel (right sidebar) component
  • Dashboard layout: two-panel -> three-panel
  • Agent selector: increased height + team collapsibility for 81 agents
  • Agent selector: modal mode for full roster browsing
  • Conversation persistence (API routes + sidebar list)
  • API key validation and onboarding integration
  • P1 -- Brand/Positioning Alignment (23 items)

    1-18. Token migration across all 18 component files (zinc -> stone, teal -> amber)

  • Hint card copy in EmptyState (product-org -> domain-diverse)
  • Storage page copy ("V2V" -> neutral terminology)
  • Skill palette: increased max-height, consider functional taxonomy
  • Agent selector: gateway shortcuts at team level
  • Status bar component (usage display)
  • P2 -- Polish (9 items)

  • Meeting Mode renderer component
  • Cmd+K global shortcut (skill palette as modal)
  • Keyboard shortcut help panel
  • "Recently Used" section in skill palette
  • Smart agent suggestions based on usage patterns
  • Stop generating button during streaming
  • Subtle assistant message background for visual separation
  • Heading font (Space Grotesk) in markdown renderer
  • Full context dashboard route (/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