Review Gallery

One place to see every changed surface in the state that shows the change, without making test data. Two halves that share one list: a native window under Diagnostics ▸ Review Gallery… for the Mac app, and a dev-only page at /report/dev/review for the web report. Each entry renders the real view, fed fake inputs; nothing is redrawn by hand, so what you see is what ships.

1 · The Mac window

The same shape as Sidebar Lab and Keycap Gallery: a source list on the left, the specimen on the right. Selected here: the boot-failure pane from f7048124 and 4d8053c9.

Review Gallery Appearance: Auto ▾Language: English ▾Changed since: 20 Oct ▾
Panes and sheets
Couldn’t start Bristlenose3
✓Re-analyse can’t count your edits1
Project list couldn’t be read1
Sidebar rows
Row states (new since 20 Oct)7
Speech model downloading2
1 min left (fr · es · it · pt · ca)5
Popovers
Duplicate transcript set aside1
Provider not set up1
Settings
✓Key not saved to Keychain3
MCP Install opened nothing1
Accounts: parked platform1
In the app (opens the real thing)
Stopped study offers Analyse ↗1
Failed study refuses files ↗1

Couldn’t start Bristlenose

After a failed Retry the button becomes Send Feedback…; the timeout now says 90 seconds.
f70481244d8053c9BootView.swift
Mark Reviewed
State First failureAfter a failed retry90 s timeoutSidecar missing Show details
BootView · .failed · startedByRetry = true · 520 × 360
⚠︎

Couldn’t start Bristlenose

Bristlenose stopped before it finished starting (code 1).

Send Feedback…Show details
Buttons are live: Send Feedback… opens the real sheet.⌘↓ next entry · ⌘R mark reviewed

2 · An entry with many states at once

Where a change is a family of small states, the canvas lays them out side by side instead of one at a time. These are the real sidebar cells (ProjectSidebarOutline), each fed a fake study.

Acme onboarding8⚠︎Provider not set up
Checkout v25⚠︎Project file damaged
Pricing interviews12Exporting…
Diabetes diary6Downloading speech model · 412 MB of 1.6 GB
Kitchen study9⚠︎This report couldn’t be shown
Empty folder—⚠︎No analysable interviews found
Old shoot3⚠︎Missing
Each cell is labelled in the gallery with its commit and the fake state behind it, and clicking a cell opens its popover, so the row and its explanation are reviewed together.

3 · The web page

Dev builds only (serve --dev), never in an export or a release. The same list on the left; the specimen is the real React component. Its one new tool is a fault bar: fail or hang a chosen request, so failed-read and crash states need no code edit and no killed server.

localhost:8150/report/dev/review#lens-crash
Crashes
A lens crashes2
A sidebar crashes2
Header or dialog crashes4
The whole report crashes1
Failed requests
Sessions read fails2
Timeline read fails once1
Saving a removed quote1
Feedback can’t send or copy1
Chips and exports
AutoCode catch-up outcomes3
Miro: not connected / no link2
Miro token not stored1

A lens crashes

The crash stays inside the lens: header, nav and sidebars stay up.
e63d82ef95f95c6fRouteError.tsx
Mark reviewed
Fault Crash ▾ in Signals lens ▾ every time ▾ Apply or Fail ▾ GET /sessions ▾ with 500 ▾
⚠︎
This lens couldn’t be shown. Try again, or choose another lens.
Retry

4 · How it stays honest, and what it costs

QuestionAnswer
How does an entry get in?A small registry, one entry per changed surface: title, the commits, the view, and its fake states. Adding the entry is part of landing the UX change; a test fails if an entry names a view or a state that no longer exists, so the gallery cannot quietly rot.
Real views or drawings?Real. The Swift window hosts the actual SwiftUI/AppKit view; the web page mounts the actual component. That is why it needs the fake-input seams below and not screenshots.
What’s needed first (Mac)The window itself; new fixture states for the sidebar row and popover (provider not set up, damaged manifest, report crash, Exporting…, downloading speech model, no analysable interviews); wiring the half-built Whisper debugApply; a Keychain-refusal seed through the existing KeychainStore injection.
What’s needed first (web)The dev-only page; the fault bar (a request-fault injector and a per-part crash trigger), compiled out of release and export builds.
What it coversOf the 69 changes since Monday: the 19 gallery items and 4 seeds directly, and about 7 of the 26 hands items once the fault bar exists. The 20 look items stay in the review list as links. What it can’t fake honestly (a real Keychain prompt, an iCloud placeholder, two windows) stays on the hands list.
Who sees itMac: the Diagnostics menu, debug and .dmg beta builds only, like the other labs. Web: serve --dev only.
Review state“Mark reviewed” is per machine and per change window; it resets when the list moves on.

This is new tooling, not product UX, but it is architecture: a registry and two fake-input seams. That’s why it’s a mockup for your call rather than something built under the trust goal.