feat(app): Yinka's first-conversation onboarding as the yinka arm of a three-way onboarding experiment
Summary
Adds Yinka's onboarding (PR #21445: Name → Permissions → Language → Connect Omi → a first real conversation, its summary and to-dos, the paywall, the rating ask) as the yinka arm of a three-way first-run onboarding experiment, next to today's native steps (control) and Reid's web page (reid). Nothing changes for anyone not in the experiment: the flag targets the test account only, and an unread flag, an unknown variant or a bad payload is control.
OnboardingVariantGatereplacesOnboardingWebviewGate: one multivariate PostHog flagonboarding-variant(control/reidwith{"url"}payload /yinka), same identity wait, warm-up, account-switch fence and verified reload. Debug:--dart-define=OMI_ONBOARDING_VARIANT=reid|yinka.- Yinka's screens live under
app/lib/pages/onboarding/variants/yinka/(copied from her branch, imports rebased) with a smallYinkaOnboardingFlowpage that runs them after sign-in and consent, like the web onboarding page. The wrapper still owns completion; it skips the end-of-onboarding paywall placement when the activation already offered a plan. - Shared, additive changes her flow needs: capture controller audio taps (+ a flag to hold the generic "talk for 30 seconds" notice), onboarding provider quiet scan /
endSearch, Bluetooth in the permissions panel enum, scanning ripple colour, in-app web page close button, the Omi shop helper, 32 strings in all 49 locales. - Out of scope on purpose (not onboarding): her Home live pill, Settings upgrade button, paywall re-ask, Superwall pilot, pull-to-refresh, Get-Started removal.
- The wrapper emits
Onboarding Variant Shownwith$feature/onboarding-variantfor every arm, the experiment's exposure event.
PostHog: flag 961069 (test account → yinka, everyone else control), draft experiment 484222, dashboard 2212642.
Testing
Simulator (dev flavour, prod backend, OMI_ONBOARDING_VARIANT=yinka): Name → Permissions → Language → Connect Omi ("Not ordered yet" opens the store sheet) → "Let's try Omi" → dictation → "You're all set, Nik" → rating prompt → outline paywall (the account's paywall arm) → Home, no second paywall. Kill-and-relaunch mid-flow resumed at Connect Omi. 60 unit/widget tests pass (gate, activation flow, connect step, summary text, existing onboarding tests).
Product invariants affected
- INV-CAP-1 — the capture controller change only adds observer taps (a copy of each phone-mic buffer / pendant packet handed to a listener) and a flag that hides a notice; no uplink, subscription, WAL or frame path is closed, fenced or skipped.
Failure class (fixes)
Failure-Class: none
UI-Evidence: none -- new screens are flag-gated to the test account; simulator walkthrough screenshots in the PR description are the evidence.