evOo-local production readiness (Phase 1)
Audit of user journeys, automated coverage, known defects, and Phase 2 backlog. Scope: web app (apps/web), API, shared packages; mobile (apps/mobile) noted where CI does not cover it.
Product surfaces
| Surface |
Entry |
Locales in CI |
| Desktop web |
≥768px viewport |
EN + DE in targeted specs |
| Mobile web |
390×844, touch |
EN + DE in targeted specs |
| API / Postgres journeys |
packages/testkit |
EN |
| Mobile native |
Expo app |
Maestro smoke only (not full matrix) |
User journey inventory
Legend: E2E = Playwright under apps/web/e2e/; Unit = vitest in app/packages; PG = postgres journey in testkit; Gap = missing or partial automation.
First run & onboarding
| Journey |
Routes / UI |
Desktop E2E |
Mobile E2E |
Unit/PG |
Gaps |
| Sign up |
/sign-up |
golden, first-run-onboarding-ux |
same |
auth PG |
— |
| Look category & swipe |
/onboarding emoji step |
onboarding-oo-swipe, onboarding-emoji-first |
swipe spec (desktop viewport) |
— |
Mobile-specific swipe gestures |
| Name Oo |
name step |
first-run-onboarding-ux |
partial |
— |
— |
| Language |
language step |
first-run-onboarding-ux, ui-locale |
DE skip label |
— |
— |
| Voice |
voice step |
first-run-onboarding-ux, voice |
DE voices |
— |
Kokoro offline errors |
| Integrations / scan |
optional steps |
onboarding-discovery, onboarding-complete |
— |
onboarding PG |
— |
| Reload mid-onboarding |
/onboarding |
onboarding-reload-persistence (this PR) |
same |
onboarding-draft.test |
— |
| Intake cards (focus, goal, rhythm, quiet hours) |
/app/g/… |
onboarding-intake |
onboarding-intake-de |
onboarding-intake PG |
Full DE rhythm/quiet copy |
Deep link /onboarding while signed in |
redirect rules |
partial via auth specs |
— |
— |
Explicit deep-link matrix |
Session & auth
| Journey |
Routes |
E2E |
Gaps |
| Sign in / out |
/sign-in, / |
auth-lifecycle, browser-auth |
Tailscale / cookie edge cases |
| Password reset |
/forgot-password, /reset-password |
auth-lifecycle |
— |
| Session unavailable / retry |
/app loading |
module-recovery |
— |
| Welcome (signed out) |
/ |
smoke |
— |
Heute (daily brief)
| Journey |
Route |
E2E |
Gaps |
| Open Heute |
/app/heute |
heute-brief |
Mobile layout overflow audit |
| Coach / goals list |
Heute UI |
heute-brief |
— |
| Deep link reload |
/app/heute |
partial |
Console errors on cold load |
1:1 & group chat
| Journey |
Route |
E2E |
Gaps |
| Main conversation |
/app/g/:groupId |
main-conversation, first-conversation |
— |
| Bot thread |
/app/:botId |
many specs |
— |
| Send message |
composer |
message-send |
— |
| Streaming / progress |
transcript |
chat-progress-messages (fixture), chat-queued-progress |
Real LLM latency (mocked) |
| Queued / slow model UI |
composer + transcript |
chat-queued-progress |
Multi-run queue depth |
| Errors & retry |
composer banner |
run-failure, computer-screen-error |
— |
| Stop run |
composer |
golden |
— |
| Peer / group |
/app/g/… |
group-chats, peer-messages |
— |
| Console cleanliness |
main paths |
journey-console-errors |
Full matrix all routes |
Oos (bots)
| Journey |
E2E |
Gaps |
| Create / name / archive / delete |
bot-crud, new-bot-ux |
— |
| Switch bot / sidebar |
sidebar-nav, unterhaltungen-sidebar |
— |
| Avatar / look |
oo-avatar, look-suggestion |
— |
| Capabilities |
bot-capabilities |
— |
| Team vs dedicated computer |
team-computer |
Real docker teardown in PG |
Projekte
| Journey |
E2E |
Gaps |
| Create project space |
spaces, adaptive-workspace |
— |
| Bind folder + git |
project-main-agent |
— |
| Timeline / goals |
project-main-agent |
Voice-first goal card |
| Empty project |
partial |
Dedicated empty-state spec |
Settings
| Journey |
E2E |
Gaps |
| General / account |
settings-shell, user-profile |
— |
| Language (UI locale) |
ui-locale |
— |
| Voice |
voice, media-settings |
— |
| Goal / intake copy (DE) |
onboarding-intake-de |
Profile fact values remain EN from server |
| Privacy / delete account |
settings-privacy |
Docker/network cleanup verified in adapters unit; PG journey extension |
| Model connection |
model-settings, models-managed |
Offline model banner |
| Notifications / quiet hours |
notification-settings |
— |
| Messaging |
messaging-settings |
— |
Account & space deletion
| Journey |
E2E / PG |
Gaps |
| Delete account (API) |
PG journey 11 |
Team sandbox + data/homes/team-* cleanup added in API (this PR); PG assertion Phase 2 |
| Delete empty space |
authorization PG |
— |
Empty, error, offline
| Journey |
Coverage |
Gaps |
| No model connected |
model-settings, composer banner |
— |
| Server unreachable |
SessionUnavailable UI |
E2E |
| Empty inbox / no bots |
partial |
— |
| Teaching blocks composer |
Shell copy |
E2E |
Navigation, keyboard, a11y
| Journey |
E2E |
Gaps |
| Escape closes mobile drawer |
first-run-onboarding-ux mobile |
— |
| Command palette |
command-palette |
— |
| Mention picker keyboard |
mention-picker-keyboard |
— |
| Collapsible sidebar |
collapsible-sidebar-sections, mobile-sidebar-swipe |
Touch target audit (44px) |
| Focus management on drawer close |
mobile esc test |
Broader focus trap review |
Integrations & MCP
| Journey |
E2E |
Gaps |
| Integration setup |
integration-setup |
— |
| MCP OAuth callback |
mcp-oauth |
— |
| GraphQL integrations |
graphql-integrations |
— |
Prioritized defect list
Severity: P0 ship blocker · P1 major UX/trust · P2 polish · P3 nice-to-have
Fixed in Phase 1 (this PR)
| ID |
Sev |
Issue |
Fix |
| PR1-1 |
P1 |
Reload during onboarding lost look/name/step |
Session draft via onboarding-draft.ts |
| PR1-2 |
P1 |
DE UI: goal placeholder / discovery “Chief of Staff” English |
Lingui for discovery; intake DE E2E |
| PR1-3 |
P1 |
Account delete left team sandbox + homes |
destroySpaceSandboxes on account delete |
| PR1-4 |
P1 |
Chat felt idle while queued / slow send |
Composer sending+run chrome; queued label; 120s watchdog |
| PR1-5 |
P2 |
Console errors on main journeys |
journey-console-errors spec |
Remaining — Phase 2+
| ID |
Sev |
Issue |
Notes |
| R2-1 |
P1 |
Profile fact values (e.g. focus goal text) stored/displayed in English in DE UI |
Server-side localization or locale-aware fact rendering |
| R2-2 |
P1 |
PG journey: assert filesystem/docker cleanup after account delete |
Extend journey 11 with fake sandbox + temp data dir |
| R2-3 |
P2 |
Five persona-test console/network errors (root causes) |
Need symbolicated list from persona run logs |
| R2-4 |
P2 |
390px layout overflow on long German strings |
Audit Heute, settings, project timeline |
| R2-5 |
P2 |
Touch targets <44px in dense sidebar rows |
Measure sidebar-unterhaltungen rows |
| R2-6 |
P2 |
Deep link every route while signed out/in |
Table-driven Playwright matrix |
| R2-7 |
P2 |
Offline / model-not-connected on mobile web |
No E2E |
| R2-8 |
P3 |
Mobile native parity for onboarding reload |
Expo secure store draft |
| R2-9 |
P3 |
Intake card English questions in non-EN tests |
Extend locale matrix beyond DE |
| R2-10 |
P3 |
NPS/SUS follow-ups from persona round 2 |
Product research, not CI |
CI gates (Product)
Lint · Typecheck · Unit · Postgres journeys · Production builds · Web E2E (Playwright). Desktop Electron E2E runs in CI virtual display only.
How to extend this doc
When adding a journey spec, update the table row and move defects from Remaining to Fixed with PR link. Keep user-visible copy quoted in PR descriptions when introducing new strings.