127 lines
30 KiB
Markdown
127 lines
30 KiB
Markdown
# 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. | **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; 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.
|