Skip to content

B2C Strategic Practice (one-tap practice + onboarding once)

Status: in progress Owner: Bhanu Related: Study Plan engine (#1127, PR #1204), AITutorPage practice flow

Why this exists (Product Mindset Gate)

  1. Who asked for it? Bhanu, from dogfooding the Study Plan. Direct observation: "Start practice takes me through the mock-test onboarding every time. Onboarding is for one-time. Driving the user through it on every practice start doesn't make sense."
  2. What user pain? A learner taps "Start practice" on a ranked chapter (e.g. Electrostatics) from their Study Plan and, instead of practicing it, hits a wizard re-asking subject / chapter / question-count / difficulty they already implied by tapping that chapter. Friction sits on the single action the whole Study Plan exists to drive.
  3. Cost of not doing it? The Study Plan's promise ("study what is ranked next") dies at the click. Every practice start taxes the user with a setup wizard. Lower practice-start rate, and the paid Pro feature feels hollow.
  4. Validated or guess? Validated. Owner observation plus every serious competitor doing the opposite: Duolingo (one tap, algorithm picks next), Embibe (auto weak-chapter practice), Physics Wallah / Allen / Aakash (chapter to DPP, one tap), Unacademy / Toppr / Doubtnut (topic to adaptive set, one tap). None gate practice behind a per-session wizard; onboarding is one-time at signup.
  5. How we know it worked? Tap-to-first-question drops to ~0 extra steps; practice-starts-per-session rises. Sean Ellis counterfactual: if we re-added the per-session wizard, returning learners would complain "why is it asking me again."

What changes

One-tap practice (decision: derived params)

  • "Start practice" on a Study Plan chapter goes straight into a practice set for that chapter.
  • Parameters are derived, not asked: difficulty = adaptive from mastery (cold-start = mixed), question count = a sensible default (10).
  • The PracticePicker wizard is demoted from a mandatory gate to an optional "Customize" affordance.

Onboarding once (decision: once, then never)

  • The mock-test / practice onboarding wizard (AITutorPage wizardSteps) runs on first practice only.
  • Persist a "completed" flag (profile or durable store), then skip on every subsequent practice.
  • Stays re-accessible from settings; an already-onboarded learner (signup captured exam/subjects) skips it entirely.

Non-goals (v1)

  • Redesigning the chat/practice generation itself or the question engine.
  • Changing the trainer (teacher) practice-authoring flow — this is the learner practice path only.
  • Re-theming the switcher / other Study Plan visuals (tracked separately, needs a screenshot).
  • Building a brand-new adaptive difficulty model — "adaptive from mastery" uses existing mastery signal; cold-start = mixed.

Rejected alternatives

  • Keep picker, prefill, one confirm tap. Still an extra screen on every start; competitors skip it. Rejected for the derived-params path.
  • Remember last choices and replay. Honors explicit prefs but is less strategic than mastery-adaptive; kept as a possible later refinement, not v1.
  • Keep onboarding, just make it skippable. Relies on the user to dismiss every time; not honest one-time. Rejected for the persisted once-flag.

Implementation notes

  • Entry: Study Plan chapter CTA already builds /learn/practice?subject=X&chapter=Y (buildDrillHref, on the Study Plan M1 branch). The AITutorPage flow must respect those params + derived defaults and skip the picker.
  • Flow lives in apps/web/src/pages/shared/AITutorPage (ChatEngine, IntentPickers/PracticePicker, wizardSteps).
  • Once-flag: prefer a durable per-user flag; if backend work is needed, scope it; localStorage is a fallback only if a durable store is unavailable.

Changelog

  • 2026-07-01: Doc created with gate answers; decisions locked (one-tap derived params; onboarding once-then-never).