feat(cases): the New Case wizard lacks the mock's Signals and Review steps and the per-case auto-capture switch#1526
Summary
The design mock creates a case through a three-step wizard: Details, Signals, Review. The app creates a case on one page with one Create button. Two pieces of the mock flow have no counterpart in the app at all, so an operator cannot review what they are about to create and cannot arm per-case auto-capture at creation.
Ruled later on 2026-09-20: not a beta-floor defect, since the single-page wizard creates cases correctly. Filed so the gap survives the 2026-09-19 mock reconciliation going stale.
Gap
Three mock-ahead rows from the New Case wizard section of the mock reconciliation, all with no issue attached:
- Three-step flow. Mock splits creation into Details, Signals and Review, each with its own subtitle, advancing on Continue and gating the first step on a non-empty name. App is a single card with no step state.
- Review step. Mock replays the name, the description, the chosen selector chips and a summary line naming the selector count and the auto-capture state. App has no confirmation surface.
- Auto-capture-pages-that-match switch. Mock's Signals step carries a switch, on by default, so the case's capture mode is set at creation and echoed on Review. App's wizard has no such control and never writes the capture mode on creation; the only auto-capture control is the Signals card after the case exists.
Two smaller mock-ahead rows in the same section ride along if the flow is rebuilt: progressive description disclosure, and Enter in the name field advancing the step.
Where
- Mock:
docs/design-handoff/2026-09-14-design-project-export/Birdbrain.dc.htmllines 3545-3585 (markup), 5855-5913 (view model), 5843-5853 (presets) - App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsxlines 90-192 - Source rows:
docs/plans/2026-09-19-mock-reconciliation.md, section "New Case wizard, create and import dialogs" (PR #1519)
Not in scope
The other 26 rows in that section are drift (step pips, page chrome, copy, Back/Cancel label, preset pre-armed) and are recorded in the reconciliation doc, not here.
Visual drift and validation (added 2026-09-21)
The rest of the wizard's design gaps, folded in here so the wizard is one unit of work. Direction is mock for every row, per the maintainer's 2026-09-20 ruling that no design gap should drift. The UI findings are the two wizard behaviours the driven pass found that no other ticket covers.
- Step progress indicator (drifted, row). The mock renders three button pips inline with the heading and right-aligned: the active one widens to
22pxaccent, completed ones are accent at 45%, future ones elevated, and clicking a completed pip jumps back. The app renders three static elements centred above the card that never change and are not clickable.- Mock:
Birdbrain.dc.html:3541-3543, values at 5879-5887 - App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:93-97
- Mock:
- Name field treatment and placeholder (drifted, row). The mock's name field is label-free: a borderless
20pxdisplay-font line with only a bottom border that turns accent on focus, placeholder naming the investigation. The app puts a visible label above a fully bordered input at14pxwith an example-name placeholder.- Mock:
Birdbrain.dc.html:3547 - App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:112-125
- Mock:
- Description placeholder copy (drifted, row). Mock: optional, then scope, subjects and the tip that opened this case. App: brief description of this investigation. The mock wording appears nowhere in the app.
- Mock:
Birdbrain.dc.html:3552 - App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:141
- Mock:
- Selector section heading copy (drifted, row). The mock introduces the chips with the instructional sentence 'Watch every capture for:' at
12pxmuted. The app uses a14pxfield label reading Initial Selectors.- Mock:
Birdbrain.dc.html:3558 - App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:149-151
- Mock:
- Primary action label (drifted, row). Mock: Continue on the first two steps and Create investigation on Review, keeping the label while a
12pxspinner ring appears in flight. App: a single Create Case, switching to a Creating... label while the mutation runs, and the button primitive has no spinner support.- Mock:
Birdbrain.dc.html:3589-3594, label at 5908 - App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:182-189
- Mock:
- Page chrome: card, icon tile, subtitle, column width (drifted, row). The mock is a bare
480pxcolumn on the canvas whose only header is the heading plus the step pips. The app centres a672pxcard with32pxpadding, prefixes the heading with an accent-subtle icon tile and adds a subtitle, none of which exist in the mock.- Mock:
Birdbrain.dc.html:3538-3543 - App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:91, 100-109
- Mock:
- Back and Cancel button (drifted, row). The mock's left footer button is label-only and swaps between Cancel on the first step and Back on the others. The app has a single Cancel with a leading arrow icon; the mock carries no icon there. Both route to the dashboard, and the app adds a footer rule the mock does not draw.
- Mock:
Birdbrain.dc.html:3587, values at 5905-5906 - App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:174-181
- Mock:
- Selector chips pre-selected on open (drifted, row). The mock's Signals step opens with the email preset already armed, from its initial state. The app starts with nothing selected. Both sides render identical chips and labels, so the initial armed value is the whole difference.
- Mock:
Birdbrain.dc.html:3951(preset seed) - App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:49
- Mock:
- Preset chip metrics (drifted, row). Mock chips are a
4pxradius with6pxby12pxpadding at12pxtype. App chips are6pxafter the radius collapse, the same padding, and14pxtext. Pixel-level only; the token colours match exactly, and the4pxstep is still expressible in the app's scale.- Mock:
Birdbrain.dc.html:3561 - App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:159-163
- Mock:
- A case name that already exists is accepted silently (UI medium, finding). Creating the same name twice gives two cards with the same title and no warning at either point. The palette case switcher lists names only, so once two cases share a name it cannot tell them apart; on the dashboard only the description and the capture count differ.
- App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:58
- App:
- An empty name produces no message, and the disabled button leaves the tab order (UI medium, finding). The only feedback is the primary button at half opacity, with no alert, helper text, disabled attribute state, hover or title. Because it is disabled it is skipped by Tab, so the keyboard path runs name, description, six chips, Cancel and out into the top bar, never meeting the primary action. Enter in the name field does nothing either.
- App:
src/renderer/components/dashboard/cases/NewCaseWizard.tsx:182
- App:
The wizard's accessibility and minimum-window findings sit with the app-wide fixes in #1536, #1537 and #1539, and the top bar treating the wizard route as a case is in #1545.