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

104 lines
7.6 KiB
Markdown
Raw Permalink 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.
# Wave R — R10 convergent fixes (2026-07-06 S2, goal 5×9/10)
R10: design 7.8 · kw 7.7 · competitor 7.6 · a11y 7.6 · brand 7.5 (min 7.5 avg 7.64 —
new min high; loop moving again). Shots:
`C:/Users/MARKOM~1/AppData/Local/Temp/claude/D--Projects-waggle-os/a6467fd9-181f-4689-a4ee-1d6dedbbfb17/scratchpad/shots/judge-round10/`
Same vocabulary + honesty contract as waves P/Q. Surgical; both themes; testids/aria survive.
## Lane A — settings selection grammar + Show re-home (5/5 flagged the blue ring) — 6.6 worst
Evidence: `137-settings-models-dark/light.png`, `141-settings-provider-selected-dark.png`.
Files: `model-gate/ModelGate.tsx`, `apps/SettingsApp.tsx`, `os/ModelPilotCard.tsx`, tests.
1. **Kill the blue ring** (all 5 judges): shot 141 shows Anthropic with a browser/Tailwind
DEFAULT BLUE focus/ring while OpenAI wears the honey selected border — find every `ring`
utility in the tile grid missing an explicit ring color + the focus-visible outline, and
tokenize: honey ring = selected/focus, risk tint = error; never two ring languages at once.
An error tile that is ALSO selected shows risk ring only.
2. Dark segmented control (API key / Local model): real active state — filled cell
(bg-card + shadow-sm is too subtle in dark; add honey underline or stronger fill) to match
light's clarity.
3. **Re-home the Show control** (3/5): out of the rail foot → the CONTENT side: a compact
labeled control in the settings content header row (right-aligned, caption "Show"),
so it sits visually above the sections it gates. Keep aria + tier mechanics + tests.
4. ModelPilotCard: replace bare `$$$` glyphs with explicit cost text (e.g. "$$$ · ~$0.05/msg"
already exists as a legend at card foot — surface the per-row cost inline, or tooltip +
aria-label; judges called the glyphs cryptic).
## Lane B — workspace card living identity (5/5 HIGH, third round) — 7.0
Evidence: `132-workspaces-dark/light.png`, `140`. The card body still reads as reserved-but-empty;
Open is hover-only; two "Research Hub"s differ only by slug chip; dark cards near-vanish.
Files: `packages/server/src/**` (workspace list route), `apps/web/src/lib/types.ts`,
`apps/web/src/lib/adapter.ts`, `apps/AllWorkspacesApp.tsx` (+test).
1. **Server enrichment (the real unlock):** find GET /api/workspaces list route; the workspace
summary/description cache and per-workspace session/memory stores exist server-side. Extend
each list row with REAL fields where cheaply available: `memoryCount` (frame count for that
workspace mind) and `lastSessionTitle` or the cached summary line. NO N+1 explosion: batch
or reuse existing counts; if a count is expensive, skip it — never estimate. Typecheck
packages/server with its own tsconfig (it is NOT covered by npm run build).
2. Card render: body = description OR cached summary OR lastSessionTitle-composed line
("Last: <title> · 2w ago") — real strings only; memory count joins the meta footer (⬡ N).
3. `Open →` becomes a PERSISTENT quiet affordance (text-dim at rest, honey on hover) — no
more hover-only reveal; keep the whole-card click.
4. Duplicate names: promote the disambiguator — slug chip moves up beside the title at
readable weight (11.5px), not a whisper below it.
5. Dark theme: card border one token step up (line-soft → line) so cards stop vanishing
(a11y ask); keep light as is.
## Lane C — marketplace craft pass (4/5) — 7.3
Evidence: `136-marketplace-dark/light.png`.
Files: `apps/MarketplaceApp.tsx`, `apps/extend/*` (ExtensionCard, AgentSearchBox…).
1. One chip grammar: tag lozenges (mcp / Security / local registry…) restyle to the app-wide
quiet chip (11px, line-soft border, text-muted) — no third grammar.
2. Search submit: the honey up-arrow orb reads as scroll-to-top — swap to a labeled affordance
(e.g. ⏎ "Search" chip or magnifier-forward) — pick the least-chrome honest option.
3. 'Connected' pill: teal/green → the warm healthy token already used app-wide (--healthy is
sage — fine) BUT brand judge flags it as off-palette teal: verify which token it uses and
align to --healthy + healthy-wash grammar used on agents/home chips.
4. "Not scanned" shield-warning → neutral quiet chip "Safety scan pending" (kw), tooltip intact.
5. START HERE re-curation: lead with memory-feeding connectors (Gmail / Google Drive / Notion /
Slack — whichever of those exist in the catalog), demote 1Password; tighten row vertical
padding one step (density).
6. Listing identity: bump logo tile size one step so brand marks carry the row.
## Lane D — chrome truth + token passes (kw HIGH numbers + a11y tokens)
Files: `os/StatusBar.tsx`, `apps/ChatApp.tsx` (+ chat composer/empty files it imports),
`index.css` (ONLY this lane touches it).
1. **Numbers scope** (kw #1): status bar "552 memories" counts ALL minds; memory page counts
the personal mind (448). Make the scope visible in the chip itself — shortest honest label
(e.g. "552 memories · all minds"); do NOT change what is counted, label it.
2. Composer control family: persona chip, Memory chip, Ask-first, model chip → ONE species
(same height, radius, border/fill logic); the bare '>' collapse toggle gets an aria-label
+ tooltip ("Collapse agent strip") or a clearer icon.
3. Message attribution line (Waggle · Verifier · model): one size/contrast step up (a11y —
it is the only provenance signal on a turn).
4. index.css token pass:
- LIGHT: card elevation one step (slightly stronger --shadow-card + --line-soft on ivory);
light --attention #b57d12#9a6408 (matches --honey-text light, 4.64:1 AA — fixes
"aging — added 2w ago" micro-text) — verify attention-WASH stays as-is.
- DARK: muted chip legibility one token step (inactive filter chips sit below comfort —
bump the chip text token used there, NOT global --text-dim which was already tuned).
- Hex wallpaper: add a radial falloff/vignette so the pattern fades toward the content
column (design+brand: "wallpaper → compositional") — CSS mask/radial-gradient on the
wallpaper layer, both themes, subtle.
5. Chat empty state: place one flat-geometric bee mascot (assets/personas set) with a short
warm line — brand judge: "free the mascots". Only if ChatApp owns an empty-state block;
do not invent a new empty state.
## Lane E — brand moments + memory stats + landing stat (brand HIGH)
Files: `overlays/onboarding/WelcomeStep.tsx`, `overlays/LoginBriefing.tsx`,
`apps/memory/MemoryTrust*.tsx`, `apps/www/app/**` (landing hero stat only).
1. Onboarding welcome: one bee mascot moment (flat-geometric set — e.g. general-purpose bee)
beside/above the headline — placed calmly, not clip-art; both themes.
2. LoginBriefing (content state): mascot in the header ("Catching you up" + small bee);
differentiate I-REMEMBER sparkle cards from workspace cards (distinct container tint —
honey-wash vs surface); label the brain/chat micro-counts (aria + visible tooltip);
bottom scroll affordance (edge fade) when the list overflows.
3. Memory stat row: never lead with a zero — order chips by value desc (zero chips last,
already quiet-styled); keep the disclaimer.
4. Landing hero (apps/www): the 86.49% LoCoMo line gets flagship-stat weight — a stat chip /
larger mono treatment near the CTAs (competitor+design). Canonical number 86.49 ONLY.
Gate: `cd apps/www && npx next build` must pass (honest gate for www).
## Per-lane gate
Related vitest green + eslint on touched files; Lane B ALSO: npx tsc --noEmit -p packages/server/tsconfig.json.
NO cross-lane file edits. Orchestrator: full web tsc + vitest + www build after merge.