Six plans drafted after Wave 2 completed:
Phase 11.5 — per-project scoping follow-up (BACKLOG)
The 5 BLOCKED tabs from Phase 11 (Agents, Gates, Costs, Activity,
Org) each need projectId scoping in the corresponding backend types
and list components. Not time-critical — shipped as TabPlaceholder
components in Phase 11 with honest data-gap badges. Each of the 5
tickets is self-contained and can run independently when the
placeholder UX hurts or when Wave 3 completes. Recommends dropping
the Org tab entirely rather than building per-project scoping for it.
Phase 12 — Promote-to-project transition (WAVE 3)
Replaces Phase 9's synchronous assistantHandoff() with the animated
700ms compress-and-rise from spec 5.6. New files: PromoteTransition,
BrainstormerPanel, usePromoteToProject state machine. CSS-first
animation, not Motion library. Respects prefers-reduced-motion.
Depends on Phase 9 (Assistant) and Phase 11 (Projects).
Phase 13 — Settings consolidation (WAVE 3)
Collapses the nested instance-settings tree into a single-column
scroll with 8 section cards (Workspace, LocalAI, Cloud, Skills,
Routines, Telegram, About, Danger). Phase 13 is the one phase
where routing changes ARE phase-owned: it strips nested
/instance/settings sub-routes and replaces with Navigate redirects.
Phase 14 — Voice + CmdK globalization (WAVE 3)
Lifts voice state out of ChatInput's internal VoiceMicButton into
a shared VoiceContext so the top-strip GlobalMicButton becomes
functional from any route, with speech queued to the Assistant
inbox per spec 5.5. Replaces the CmdKButton synthetic-keydown shim
with a real CommandPaletteContext. Extends CommandPalette search
to cover conversations, projects, issues, agents, settings,
workshops. Also fixes the pre-existing useKeyboardShortcuts.ts
destructure bug caught during Phase 6/11 reviews.
Phase 15 — Mobile parity (WAVE 3)
4-destination MobileTabBar replacing MobileBottomNav. History +
Memory sheets become full-screen on mobile. Promote transition
uses a full-screen takeover instead of split layout. BuilderTabStrip
scrolls horizontally with edge fades. Single 768px breakpoint.
Phase 16 — Cleanup pass (WAVE 4, sequential)
Deletes dead chrome files (ChatPanel, ChatPanelContext, Sidebar,
InstanceSidebar, BreadcrumbBar, PropertiesPanel, MobileBottomNav).
Migrates ChatMessageList off ChatPanelContext first (flagged
hazard from Phase 9). Vocabulary sweep company to workspace in
UI strings only (backend keeps company identifiers per upstream
sync constraint). Fixes the minor issues accumulated across
Phase 8-15 reviews (useKeyboardShortcuts destructure bug,
GlobalMicButton test double-render, Projects umbrella regex
duplication, PersonalAssistant brittle fixed height). Visual
QA pass.
Wave structure for Wave 3 dispatch:
Wave 3A: Phase 12, Phase 13, Phase 14, Phase 15 in parallel
(4 subagents, disjoint file ownership)
Wave 3B: Phase 16 sequential (intentionally touches everything)
Phase 11.5 stays in backlog — not in any wave. It activates when
the TabPlaceholder UX becomes a friction point or when a milestone
explicitly pulls one of its tickets into scope.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9.5 KiB
Nexus Phase 16 — Cleanup Pass
Sequential, not parallel. This phase touches everything. Use
superpowers:test-driven-developmentonly for any non-trivial logic change; most of Phase 16 is deletion and find-replace.
Goal: Delete the dead chrome code that Phase 8 unmounted, sweep the UI copy for "company" → "workspace" (or deletion), fix accumulated minor issues surfaced by review cycles across Phases 8–15, and perform a final visual QA pass.
Source of truth: spec §2 "Killed list" and the list of known minor issues logged across Phase 8–15 reviews.
Branch: nexus/design-system-migration. This is the LAST phase of the structural overhaul.
Ownership boundaries
Phase 16 is intentionally broad. You may touch any file in ui/src/ that contains dead chrome code, legacy vocabulary, or accumulated cruft. However:
- Do NOT touch
server/,packages/, orcli/— the backend vocabulary stays per PROJECT.md's upstream-sync constraint - Do NOT touch any test file unless its assertions reference dead code you're deleting
- Do NOT introduce new features — this is strictly subtraction
- Do NOT touch the
.planning/directory
If in doubt whether a file is dead, run grep -r "<SymbolName>" ui/src/ — if there are zero remaining consumers, it's dead. If there's any consumer, escalate before deleting.
Scope
1. Delete dead chrome files (spec §2 "Killed list")
Files Phase 8 unmounted but didn't delete. Verify each has zero consumers, then delete:
ui/src/components/ChatPanel.tsx— the old 380px slide-in chat panel- HAZARD:
ChatMessageListis hard-bound toChatPanelContext(Phase 9 note). Before deletingChatPanelContext.tsx, migrateChatMessageListoff it. See "ChatMessageList migration" below.
- HAZARD:
ui/src/context/ChatPanelContext.tsx— only afterChatMessageListmigrationui/src/components/PropertiesPanel.tsx— unless a page-level usage still exists (grep first)ui/src/components/Sidebar.tsx— the 280px left sidebarui/src/components/InstanceSidebar.tsx— already slated by Phase 13; confirm deletedui/src/components/BreadcrumbBar.tsx— replaced by ModeBreadcrumbui/src/components/MobileBottomNav.tsx— replaced by MobileTabBar (Phase 15)
For each deletion, also delete the corresponding .test.tsx / .stories.tsx file and search the codebase for any remaining imports. If any import survives, fix it in the same commit.
2. ChatMessageList migration
Phase 9 flagged: ChatMessageList.tsx reads activeConversationId / scrollToMessageId from ChatPanelContext. Phase 16 must migrate these reads OFF the legacy context before deleting it.
Migration strategy: introduce AssistantChatContext in ui/src/context/AssistantChatContext.tsx that owns activeConversationId and scrollToMessageId. Update ChatMessageList to consume it. Update PersonalAssistant and any other consumers to provide the new context. Delete ChatPanelContext only AFTER all consumers moved.
Alternative: if the state is better owned by URL params (/:conversationId + a query param for scroll target), refactor that way. Cleaner but more invasive.
3. Vocabulary sweep — "company" → "workspace"
Per spec §2: "Any text containing 'company', 'companies', 'workspace member', 'tenant' → vocabulary cleanup."
Scope: display-only strings in ui/src/. Do NOT rename code symbols. The UI says "workspace" while the backend keeps company / companyId identifiers forever (upstream sync constraint from PROJECT.md).
- Find all UI strings with "company" / "Company" / "companies" / "Companies" / "Tenant" / "tenant"
- Replace with "workspace" / "Workspace" / "workspaces" / "Workspaces"
- Exception: if
@paperclipai/brandingalready has aVOCAB.companytoken that resolves to "Workspace", just use that — don't hand-type the replacement - Exception: error messages from the backend that include "company" — leave alone, they come from the server
4. Minor issues accumulated across Phase 8–15 reviews
These were flagged during reviews but deferred to Phase 16. Fix each in a clearly-labelled commit:
useKeyboardShortcuts.ts:12-17destructure bug — the type declaresonSearch?: () => voidbut the destructure omits it, so the call at line 25 always resolves to undefined. If Phase 14 hasn't already fixed this, fix it here.GlobalMicButton.test.tsxdouble-render warning — the test'srender(state)helper is called 3 times in one test without unmounting between. Cosmetic but noisy. Refactor to unmount between renders or split into 3 separate tests.IconRail.tsxProjects umbrella regex repetition — 10 regexes with||. Extract to a constant list +.some()helper. Coordinate with Phase 11's note about duplicated-umbrella-list-drift.PersonalAssistant.tsxmessage-thread fixed heightcalc(100vh - 320px)— brittle. Investigate replacing with a flex layout that derives height from flex parent, now that the surrounding chrome is stable.Projects.tsxphase / costBurnedCents / activeAgentsCount gaps — still rendering as null. Phase 16 doesn't fix the data gaps (that's Phase 11.5), but it removes the// TODOcomments that were added by Wave 2.5 IF Phase 11.5 has already landed.- Spec drift from Phase 10 commit 5 missing body — optional: amend the commit or just leave it. Low priority.
- Phase 10
PresentationPanelfold-in — Wave 2.5 already handled this. If Phase 16 findsPresentationPanelis dead code for any reason (e.g. spec changed), delete it.
5. Top-level route deletion decisions
Phase 11 demoted several routes to per-project tabs but kept them at the top level for backwards compat:
/issues→ now a per-project tab. Delete?/agents→ now a per-project tab. Delete?/approvals→ now a per-project/gatestab. Delete?/costs→ now a per-project tab. Delete?/activity→ now a per-project tab. Delete?/inbox→ replaced by Assistant dot + ⌘K. Delete?/goals→ folded into Overview milestone checklist. Delete?/routines→ moved to Settings in Phase 13. Delete?/org→ now a per-project tab. Delete?/dashboard→ replaced by Assistant home greeting. Delete?/convert→ folded into Studio. Delete?
Decision rule: delete IF the corresponding Phase 11 / 13 / 15 replacement fully covers the use case AND there are no external bookmarks / docs pointing at the route. If in doubt, keep and flag for user decision.
Safer default: keep all of them for now as backwards-compat redirects. If Phase 16 finds clear dead code (component exists but its route is already a <Navigate> to a new home), delete. If the page still renders real UI, keep.
6. Visual QA pass
Walk every top-level route in the dev server, compare against DESIGN.md principles and the layout spec. Capture issues as a short list and either fix inline or file follow-up tickets. No code changes unless issues found.
Routes to walk:
/assistant(with and without active conversation)/content-studio+ each workshop/projects(populated and empty states)/projects/<slug>/overview+ each tab/instance/settings/general/convert(legacy)/approvals(legacy)
Sequential commits (suggested)
This phase is naturally sequential. Each commit is reviewable independently.
refactor(nexus): migrate ChatMessageList off ChatPanelContext (phase 16)refactor(nexus): delete legacy chrome files (phase 16)— Sidebar, InstanceSidebar, ChatPanel, ChatPanelContext, PropertiesPanel, BreadcrumbBar, MobileBottomNavrefactor(nexus): vocabulary sweep company -> workspace (phase 16)fix(nexus): useKeyboardShortcuts destructure bug (phase 16)refactor(nexus): fix GlobalMicButton test double-render warning (phase 16)refactor(nexus): extract shared PROJECTS_UMBRELLA constant (phase 16)refactor(nexus): PersonalAssistant message-thread flex layout (phase 16)refactor(nexus): delete dead top-level routes (phase 16)— only routes whose components are pure redirectsdocs(nexus): visual QA findings (phase 16)— any issues found during QA, either fixed inline or filed
Group commits together only when they touch the same file for the same reason.
Acceptance criteria
- All files listed in §1 are deleted or clearly documented as intentionally kept
ChatMessageListno longer consumesChatPanelContext- Zero UI strings say "company" or "Company" (except via
VOCAB.companytoken) - Known minor issues from §4 are fixed or tickets filed
- Full test suite passes:
npx vitest run src/components/frame/ src/components/assistant/ src/components/studio/ src/components/projects/ src/components/settings/ src/hooks/ - Typecheck clean on all Wave 1–3 files
- Visual QA pass findings logged (either fixed inline or filed)
- The commit chain on
nexus/design-system-migrationis complete and ready for merge / PR review
Non-scope
- Backend vocabulary changes (
companyidentifiers stay — upstream sync) - Phase 11.5 per-project-scoping work (separate plan)
- Phase 4–7 visual migration polish (can run before or after Phase 16, independent)
- New features
- Performance optimization
- Test coverage expansion beyond what's needed to protect deletions
Report format
- Status (DONE / DONE_WITH_CONCERNS / BLOCKED)
- Commit SHAs with one-line summaries
- Files deleted (with confirmation of zero consumers)
- Files moved / refactored (e.g. ChatMessageList migration)
- Vocabulary sweep count (how many strings changed)
- Minor issues fixed vs deferred
- Visual QA findings
- Final typecheck + test suite result
- Concerns