diff --git a/CODEBASE-MAP.md b/CODEBASE-MAP.md new file mode 100644 index 00000000..9ce9c1e1 --- /dev/null +++ b/CODEBASE-MAP.md @@ -0,0 +1,419 @@ +# Nexus Codebase Map + +> **Purpose:** fast orientation for sessions that don't have the full conversation history loaded. This file is factual — generated by scanning the tree, not by reading intent docs. If something here contradicts a plan or spec, trust this file over the plans. +> +> **Branch:** `nexus/design-system-migration` +> **Last updated:** 2026-04-11 after Wave 3A completion. Phase 16a is running in the background at the time of this snapshot; see §7 and §8 for which files are expected to move. + +--- + +## 1. Directory tree (`ui/src/`, 2 levels) + +``` +ui/src/ +├── adapters/ — one subdir per AI adapter runtime (claude-local, +│ codex-local, cursor, gemini-local, hermes-local, +│ http, openclaw-gateway, opencode-local, pi-local, +│ process). Mostly glue between the UI and backend +│ provider clients. +├── api/ — typed client wrappers, one file per backend surface +│ (see §5 for the full list) +├── components/ +│ ├── assistant/ — Phase 9 + 12 Assistant-route widgets +│ ├── frame/ — Phase 8 + 14 global chrome (icon rail, top strip, +│ ⌘K button, global mic, mobile tab bar) +│ ├── onboarding/ — first-run wizard steps +│ ├── projects/ — Phase 11 hero-stat card, tab strip, per-project tabs +│ │ └── tabs/ — Phase 11 Overview + 5 TabPlaceholder tabs + Issues wire +│ ├── settings/ — Phase 13 single-column section cards +│ ├── studio/ — Phase 10 workshop grid + prompt bar + classifier +│ ├── transcript/ — run transcript viewer used by UX test lab +│ └── ui/ — shadcn-ish primitives (Button, Tooltip, Dialog, etc.) +├── context/ — React contexts (see §4) +├── fixtures/ — test fixtures +├── hooks/ — custom hooks (see §4) +├── lib/ — pure utilities (router wrapper, company-selection, +│ queryKeys, utils, instance-settings, etc.) +├── pages/ — route-level page components (see §3) +├── plugins/ — plugin host SDK internals +└── types/ — cross-cutting TypeScript types +``` + +**File sizes for orientation:** +- Largest page: `AgentDetail.tsx` (4104 L), `Inbox.tsx` (2028 L), `IssueDetail.tsx` (1696 L), `DesignGuide.tsx` (1532 L), `CompanyImport.tsx` (1355 L). These are legacy Paperclip pages. +- Largest Nexus-era pages: `ProjectDetail.tsx` (1006 L — Phase 11), `PersonalAssistant.tsx` (379 L — Phase 9), `StudioWorkshopDetail.tsx` (362 L — Phase 10), `Projects.tsx` (315 L — Phase 11 + Wave 2.5). +- Layout shell: `Layout.tsx` ~240 L (down from 510 L pre-Phase-8). + +--- + +## 2. Route map (from `ui/src/App.tsx` `boardRoutes()`) + +All routes are mounted under a company-prefixed root (`/:companyPrefix/*`) except `/instance/*` which is global. + +| Route | Component | Status | Notes | +|---|---|---|---| +| (index) | `` | LEGACY | Phase 16b will redirect to `/assistant` | +| `dashboard` | `Dashboard` | LEGACY | Kill in Phase 16b — Assistant conversational home replaces it | +| `onboarding` | `OnboardingRoutePage` | ACTIVE | First-run wizard | +| `companies` | `Companies` | LEGACY | Single-workspace; kill in Phase 16b | +| `company/settings` | `CompanySettings` | LEGACY | Overlaps with instance settings — Phase 16b decision | +| `company/export/*` | `CompanyExport` | ACTIVE | Still useful for workspace export | +| `company/import` | `CompanyImport` | ACTIVE | Still useful for workspace import | +| `skills/*` | `CompanySkills` | ACTIVE | Skill Aggregator — linked from Settings §Skills | +| `settings` | `LegacySettingsRedirect` → `/instance/settings/general` | REDIRECT | Phase 13 redirect | +| `settings/*` | `LegacySettingsRedirect` | REDIRECT | Phase 13 | +| `plugins/:pluginId` | `PluginPage` | ACTIVE | Plugin system | +| `org` | `OrgChart` | LEGACY | Demoted — Phase 16b kill | +| `agents` → `/agents/all` | Redirect | LEGACY | Phase 16b: redirect to `/projects` | +| `agents/all`, `/active`, `/paused`, `/error` | `Agents` | LEGACY | Per-project tab now; Phase 16b kill | +| `agents/new` | `NewAgent` | ACTIVE | Per-project agent creation | +| `agents/:agentId`, `/:tab`, `/runs/:runId` | `AgentDetail` | ACTIVE | Agent detail still needed | +| `projects` | `Projects` | **ACTIVE (Phase 11 + Wave 2.5)** | Hero-stat card grid | +| `projects/:projectId` | `ProjectDetail` | **ACTIVE (Phase 11)** | Default sub-route | +| `projects/:projectId/overview` | `ProjectDetail` | **ACTIVE** | Phase 11 Overview tab | +| `projects/:projectId/issues` | `ProjectDetail` | **ACTIVE** | Phase 11 Issues tab (real wire) | +| `projects/:projectId/issues/:filter` | `ProjectDetail` | **ACTIVE** | Filter sub-route | +| `projects/:projectId/agents` | `ProjectDetail` | **ACTIVE (placeholder)** | Phase 11 TabPlaceholder | +| `projects/:projectId/gates` | `ProjectDetail` | **ACTIVE (placeholder)** | Phase 11 TabPlaceholder | +| `projects/:projectId/costs` | `ProjectDetail` | **ACTIVE (placeholder)** | Phase 11 TabPlaceholder | +| `projects/:projectId/activity` | `ProjectDetail` | **ACTIVE (placeholder)** | Phase 11 TabPlaceholder | +| `projects/:projectId/org` | `ProjectDetail` | **ACTIVE (placeholder)** | Phase 11 TabPlaceholder, hidden for single-agent | +| `projects/:projectId/configuration` | `ProjectDetail` | LEGACY preserved | Phase 11 kept for backwards compat | +| `projects/:projectId/budget` | `ProjectDetail` | LEGACY preserved | Phase 11 kept for backwards compat | +| `issues`, `issues/all`, `/active`, `/backlog`, `/done`, `/recent` | `Issues` / redirects | LEGACY | Phase 16b kill — redirect to `/projects` | +| `issues/:issueId` | `IssueDetail` | ACTIVE | Issue detail still needed | +| `routines`, `routines/:routineId` | `Routines` / `RoutineDetail` | LEGACY | Phase 13 linked from Settings; Phase 16b kill top-level | +| `execution-workspaces/:workspaceId` | `ExecutionWorkspaceDetail` | ACTIVE | Workspace detail | +| `goals`, `goals/:goalId` | `Goals` / `GoalDetail` | LEGACY | Phase 16b kill — folded into Overview milestones | +| `approvals`, `/pending`, `/all`, `/:approvalId` | `Approvals` / `ApprovalDetail` | LEGACY | Phase 11 demoted → per-project Gates tab; Phase 16b kill top-level | +| `costs` | `Costs` | LEGACY | Phase 16b kill | +| `activity` | `Activity` | LEGACY | Phase 16b kill | +| `inbox`, `/mine`, `/recent`, `/unread`, `/all`, `/new` | `Inbox` / redirects | LEGACY | Phase 16b kill — replaced by Assistant dot + ⌘K | +| `assistant` | `PersonalAssistant` | **ACTIVE (Phase 9 + 12)** | Default landing | +| `assistant/:conversationId` | `PersonalAssistant` | **ACTIVE** | Conversation-specific | +| `content-studio` | `ContentStudio` | **ACTIVE (Phase 10 + Wave 2.5)** | Workshop grid | +| `content-studio/:workshopSlug` | `ContentStudio` | **ACTIVE** | Phase 10 workshop detail | +| `convert`, `/:sourceFormat`, `/:sourceFormat/:targetFormat` | `ConvertPage` | LEGACY preserved | Kept for bookmark compat; Studio has Convert workshop | +| `design-guide` | `DesignGuide` | ACTIVE | Internal design reference | +| `tests/ux/runs` | `RunTranscriptUxLab` | ACTIVE | UX test lab | +| `:pluginRoutePath` | `PluginPage` | ACTIVE | Plugin runtime | +| `*` | `NotFoundPage` | ACTIVE | 404 | +| `/instance/settings/general` | `InstanceGeneralSettings` | **ACTIVE (Phase 13)** | Single-column settings | +| `/instance/settings/heartbeats` → `/general` | Redirect | REDIRECT | Phase 13 collapsed | +| `/instance/settings/experimental` → `/general` | Redirect | REDIRECT | Phase 13 collapsed | +| `/instance/settings/plugins`, `/:pluginId` | `PluginManager` / `PluginSettings` | ACTIVE | Plugin system keeps its own settings sub-tree | + +**Unprefixed redirect routes** (catch direct-entered non-company-prefixed URLs): every top-level route has a matching `UnprefixedBoardRedirect` variant. Phase 13 also added unprefixed redirect routes for the new project sub-routes. + +--- + +## 3. Component inventory (frame + pages) + +### `ui/src/components/frame/` (Phase 8 + 14 + 15) + +| File | Lines* | Phase | Status | Purpose | +|---|---|---|---|---| +| `IconRail.tsx` | ~180 | 8 | ACTIVE | 56px left rail, 4 destinations, volt active state, Phase 11 gate-indicator dot | +| `IconRail.test.tsx` | ~200 | 8 | ACTIVE | 9 tests including gate-indicator dot | +| `ModeBreadcrumb.tsx` | ~110 | 8 | ACTIVE | Pure `deriveBreadcrumbSegments` + render component | +| `ModeBreadcrumb.test.tsx` | ~120 | 8 | ACTIVE | 22 tests (parameterized + rendered) | +| `CmdKButton.tsx` | ~30 | 8/14 | ACTIVE | Phase 14 rewired from synthetic keydown shim to `useCommandPalette().setOpen(true)` | +| `CmdKButton.test.tsx` | ~60 | 8/14 | ACTIVE | 2 tests + context consumer | +| `GlobalMicButton.tsx` | ~80 | 8/14 | ACTIVE | Phase 14 rewired from visual-only scaffold to `useVoice()` consumer | +| `GlobalMicButton.test.tsx` | ~80 | 8/14 | ACTIVE | 3 tests + context consumer | +| `TopStrip.tsx` | ~30 | 8 | ACTIVE | 48px sticky, composes breadcrumb + cmdK + mic | +| `TopStrip.test.tsx` | ~110 | 8 | ACTIVE | 4 tests; Wave 3A integration pass added context mocks | +| `MobileTabBar.tsx` | ~100 | 15 | ACTIVE | 56px bottom bar, 4 destinations, scroll-hide via `visible` prop | +| `MobileTabBar.test.tsx` | ~150 | 15 | ACTIVE | 12 tests | + +*Lines are approximate; exact counts drift with commits. + +**Pending (Phase 16a):** `destinations.ts` to consolidate the 4-destination config shared between `IconRail.tsx` and `MobileTabBar.tsx`. + +### `ui/src/components/assistant/` (Phase 9 + 12) + +| File | Phase | Status | Purpose | +|---|---|---|---| +| `AssistantInputBar.tsx` / `.test.tsx` | 9 | ACTIVE | Waveform + text input composite, anchored at chat bottom | +| `ActionStrip.tsx` / `.test.tsx` | 9/12 | ACTIVE | Promote / Attach / Memory / History 4-button row | +| `AssistantHomeGreeting.tsx` / `.test.tsx` | 9 | ACTIVE | Synthesized assistant-turn greeting when no active conversation | +| `HistorySheet.tsx` / `.test.tsx` | 9/15 | ACTIVE | Left slide-over (desktop), full-screen (mobile) | +| `MemorySheet.tsx` / `.test.tsx` | 9/15 | ACTIVE | Right slide-over (desktop), full-screen (mobile), wired to `assistantMemoryApi` | +| `BrainstormerPanel.tsx` / `.test.tsx` | 12 | ACTIVE | Goal / Acceptance / Gates / Engineer template form | +| `PromoteTransition.tsx` / `.test.tsx` | 12/15 | ACTIVE | 700ms compress-and-rise CSS animation + mobile takeover variant | + +### `ui/src/components/studio/` (Phase 10 + Wave 2.5) + +| File | Phase | Status | Purpose | +|---|---|---|---| +| `workshops.ts` / `.test.ts` | 10/2.5 | ACTIVE | 9-workshop data (Presentations added Wave 2.5) | +| `classifyIntent.ts` / `.test.ts` | 10/2.5 | ACTIVE | Keyword-based intent → workshop classifier; 38 test cases including pitch deck / slide deck patterns | +| `WorkshopCard.tsx` / `.test.tsx` | 10 | ACTIVE | Single card for the grid | +| `WorkshopGrid.tsx` / `.test.tsx` | 10 | ACTIVE | Responsive 3/2/1-column grid | +| `StudioPromptBar.tsx` / `.test.tsx` | 10 | ACTIVE | Freeform input → classifier → navigate or fall through to Assistant | + +### `ui/src/components/projects/` (Phase 11) + +| File | Status | Purpose | +|---|---|---| +| `ProjectCard.tsx` / `.test.tsx` | ACTIVE | Hero-stat card with 72px volt percentage | +| `BuilderTabStrip.tsx` / `.test.tsx` | ACTIVE | 7-tab strip with volt active underline, Org hidden for single-agent, horizontal scroll on mobile | +| `tabs/OverviewTab.tsx` / `.test.tsx` | ACTIVE | Phase 11 Overview with milestone checklist + Origin chat + Activity card | +| `tabs/IssuesTab.tsx` | ACTIVE | Thin wrapper around existing `IssuesList` with `projectId` prop (only tab with real wire) | +| `tabs/AgentsTab.tsx` | PLACEHOLDER | Phase 11 `TabPlaceholder` — see §7 | +| `tabs/GatesTab.tsx` | PLACEHOLDER | Phase 11 `TabPlaceholder` | +| `tabs/CostsTab.tsx` | PLACEHOLDER | Phase 11 `TabPlaceholder` | +| `tabs/ActivityTab.tsx` | PLACEHOLDER | Phase 11 `TabPlaceholder` | +| `tabs/OrgTab.tsx` | PLACEHOLDER | Phase 11 `TabPlaceholder` | +| `tabs/TabPlaceholder.tsx` | ACTIVE | Shared "PHASE 11 DATA GAP" card with per-tab rationale | + +### `ui/src/components/settings/` (Phase 13) + +| File | Status | Purpose | +|---|---|---| +| `SettingsSection.tsx` / `.test.tsx` | ACTIVE | Shared section card shell | +| `WorkspaceSection.tsx` / `.test.tsx` | ACTIVE | Root dir, theme, re-run onboarding, experimental toggles folded in | +| `LocalAISection.tsx` / `.test.tsx` | ACTIVE | Hermes / Whisper / Piper config | +| `CloudProvidersSection.tsx` / `.test.tsx` | ACTIVE | API keys (masked), Puter.js status | +| `SkillsSection.tsx` / `.test.tsx` | ACTIVE | Compact summary + link-out to Skill Aggregator | +| `RoutinesSection.tsx` / `.test.tsx` | ACTIVE | Compact read-only list + link-out to `/routines` | +| `TelegramSection.tsx` / `.test.tsx` | ACTIVE | Bot token, allowed chat IDs | +| `AboutSection.tsx` / `.test.tsx` | ACTIVE | Version, fork info, MIT | +| `DangerZoneSection.tsx` / `.test.tsx` | PLACEHOLDER | Disabled buttons — no server endpoints exist yet | + +### `ui/src/pages/` (key files) + +| File | Phase | Status | +|---|---|---| +| `PersonalAssistant.tsx` | 9/12/14 | ACTIVE — canonical Assistant | +| `ContentStudio.tsx` | 10 | ACTIVE — workshop grid host | +| `StudioWorkshopDetail.tsx` | 10 | ACTIVE — per-workshop detail view | +| `Projects.tsx` | 11/2.5 | ACTIVE — hero-stat list with derivatives | +| `ProjectDetail.tsx` | 11 | ACTIVE — Builder tabs + legacy `configuration`/`budget` preserved | +| `InstanceGeneralSettings.tsx` | 13 | ACTIVE — single-column settings | +| `Dashboard.tsx` | — | LEGACY — Phase 16b kill | +| `Companies.tsx` | — | LEGACY — Phase 16b kill (single workspace) | +| `Issues.tsx`, `Agents.tsx`, `Approvals.tsx`, `Costs.tsx`, `Activity.tsx`, `OrgChart.tsx`, `Goals.tsx`, `Inbox.tsx`, `Routines.tsx` | — | LEGACY — Phase 16b kill/redirect | +| `ConvertPage.tsx` | — | LEGACY preserved — `/convert` route kept for compat | +| `AgentDetail.tsx`, `IssueDetail.tsx`, `ApprovalDetail.tsx`, `GoalDetail.tsx`, `RoutineDetail.tsx` | — | ACTIVE — detail pages still needed | + +--- + +## 4. Context + hook map + +### Contexts (`ui/src/context/`) + +| Context | Provides | Main consumers | +|---|---|---| +| `CompanyContext` | `companies`, `selectedCompany`, `selectedCompanyId`, `setSelectedCompanyId` | Everything — it's the workspace selector | +| `DialogContext` | `openNewIssue`, `openNewProject`, `openNewGoal`, `openNewAgent`, `openOnboarding` | Layout, IconRail (nexus mark), Settings sections | +| `ThemeContext` | `theme` (`"dark"` \| `"light"`), `toggleTheme` | Settings Workspace section | +| `ToastContext` | `pushToast` | Across the app | +| `SidebarContext` | `isMobile`, legacy `sidebarOpen`/`setSidebarOpen` | Layout (reads `isMobile`) | +| `PanelContext` | Legacy `panelVisible` state | Unused post-Phase-8 (candidate for deletion) | +| `GeneralSettingsContext` | `keyboardShortcutsEnabled` | Keyboard shortcut hook | +| `BreadcrumbContext` | Legacy `breadcrumbs` state | Projects page calls `setBreadcrumbs` for BreadcrumbBar (now dead). Candidate to delete or repurpose. | +| **`VoiceContext`** (Phase 14) | `state`, `mediaStream`, `hasQueuedVoice`, `startListening`, `stopListening`, `drainQueue` | `GlobalMicButton`, `ChatInput`, `PersonalAssistant` queue drain | +| **`CommandPaletteContext`** (Phase 14) | `open`, `setOpen`, `toggle` + global Cmd+K listener | `CmdKButton`, `CommandPalette`, `Layout.onSearch` | +| `LiveUpdatesProvider` | SSE stream subscriptions | Chat, activity, project state | +| **`ChatPanelContext`** | Legacy `chatOpen`, `activeConversationId`, `scrollToMessageId` | `ChatMessageList` reads this — **Phase 16a migrating it off** | + +### Hooks (`ui/src/hooks/`, 39 total) + +Key Nexus-era hooks: +- `useAssistantHomeStatus` (Phase 9) — composes projects/agents/gates/activity for the home greeting +- `useGateIndicator` (Phase 11) — pending gate count for the IconRail volt dot +- `usePromoteToProject` (Phase 12) — state machine for the promote animation +- `useStreamingChat` (v1.3) — SSE chat stream +- `useChatConversations` / `useChatMessages` / `useChatSearch` / `useChatBookmarks` / `useChatFileUpload` (v1.3) +- `useVoiceMode` / `useVadRecorder` / `usePiperTts` (v1.6) — voice primitives; `useVadRecorder` is now orphaned post-Phase-14 (Phase 16a deletes) +- `useBrainstormerDefault` (v1.3) — brainstormer workflow default +- `useHardwareInfo` (v1.5) — hardware probe for onboarding +- `useInboxBadge` — legacy, still consumed by pre-Phase-15 code +- `useKeyboardShortcuts` — wired to `CommandPaletteContext` via Phase 14 +- `useMediaQuery` — single-breakpoint helper (768px) +- `useNexusMode` — mode detection (Assistant vs Project Builder) +- `useOfflineQueue`, `useOnlineStatus`, `useInstallPrompt` (v1.3 PWA) +- `useStreamingChat`, `useContentJob` (v1.7 content gen) + +--- + +## 5. API surface (`ui/src/api/`, 34 files) + +``` +access, activity, agents, approvals, assets, assistantMemory (Phase 9), +auth, budgets, chat, client (HTTP base), companies, companySkills, +contentJobs, convert, costs, dashboard, execution-workspaces, goals, +hardware, health, heartbeats, index (re-exports), instanceSettings, +issues, ollama, plugins, projects, push, puter-proxy, routines, +secrets, sidebarBadges, skillGroups, skillRegistry, telegram, +transcribe, (+ more) +``` + +**Phase 9 Assistant integration added:** `assistantMemoryApi` wired to MemorySheet — shape: `{ companyId, facts: string[], updatedAt }`, methods: `getMemory`, `appendFact`, `clearMemory`. + +**Phase 14 voice integration:** reuses `/api/transcribe` from v1.6, no new endpoints. + +**Phase 11 derivatives:** `Projects.tsx` composes `projectsApi.list` + `issuesApi.list` + `approvalsApi.list(_, "pending")` to derive per-project progress % from `closed_issues / total_issues` (see §7 for the TODO annotations). + +--- + +## 6. CSS token map (`ui/src/index.css`, 951 lines) + +### Dark mode (`.dark` — 158px from line 147) +``` +--background #000000 (pure black) +--foreground #ffffff +--card #141414 (near-black input fill) +--popover #141414 +--primary #faff69 (NEON VOLT — the brand) +--primary-foreground #151515 +--secondary #166534 (forest green) +--secondary-foreground #ffffff +--muted #141414 +--muted-foreground #a0a0a0 (silver) +--accent #141414 +--accent-foreground #faff69 +--destructive #ef4444 +--warning #f59e0b +--success #166534 +--border rgba(65, 65, 65, 0.8) (charcoal — workhorse) +--input #141414 +--ring #faff69 +--chart-1..5 volt, forest, silver, pale-yellow, red +--sidebar #000000 +``` + +### Light mode (`:root` — from line 87) +``` +--background #fafafa (near-white) +--foreground #0a0a0a +--card #ffffff +--primary #166534 (forest — volt downranked per MIGRATION-PLAN §5) +--primary-foreground #ffffff +--secondary #f1f5f1 +--muted-foreground #6b6b6b +--destructive #dc2626 +--warning #b45309 +--border rgba(20, 20, 20, 0.12) +--ring #166534 +--volt #4f5100 (dark olive — light-mode volt downrank) +``` + +### Direct brand references (in both modes) +``` +--volt / --volt-pale / --volt-border +--forest / --forest-dark +--near-black / --hover-gray / --silver +--charcoal-border / --charcoal-divider +``` + +### Chart role palette exception +Dark mode reserves `--chart-role-1` through `--chart-role-5` as 5 muted hues (olive, teal, violet, amber, gray) for agent-role differentiation. Documented as a deliberate exception to DESIGN.md's "single chromatic accent" rule. + +### `@theme inline` block (lines 25-85) +Maps CSS vars to Tailwind `--color-*` tokens so `text-primary`, `bg-card`, `border-border`, etc. all resolve correctly. + +--- + +## 7. Known issues (grep for TODO / FIXME / PHASE 11 DATA GAP / placeholder / TabPlaceholder) + +### Phase 11.5 data gaps — tracked for backlog plan at `docs/plans/2026-04-11-nexus-phase-11-5-per-project-scoping.md` + +| File:line | What's missing | +|---|---| +| `Projects.tsx:20` | `// Each proxy is marked with a // TODO(phase-11.5) comment and will be replaced by a real backend field when it lands` (comment block documenting the derivative strategy) | +| `Projects.tsx:49` | `TODO(phase-11.5): replace with server-side aggregates on the Project record` | +| `Projects.tsx:171` | `TODO(phase-11.5): replace with server-side aggregates on Project record` | +| `Projects.tsx:292` | `TODO(phase-11.5): replace with real milestoneProgress from the Project record` | +| `Projects.tsx:299` | `TODO(phase-11.5): replace with the real next-gate slot on the Project record` | + +### Phase 11 per-project tab placeholders (5 tabs) + +Every tab except `IssuesTab` renders `TabPlaceholder` with a "PHASE 11 DATA GAP" rationale. Files: `AgentsTab.tsx`, `GatesTab.tsx`, `CostsTab.tsx`, `ActivityTab.tsx`, `OrgTab.tsx`. Each explains the specific gap (e.g., "Agent type has no projectId field"). See Phase 11.5 plan for fix tickets. + +### Other markers in the tree + +~40 files match `TODO|FIXME|placeholder`. Most are normal in-code TODOs on legacy Paperclip pages (Inbox, CompanySettings, AgentDetail) that are slated for Phase 16b deletion. The Phase 11.5 tags are the high-signal ones. + +### Pre-existing typescript errors (not Nexus-overhaul-related, but present) + +Unrelated to the design system migration, these have been flagged across review cycles: +- `AgentConfigForm.tsx:351` — stale API ref +- `OnboardingSummaryStep.test.tsx` — missing `onRootDirChange` prop in ~7 test cases +- `ui/command.tsx:57` — bigint ReactNode type +- `useKeyboardShortcuts.ts:25` — FIXED in Phase 14 (was the missing-onSearch destructure) +- `useVadRecorder.ts:58` — stale Silero VAD options (file slated for Phase 16a deletion) +- `PersonalAssistant.tsx:231-234` — FIXED in Phase 9 (was stale toast tones) + +--- + +## 8. Migration status (verified against `git log --oneline`) + +### MIGRATION-PLAN.md phases 1–7 (visual repaint) + +| Phase | Status | Key commits | +|---|---|---| +| 1 — Tokens + Inter font | **DONE** | `e49144a4` feat(nexus): design system phase 1 tokens and inter font | +| 2 — Status + role color dictionaries | **DONE** | `4b8f8178` feat(nexus): design system phase 2 status and role color dictionaries | +| 3 — Raw utility sweep | **DONE** | `3a41ec7b` feat(nexus): design system phase 3 raw utility sweep | +| 4 — Typography + radius audit | **PENDING** | No commits yet | +| 5 — ThemePreviewPanel rewrite | **PENDING** | No commits yet | +| 6 — hljs syntax highlighting | **PENDING** | No commits yet | +| 7 — Visual QA pass | **PENDING** | No commits yet | + +### Layout overhaul phases 8–16 (structural) + +| Phase | Wave | Status | Commit count / notes | +|---|---|---|---| +| 8 — Frame skeleton | 1 | **DONE** | 10 commits (`332ed47b`…`2dbf2811`) | +| 9 — Assistant mode | 2 | **DONE** | 8 commits (`397e12a8`…`e43d5ec2`) | +| 10 — Studio mode | 2 | **DONE** | 5 commits (`533490f1`…`cd6c172d`), Presentations added as 9th workshop in Wave 2.5 | +| 11 — Projects + Builder mode | 2 | **DONE** | 7 commits (`6010a105`…`1e855657`), 5 tabs shipped as TabPlaceholder — see Phase 11.5 backlog | +| 12 — Promote-to-project transition | 3A | **DONE** | 3 commits (`d2d41886`, `70698b9e`, `b2775275`) + 1 attribution artifact in Phase 13's `f41690ff` | +| 13 — Settings consolidation | 3A | **DONE** | 6 commits (`7aa98d38`…`1a0d611c`) | +| 14 — Voice + ⌘K globalization | 3A | **DONE** | 6 commits (`14ecbf00`…`9b772aa1`) | +| 15 — Mobile parity | 3A | **DONE** | 1 commit (`4623c8ae`) | +| **Wave 2 integration** | — | **DONE** | `1b7e3d44` (routing + IconRail gate indicator) | +| **Wave 2.5** | — | **DONE** | `428f0336` (Presentations + ProjectCard derivatives + spec 8→9) | +| **Wave 3A integration** | — | **DONE** | `fb76b5ee` (TopStrip test provider mocks + PromoteTransition mobile variant + Layout onSearch cleanup) | +| 16a — Dead chrome cleanup | 3B | **IN PROGRESS** | Subagent running in background at time of this snapshot | +| 16b — Vocabulary sweep + route cleanup | 3B | **PENDING** | Blocked on 16a | + +### Non-overhaul commits mixed in + +- `137bd3d0` fix(nexus): unblank assistant page on piper-tts import error (fixed a namespace import bug surfaced at session start) +- `43ca8d30` docs(nexus): layout overhaul spec (spec commit itself) +- `2a42f4ab` docs(nexus): phase 8 frame skeleton implementation plan +- `3f0d3377` docs(nexus): wave 2 implementation plans (phases 9, 10, 11) +- `87b45c73` docs(nexus): wave 3 plans (phases 12-16) + phase 11.5 backlog + +### Plans committed but not yet executed + +All five Wave 3 plans + Phase 11.5 backlog plan live at: +- `docs/plans/2026-04-11-nexus-phase-11-5-per-project-scoping.md` — backlog +- `docs/plans/2026-04-11-nexus-phase-12-promote-transition.md` — DONE +- `docs/plans/2026-04-11-nexus-phase-13-settings-consolidation.md` — DONE +- `docs/plans/2026-04-11-nexus-phase-14-voice-cmdk-globalization.md` — DONE +- `docs/plans/2026-04-11-nexus-phase-15-mobile.md` — DONE +- `docs/plans/2026-04-11-nexus-phase-16-cleanup.md` — IN PROGRESS as 16a, pending as 16b + +The layout overhaul spec is at `docs/specs/2026-04-11-nexus-layout-overhaul.md`. It was amended post-Wave-2 to reflect the 8→9 workshop count (Presentations restoration). + +--- + +## Appendix: Dead code files slated for deletion (pre-16a snapshot) + +| File | Status | Reason | +|---|---|---| +| `ui/src/components/ChatPanel.tsx` | ALIVE | Phase 8 unmounted from Layout; Phase 16a deletes | +| `ui/src/context/ChatPanelContext.tsx` | ALIVE | Phase 16a deletes AFTER migrating ChatMessageList off it | +| `ui/src/components/Sidebar.tsx` | ALIVE | Phase 8 unmounted; Phase 16a deletes | +| `ui/src/components/BreadcrumbBar.tsx` | ALIVE | Phase 8 unmounted; Phase 16a deletes | +| `ui/src/components/PropertiesPanel.tsx` | ALIVE | Phase 8 unmounted; Phase 16a deletes | +| `ui/src/components/VoiceMicButton.tsx` | ALIVE | Phase 14 orphaned; Phase 16a deletes | +| `ui/src/hooks/useVadRecorder.ts` | ALIVE | Phase 14 orphaned; Phase 16a deletes | +| `ui/src/components/InstanceSidebar.tsx` | **DELETED** | Phase 13 deleted | +| `ui/src/components/MobileBottomNav.tsx` | **DELETED** | Phase 15 deleted | + +Phase 16a is expected to move all 7 ALIVE entries to DELETED. diff --git a/PROJECT-STATUS.md b/PROJECT-STATUS.md new file mode 100644 index 00000000..3423b805 --- /dev/null +++ b/PROJECT-STATUS.md @@ -0,0 +1,280 @@ +# Nexus Project Status + +> **Purpose:** snapshot of where the project is right now — what's shipped, what's blocked, what to do next. Generated by scanning git log + code + reading `.planning/` and `docs/`. If this file disagrees with any plan or spec, trust this file; the code is the source of truth. +> +> **Last updated:** 2026-04-11, mid-Wave-3B. Phase 16a is running in the background at the time of this snapshot; the "Wave 3B in progress" sections will need a refresh when 16a completes. + +--- + +## 1. Current milestone + +- **Version:** v1.7 — Content Generation +- **Branch:** `nexus/design-system-migration` +- **Active work:** the **Nexus layout and information architecture overhaul** (a separate, parallel track from the v1.7 content-generation milestone). The overhaul is delivered as phases 8–16 of `MIGRATION-PLAN.md` + the layout spec at `docs/specs/2026-04-11-nexus-layout-overhaul.md`. +- **v1.7 goal:** "Comprehensive content generation layer — agents produce visual, document, and media content as real deliverables." The layout overhaul reshapes how these generators are surfaced (Studio workshops) without changing their internals. +- **Main/upstream branch:** `PAP-878-create-a-mine-tab-in-inbox`. Nexus maintains display-layer differentiation; schema/API identifiers stay upstream-compatible for periodic rebases. + +### v1.7 content-generation milestone status + +Active requirements from `.planning/PROJECT.md` mapped to implementation: + +| Requirement | Status | Where | +|---|---|---| +| Presentations & video via Remotion | DONE (v1.7 phase 44) | `PresentationPanel.tsx`, wired into Studio as the 9th workshop in Wave 2.5 | +| Placeholder assets with DRAFT styling | Partial — DRAFT manifest exists server-side | — | +| Theme & palette generator | DONE (v1.7 phase 41) | Studio `themes` workshop | +| Wallpapers & visual assets | DONE (v1.7 phase 42) | Studio `wallpapers` workshop | +| Diagram generation | DONE (v1.7 phase 41) | Studio `diagrams` workshop | +| Document generation (PDF) | DONE (v1.7 phase 43) | Studio `documents` workshop | +| Icon generation | DONE (v1.7 phase 41) | Studio `icons` workshop | +| Social media content | DONE (v1.7 phase 42) | Studio `social` workshop | +| Branding media kit | DONE (v1.7 phase 43) | Studio `brand-kits` workshop | +| Whisper voice input in web chat | DONE (v1.6 phase 37) | ChatInput voice mic — lifted into VoiceContext in layout phase 14 | +| Content types as installable Nexus skills | DONE (v1.7 phase 45) | 9 SKILL.md files, Creative group | + +--- + +## 2. Design system migration status (phases 1–7, visual repaint) + +Verified by `git log --oneline` on `nexus/design-system-migration`. + +| Phase | Title | Status | Commits | +|---|---|---|---| +| 1 | Foundation — `index.css` tokens + Inter font | **DONE** | `e49144a4` | +| 2 | Status + role color dictionaries | **DONE** | `4b8f8178` | +| 3 | Raw utility sweep | **DONE** | `3a41ec7b` | +| 4 | Typography + radius audit | **PENDING** | No commits | +| 5 | ThemePreviewPanel rewrite | **PENDING** | No commits | +| 6 | hljs syntax highlighting | **PENDING** | No commits | +| 7 | Visual QA pass | **PENDING** | No commits | + +**Note:** phases 4–7 are independent of the layout overhaul (phases 8–16) and can run before or after. The user explicitly chose to push the structural overhaul first because visual polish layers on top; the layout has bigger leverage. + +--- + +## 3. Layout overhaul status (phases 8–16, structural) + +| Phase | Wave | Title | Status | Commits | +|---|---|---|---|---| +| 8 | 1 | Frame skeleton (IconRail + TopStrip + killed chrome) | **DONE** | 10 commits `332ed47b`…`2dbf2811` | +| 9 | 2 | Assistant mode (full-bleed chat + slide-overs + home greeting) | **DONE** | 8 commits `397e12a8`…`e43d5ec2` | +| 10 | 2 | Studio mode (9-workshop grid, Convert folded in, Presentations restored) | **DONE** | 5 commits `533490f1`…`cd6c172d` + Wave 2.5 | +| 11 | 2 | Projects + Builder mode (hero cards + tab strip + 5 placeholder tabs) | **DONE (with 5 TabPlaceholders)** | 7 commits `6010a105`…`1e855657` | +| 12 | 3A | Promote-to-project 700ms transition | **DONE** | 3 commits `d2d41886`, `70698b9e`, `b2775275` + 1 in `f41690ff` (attribution artifact) | +| 13 | 3A | Settings consolidation (single-column, 8 sections) | **DONE** | 6 commits `7aa98d38`…`1a0d611c` | +| 14 | 3A | Voice + ⌘K globalization | **DONE** | 6 commits `14ecbf00`…`9b772aa1` | +| 15 | 3A | Mobile parity (MobileTabBar + sheet variants) | **DONE** | 1 commit `4623c8ae` | +| **Wave 2 controller integration** | — | Wire routing + icon rail gate dot | **DONE** | `1b7e3d44` | +| **Wave 2.5 follow-ups** | — | Presentations workshop + ProjectCard derivatives + spec drift fix | **DONE** | `428f0336` | +| **Wave 3A controller integration** | — | TopStrip test providers + PromoteTransition mobile variant + Layout onSearch cleanup | **DONE** | `fb76b5ee` | +| 16a | 3B | Dead chrome cleanup (delete 7 files + DRY destinations + flex layout fix) | **IN PROGRESS** | Subagent running in background | +| 16b | 3B | Vocabulary sweep + route cleanup + visual QA | **PENDING** | Blocked on 16a | + +### Wave summary + +- **Wave 1:** Phase 8 alone — foundational frame +- **Wave 2:** Phases 9, 10, 11 dispatched in parallel as 3 subagents +- **Wave 2.5:** Controller follow-up batching Presentations fix, ProjectCard derivatives, spec 8→9 drift +- **Wave 3A:** Phases 12, 13, 14, 15 dispatched in parallel as 4 subagents +- **Wave 3B:** Phase 16 split into 16a (dead code, running now) and 16b (vocabulary + routes, pending) + +--- + +## 4. Known placeholders (from grep) + +### Phase 11.5 data gaps — queued for backlog plan `docs/plans/2026-04-11-nexus-phase-11-5-per-project-scoping.md` + +**Five per-project tabs shipped as `TabPlaceholder` because reusable list components with `projectId` props don't exist:** + +| Tab | File | Missing | +|---|---|---| +| Agents | `ui/src/components/projects/tabs/AgentsTab.tsx` | `Agent` type has no `projectId`; `AgentList` isn't a standalone component | +| Gates | `ui/src/components/projects/tabs/GatesTab.tsx` | `Approval.payload.projectId` is untyped; `ApprovalsList` isn't a standalone | +| Costs | `ui/src/components/projects/tabs/CostsTab.tsx` | `CostsBreakdown` doesn't exist; `Costs.tsx` is 1100 lines inline | +| Activity | `ui/src/components/projects/tabs/ActivityTab.tsx` | `activityApi` supports server-side entity filtering but no standalone feed component | +| Org | `ui/src/components/projects/tabs/OrgTab.tsx` | `agentsApi.org()` returns company-wide tree with no per-project scoping. Backlog plan recommends dropping this tab entirely | + +Each renders a "PHASE 11 DATA GAP" card with precise rationale; honest and diagnosable, not fabricated. + +### ProjectCard hero-stat proxies — Wave 2.5 derivatives + +**Five `TODO(phase-11.5)` annotations in `ui/src/pages/Projects.tsx`** (lines 20, 49, 171, 292, 299). The hero-stat card computes `progress` from `closed_issues / total_issues`, `nextGateName` from the first pending approval whose `payload.projectId` matches, and `lastActivity` from `max(project.updatedAt, newest issue.updatedAt)`. These proxies were the Wave 2.5 "don't ship em-dash city" compromise; real backend aggregates on `Project` are the backlog fix. + +**Hard data gaps still rendering as em-dashes:** +- `phase` / `milestones` — no milestone field on the `Project` record. Overview tab shows "No milestones defined." +- `costBurnedCents` — no aggregate field. Card footer shows `—`. +- `originConversationId` — no link from project → conversation. Origin Chat card omitted. +- `activeAgentsCount` per project — hard-coded to 0. + +### Other placeholders + +- `DangerZoneSection.tsx` renders `disabled` "Reset workspace" and "Delete all conversations" buttons — no server endpoints exist yet. Honest placeholder per plan. +- `PresentationPanel` has always-hardcoded generator — Studio fold-in via `componentKey: "presentation"`. + +--- + +## 5. Blocked work + +### Phase 11.5 — 5 per-project tab scoping tickets + +Cannot proceed without one of: +- Adding `projectId` to the `Agent` shared type + reverse index (backend change) +- Adding typed `projectId` to `Approval.payload` (backend change) +- Extracting `AgentList` / `ApprovalsList` / `CostsBreakdown` / `ActivityFeed` / `OrgChart` as standalone projectId-aware components (frontend extraction — easier) + +The backlog plan at `docs/plans/2026-04-11-nexus-phase-11-5-per-project-scoping.md` breaks this into 5 independent tickets. Trigger is UX pain or explicit milestone pull-in. + +### ProjectCard real fields + +Not strictly blocked — Wave 2.5 computes proxies — but the ideal fix adds real backend aggregate fields to the `Project` record: +- `milestoneProgress: number` (0–100) +- `milestones: ProjectMilestone[]` +- `nextGateName: string | null` +- `costBurnedCents: number` +- `originConversationId: string | null` +- `activeAgentsCount: number` + +Backend ticket, not UI. + +### Phase 16a hazard — `ChatMessageList` migration + +`ChatMessageList.tsx` reads `activeConversationId` and `scrollToMessageId` from `ChatPanelContext`. Phase 16a MUST migrate this off before deleting the context. Phase 9's report explicitly flagged this. Phase 16a's instructions cover it; if Phase 16a reports BLOCKED on this item, that's the hazard firing. + +--- + +## 6. Dead code inventory + +**Pre-16a snapshot — Phase 16a running in background is expected to move ALIVE entries to DELETED.** + +| File | Status (pre-16a) | Reason for deletion | Owner phase | +|---|---|---|---| +| `ui/src/components/ChatPanel.tsx` | ALIVE | Phase 8 unmounted | 16a | +| `ui/src/context/ChatPanelContext.tsx` | ALIVE | Phase 16a migrates ChatMessageList off first | 16a | +| `ui/src/components/Sidebar.tsx` | ALIVE | Phase 8 unmounted | 16a | +| `ui/src/components/BreadcrumbBar.tsx` | ALIVE | Phase 8 unmounted | 16a | +| `ui/src/components/PropertiesPanel.tsx` | ALIVE | Phase 8 unmounted | 16a | +| `ui/src/components/VoiceMicButton.tsx` | ALIVE | Phase 14 orphaned | 16a | +| `ui/src/hooks/useVadRecorder.ts` | ALIVE | Phase 14 orphaned | 16a | +| `ui/src/components/InstanceSidebar.tsx` | **DELETED** | Phase 13 | — | +| `ui/src/components/MobileBottomNav.tsx` | **DELETED** | Phase 15 | — | + +**After 16a completes, re-run `ls ui/src/components/{ChatPanel,Sidebar,BreadcrumbBar,PropertiesPanel,VoiceMicButton}.tsx ui/src/context/ChatPanelContext.tsx ui/src/hooks/useVadRecorder.ts` to confirm all 7 are gone.** + +--- + +## 7. Route status + +From `ui/src/App.tsx boardRoutes()`. Marks reflect the post-Wave-3A state. + +### Active (new Nexus destinations) + +- `/assistant` — PersonalAssistant (Phase 9+12+14) +- `/assistant/:conversationId` — PersonalAssistant +- `/content-studio` — ContentStudio (Phase 10 + Wave 2.5) +- `/content-studio/:workshopSlug` — ContentStudio workshop detail +- `/projects` — Projects (Phase 11 + Wave 2.5) +- `/projects/:projectId/overview` — ProjectDetail Overview tab +- `/projects/:projectId/issues` — ProjectDetail Issues tab (real wire) +- `/projects/:projectId/agents` — ProjectDetail Agents tab (placeholder) +- `/projects/:projectId/gates` — ProjectDetail Gates tab (placeholder) +- `/projects/:projectId/costs` — ProjectDetail Costs tab (placeholder) +- `/projects/:projectId/activity` — ProjectDetail Activity tab (placeholder) +- `/projects/:projectId/org` — ProjectDetail Org tab (placeholder) +- `/instance/settings/general` — Phase 13 single-column settings +- `/instance/settings/plugins`, `/plugins/:pluginId` — plugin subsystem (kept) + +### Redirects (Phase 13 + historical) + +- `/instance` → `/instance/settings/general` +- `/instance/settings/heartbeats` → `/general` +- `/instance/settings/experimental` → `/general` +- `/settings`, `/settings/*` → `/instance/settings/general` +- `/approvals` → `/approvals/pending` +- `/inbox` → `/inbox/mine` (legacy) +- `/agents` → `/agents/all` (legacy) + +### Legacy (pending Phase 16b deletion or redirect) + +- `/dashboard` — Dashboard.tsx → Phase 16b: delete +- `/companies` — Companies.tsx → Phase 16b: delete (single workspace) +- `/org` — OrgChart.tsx → Phase 16b: delete +- `/agents/all`, `/active`, `/paused`, `/error` — Agents.tsx → Phase 16b: redirect `/agents` → `/projects` +- `/issues`, `/issues/all`, `/active`, `/backlog`, `/done`, `/recent` → Phase 16b: redirect `/issues` → `/projects` +- `/issues/:issueId` — IssueDetail.tsx → ACTIVE (kept — detail page still needed) +- `/routines`, `/routines/:routineId` → Phase 16b: delete top-level (Phase 13 linked from Settings) +- `/goals`, `/goals/:goalId` → Phase 16b: delete (folded into Overview) +- `/approvals/*` → Phase 16b: delete (demoted to per-project Gates tab) +- `/costs` — Costs.tsx → Phase 16b: delete +- `/activity` — Activity.tsx → Phase 16b: delete +- `/inbox/*` — Inbox.tsx → Phase 16b: delete +- `/convert`, `/:sourceFormat`, `/:sourceFormat/:targetFormat` → LEGACY PRESERVED (Studio has the Convert workshop, but `/convert` bookmark redirect for now) +- `/company/settings` — CompanySettings.tsx → Phase 16b decision (overlaps with instance settings) + +### Other actives (kept because detail pages still needed) + +- `/agents/new`, `/agents/:agentId`, `/:tab`, `/runs/:runId` +- `/projects/:projectId` (root), `/projects/:projectId/configuration`, `/projects/:projectId/budget` +- `/execution-workspaces/:workspaceId` +- `/company/export/*`, `/company/import` +- `/skills/*` (Skill Aggregator linked from Settings) +- `/design-guide`, `/tests/ux/runs` +- `/:pluginRoutePath` +- `/*` (NotFound) + +--- + +## 8. Pending decisions + +### From MIGRATION-PLAN.md §10 — still unresolved for visual phases 4–7 + +1. **Light mode:** ship / drop / iterate? Light mode tokens already exist in `index.css` (`:root` block) but the visual phases to validate them haven't run. +2. **Basier font:** license / Inter only / free alternative? Current state: Inter everywhere. Decision pending. +3. **Destructive color:** current dark is `#ef4444`, light is `#dc2626`. Effectively resolved via the shipped tokens. +4. **Role hue collapse vs preserve:** resolved — `--chart-role-1..5` exception documented in `index.css`. +5. **Display 900:** resolved — used in the 72px ProjectCard hero and 96px empty state. +6. **Theme toggle UX:** resolved — binary light/dark, toggle in Settings Workspace section. +7. **Tokyo Night removal:** resolved — deleted in Phase 1 commit. + +### From the layout overhaul + +1. **Presentations workshop:** RESOLVED — added as 9th workshop in Wave 2.5 per user decision (C). Spec updated from 8→9. +2. **Phase 11 placeholder tabs:** RESOLVED — user accepted (A) + draft 11.5 plan. Both shipped. +3. **ProjectCard derivatives:** RESOLVED — user chose (B) compute from derivatives. Shipped in Wave 2.5. +4. **Phase 16 scope split:** RESOLVED — 16a (dead code + DRY + flex fix) and 16b (vocab + routes + visual QA). +5. **MobileTabBar FAB + badge:** RESOLVED — user chose (A) ship pure, no FAB/badge. ⌘K handles new-issue on mobile. + +### Open for future milestones + +- Recipe registry v1.8 — planned, not yet started. Phase 14 stubbed the "Recipes" group in the command palette as disabled placeholder. +- Phase 11.5 trigger — when does the `TabPlaceholder` UX pain justify promoting the 5 tickets to active work? User's call. +- Backend Project record enrichment (milestoneProgress, originConversationId, costBurnedCents, activeAgentsCount) — backlog. +- Phase 16b `/issues` and `/agents` redirect targets — confirmed in user's resume prompt: both redirect to `/projects`. + +--- + +## 9. Next actions (ordered) + +1. **Wait for Phase 16a subagent to complete.** Check via the background task notification system. +2. **Review Phase 16a output.** Verify all 7 dead files are deleted, ChatMessageList is migrated cleanly, destinations.ts extracted, PersonalAssistant flex layout fix applied. +3. **Run full test sweep** after 16a: `npx vitest run src/components/frame/ src/components/assistant/ src/components/studio/ src/components/projects/ src/components/settings/ src/context/ src/hooks/`. Expected: still 294+ tests passing. +4. **Dispatch Phase 16b** as a sequential subagent with the scope confirmed by user decisions: + - Vocabulary sweep "company" → "workspace" in UI strings only + - Delete `/dashboard`, `/goals`, `/costs`, `/activity`, `/org`, `/inbox`, `/convert`, `/approvals`, `/routines` + - `/issues` → redirect to `/projects` + - `/agents` → redirect to `/projects` + - Visual QA pass against DESIGN.md +5. **Run final test sweep** after 16b. +6. **Update `PROJECT-STATUS.md`** (this file) to mark 16a and 16b as DONE. +7. **Update `CODEBASE-MAP.md`** dead-code appendix to mark the 7 files as DELETED. +8. **Decide next priority:** + - Run visual migration phases 4–7 (typography audit, ThemePreviewPanel rewrite, hljs, visual QA) + - Or start Phase 11.5 tickets + - Or switch back to the v1.7 content-generation milestone work + - Or move to the v1.8 Recipe Registry milestone + +### Hard hazards to remember + +- **Upstream sync:** all commits on this branch use `[nexus]` (or `feat(nexus):`/`refactor(nexus):`) prefix. Don't rename backend identifiers. `company` in TypeScript/API/DB stays; `workspace` is display-only. +- **DESIGN.md is law:** anything conflicting with DESIGN.md loses. Pure black canvas, volt `#faff69` accent, forest `#166534` secondary, Inter 900 display, sharp 4/8 radii, charcoal `rgba(65,65,65,0.8)` borders. +- **No terminal for users:** zero-terminal principle. Every surface must be reachable through the UI. +- **Shared-file dispatch rule:** for parallel subagents editing shared files (`PersonalAssistant.tsx`, `Layout.tsx`, `App.tsx`, `main.tsx`), each subagent must `git add` only its own new files. Controller handles shared-file integration commit. See `~/.claude/projects/-opt-nexus/memory/feedback_parallel_dispatch_shared_files.md`.