Profile Setup
Six steps, no skip button
Overview
Six discrete steps that build the agent's profile. Each step animates in from below with a staggered fade, so the screen feels like it's being built around you rather than thrown at you. The StepHeader is the same on every step. The questions are deliberately blunt — 'Where does your productivity hurt the most?' — to set a tone. The final step is a TimeWasteSlider where the agent commits a number in hours per day. That number isn't used for anything analytical yet — it's a self-conviction tax.
How it works
A single screen with `step` local state, 1 through 6. Forward is a button, back is the arrow in `StepHeader`. There is no skip.
Each step uses a GradientBorderBox for its inputs, so the dark background feels structured rather than empty.
Step 2 is the DateInput. Step 3 is gender chips (male/female icons + 'prefer not to say').
Steps 4 and 5 are multi-select pickers built on a shared Picker component. Step 4 is 'what hurts' (ADHD, anxiety, etc.), step 5 is the inverse — what to improve (consistency, focus, etc.).
Step 6 is the time-waste slider — when the user lifts their finger, we trigger a haptic and the number animates. The final 'CONFIRM' button writes the profile to Convex via a `users.completeOnboarding` mutation.
Once complete, we route to `/onboarding-focus`. The user's onboarding state is read on every app launch by `useOnboardingStatus`, which decides whether to show the main tabs or kick back into this flow.
Key decisions
No skip button anywhere
Most onboarding flows let you punt on questions. Ours doesn't. The agent has to give us a name, a real age, and three areas to improve. We lose some installs at this step — that's the point. If you won't pick three things to fix, the rest of the app won't help you.
Self-conviction over data quality
The time-waste slider doesn't drive analytics — we don't even surface the number after onboarding. It exists so the user has to physically pick a number that's probably embarrassing. That moment is the start of the contract.
Reanimated for every step transition
We could have used `LayoutAnimation` or a simpler library, but every screen in the wizard uses Reanimated's shared values so the staggered entrance feels mechanically the same as the rest of the app. Consistency of motion is brand.
