Onboarding And Teaching Surfaces
This runbook covers welcome, Block Party practice, sidebar tips, billing gates, and the rule that at most one onboarding card or modal is on screen at a time. Keyboard shortcut bindings themselves live in Shortcuts.
Teaching surfaces and their coordinator are documented in Frontend Runtime Flow.
Scope
Use this guide to validate:
- only one onboarding card or modal at a time (
RootShellsurface priority) - the billing gate and checkout celebration hiding lower-priority prompts
- the welcome flow with the mouse (every control responds to clicks)
- opt-in Block Party practice (
?play=1, command palette, welcome footer) - sidebar tip mute and five-minute rotation
- trial card banner dismissal persisting for the current trial end date
- palette Next time, press … teaching (see Shortcuts scenario 25)
The sidebar tip and the ? legend are not onboarding cards and may appear
alongside a card when the coordinator allows it.
Do not use this guide for full shortcut parity (see shortcuts.md) or auth
flows (see auth.md).
Setup
- Start the app with
bun run dev:web(anonymous IndexedDB is enough for most scenarios). - Use a fresh browser profile or clear cookies and local storage unless a scenario needs persisted flags.
- Use a desktop viewport (onboarding overlays are skipped on mobile OSes).
Helpful storage keys:
compass.onboarding.has-seen-welcomecompass.onboarding.has-seen-shortcut-showcasecompass.onboarding.first-event-donecompass.shortcuts.tips-muted(STORAGE_KEYS.SHORTCUT_TIPS_MUTED)compass.billing.trial-card-banner-dismissed-for(STORAGE_KEYS.TRIAL_CARD_BANNER_DISMISSED_FOR)
Automated coverage: e2e/onboarding/welcome-mouse.spec.ts,
e2e/onboarding/shortcut-showcase.spec.ts, and
e2e/onboarding/billing-gate-hides-prompts.spec.ts.
Scenario 1: One Surface At A Time
UX
RootShell owns an ordered list of teaching surfaces. Only the highest-priority
surface that wants the screen is mounted. Lower surfaces wait their turn.
Priority (highest first): billing gate, checkout celebration, welcome modal,
Shortcut Showcase, welcome guide, connect-calendar prompt, first-event prompt,
palette PointerHint.
Steps
- Open
/weekas a first-time anonymous visitor. - Confirm the welcome dialog is visible.
- Dismiss welcome with Explore without an account.
- Open the command palette and start Play Block Party.
- While Block Party is open, confirm no first-event card stacks on top.
Expected Results
- Step 2: only the welcome dialog is an onboarding card; no connect-calendar or first-event card appears underneath.
- Step 5: the practice region is the sole onboarding card; the first-event complementary card stays hidden until practice closes.
Scenario 2: Billing Gate Hides Prompts
UX
When the signed-in account cannot write (awaiting_checkout, expired, or
canceled), the billing gate owns the screen. Welcome, practice, connect
calendar, first-event, sidebar teaching copy, and palette PointerHint do
not appear above or beside the gate.
Steps
- Sign in on an account that is read-only with status
awaiting_checkout(or use the e2e mock inbilling-gate-hides-prompts.spec.ts). - Clear welcome and showcase flags so a fresh visitor would normally see them.
- Load
/week. - Optionally append
?play=1and reload.
Expected Results
- The Start your 7-day trial (or subscribe) billing dialog is visible.
- No welcome dialog, Block Party region, connect-calendar prompt, or first-event card is present.
?play=1does not open Block Party while the gate is up.
Scenario 3: Welcome Flow With The Mouse
UX
Every welcome control works with the mouse. No screen refuses clicks or shows "No clicks allowed".
Steps
- Open
/weekin a fresh profile. - Click Get started for free.
- Expand each FAQ row by clicking its question button.
- Click Next, then click Practice the shortcuts in the footer.
- On Block Party, click Start practicing.
Expected Results
- Each click advances or toggles state; focus and
aria-expandedupdate on FAQ rows. - Block Party opens from the footer link without requiring keyboard shortcuts.
- Covered by
e2e/onboarding/welcome-mouse.spec.ts.
Scenario 4: Block Party Is Opt-In
UX
Block Party does not auto-start when welcome closes or after signup. Entry
points are the welcome footer link, ?play=1, and the command palette
(Play Block Party).
Steps
- Fresh profile on
/week; complete welcome with Explore without an account. - Confirm Block Party is closed.
- Open
/week?play=1. - Open the command palette and run Play Block Party after closing practice.
Expected Results
- Step 2: no Shortcut practice region.
- Step 3: Block Party how-to card opens;
play=is stripped from the URL. - Step 4: practice reopens from the palette.
- Covered by
e2e/onboarding/shortcut-showcase.spec.ts.
Scenario 5: Sidebar Tip Mute
UX
The sidebar status bar rotates shortcut tips every five minutes. Hide tips
on the tip mutes sidebar tips and palette teaching hints via
compass.shortcuts.tips-muted. The command palette exposes Hide shortcut
tips / Show shortcut tips.
Steps
- Load
/weekafter welcome and showcase flags are set (signed-in or explore-without-account with sample events). - Open the sidebar if collapsed; note the tip in the status bar.
- Click Hide tips on the tip (or Tab to it and press Enter).
- Open the command palette, run Create event, and confirm no Next time, press … pill appears.
- Open the palette and run Show shortcut tips.
- Run Create event again.
Expected Results
- Step 3: the sidebar tip disappears and stays hidden after reload.
- Step 4: no palette
PointerHintpill. - Step 6: the pill returns after tips are shown again.
Scenario 6: Trial Card Banner Dismissal Persists
UX
When a trialing account needs a payment method and three or fewer days remain,
a non-blocking trial banner appears. Dismiss hides it for the current
trialEndsAt value in local storage.
Steps
- Sign in on an account with
subscriptionStatus: trialing,needsPaymentMethod: true, andtrialEndsAtwithin three days (seee2e/billing/trial-card-banner.spec.tsfor mock shape). - Load
/weekand confirm the trial banner status line. - Click Dismiss.
- Reload
/week.
Expected Results
- Step 2: banner visible; billing gate dialog is not open.
- Step 3: banner hides immediately.
- Step 4: banner stays hidden for the same
trialEndsAt; changing the trial end date in billing status may show it again.