30 KiB
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 toStorageType = '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 thehive-mindbenchmark. - §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. | S–M |
| 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; inlineCAPS11×6 +SOTA_BARS4-bar constants, dated, with the no-fabrication caveat verbatim) +routes/BenchmarkRoute.tsx(thin wrapper, PR1a §5.1 pattern). Register inroutes/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 aviewenum; Desktop has a macOS↔Windows titlebar toggle) +routes/PlatformRoute.tsx+ register/platform(⌘K-only). Reskinpages/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.tsxwith 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 byGET /api/workspaces/:id+ the file-tree route) + newStorageAndFilesApp.tsxwrapper (A/B segmented toggle, hostsFilesAppfor B) routed viaFilesRoute; add a Source column toFilesApp(:539-544, gated when provenance absent). - 08: add per-model bars + budget UI to
TelemetryApp; Renew→Rotate inVaultApp; color-stratified risk badges inApprovalsApp; 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 existingEvolutionRundata; 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.
- 06: extend
- PR6c (data surfaces, the only net-new backend):
- 04: new
AllWorkspacesApp.tsx(grid + search + storage filter pills + cards w/ actions viauseWorkspaces/adapter.getWorkspaces/ShellContext.selectWorkspace) +routes/WorkspacesRoute.tsx; replaceApp.tsx:66redirect; add ⌘K entry. ReuseWorkspaceActionsMenufor row actions. No new backend (all routes exist:GET /api/workspaces,DELETE/PATCH /api/workspaces/:id). - 15: flip
SHOW_STREAKonce a realstreaklands onHomeBriefing(the one backend field — calculation owner TBD, D17); OvernightHero is already correct; depth/nudges deferred (D18).
- 04: new
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.
PlatformApp3 tabs + route + ⌘K register; reskinNotFound; 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+StorageAndFilesAppwrapper +FilesAppSource 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_STREAKgated on the realstreakfield; 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.tsxthe 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→ explicittsc -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:
/workspacesrenders 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.7makes Home the workspace selector (HomeRecentWorkspacesPanelshows ~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.htmlhas BOTH variations (segmented control:110-113); the ReactLauncherApprenders only Variation A — no toggle, no Variation B. Copy is generic ("Tool Launcher", "Optional prompt") vs the spec narrative. - 07: The existing
FilesAppTabsstorage-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 separateConnectorsApp(:229comment).CapabilitiesApp.Toolsshows generic agent tools (read_file/bash/web_search), not connected integrations (those live inConnectorsApp) — 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 carryingskill_share/model_recipesubtypes — it's a net-new feature, not a reskin. - 15:
SHOW_STREAK=false+STREAK_DAYS=0are intentional gates awaiting a backendstreakfield (review must read them as TODO, not bugs).OvernightHero+RunChipare already correct and live (no work).NotificationInboxexists 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 (HomeBriefinghas nomemoryCount/depthRank). Correctly has no standalone/habitroute (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 inbenchmark.html:168-180(must inline or externalize). Numbers are June-2026-dated and must be manually refreshed from thehive-mindbenchmark — 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 genericNotFound.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
colorfields 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.