Repository navigation
Inbox: the onboarding tour (a replay of how we built the Inbox with the Inbox) - #2156
Merged
Merged
Conversation
…ne and the tour window The approved tour (approval inbox-onboarding-tour): a replay of the real Guided Reviews in VS Code thread, drawn with the window's own list, thread and picture-choice card over a fixture served lazily from the binary, then step 6 in the person's own first-run screen. Two paths entry, Settings and What's new entry points, tour bar with a chip for real arrivals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…decided Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…prompt; shot helper fixes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Notifications and the sound work as always on step 6 and with the tab in the
background; only the replay in front stays quiet (the chip says it).
- The first real thread's inline ask follows the list's ask (never off or
dismissed), in a real thread's words, and the list's line stands down.
- Search does not open over the replay.
- Exit and Finish go back where the tour started (Settings stays Settings);
Back never reopens the tour or records a second skip.
- Picture labels: ui QuestionBlock's pictureBadge seam (default absent);
"Mockup · VS Code" ("Mockup" on a phone) and "Screenshot · Inbox".
- The What's new line stops once the tour is skipped or finished.
- Step 6's Try it carries the brief's prompt (one real question, with pictures).
- Tests for each; the routes check now compares the binary's content byte for
byte; shots wait for the coach's entrance.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The picture badge is styled inline: no new utility class, so the guides.show viewer CSS and its pinned manifest stay byte for byte (check:manifest). - The chip and the tour sidebar's Settings replace the tour's history entry, so Back never reopens #tour=N. - The tour's start point is kept only for a tour started from a screen and is forgotten when it ends: a tour reached by a link exits to the Inbox. - e2e: Back after the chip and after Settings, and the link-entered tour's Exit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The picture badge moves into the extracted QuestionPictureTiles (its pictureBadge prop; the card passes it through), still styled inline so the guides.show viewer's CSS and manifest stay unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The landing loop counted the pressed Exit or Finish as focus while the tour's screen was still up; on a slow runner the Inbox redrew after that and focus dropped to the page (the Inbox window e2e on Linux CI). It now waits for the tour bar to go, then for focus to hold over a few frames, for up to 3 s. Tests: focusKept also checks focus is still held a moment later; the link case checks the person's own list (a thread that arrived mid-tour waits behind "N new"); PLANNOTATOR_E2E_CPU_THROTTLE reproduces a slow runner. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…inished - endTour(kind, to?): what it records (exit or finish) apart from where it goes. Step 6's How to allow opens Settings → General and records finished. - Step 6's real sidebar rows (Inbox, projects, Settings, Drafts, pins, What's new, Reload Claude Code) end the tour, finished. - writeRoute replaces whenever the route leaves a #tour entry, and the Exit fallback after a reload or a link replaces too, so Back never reopens #tour=N. Leaving step 6 by Back records finished, before it skipped. - e2e: How to allow, the step 6 sidebar's Inbox and Settings rows, Exit after a reload; Back never reopens the tour. - AGENTS.md: the wording, and PLANNOTATOR_E2E_CPU_THROTTLE. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
settingsReturn and whatsNewReturn skip #tour routes, so ← Inbox after leaving step 6 (sidebar Settings, How to allow, What's new) goes to the screen before the tour. The step 6 e2e case presses both buttons; the blocked-notifications init script now runs before the first navigation. Co-Authored-By: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Builds the owner-approved Inbox onboarding tour (approval
inbox-onboarding-tour, 2026-10-24; record, prototype and BRIEF in.product/approved/inbox-onboarding-tour/, not in this repo). All seven §7 choices are built as recommended.What it is
The idea: "To show you how the Inbox works, here is how we used it to build the Inbox."
The tour replays the real thread Guided Reviews in VS Code: spec and prototype. It uses the window's own
InboxList,MessageBody(the real question card with #2144's picture tiles) andSidebar, fed from a fixture instead of the person's store.prototype.htmlin asandbox="allow-scripts"frame.pictureBadge(absent by default, so every other card is unchanged).Server
GET /api/inbox/tour/fixture.jsonandGET /api/inbox/tour/assets/<name>(packages/server/inbox-tour.ts):sandbox allow-scripts, neverallow-same-origin.packages/inbox/tour/content/. It is embedded through literaltype: "file"imports (inbox-tour-content.ts) and served lazily, never inlined into inbox.html.POST /api/inbox/settingstakes{ tour: { seen?, finished?, skipped?, notify_again? } }. It is stored as config.jsoninboxTourand returned in GET astour. No other routes were added.Rules kept
Tests
Unit:
packages/inbox/tour/model.test.tscovers:packages/server/inbox-tour.test.tscovers the routes and thetourkey.DOM:
packages/inbox/tour.test.tsx, added to test.yml's DOM list. It covers:e2e:
tests/e2e/inbox-tour.spec.ts, against the compiled binary:Existing first-run specs and DOM tests now mark the tour decided first (
tests/helpers/tour-decided.ts; the DOM server'sfirst-runmode does it).inbox.spec.ts's rhythm check now counts the new quiet "Take the 2-minute tour" line.Results:
bun run typecheckpasses.--isolate), with the ui picture tests: 780 pass.plannotatorbinary, and so doinbox,inbox-first-run,notifications,inbox-agents,inbox-phones,inbox-tailscale,inbox-settings,inbox-soundandinbox-mobile.Timing (the brief's paced model: 220 wpm, 1.5 s to find a control, 3 s for the closer look, 5 s in the mock; screenshot time left out):
Differs from the prototype
🤖 Generated with Claude Code