Files
waggle-os/docs/redesign-warm-hive/PR6-BUILD-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

127 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Warm-Hive PR6 — Remaining surfaces (the long tail) — Build Plan
> Source design: `docs/design_handoff_waggle_app/SCREENS.md §04·06·07·08·12·15·16·17·18` + `design-files/screens/*.html`. Roadmap: `BUILD-PLAN.md §6` (PR6 = screens 06·07·08·16·12·17·18·15·04). Branch: TBD off main (PR5 stream merges first). Status: **plan — §3 decisions need founder ratification before feature code.**
> Recon: 9-screen grounded recon (one reader per screen), every claim verified vs live code with file:line. The notable corrections are in §8 (honesty log).
> **Scope reframe vs the roadmap:** PR6 as written is **9 heterogeneous screens** — too big for one PR. §2.5 recommends a **3-way sub-PR split**.
## 1. The design contract
- **§04 All workspaces** (`workspaces.html`): the full workspace shelf — Grid (default) / Table toggle, search + storage filter pills (All/Local/Virtual/Team), cards with hex avatar, **storage badge** (Local=honey, Virtual=intel, Team=healthy), summary, meta (memories · "agent live" · "N to review" · "Open →"). Answers "where are all my workspaces?" (Home = your day; this = everything). Reachable from rail/⌘K/switcher.
- **§06 Launcher (AI-OS)** (`launcher.html`): detect & launch external coding agents into a workspace's shared memory. **Variation A (Launch)** = primary (tool cards, launch-with-task box, "Running now" PID panel). **Variation B (How memory is shared)** = a 3-node flow diagram + 3 explanation cards + a provenance example, on a segmented toggle.
- **§07 Storage & Files** (`storage.html`): make the filesystem legible. **Variation A (Where it lives)** = live on-disk tree card + three storage-type cards (Virtual/Local/Team) + local-first reassurance. **Variation B (Files)** = classic browser with a **Source/provenance column** ("made by Claude Code"). Both real, one screen, segmented toggle. Maps to `StorageType = 'virtual'|'local'|'team'`.
- **§08 Power surfaces** (`surfaces.html`): the long tail (Tools · Automations · Approvals · Vault · Usage) on **ONE reusable row/card/toggle set**, behind ⌘K. Per-model spend bars + budget on Usage; Rotate/Reveal/Renew on Vault; color-stratified risk badges on Approvals; enable/pause on Automations.
- **§12 Skill evolution + diffusion** (`evolution.html`): **A (version ladder)** = a skill card with v1/v2/v3 quality scores + improvement notes + a "GEPA optimized · judged by 3 models" provenance badge. **B (diffusion)** = skills/recipes propagating across agents/workspaces via waggle-dance signals. Both views are real tabs per §371.
- **§15 Habit loop** (`habit.html`): **NOT a standalone screen** — a principles doc whose mechanics live on Home: 🔥 daily streak chip, "while you slept" variable-reward chips, gentle nudges (earned), compounding memory depth. Ethics note (no dark patterns, all toggle-off-able).
- **§16 App surfaces (sextet)** (`appsurfaces.html`): six real routes on one rail — Agents (swarm CTA), **Room** (shared stage of turns + participants panel), **Artifacts** (3-col card grid + provenance), **Mission Control** (hive health + local services list), Timeline (one chronological stream), **Profile** ("what Waggle knows about you" facts + persona chips).
- **§17 Benchmarks** (`benchmark.html`): honest positioning. **A (Capabilities)** = 11-row matrix (Waggle column honey-highlighted; ●/◐/○; competitors deliberately given ● on terminal coding). **B (Memory SOTA)** = LoCoMo bars (87.66/81.95/78.05/62.47) + stats (+5.71pp, p<10⁻⁵, 92.75%, 100% local). ⌘K-only, both views real tabs. Numbers must stay accurate to the `hive-mind` benchmark.
- **§18 Platform & roadmap** (`platform.html`): the Tauri desktop story + roadmap. **4 views** (all real tabs per §371): Desktop (macOS↔Windows titlebar toggle), Boot ("warming the hive" checklist), Coming-next channel cards, and a **custom 404** ("This cell of the hive is empty."). ⌘K-only.
## 2. Current state — **grounded, one row per screen** (verified vs live, 2026-06-17)
| Screen | Design intent (1-line) | Reality today (file:line) | State | Gap | Effort |
|---|---|---|---|---|---|
| **04 All workspaces** | Full shelf: grid/table + storage pills + rich cards | `App.tsx:66` `/workspaces``Navigate to /home`; list lives only as `HomeCockpit` RecentWorkspacesPanel (`HomeCockpit.tsx:166-226`, ~2 cards). `adapter.getWorkspaces()` (`adapter.ts:491-500`), `Workspace` type w/ `storageType/memoryCount/sessionCount/health` (`types.ts:239-260`), `useWorkspaces` hook all present. No `AllWorkspacesApp`, no ⌘K/rail entry. | **NET-NEW** | large | **M** |
| **06 Launcher** | Variation A launch + Variation B memory-sharing explainer | `LauncherApp.tsx:1-525` feature-complete A (detect/launch/hooks/processes/prompt-pass). Routed `LauncherRoute`, in `App.tsx:82`, `command-catalog.ts:72`, dock `dock-tiers.ts:93`. Backend `/api/tools/{detect,launch,processes,kill,hooks}` (`adapter.ts:2408-2523`). **Variation B absent.** | **EXISTS (PARTIAL)** | small | **S** |
| **07 Storage & Files** | A "where it lives" + B file browser w/ provenance col | `FilesApp.tsx:1-793` (B browser; **no Source column**, headers Name/Size/Modified `:539-544`), `FilesAppTabs.tsx:1-99` (storage-type tabs — orthogonal to A/B), `FilesRoute.tsx`, `STORAGE_LABELS` (`file-utils.ts:52-56`). **Variation A absent** (no on-disk tree, no storage-type cards). | **PARTIAL** | medium | **M** |
| **08 Power surfaces** | 5 tabs on ONE row/card/toggle set, ⌘K shell | 5 separate apps at separate routes: `VaultApp.tsx` (`/settings/vault`; Reveal+Rotate-link, **no Renew**), `ApprovalsApp.tsx` (`/approvals`; amber text, **no color-stratified badges**), `AutomationCenterApp.tsx` (`/automations`; toggles work), `TelemetryApp.tsx:1-145` (`/settings/usage`; **no per-model bars, no budget**), `CapabilitiesApp.tsx` Tools tab ≠ integrations. Backend all present (vault/approval/automations/cost/events). | **PARTIAL** | medium | **M** |
| **12 Evolution** | A version ladder + B diffusion maps | `EvolutionTab.tsx:1-1000` full run-review (list/detail/accept/reject/SSE/NewRunModal), rendered as Memory tab (`MemoryCenterApp.tsx:35,180`). Backend `evolution.ts:1-662` complete. **No version-ladder skill-card framing; no diffusion (B) UI.** | **PARTIAL** | medium | **M** |
| **15 Habit loop** | Mechanics on Home (streak/overnight/nudge/depth) | `StreakChip.tsx:1-26` exists but `SHOW_STREAK=false`, `STREAK_DAYS=0` hardcoded (`HomeCockpit.tsx:49-50`). `OvernightHero.tsx`+`RunChip.tsx` correct & live (`HomeCockpit.tsx:293-330`). `NotificationInbox.tsx:1-80` exists but **not wired to Home**. No `streak/memoryCount/nudge` on `HomeBriefing` (`types.ts:317-329`). Memory-depth: **no backend**. | **PARTIAL** | medium | **M** (backend-blocked) |
| **16 App surfaces (sextet)** | 6 routes, consistent rows/badges/provenance | All six routed: `AgentsApp` (swarm CTA soft-routed `:158`), `RoomApp.tsx:1-261` (**single-col tile grid; no participants panel/turn stage**), `ArtifactCenterApp.tsx:1-386` (**vertical list; not 3-col grid**), `MissionControlApp.tsx:1-227` (fleet/team/activity tabs; **no unified services list**), `TimelineApp.tsx:1-241` (**ALIGNED**), `UserProfileApp.tsx:1-532` (**no "what Waggle knows" read-only facts**). | **PARTIAL** | medium | **M** |
| **17 Benchmarks** | Capabilities matrix + Memory SOTA bars, ⌘K-only | **Nothing exists.** No grep hits for "benchmark" in `apps/web/src`; not in `dock-tiers.ts` AppId, `routes.ts`, `command-catalog.ts`, `App.tsx`. Design fully specified in `benchmark.html` (220 lines, static data). No backend needed. | **NET-NEW** | net-new | **M** |
| **18 Platform & roadmap** | 4 views (Desktop/Boot/Roadmap/404), ⌘K-only | **Nothing exists.** No `PlatformApp`/`PlatformRoute`, not in AppId/routes/⌘K/`App.tsx`. 404 is generic `NotFound.tsx:1-24` (no honey hex, no spec copy). Design in `platform.html`. No backend needed. | **NET-NEW** | net-new | **M** |
**Net:** PR6 is **2 net-new informational surfaces** (17, 18 — pure UI, static data, no backend), **1 net-new data surface** (04 — backend already feeds it), **5 reskin/reconcile-in-place** of shipped apps (06 add Variation B; 07 add Variation A + provenance col; 08 add the 5 missing features within existing routes; 12 add version-ladder framing; 16 reskin 5 of 6 + 2 small builds), and **1 backend-blocked Home wiring** (15 — flip the streak gate + the depth/nudge mechanics need new backend fields, so the flip-now slice is small and the rest defers).
### 2.5 Recommended sub-PR split (the core recommendation)
PR6 spans nine screens with sharply different shapes — net-new builds, in-place reskins, and a backend-blocked feature. One PR would be unreviewable and would couple low-risk reskins to backend-dependent work. **Recommend 3 cohesive sub-PRs, ordered by value/risk:**
| Sub-PR | Screens | Scope theme | Why this grouping | Effort |
|---|---|---|---|---|
| **PR6a — Net-new informational surfaces** | **17 Benchmarks · 18 Platform** | Two pure-UI, static-data, ⌘K-only surfaces. New `*App` + `*Route` + register in `routes/index.ts`+`App.tsx`+`command-catalog.ts`; reskin `NotFound.tsx`. | **Lowest risk, highest standalone value** — zero backend, no existing-component blast radius, ships the public-facing positioning + desktop story. Benchmarks shows the SOTA proof we already published. Cleanest first PR. | **SM** |
| **PR6b — In-place reskin + feature-fill of shipped apps** | **06 Launcher · 07 Storage&Files · 08 Power surfaces · 12 Evolution · 16 App-surfaces** | Reskin shipped apps to spec + fill named missing features, each at its current route. No architectural unification, no new backend (except §3 D3/D6 cheap routes). | **The bulk of the value, all reuse.** Every screen already has a working component + backend; this is "make it match the doc." Largest review surface, so it is its own PR. Internally phaseable (one screen per commit). | **L** (M each ×5) |
| **PR6c — All workspaces + Habit-on-Home** | **04 All workspaces · 15 Habit loop** | The two surfaces that need a backend field/route to be honest: 04 = net-new view over existing `getWorkspaces`; 15 = flip the streak gate + (deferred) depth/nudge fields. | **Backend-coupled, so isolated from the reskins.** 04 is a real new screen but its data is ready; 15's honest slice is tiny (gate flip) with the rest gated behind new `HomeBriefing` fields. Grouping the two data-shaped surfaces keeps the backend touch in one PR. | **M** |
**Sequencing rationale:** PR6a first (de-risked, shippable alone, no dependencies). PR6b second (the meat; depends on PR1/PR2 tokens + ⌘K being merged, which they are). PR6c last (carries the only net-new backend fields — §3 D9/D10 — and is the most likely to spill into a follow-up). Each sub-PR is independently revertible. If timeline pressure hits, **PR6c is the natural defer candidate** (04 can ship without a rail entry; 15's flip can wait for the streak backend).
## 3. Decisions — **NEED FOUNDER RATIFICATION before feature code** (recommend-and-proceed unless you object; D1/D8/D11 are strategic)
| # | Decision | Recommended | Why |
|---|---|---|---|
| **D1** | **Sub-PR split** (§2.5) | **Ship the 3-way split: PR6a (17·18) → PR6b (06·07·08·12·16) → PR6c (04·15)** | Nine heterogeneous screens are unreviewable as one PR and couple zero-risk reskins to backend-dependent work. The split groups by risk shape, keeps net-new backend in one PR, and each piece is independently revertible. **Founder structural call.** |
| **D2** | Benchmarks (17) — build vs defer | **BUILD in PR6a** | Pure UI, static data from `benchmark.html`, no backend, self-contained. It surfaces the LoCoMo SOTA proof (87.66, +5.71pp, p<10⁻⁵) that is **already published** — high marketing value at near-zero risk. ⌘K-only keeps the spine calm. |
| **D3** | Benchmarks data source | **Inline constant in `BenchmarkApp.tsx`** (11×6 CAPS + 4 SOTA bars), mirroring `benchmark.html` | Design treats it as static. An API is over-engineering for numbers that change on a benchmark cadence, not a request cadence. Numbers must be **manually refreshed from the `hive-mind` benchmark** (carry a dated comment + the no-fabrication caveat). |
| **D4** | Platform (18) — build vs defer | **BUILD in PR6a** | Pure UI, no backend, self-contained, ⌘K-only. Tells the Tauri desktop story + roadmap and replaces the generic 404 with the on-brand one. Low risk, high polish payoff. |
| **D5** | Platform 404 ownership | **Reskin the standalone `NotFound.tsx`** (honey hex + spec copy + back-to-Home + ⌘K affordance); **do NOT** nest 404 inside `PlatformApp` state | `NotFound.tsx` is the real router catch-all (`App.tsx:94`); a tab inside `/platform` would never catch a bad URL. Keep them split: 404 stays the route fallback, Platform's other 3 views are tabs. |
| **D6** | Platform Boot view vs real boot | **Render Boot as a static showcase tab** in `PlatformApp`; do NOT rewire the live `BootScreen`/AppShell boot gate | The real boot flow is owned by AppShell (PR1 stream). The §18 "warming the hive" view is a marketing showcase, not the runtime gate — duplicating runtime logic risks the cold-load crash class PR3 already fought. Showcase only. |
| **D7** | Launcher (06) Variation B | **Add as a segmented toggle on the same surface** (matches `launcher.html:110-113`); align copy to §06 spec | Design shows a segmented control on one page, not a modal/overlay. All plumbing exists; this is a second view + copy polish. No backend. |
| **D8** | Power surfaces (08) — unify behind ⌘K vs keep separate routes | **Keep the 5 apps at their current routes; reskin to a shared row/card/toggle look. DO NOT unify into one `/settings/power-surfaces` shell in PR6.** | Unifying breaks 4 deep-linked routes (`/settings/vault`, `/approvals`, `/automations`, `/settings/usage`) wired into ⌘K + dock + onboarding. The design's "ONE component set" intent is satisfied by **shared primitives**, not a shared route. Architectural unification is a **post-launch Phase 4B item** — flag it but don't ship it here. **Strategic scope call.** |
| **D9** | Power surfaces (08) feature fill | **In PR6b:** per-model spend bars + daily-budget input (80% warn) on Usage; Renew button on Vault → reuse the Rotate endpoint; color-stratified risk badges (amber=Medium, green=Low) on Approvals; harmonize toggle/row/badge styling | These are the named §08 gaps and are all FE-side over existing backends (`cost/by-workspace`, vault, approval). Renew has no dedicated endpoint — **point it at Rotate** and note the intent for a future phase (no new backend in PR6). |
| **D10** | Storage (07) — A as a tab in `/files` vs new `/storage` route | **Tab within `/files`** via a new `StorageAndFilesApp` wrapper holding the A/B segmented toggle; storage-type tabs (Virtual/Local/Team) live **inside** Variation B (orthogonal) | Design shows one screen with a unified A/B switcher (`storage.html:97-100`). Reuses `FilesRoute`; avoids a second route + a second ⌘K entry. The recon's key correction: the existing storage-type tabs are a **different axis** from A/B — they coexist, not conflate. |
| **D11** | Storage (07) provenance column — source | **Add a Source column to the file table** showing granular creator ("made by Claude Code", "you uploaded", agent name); **gate off when unknown** (no fabricated source) | §07 shows the specific string ("made by Claude Code"). Needs the creator/provenance to exist on the file metadata — **verify the file-tree route carries it; if absent, show "—", never invent** (PR3/PR3.5 no-fabrication contract). Confirm data availability before shipping the column. |
| **D12** | Evolution (12) version-ladder grouping | **In PR6b:** aggregate `EvolutionRun` rows by `(target_kind, target_name)` into skill cards; render the version ladder (score bar + delta + improve-note); **DEFER Variation B (diffusion maps) to PR7/8** | A is a reskin over real run data (`evolution.ts`). B (diffusion) is **net-new UI** (propagation maps + adopter lists + waggle-dance signal correlation) — out of proportion to a reskin. Signals exist in backend but the map component is a distinct feature. |
| **D13** | Evolution (12) "GEPA · judged by 3 models" badge | **Show only when derivable from `gate_reasons`/status; otherwise omit** | The backend does not explicitly store this provenance string. Inferring "best" from `(status=deployed, highest delta_accuracy)` is honest; **fabricating "judged by 3 models" when the gate roster isn't recorded is not.** Gate the badge off when the metadata is absent. |
| **D14** | All workspaces (04) — Grid vs Table MVP | **Ship Grid (default) only in PR6c; Table as a fast-follow** | Design names Grid as the ship variation (§366); Table is the alternate. Grid-only is the ≤2-screen MVP; the toggle scaffold can land with Table stubbed/deferred. |
| **D15** | All workspaces (04) — nav entry | **Add an "All workspaces" entry to ⌘K (Jump group, after Home) in PR6c**; replace the `App.tsx:66` `/workspaces``/home` redirect with the real route | §04 says it's reachable from rail/⌘K/switcher. ⌘K is the cheapest discoverable entry (no spine change — Home stays the day view). Rail entry is out of scope (5-item spine is locked). |
| **D16** | All workspaces (04) — empty state | **Surface a first-run empty state** ("Create your first workspace" CTA) rather than gating behind Home | A direct `/workspaces` visit (or ⌘K) on a zero-workspace install must not dead-end. Reuse the Home create-workspace flow's dialog. |
| **D17** | Habit (15) — streak gate flip | **In PR6c:** flip `SHOW_STREAK=true` **only after** a real `streak` field lands on `HomeBriefing` (backend); until then leave gated (no fabricated streak) | A hardcoded `STREAK_DAYS=0` or invented count violates the no-fabrication contract (PR3 streak precedent — this is literally that precedent). The flip is one line; the **backend streak calculation is the dependency** — confirm owner + timing. |
| **D18** | Habit (15) — memory-depth + nudges | **DEFER memory-depth ("+14 this week · top 8% by depth") to post-PR6** (needs a new `/api/memory/stats` shape + `HomeBriefing` fields); **wire gentle nudges only if `NotificationInbox` filtering lands**, else defer | Depth requires net-new backend (no `memoryCount`/`depthRank` today). Nudges must be "earned" per §15 ethics — surfacing all notification types uniformly is the dark-pattern the design warns against. Both are backend-shaped; keep PR6c's habit slice to the honest streak flip + the already-correct OvernightHero. |
| **D19** | App-surfaces (16) builds vs reskins | **In PR6b:** reskin all six to warm tokens; **build** the Room participants-panel/turn-stage (two-col) + Artifacts 3-col grid + Profile "what Waggle knows" read-only facts; **promote** the Agents swarm CTA; Mission Control = relabel tabs (don't rebuild as a flat services list) | These are the named §16 gaps. Room/Artifacts/Profile are real layout builds; Agents/Mission-Control are reskins/relabels. Mission Control's flat-services-list redesign is larger than a reskin — **relabel + reorder tabs to lead with Services**, defer the full rebuild. |
| **D20** | Profile (16) "what Waggle knows" facts source | **Derive from stored `profile.identitySuggestions` first; only add `/api/profile/facts` if that's insufficient** | Avoids a net-new route if the data already exists in the profile blob. Confirm the suggestions field carries displayable facts before committing to a new endpoint. **No fabricated facts** — render only what the profile actually holds. |
| **D21** | Warm-token sweep | **In every sub-PR, sweep the touched files** — desaturate emerald/violet/amber/sky status colors (still hardcoded in `dock-tiers.ts` color fields + the older apps) to warm semantics; verify `--honey/--intel/--healthy/--attention/--risk` usage matches the mocks | PR6 edits these surfaces heavily; one pass per file keeps the "single honey accent" honest. The sextet + power surfaces still carry pre-warm tier colors (`text-violet-400`, `text-emerald-400`, etc.). |
## 4. Architecture
- **PR6a (net-new, no backend):**
- `apps/web/src/components/os/apps/BenchmarkApp.tsx` (state-toggled Capabilities/SOTA views; inline `CAPS` 11×6 + `SOTA_BARS` 4-bar constants, dated, with the no-fabrication caveat verbatim) + `routes/BenchmarkRoute.tsx` (thin wrapper, PR1a §5.1 pattern). Register in `routes/index.ts` + `App.tsx` (`/benchmarks`) + `command-catalog.ts` (Power group, ⌘K-only).
- `apps/web/src/components/os/apps/PlatformApp.tsx` (3 tabs Desktop/Boot/Roadmap via a `view` enum; Desktop has a macOS↔Windows titlebar toggle) + `routes/PlatformRoute.tsx` + register `/platform` (⌘K-only). Reskin `pages/NotFound.tsx` (honey hex + "This cell of the hive is empty." + back-to-Home + ⌘K).
- **PR6b (reskin-in-place, reuse — DO NOT recreate the backing apps/routes/backends):**
- **06:** extend `LauncherApp.tsx` with a Variation B view behind a segmented toggle (flow diagram + 3 cards + provenance example). No route/backend change.
- **07:** new `StorageApp.tsx` (Variation A: live on-disk tree card + 3 storage-type cards, fed by `GET /api/workspaces/:id` + the file-tree route) + new `StorageAndFilesApp.tsx` wrapper (A/B segmented toggle, hosts `FilesApp` for B) routed via `FilesRoute`; add a Source column to `FilesApp` (`:539-544`, gated when provenance absent).
- **08:** add per-model bars + budget UI to `TelemetryApp`; Renew→Rotate in `VaultApp`; color-stratified risk badges in `ApprovalsApp`; extract shared `<SurfaceRow>/<SurfaceToggle>/<RiskBadge>` warm primitives (the "ONE component set") and adopt across the 5 apps. **No route consolidation (D8).**
- **12:** in `EvolutionTab.tsx`, add a skill-card aggregation + version-ladder render over existing `EvolutionRun` data; provenance badge gated (D13). No backend.
- **16:** reskin six apps; build Room two-col (participants panel + turn stage), Artifacts 3-col grid, Profile read-only facts section; promote Agents swarm CTA; relabel Mission Control tabs.
- **PR6c (data surfaces, the only net-new backend):**
- **04:** new `AllWorkspacesApp.tsx` (grid + search + storage filter pills + cards w/ actions via `useWorkspaces`/`adapter.getWorkspaces`/`ShellContext.selectWorkspace`) + `routes/WorkspacesRoute.tsx`; replace `App.tsx:66` redirect; add ⌘K entry. Reuse `WorkspaceActionsMenu` for row actions. No new backend (all routes exist: `GET /api/workspaces`, `DELETE/PATCH /api/workspaces/:id`).
- **15:** flip `SHOW_STREAK` once a real `streak` lands on `HomeBriefing` (the **one backend field** — calculation owner TBD, D17); OvernightHero is already correct; depth/nudges deferred (D18).
## 5. Phased plan (TDD; commit per phase/screen; FE `tsc -p apps/web/tsconfig.app.json` + vitest each)
**PR6a**
- **A1 — Benchmarks.** `BenchmarkApp` + route + ⌘K register; inline data constants; dark+light; matrix + SOTA-bar render; unit test (renders both views, honey-highlight on Waggle column/bar).
- **A2 — Platform + 404.** `PlatformApp` 3 tabs + route + ⌘K register; reskin `NotFound`; unit test (tab switch, titlebar toggle, 404 affordances).
**PR6b** (one commit per screen; each: reskin + named feature + tests)
- **B1 — Launcher Variation B** (segmented toggle + flow/cards/provenance + copy).
- **B2 — Storage Variation A + provenance column** (`StorageApp` + `StorageAndFilesApp` wrapper + `FilesApp` Source column gated; confirm D11 data first).
- **B3 — Power surfaces feature-fill** (per-model bars + budget; Renew; risk badges; shared primitives — D8/D9/D21).
- **B4 — Evolution version ladder** (aggregate + ladder + gated badge — D12/D13).
- **B5 — App-surfaces sextet** (reskin 6 + Room/Artifacts/Profile builds + Agents CTA + Mission Control relabel — D19/D20).
**PR6c**
- **C1 — All workspaces** (`AllWorkspacesApp` + route replacing redirect + ⌘K entry + grid + actions + empty state — D14/D15/D16).
- **C2 — Habit streak flip** (flip `SHOW_STREAK` gated on the real `streak` field; verify OvernightHero; depth/nudges deferred — D17/D18).
**Each sub-PR ends with:** adversarial review (correctness / security / honest-stats / design-fidelity) + live smoke (dark + light, 0 console errors).
## 6. Key risks
- **Don't recreate the 5 backing apps / routes / backends for screens 06·07·08·12·16** — they are shipped and working; PR6b is reskin + feature-fill, not rebuild (CLAUDE.md §3.3/§8). The biggest risk is mistaking a PARTIAL app for net-new.
- **No-fabrication contract (the recurring trap):** Benchmark numbers (D3), Evolution "judged by 3 models" badge (D13), Storage provenance column (D11), Profile facts (D20), Habit streak/depth (D17/D18) are **six** places PR6 could invent data. Gate each off when the real value is absent — carry the PR3/PR3.5 streak-gate precedent. A real 0 is honest; a fabricated count is not.
- **Power-surfaces route consolidation (D8)** is a deep-link landmine — 4 routes are wired into ⌘K + dock + onboarding. Reskin to shared primitives, do **not** collapse the routes in PR6.
- **All-workspaces redirect replacement (`App.tsx:66`)** changes router behavior — verify nothing else relies on `/workspaces``/home` (it does NOT per recon; switcher opens a picker modal). Add the empty-state to avoid a zero-workspace dead-end.
- **Habit streak is backend-blocked (D17)** — the flip is one line but the streak calculation owner is unconfirmed. Don't flip until the field is real, or the gate ships a fabricated streak.
- **404 ownership (D5)** — keep `NotFound.tsx` the router fallback; a Platform tab can't catch bad URLs. Don't merge them.
- **Server routes via tsx** (D3-class cheap routes, if any land for Profile facts/file-tree provenance) are not typechecked by `npm run build` → explicit `tsc -p packages/server`.
## 7. Verification gates (per sub-PR + final)
`tsc -p apps/web/tsconfig.app.json` 0 · `tsc -p packages/server` 0 (only if any cheap route lands) · FE vitest green · `npm run lint` (no new errors) · live smoke per sub-PR (dark + light, 0 console errors):
- **PR6a:** Benchmarks renders both views w/ honey-highlight + accurate numbers; Platform 3 tabs + titlebar toggle; custom 404 on a bad URL; both reachable via ⌘K.
- **PR6b:** Launcher A/B toggle; Storage A/B toggle + provenance col (or honest "—"); Usage per-model bars + budget; Vault Renew; Approvals color badges; Evolution version ladder; sextet reskinned + Room two-col + Artifacts grid + Profile facts.
- **PR6c:** `/workspaces` renders the shelf (grid + search + pills + actions + empty state) reachable via ⌘K; streak chip shows only with a real field.
## 8. Honesty log — every drift the recon found (verified vs live)
- **04:** `BUILD-PLAN.md §9.7` makes **Home the workspace selector** (Home `RecentWorkspacesPanel` shows ~2 cards, `HomeCockpit.tsx:166-226`), so §04's "reachable from rail" is **not literally true** — no rail entry exists (5-item spine locked) and the switcher pill opens a **picker modal, not the full shelf**. PR6c adds a ⌘K entry, not a rail entry. Design shows 8 sample workspaces; live has no dedicated view at all.
- **06:** `launcher.html` has BOTH variations (segmented control `:110-113`); the React `LauncherApp` renders **only Variation A** — no toggle, no Variation B. Copy is generic ("Tool Launcher", "Optional prompt") vs the spec narrative.
- **07:** The existing `FilesAppTabs` storage-type tabs (Virtual/Local/Team) are **orthogonal to** the A/B variation toggle — the recon's key correction is they must **coexist, not conflate** (storage-type filters live *inside* Variation B). The file table has **no Source/provenance column** (`:539-544` = Name/Size/Modified only). Variation A has no component, route, or on-disk tree at all.
- **08:** Design assumes a **unified ⌘K shell with 5 tabs via a left-rail switcher**; live has **5 separate full-canvas apps at separate routes** — an architectural split, not a styling gap. `VaultApp`'s Connectors tab was **moved out** to a separate `ConnectorsApp` (`:229` comment). `CapabilitiesApp.Tools` shows **generic agent tools** (read_file/bash/web_search), **not connected integrations** (those live in `ConnectorsApp`) — the design's "Tools" tab and the live "Tools" tab are different things. No Renew, no per-model bars, no budget UI, no color-stratified risk badges. Each app uses **distinct styling** (the "ONE component set" intent is unmet).
- **12:** Implementation tracks **individual runs**, design shows a **single skill card with 3 versions** — needs `(target_kind, target_name)` aggregation. Backend does **not** store "GEPA optimized · judged by 3 models" provenance (must infer or omit, D13). Variation B (diffusion) has **zero FE integration** despite waggle-dance carrying `skill_share`/`model_recipe` subtypes — it's a net-new feature, not a reskin.
- **15:** `SHOW_STREAK=false` + `STREAK_DAYS=0` are **intentional gates** awaiting a backend `streak` field (review must read them as TODO, not bugs). `OvernightHero`+`RunChip` are **already correct and live** (no work). `NotificationInbox` exists but is **isolated** (not wired to Home; renders ALL notification types uniformly — the opposite of the "earned nudge" the design demands). Memory-depth has **zero backend** (`HomeBriefing` has no `memoryCount`/`depthRank`). Correctly has no standalone `/habit` route (matches spec).
- **16:** Room = **single-column tile grid**, design wants **two-col** (shared turn stage + participants panel). Artifacts = **vertical list**, design wants **3-col card grid** with ext tiles + provenance. Profile = editable tabs only, **missing the "what Waggle knows" read-only facts** section. Mission Control = fleet/team/activity tabs, design leads with a **local-services list**. Agents swarm CTA exists but is **soft-routed/buried** (`:158`). Timeline is **fully aligned** (no work).
- **17:** **Net-new** — verified zero "benchmark" grep hits in `apps/web/src`; absent from AppId/routes/⌘K/`App.tsx`. Matrix data is hardcoded JS in `benchmark.html:168-180` (must inline or externalize). Numbers are June-2026-dated and must be **manually refreshed** from the `hive-mind` benchmark — they are accurate today (87.66 SOTA matches the published result + MEMORY.md SOTA index).
- **18:** **Net-new** — no `PlatformApp`/`PlatformRoute`; absent from AppId/routes/⌘K/`App.tsx`. The live 404 is the **generic `NotFound.tsx:1-24`** (no honey hex, no spec copy, no ⌘K affordance). The §18 Boot "warming the hive" view risks **colliding with the real AppShell boot gate** — keep it a static showcase (D6), don't rewire runtime.
- **Cross-cutting:** the BUILD-PLAN §6 PR6 row lists all 9 screens as one PR; this plan reframes that into the §2.5 split. Dock-tier `color` fields and the older apps still carry pre-warm tier colors (`text-violet-400`, `text-emerald-400`, `text-sky-400`) — swept per-file under D21, not as a separate migration.