feat(app): Yinka's first-conversation onboarding as the yinka arm of a three-way onboarding experiment

Merged
KO
2d ago
+12531-437

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.

  • OnboardingVariantGate replaces OnboardingWebviewGate: one multivariate PostHog flag onboarding-variant (control / reid with {"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 small YinkaOnboardingFlow page 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 Shown with $feature/onboarding-variant for 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.