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

30 KiB
Raw Blame History

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 /workspacesNavigate 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).

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.