Files
waggle-os/docs/ux-refactor/IMPLEMENTATION-PLAN.md
Oleg Maslov 0c3e2ead3b
Some checks failed
Installer Smoke / installer-smoke (push) Has been cancelled
moving
2026-09-02 10:10:29 +02:00

42 KiB
Raw Blame History

Waggle OS UX Refactor — Master Implementation Plan

This is a sequenced INDEX, not a re-paste. Each phase references the detailed gap cards (gap-cards/S00..S21.md) and deltas (deltas/*.md) that carry the full build spec. It exists to put them in one coherent, dependency-ordered, full-stack sequence under the locked execution model. The PRD (../Waggle_OS_UX_Refactor_Master_Handoff_Package/Waggle_OS_UX_Refactor_PRD.md) is the source of truth; this plan resolves PRD §8, PRD §21 sprints, and Blueprint §19 roadmap into a single Phase 0..6. Every backend claim is grounded in docs/backend-map/ or live source.


1. Executive summary, locked decisions, and the 8 non-negotiable product rules

Executive summary

Waggle OS is today a single-route windowed desktop OS (apps/web/src/components/os/Desktop.tsx + Dock.tsx; 27 AppId window types; no react-router) sitting on a deep, mostly-built backend substrate. The refactor converts it into a workspace-first Agent Desktop whose spine is Home Cockpit → Workspace Desktop → Ctrl+K → visible Memory/Artifacts → Agents/Skills/Automations → governed Extend → Team. We deliver this as an in-place incremental refactor of apps/web + targeted local-sidecar extensions — reusing workspace-manager, the workspace-state builder, the .mind schema, the harvest pipeline, install-audit, and the approval/trust runtime. The total backend work resolves to 53 endpoints (35 net-new + 18 extend), 5 new sidecar route files (home.ts, command.ts, artifacts.ts, agents.ts, mcps.ts) + 1 alias plugin (automations.ts), 2 new JSON-file stores (agents.json, artifacts.json), ~13 new design-system components, and at most one conditional SQLite migration (memory_frames.metadata). All 21 numbered screens + the AppShell are covered.

Locked decisions (founder, via PRD)

  1. In-place INCREMENTAL refactor of apps/web + targeted backend extensions. NOT a rebuild.
  2. FULL-STACK scope (net-new/extended backend APIs and frontend).
  3. Mockups are DIRECTIONAL (PRD §24); PRD acceptance criteria win over pixels.
  4. Local-first by default — desktop FE talks ONLY to the local sidecar (:3333).
  5. Backend-map is the contract reference; ground every backend claim there or in live source.

The 8 non-negotiable product rules (condensed handoff §"Non-negotiable product rules"; PRD §6)

  1. Workspace is the primary object. Everything happens inside or across workspaces.
  2. Ctrl+K is always available — search, launch, run, create, navigate, extend, from anywhere.
  3. Memory is visible, inspectable and editable — source, confidence, scope, evidence, edit/delete.
  4. Artifacts are outcomes, not attachments — documents/decks/sheets/dashboards/research are first-class.
  5. Connectors and MCPs live in Extend, not hidden Settings.
  6. Agents must declare scope, model, memory, tools, skills, permissions, and autonomy (no hidden access).
  7. No import or elevated tool access without explicit user approval.
  8. Use existing backend foundations wherever possible (do not duplicate backend state logic in the FE).

PRD §20.4 "Avoid": do not add top-level apps that don't fit the IA; do not duplicate backend state calc in the FE; do not hide connectors/MCPs in Settings; do not default to blank chat on launch; do not let agents/automations gain hidden access.


2. Current state in one paragraph (from the inventories)

The FE is a single / route (apps/web/src/pages/Index.tsxBootScreenDesktop); all "navigation" is window management in useWindowManager.ts keyed by AppId (27 ids in lib/dock-tiers.ts; a stale 8-id AppView union and dead terminal/calculator/notes ids are cleanup candidates). The dock (Dock.tsx + lib/dock-tiers.ts) already supports zone-parent flyouts, which is the hook for the new Work/Intelligence/Extend/Team IA without a router. The single backend gateway is lib/adapter.ts (~1930 LOC, ~150 methods); domain hooks (useWorkspaces, useChat, useMemory, …) wrap it. The sidecar already serves 16 of 65 PRD §16 endpoints as-is and 30 more partially; the rich substrate already present includes: the workspace-state builder + WorkspaceNow block (Home/Workspace seed), the full harvest engine (preview/commit/sources), install_audit + trust-model + the confirmation.ts approval gate + persistent grants + the approval_required SSE event, the EU-AI-Act ai_interactions append-only store, cron (the Automations capability), teams.db RBAC CRUD, and the knowledge_* graph. The biggest genuine gaps are: no Artifact entity/route anywhere, no sidecar /api/agents/* (only the cloud server has it), MCP runtime never populated (local/index.ts:911), and memory has no confidence/provenance/metadata column. Design-wise the Hive DS (ui/*, ~50 shadcn primitives + waggle-theme.css tokens) covers most needs; ~13 product-typed components are net-new.


3. Phase table (Phase 0..6)

Numbering reconciliation. Three sources order the work slightly differently: PRD §8 (Phase 0-5) and PRD §21 (Sprint 1-9) put Intelligence/builders (P3) BEFORE Extend (P4); the Blueprint §19 roadmap and the condensed handoff sequence put Extend BEFORE builders. The backend-api-delta.md already commits to the PRD §8 ordering. Because the PRD wins (locked decision 3 + "PRD acceptance criteria win"), this plan adopts PRD §8 phase numbering: P0 Align → P1 Core Runtime → P2 Work+Onboarding → P3 IntelligenceP4 Extend → P5 Team → P6 Hardening (PRD §21 Sprint 9 / Blueprint Phase 7, promoted to a first-class phase because PRD §26 DoD #10 "all screens have required states" is otherwise the weakest-traced item — see coverage-check GAP-D4). Phases 3 and 4 are independent (see §4) and MAY be parallelized by separate streams, but the default sequence is PRD order.

Verification gate for EVERY phase (CLAUDE.md §2 — run, do not claim):

npx tsc --noEmit --project packages/shared/tsconfig.json      # if shared types touched
npx tsc --noEmit --project packages/hive-mind-core/tsconfig.json  # if substrate/migration touched
npx tsc --noEmit --project packages/server/tsconfig.json      # sidecar routes (NOT typechecked by npm run build)
npx tsc --noEmit --project packages/agent/tsconfig.json       # if agent runtime touched
npm run build           # typechecks apps/web (the FE)
npm run test -- --run   # vitest unit
npm run lint            # ESLint repo-wide (no-explicit-any is error repo-wide per CLAUDE.md §10)

Build order matters (CLAUDE.md §2 / MEMORY 0601 S3): shared → hive-mind-core → core → agent → server.


Phase 0 — Architecture alignment & IA freeze

  • Goal: freeze the IA + route/vocabulary names; establish the shared-type spine + DS token layer that every later write-path depends on. No new endpoints. (PRD §8 Phase 0 / §21 Sprint 1 / Blueprint P0.)
  • Screens delivered: S00 (AppShell + IA + Navigation) — partial: the shell reframe + nav labels + Ctrl+K provider skeleton. (Full Ctrl+K UX lands in P1/S03.)
  • Frontend tasks
    • Keep-promote: Dock.tsx + lib/dock-tiers.ts zone-parent model → regroup dock entries into Work / Intelligence / Extend / Team / System zones (PRD §10 IA) — no react-router (see open-question B1, recommended: in-place dock reframe, keep windowed AppId navigation). Desktop.tsx appConfig + renderAppContent switch stays the navigation engine.
    • Rework: consolidate the dual app-id union onto AppId; delete stale AppView + dead ids (terminal/calculator/notes) (_inventory/frontend.md §b). Add the global Ctrl+K provider shell (compose ui/command.tsx; absorb overlays/GlobalSearch.tsx).
    • Create: components/os/AppShell.tsx (compose ui/sidebar.tsx + ui/scroll-area.tsx), WorkspaceSwitcher (compose ui/command.tsx + ui/dropdown-menu.tsx), the --sem-* token alias layer.
    • DoD #1 launch-flip (coverage-check GAP-D1): change the boot default route so launch lands in Home Cockpit, not blank chat — S00 explicitly owns this (pages/Index.tsx/Desktop.tsx initial window). Even though S01 builds later, the routing decision is frozen here.
  • Backend tasks (no routes; backend-api-delta.md "Phase 0")
    • WorkspaceConfig V2 additive optional fields (description, type, status, agentIds[], connectorIds[], mcpIds[], updatedAt, lastActiveAt) on packages/hive-mind-core/src/workspace-manager.ts:5-58 + CreateWorkspaceOptions:60-95. JSON file (workspace.json) — NO DB migration.
    • Write-side stamps: updatedAt in update() (workspace-manager.ts:222); lastActiveAt from the chat/agent loop.
  • Shared-types changes (shared-types-delta.md §1): add the PRD §15.2 union block to packages/shared/src/types.ts (WorkspaceType, Scope, Confidence, MemoryKind, ArtifactKind, AgentType, AutonomyLevel, ExtensionType) + export interface WorkspaceConfigV2; FE imports them into apps/web/src/lib/types.ts. Enums live once in @waggle/shared (no cross-file union duplication).
  • Design-system pieces (design-system-delta.md §b): add --sem-work/-intelligence/-healthy/ -attention/-risk alias vars in waggle-theme.css mapping to existing --status-* tokens. No new base palette. Build AppShell + WorkspaceSwitcher (compose existing primitives).
  • Exit criteria → PRD acceptance: IA + route names frozen (no major UX ambiguity, Blueprint P0); shared types compile across packages; launch no longer defaults to blank chat (DoD #1 routing decision committed); dock shows the 5 IA zones.
  • Verify: full gate; specifically tsc on shared + hive-mind-core (V2 fields) + apps/web.

Phase 1 — Core runtime: Home Cockpit, Workspace Desktop, Command Center (Ctrl+K)

  • Goal: the daily spine. A returning user "can continue work in under 30 seconds" (Blueprint P2 exit). (PRD §8 Phase 1 / §21 Sprints 2-3 / Blueprint P1-P2.)
  • Screens delivered: S01 Home Cockpit, S02 Workspace Desktop, S03 Command Center (Ctrl+K) (S00 Ctrl+K provider completed here).
  • Frontend tasks
    • Keep-promote: components/os/WorkspaceBriefing.tsxHome Cockpit widgets (PRD §20.1 named seed); DashboardApp.tsx (workspaces grid) folds into Home. ChatWindowInstance WorkspaceBriefing home screen is the precedent.
    • Create (S01): HomeCockpit (PRD §20.3) — greeting + ranked workspace cards + suggested actions + overnight summary + quick-capture. Retire overlays/LoginBriefing.tsx, absorb its catch-up into first paint (open-question C1).
    • Create (S02): WorkspaceDesktop as a maximized AppWindow (open-question C4/A1 — fixed layout v1, no parallel grid engine) with the 8 §12.2 tabs incl. the Settings tab (coverage-check G1) and a Tasks tab seeded from WorkspaceState (open-question C7). Sessions surface via Timeline + Ctrl+K (coverage-check G2 — document this, do not build a separate Sessions screen v1).
    • Create (S03): CommandCenter Ctrl+K overlay on the P0 provider; result groups for the 6 verbs (search/launch/create/run/navigate/extend). Reuse the chat approvals pipeline for gated commands (open-question C9).
  • Backend tasks (backend-api-delta.md Phase 1)
    • New routes/home.ts: GET /api/home/briefing (NET-NEW; cross-workspace ranker over buildWorkspaceState()/buildWorkspaceNowBlock()), GET /api/home/overnight (NET-NEW; since-last-login window).
    • Extend memory.ts: POST /api/quick-capture (thin handler → memory write + awareness row for tasks).
    • Extend workspaces.ts: GET /api/workspaces/:id/state (thin route over the existing builder), GET /api/workspaces/:id/activity (thin alias over events).
    • New routes/command.ts: GET /api/command/search (federates memory/workspaces/skills/sessions), GET /api/command/recent, GET /api/command/suggestions (NET-NEW); POST /api/command/execute (EXTEND/alias over existing plural /api/commands/executealias, don't rename, open-question B4).
    • No backend for S02 Tasks/Members/status-bar (all exist; compose client-side).
  • Shared-types changes: FE Workspace view-model gains description?/type?/status?/… (shared-types-delta §2b); NEW shared Command/CommandResult (shared-types-delta §9); seed identity on the greeting path (open-question B8 — onboarding writes profile AND identity so Home greets by name).
  • Design-system pieces: WorkspaceCard, EmptyState, ErrorState, Skeleton compositions, ActivityFeed, Timeline (extract from TimelineApp.tsx + lib/timeline-events.ts), the Ctrl+K CommandCenter shell with a11y (aria-label, focus trap from cmdk).
  • Exit criteria → PRD acceptance: PRD §22.1 "land in Home Cockpit and continue useful work" + "use Ctrl+K to find and run all major actions"; DoD #1/#2/#3. Home renders first-run-empty + daily + attention + overnight-failure states (PRD §14.2); Ctrl+K covers all 6 verbs (PRD §12.3).
  • Verify: full gate; tsc on server (new home.ts/command.ts) + apps/web.

Phase 2 — Work layer: Memory Center, Artifact Center, Onboarding, Workspace Creation

  • Goal: memory + outcomes are visible and actionable; the day-0 onboarding chain works end-to-end. (PRD §8 Phase 2 / §21 Sprints 4-5 / Blueprint P3.)
  • Screens delivered: S04 Memory Center, S05 Artifact Center, S12 First Launch, S13 Who Are You, S14 Tool Discovery, S15 Memory Import, S16 Memory Review, S17 Workspace Creation.
  • Frontend tasks
    • Rework: MemoryApp.tsxMemory Center (PRD §20.2) with source/confidence/evidence/scope + edit/merge/archive/delete; keep the working Graph tab (open-question A3 — ship in v1) and the Harvest/Weaver/Wiki/Evolution tabs.
    • Create (S05): ArtifactCenter (PRD §20.3) grid/table + DetailDrawer + cross-object related search.
    • Rework onboarding (PRD §20.2): keep OnboardingWizard.tsx shell, redesign into the 5-step profile→tool-discovery→import→review→workspace chain (S12-S17), retrofitting the new BuilderStepper. Split Import (stages previews) from Review (commits) — current code commits at S15; fix per open-question C33 ("nothing imports without review/approval").
  • Backend tasks (backend-api-delta.md Phase 2)
    • Extend memory.ts: GET /api/memory (alias), GET /api/memory/:id (NET-NEW thin), POST /api/memory (alias), PATCH /api/memory/:id (PATCH+bare id), POST /api/memory/:id/archive (NET-NEW thin), DELETE /api/memory/:id (alias), POST /api/memory/merge (NET-NEW logic).
    • Extend harvest.ts: preview returns all items + per-item confidence + normalized kind; commit accepts {selectedIds}; new thin POST /api/harvest/sources/:id/sync.
    • New routes/artifacts.ts (largest net-new domain — aggregation only, no new data store): GET /api/artifacts, POST, GET/:id, PATCH/:id, DELETE/:id, GET /api/artifacts/search-related. Backed by a lightweight artifacts.json index over the existing file/document/storage stores (open-question A6 — classification rule: artifact = explicit produced output, not every input).
    • Extend workspaces.ts (S17): richer POST /api/workspaces body (Phase-0 V2 fields); optionally extend WorkspaceTemplate shape. Record connector/MCP ids as intent, do not install at create time (open-question C35).
    • Extend profile.ts (S13): add workType/teamSize/goals to the allow-list; write profile AND seed identity (open-question B8). S12/S14 need ZERO net-new backend (catalogs already have routes).
  • Shared-types changes: NEW shared Memory entity + FE view-model (shared-types-delta §3); NEW Artifact everywhere (§4); adopt PRD §15.2 MemoryKind canonical + a pure lib/harvest-kind-map.ts (open-question B6); confidence: heuristic at preview, LLM reserved for the standing J08 queue (open-question B2).
  • Migrations (backend-api-delta.md §M): M1 — memory_frames.metadata TEXT (CONDITIONAL) — ship it only if persisted confidence/scope/status becomes a real filter axis (open-questions A8/B2); the idempotent ADD-COLUMN pattern is at hive-mind-core/src/mind/db.ts:116-124. M1' — artifacts index is a JSON file (no DB). Default: preview-only confidence + in-app filtering needs no migration.
  • Design-system pieces: ConfidenceBadge, EvidenceChip (promote the MemoryApp.tsx provenance pill), EvidencePanel, DetailDrawer (wrap ui/sheet.tsx right-side), StatusBadge (semantic + non-color indicator — the biggest a11y gap vs ui/badge.tsx), ViewToggle, BuilderStepper (retrofit onboarding), MemoryCard/ArtifactRow.
  • Exit criteria → PRD acceptance: PRD §22.1 "inspect and edit memory"; DoD #4 (source/confidence/ evidence/scope/edit/delete) + #5 (artifact outcome + related search, the "Germany GTM" cross-object acceptance PRD §12.5) + #6 (onboarding chain). Memory states §14.4 + Extension/Workspace states render.
  • Verify: full gate; if M1 ships, tsc + npm run test on hive-mind-core (migration) + a migration round-trip test; tsc on server (new artifacts.ts) + apps/web.

Phase 3 — Intelligence layer: Agents, Skills, Automations (+ builders)

  • Goal: users can create/run the core intelligence objects with validation + review. (PRD §8 Phase 3 / §21 Sprint 6 / Blueprint P5 "Builders".) Independent of Phase 4 (see §4).
  • Screens delivered: S09 Agent Center, S18 Agent Builder, S06 Skills Hub, S19 Skill Builder, S11 Automation Center, S20 Automation Builder.
  • Frontend tasks
    • Rework: AgentsApp.tsx (Personas) → Agent Center tabs (All/Personal/Workspace/Team/Autonomous/ Archive; Templates is a side affordance — open-question C22); CapabilitiesApp.tsxSkills Hub; ScheduledJobsApp.tsxAutomation Center.
    • Create: AgentBuilder (PRD §20.3, §12.9 stepper — declares goal/scope/model/memory/tools/skills/ permissions/autonomy), SkillBuilder (§12.6 stepper), AutomationBuilder (§12.10 stepper). Reuse the BuilderStepper from P2.
  • Backend tasks (backend-api-delta.md Phase 3)
    • New routes/agents.ts (sidecar /api/agents/* is absent — only the cloud server has it): GET /api/agents, POST, GET/:id, PATCH/:id (NET-NEW over a new agents.json store, mirrors agent-groups.json — open-question B3); POST /api/agents/:id/run (EXTEND → real executor POST /api/fleet/spawn, NOT the agent-groups/:id/run stub), POST /api/agents/:id/pause (EXTEND → fleet pause), GET /api/agents/:id/traces (NET-NEW read over execution_traces).
    • Extend skills.ts: PATCH /api/skills/:id + POST /api/skills/:id/test (:id variants over the existing name-keyed handlers); POST /api/skills/:id/install (NET-NEW dispatcher: starter/pack/ marketplace). Skill create is the existing POST /api/skills/create (the Builder's real target).
    • New automations.ts alias plugin over cron: GET/POST/PATCH /api/automations, /:id/run, /:id/pause, /:id/logs (all EXTEND aliases over /api/cron/*); POST /api/automations/test (NET-NEW no-persist dry-run — do NOT reuse cron/:id/trigger which executes+auto-enables, open-question C26). Also fix the FE bug: updateCronJob calls PUT but only PATCH is registered (adapter.ts:836 vs cron.ts). Triggers/conditions/actions ride the existing job_config TEXT blob — no migration. Schedule-only triggers v1; defer Event triggers (open-question C24).
  • Shared-types changes: MODIFY shared AgentDef with §15.5 fields + NEW FE Agent view-model (shared-types-delta §5); NEW Skill entity (§6); NEW Automation superset of CronJob (§7). Adopt PRD organization skill-scope vocabulary (open-question C36).
  • Migrations: M3 — agents table is OPTIONAL and NOT recommended for v1 (use agents.json). No required migration in this phase.
  • Design-system pieces: AgentCard, SkillCard, AutomationRunRow, BuilderStepper reuse, ApprovalModal (wrap ui/alert-dialog.tsx) for agent-elevation/automation-test approvals.
  • Exit criteria → PRD acceptance: PRD §22.1 "create a workspace, agent, skill, and automation"; DoD #7 (coherent IA across agents/skills/automations). Agent states §14.5 + Automation states §14.6 render; agent declares all §12.9 fields (rule #6); automation failures surface to Home (Journey 16 — wire the home/overnight failure feed to S11/S20).
  • Verify: full gate; tsc on agent (if runtime touched) + server (new agents.ts/automations.ts)
    • apps/web.

Phase 4 — Extend layer: Connectors, MCPs, Marketplace, Install Audit

  • Goal: capabilities are discoverable, installable, and governed (Blueprint P4 exit). (PRD §8 Phase 4 / §21 Sprint 7.) Independent of Phase 3 (see §4).
  • Screens delivered: S07 Connector Hub, S08 MCP Hub, S21 Marketplace / Extend Waggle.
  • Frontend tasks
    • Rework: ConnectorsApp.tsxConnector Hub (lift connectors out of the Services/MCP-tabs shell); the MCP catalog tab → standalone MCP Hub; consolidate the doubly-represented Marketplace (MarketplaceApp.tsx + the CapabilitiesApp marketplace section) into one Marketplace / Extend surface (_inventory/frontend.md §f IA cleanup).
    • Create: the unified Extend faceted catalog (S21) federating the six local domains client-side (open-question A5 — federate-at-read, no marketplace.db migration). Install modals render the TrustAssessment (risk badge + permission summary via formatTrustSummary) + a revoke action.
  • Backend tasks (backend-api-delta.md Phase 4)
    • Extend connectors.ts: POST /api/connectors/:id/sync (NET-NEW, phased stub — MVP = healthCheck() + stamp lastSyncAt; full data re-pull deferred, coverage-check C1/open-question C16), POST /api/connectors/:id/revoke (EXTEND alias → disconnect + audit), connect (+audit), GET /api/connectors (payload enrichment), optional /health + /activity.
    • New routes/mcps.ts + the foundational runtime work: GET /api/mcps, POST /api/mcps/install (via the existing marketplace installer → writes .mcp.json), POST /api/mcps/:id/test, /:id/revoke, POST /api/mcps (custom), /:id/start, /:id/stop, PATCH /:id/permissions, GET /:id/logs (phased — deferred if no log-capture infra, coverage-check C2). CRITICAL foundational task (coverage-check C4): populate mcpRuntime at boot from persisted config (local/index.ts:911 is empty today) — this is not a route, it is the work item that unblocks ALL MCP routes; treat it as an explicit, estimated Phase-4 task. MCP test semantics (live handshake vs static validation) must be resolved first (coverage-check C3 / open-question C21).
    • Marketplace + shared audit: GET /api/marketplace (bare-path alias), GET /api/extend/audit?type= (EXTEND — the read route exists at /api/audit/installs; add the filter param to serve S06/S07/S08/S21 with one route, open-question C18).
  • Shared-types changes: MODIFY FE Connector to consume shared ConnectorDefinition/ConnectorHealth (shared-types-delta §8a — a consumption switch, no new shape); NEW McpInstance (§8b); resolve the ExtensionType union to skill|agent|connector|mcp|model|template (open-question B7).
  • Migrations: M2 — install_audit risk-level CHECK fix (RECOMMENDED, pre-Phase-4). The TS AuditRiskLevel includes 'critical' but both DDL CHECKs allow only low/medium/high (install-audit.ts:65 + schema.ts:130) → a record({riskLevel:'critical'}) throws. Pick: widen the CHECK (additive migration) or lock the CRITICAL→'high'+approvalClass:'blocked' mapping as the permanent contract (zero-migration). Fix before any Extend install-audit write path ships (coverage-check C15).
  • Design-system pieces: ConnectorCard, MCPRow, ApprovalModal reuse for install-risk approval, the install-audit feed (normalizer over the three audit stores).
  • Exit criteria → PRD acceptance: PRD §22.1 "install/revoke connector/MCP with audit trail"; DoD #7; Extension states §14.7 render; MCP "auditable/permissioned/health-checked" (§12.8) — with the documented v1 caveats (connector-sync stub C1, MCP logs C2). Tier-gate MCP/Marketplace install at PRO+ through @waggle/shared tiers.ts (open-question B5).
  • Verify: full gate; if M2 ships as a migration, tsc + test on hive-mind-core/core; tsc on server (new mcps.ts) + apps/web; smoke the boot-time MCP runtime population.

Phase 5 — Team intelligence: Team Workspace, RBAC, Sharing, Audit views

  • Goal: team workflows are permissioned + auditable (Blueprint P6 exit). (PRD §8 Phase 5 / §21 Sprint 8.)
  • Screens delivered: S10 Team Workspace (+ the RBAC/Audit components PRD §20.3 — see RBAC-owner note).
  • Frontend tasks
    • Rework/create: TeamGovernanceApp.tsx + searchTeamMemory surface → Team Workspace with the role→capability matrix table (PRD §17.2), member list with role dropdown (CRUD endpoints exist), invite flow (Journey 13), "request access" on permission-denied. RBAC matrix has no dedicated card today (coverage-check GAP-D2) — S10 must own the §17.2 matrix UI (or add an RBAC/Audit card).
    • Create: unified Audit Views (normalize the three audit stores by scope) + CSV/PDF export buttons over the existing endpoints; per-object Share UI.
  • Backend tasks (backend-api-delta.md Phase 5; rbac-security-delta.md)
    • Extend team.ts: POST /api/teams/:id/invite (alias → /members), GET /api/teams/:id/audit (alias → /activity), fix the PUT(owner-only) vs PATCH(owner/admin) role-gate inconsistency on members/:memberId (team.ts:615 vs :642 — open-question A7).
    • NEW POST /api/share (no such route exists) — share memory/artifact/workspace with role perms; gate behind TEAMS tier. NEW POST /api/artifacts/:id/share (blueprint). Optional GET /api/teams/:id/governance (surface capability policies/overrides/requests).
  • Shared-types changes: unify the role enum in @waggle/sharedTeamRole = owner|admin|member|viewer(|guest), map PRD "Contributor"→"Member", defer/decide Guest (open-question A7 + rbac-delta §1). Add a shared requireRole/can() helper used by both team.ts and cloud routes.
  • Migrations: keep the live teams.db 4-role union (no migration) per the recommended A7 answer; a teams.db CHECK migration is only needed if Guest is adopted. Frame-level /api/share scope may need M1 (memory_frames.metadata) — v1 can scope implicitly via workspace teamId.
  • Design-system pieces: role→capability matrix table, ApprovalModal/audit-feed reuse, avatar stack.
  • Exit criteria → PRD acceptance: PRD §22.1 "team user can share memory/artifact with role-appropriate permissions"; DoD #8 (shared intelligence + roles) + #9 (approval-gated + audited). Workspace permission-denied + archived states render (PRD §14.3 / Journey 19).
  • Verify: full gate; tsc on shared (role enum) + server (team routes) + apps/web; RBAC enforcement tests.

Phase 6 — Hardening: states, a11y, approval/audit consistency, performance, dogfood

  • Goal: close the cross-cutting DoD items the screen phases leave under-traced. (PRD §21 Sprint 9 / Blueprint P7. Promoted to a first-class phase because PRD §26 DoD #10 + #9 are otherwise the weakest links — coverage-check GAP-D3/GAP-D4.)
  • Screens delivered: none new — every S00-S21 screen gets its §14 state matrix completed.
  • Frontend + cross-cutting tasks
    • Screen × §14-state coverage grid (GAP-D4). Build/verify all 9 global states (PRD §14.1: Loading/Empty/Populated/Error/Offline/Syncing/Permission-denied/Partial/Approval) on every major screen
      • each screen's specific states (§14.2-§14.7). Cards S02/S18/S20/S21 are visibly thin on state enumeration — close them. The DS primitives (EmptyState/ErrorState/Skeleton/StatusBadge) ship in P0-P3; this phase wires them per-screen and proves coverage in a grid artifact.
    • Approval & Audit as a cross-cutting contract (GAP-D3). No single card owns the "which actions are sensitive, what the approval payload is, what gets audited" taxonomy today, risking per-builder drift. Define the canonical gated-action taxonomy + ApprovalModal contract once (an S00 sub-spec) and retrofit S03/S08/S18/S19/S20. Reuse the built runtime: needsConfirmationWithAutonomy, the approval_required SSE event, /api/approval/*, persistent grants (rbac-delta §2).
    • Journey → screen trace (coverage-check #11). Verify the 20 PRD §13 journeys end-to-end, especially J15 (agent approval), J16 (overnight failure → Home attention, spans S01+S11+S20), J19 (archive), J20 (delete memory).
    • A11y, performance, real-data dogfood, visual polish (PRD §19.3 + §21 Sprint 9). Light-mode QA on data-heavy Memory/Artifact tables (Blueprint).
  • Backend tasks: append-only triggers on the sensitive install_audit/audit_events subset (rbac-delta §3.2, reconcile with retention); resolve any deferred Phase-4 caveats (connector-sync real pull, MCP logs) if scheduled.
  • Exit criteria → PRD acceptance: PRD §22.2 technical acceptance (every new screen has loading/empty/ error/offline/permission states; sensitive actions approval-gated; types consistent with API; no mock-only screens where backend exists); DoD #9 + #10 + #11. All §22.3 QA scenarios pass.
  • Verify: full gate + npm run test:e2e (Playwright) + visual regression; the per-screen state grid is the acceptance artifact.

4. Critical path / dependency notes

P0 (IA freeze + shared types + V2 fields + --sem-* tokens)
   └─ blocks EVERYTHING (every write-path uses V2 fields; every component uses the token layer & unions)
P1 (Home, Workspace, Ctrl+K)
   ├─ S01 Home depends on workspace-state builder (exists) + S03 Ctrl+K (greeting depends on identity seed, B8)
   ├─ S03 Ctrl+K provider skeleton starts in P0, completes in P1; S01/S02 consume it
   └─ blocks P2 (Memory/Artifact detail surfaces are reached via Workspace tabs + Ctrl+K)
P2 (Memory, Artifacts, Onboarding, Workspace Creation)
   ├─ Artifact entity (artifacts.json) is the single largest net-new domain; gates artifact-share in P5
   ├─ Memory metadata decision (M1) shared by S04 + S16; resolve B2/A8 BEFORE coding
   └─ Onboarding Import/Review split (C33) is correctness-relevant
P3 (Agents, Skills, Automations + builders)  ──┐ independent of P4
P4 (Connectors, MCPs, Marketplace)           ──┤ may run in parallel by separate streams
   ├─ P4 has the deepest hidden task: MCP boot-time runtime population (C4) — unblocks ALL MCP routes
   ├─ M2 install-audit CHECK fix must land BEFORE any Extend install-audit write (C15)
   └─ both P3 & P4 reuse the BuilderStepper (P2) and ApprovalModal
P5 (Team, RBAC, Sharing)
   ├─ depends on Artifact (P2) for artifact-share and on the unified role enum (A7) ratified before S10
   └─ frame-level /api/share may need M1 (P2) if not scoped via workspace teamId
P6 (Hardening)
   └─ depends on ALL screens existing; closes the cross-cutting DoD #9/#10/#11

Hard blockers to ratify before coding starts: the Phase-blocking founder items in §7. Single biggest hidden-effort item: MCP boot-time runtime population (P4). Single largest net-new domain: Artifacts (P2). Most error-prone reuse: alias-don't-rename the command/automations/connector-revoke vocabularies (B4) — exhaustive grep on any rename per CLAUDE.md §3.5.


5. Net-new backend endpoint master list (summary)

Full per-endpoint spec (method/path/disposition/build-target/substrate/shape/screens) lives in deltas/backend-api-delta.md. Summary counts:

  • Total endpoints requiring backend work: 53 (de-duplicated NET-NEW + EXTEND).
    • NET-NEW: 35 — Home ×2, Command ×3, Memory ×3, Artifacts ×6, Agents ×5, Skills ×1, Automations ×1, Connectors ×3, MCPs ×8, Team ×3.
    • EXTEND: 18 — quick-capture, workspace state/activity, command/execute, 4× memory aliases, harvest preview/commit + sources/sync, workspaces POST, agents run/pause, skills :id/test, 6× automations aliases over cron, connectors revoke/connect/payload, mcps/install, marketplace bare, extend/audit filter, team invite/audit/members-gate-fix.
  • PRD §16 cross-reference: of the 65 §16-literal endpoints — 16 EXIST (FE wiring only), 30 PARTIAL (→ EXTEND), 19 MISSING (→ NET-NEW). The delta adds ~16 blueprint-implied endpoints beyond the literal §16 set (MCP start/stop/logs/permissions/custom, connector health/activity, automations/test, team governance, artifact-share, extend/audit) — over-, not under-, coverage. All 65/65 §16 endpoints are addressed (coverage-check Table 2).
  • New sidecar route files: 5 (home.ts, command.ts, artifacts.ts, agents.ts, mcps.ts) + 1 alias plugin (automations.ts → cron). New JSON-file stores: 2 (agents.json, artifacts.json).
  • Schema migrations: 1 conditional (M1 memory_frames.metadata, P2/P5) + 1 recommended (M2 install_audit CHECK fix, pre-P4) + 1 optional/deferred (M3 agents table — NOT for v1). Net likely-to-ship: 1; 0 strictly required if S16 confidence stays preview-only and /api/share scopes via workspace teamId.
  • Phase-0 non-endpoint work: 5 interface/field extensions (WorkspaceConfig V2 + write-stamps, FE type unions, UserProfile fields, WorkspaceTemplate shape, Connector fields).

6. Risk register

PRD §24 risks + risks surfaced by the coverage-check / deltas:

# Risk Source Impact Mitigation (in this plan)
R1 UX becomes too complex PRD §24 High Keep Home/Workspace/Ctrl+K as the spine (P0-P1); hide power features behind the IA zones until needed.
R2 Backend not ready for all screens PRD §24 Med In-place reuse + thin adapters; mock catalog only where safe (PRD §22.2); A4 = real-where-substrate-exists.
R3 Memory trust issues PRD §24 High Source/confidence/evidence/review/edit/delete (P2); ConfidenceBadge + EvidencePanel; heuristic-then-LLM (B2).
R4 Agent safety PRD §24 High Explicit permissions + approval prompts + audit (rule #6/#7); reuse confirmation.ts + approval SSE.
R5 Marketplace scope creep PRD §24 Med Federate-at-read local catalog (A5); postpone billing/public marketplace + remote registry (PRD §4.4).
R6 Team RBAC complexity PRD §24 Med Keep the live 4-role union (A7); shared requireRole/can(); defer Guest.
R7 Global-search performance PRD §24 Med Local indexed providers + async result groups (S03).
R8 Visual mocks overfit PRD §24 Med PRD acceptance > pixels (locked decision 3).
R9 Per-screen state coverage under-traced (DoD #10) coverage-check GAP-D4 High Phase 6 state-coverage grid; primitives shipped P0-P3.
R10 Approval/audit owned by no card (DoD #9) coverage-check GAP-D3 High Phase 6 cross-cutting Approval&Audit spec (S00 sub-spec); reuse built runtime.
R11 MCP runtime never populated (unblocks all MCP routes) coverage-check C4 High Explicit, estimated Phase-4 boot-time population task (not a footnote).
R12 RBAC role-vocabulary divergence (3 enums, no Guest, PUT/PATCH gate bug) rbac-delta §1 Med Unify enum in @waggle/shared (P5); fix the gate; ratify A7 before S10.
R13 install-audit critical CHECK throws on write coverage-check C15 / rbac §3.2 Med M2 fix before any Extend install write (pre-P4).
R14 Connector /sync is a cosmetic stub vs §12.7 "data flowing" coverage-check C1 Med Flag v1 partial; schedule real connector-SDK pull (Phase 6/post-v1).
R15 Sessions not a first-class browsable object coverage-check G2 Low Document Timeline+Ctrl+K as the v1 session UX; soften the §11 "navigable" claim.
R16 Sidecar type errors ship undetected (tsx transpile-only) CLAUDE.md §2 Med Run tsc --project packages/server in every phase gate (not just npm run build).
R17 Build-order/stale-dist hides breakage behind green CI MEMORY 0601 S3 Med Enforce shared→hive-mind-core→core→agent→server; nuclear-clean before release verify.

7. Founder sign-off gate (open questions to answer before each phase)

Full options + tradeoffs + RECOMMENDED answers in deltas/open-questions.md. Coding on a phase MUST NOT start until its blocking questions are ratified.

Before Phase 0/1 (the spine) — [BLOCKS P1] ALL RATIFIED 2026-06-09 (founder)

All five spine recommendations ratified as-is; Phase 0 is unblocked.

  • B1 RATIFIED Shell topology — in-place dock reframe, keep windowed AppId nav (no react-router); group dock into Work/Intelligence/Extend/Team zones. The IA freeze; gates everything.
  • A1 RATIFIED Workspace Desktop layout — fixed layout v1 (PRD §12.2 self-answers).
  • A2 RATIFIED Home Cockpit scope — personal-only v1; team summary appended later behind RBAC.
  • B4 RATIFIED /api/* vocabulary — alias, don't rename (command/automations/connector-revoke).
  • B8 RATIFIED Identity store of record — onboarding writes profile AND seeds identity (correct greeting).

Before Phase 2 (work + onboarding) — [BLOCKS P2]

  • A6 Artifact storage — Rec: artifacts.json index over existing workspace storage; artifact = produced output.
  • A8 Memory retention/delete — Rec: soft-status in metadata (Archive reversible), hard delete with consequence confirm.
  • B2 Memory confidence — Rec: cheap heuristic at preview; LLM reserved for the standing J08 queue.
  • B6 MemoryKind reconciliation — Rec: PRD §15.2 MemoryKind canonical in @waggle/shared + pure map helpers.
  • A3 Memory graph view — Rec: ship in v1 (substrate works); default = keep.
  • C33 Import↔Review commit split — Rec: S15 stages previews, S16 commits (fix current commit-at-S15).
  • M1 decision — ship memory_frames.metadata only if confidence/scope/status becomes a real filter axis.

Before Phase 3 / 4 / 5 (not P1/P2-blocking, but ratify before the owning screen)

  • B3 Agent vs Persona boundary + store — Rec: real Agent entity in agents.json referencing personaId. (P3)
  • C24/C26 Automation triggers + test-run — Rec: schedule-only v1; no-persist dry-run route. (P3)
  • A4 Which connectors/MCPs are real — Rec: real-where-substrate-exists, catalog-for-the-rest. (P4)
  • A5/B7 Marketplace local-vs-remote + ExtensionTypeRec: federate-at-read; skill|agent|connector|mcp|model|template. (P4)
  • B5 Tier-vocabulary — Rec: document mapping, route gates through tiers.ts, MCP/Marketplace install = PRO+. (P4)
  • C21/C3 MCP test semantics — Rec: live spawn-and-isHealthy()/tools/list; fall back to static validation. (P4, resolve before S08)
  • C15 install-audit critical CHECK — Rec: ship the migration (M2) for correctness. (pre-P4)
  • A7 Minimum-viable RBAC — Rec: keep live owner/admin/member/viewer, Contributor==Member, defer Guest, fix PUT/PATCH gate. (ratify before S10)

8. Definition of Done checklist (PRD §26)

The refactor is done when all 11 hold. Mapped to the phase that delivers each (coverage-check Table 3):

  • 1. Home Cockpit replaces blank-chat launch behavior. — P0 (routing flip, GAP-D1) + P1 (screen).
  • 2. Workspace Desktop is the default runtime for workspace work. — P0 (route) + P1 (S02).
  • 3. Ctrl+K can search, launch, create, run, navigate, and extend. — P0 (provider) + P1 (S03; all 6 verbs).
  • 4. Memory Center exposes source, confidence, evidence, scope, and edit/delete. — P2 (S04/S16; M1 if filterable).
  • 5. Artifact Center supports outcome search and related objects. — P2 (S05; /search-related).
  • 6. Onboarding leads profile → tool-discovery → import → review → first workspace. — P2 (S12-S17 chain).
  • 7. Agents, skills, automations, connectors, MCPs, marketplace have coherent IA. — P3 + P4 (Work/Intelligence/Extend zones).
  • 8. Team workspace supports shared intelligence and roles. — P5 (S10 + RBAC matrix, GAP-D2).
  • 9. Sensitive actions are approval-gated and audited. — cross-cutting; ownership consolidated in P6 (GAP-D3).
  • 10. All screens have required states.P6 screen×§14-state grid (the weakest-traced item, GAP-D4).
  • 11. Claude Code can continue implementation from this PRD without product interpretation. — this doc set is the evidence.

Plus PRD §22.2 technical acceptance (verify in P6): no mock-only screens where backend exists; new components have loading/empty/error/offline/permission states; sensitive actions approval-gated; state derivation centralized in the backend; FE types consistent with API contracts; existing foundations reused.


Synthesized from PRD §6/§8/§14/§16/§20/§21/§26, Blueprint §19 roadmap, the condensed implementation handoff, the 3 inventories, the 22 gap cards (S00-S21), and the 6 deltas. All file/line citations are grounded in live source or the audited docs/backend-map/.