Tutorial teardown: five broken guided paths repaired
A scripted-browser walk of every guided path (fresh profile, screenshots per step) against a full code read of the tutorial system. The teaching copy held up; the machinery didn't — five P0s, all fixed. Full findings in docs/APP-TUTORIAL-TEARDOWN-2026-08-06.md.
- Sample runs keep their DEMO dress — running "Try it with sample data" published an unstamped result: DEMO chip gone, run labeled "Live · workspace data," $10/$30 report cards offered on our own demo CSVs. Fixtures now carry provenance; any run including one publishes
isSynthetic; the shelf swaps purchase cards for a "Scan my data" beat on sample runs. - The real-data path finally gets a tutorial — a fresh signup landing on
/workspace/scan?intent=realsaw an empty board and nothing else (first-run guidance was suppressed for authed users on the false assumption they'd toured/explore). The board tour now auto-opens once on the empty board. - Board tour decks match the board — the tour auto-fired exactly when the wizard removed both its anchors from the DOM, degrading every run to unanchored centered cards narrating an already-finished drop step. Steps now come in empty / triage / ready decks with anchors on the live wizard card and progress strip;
?tour=1is consumed after firing. - The evidence step opens a surface that exists — tour step 2 promised "we'll open the evidence view" through a wire feeding a component that is never mounted. The step now opens the costliest finding's record in the findings drawer, anchors on it, and Back closes it; tooltip height is measured instead of guessed.
- Every "tour" link starts a tour, one price story — banner, tour-end modal, and TOUR-badged sidebar links now carry
tour=1; the end-modal subtitles describe the current product (no more "sample canvas," no "upload two sample CSVs" on the your-own-data path); the/exploredwell nudge drops the stale "$10 beta scan" for the free-run story. - ~1,500 lines of dead tutorial code deleted —
ScanWorkspaceTour(6/6 dangling selectors),NextActionCoach(never mounted),TemplatesRail/TemplatesPulse(orphaned), plus their scaffolding state, storage keys, and z-index band. - Wizard triage: every card asks something — trusted joins (high confidence, or reviewed) no longer enter the decision queue, killing the six consecutive "line up → Next" nod-cards on the sample board (11 cards → 5); the pip count and the "N to decide" label now describe the same set and count down together; the Ready view carries the "N connections lined up on their own" beat next to the map that draws them checked.
- Tour truthfulness — skipping the DriftBoard tour gets "Tour closed — pick it up any time" instead of the completion celebration (same three-path modal either way), and step 1 no longer asserts "everything else is in sync" — a claim the tour can't verify.
- A11y/keyboard pass — a shared focus trap backs every
aria-modaltour and modal (autofocus on the advancing action, Tab wraps, focus restored to the opener); both live tours announce step changes to screen readers; BoardTour gains arrow-key navigation; the wizard's Enter/1/2/M shortcuts move onto data attributes with a visible legend, and the wizard suspends focus + shortcuts while the tour covers it (Enter could previously answer a card hidden behind the scrim); SystemInventoryModal gets role/aria, Esc, scroll lock, and comes down off the 9999 z-index ceiling. - Polish — the wizard floor carries "Nothing here is final — review any connection again from the board afterwards" (the no-back-button answer, made visible at the moment of hesitation); the editorial frame's inline z-indexes move onto a documented
ED_LAYERladder insrc/lib/editorialLayers.ts; the unrecognized-file question is asked in one voice fromunrecognizedFileCopy.ts.