Visual-diff report
A report is the record of one comparison run: every variant judged against its counterpart, sorted into buckets, with the screenshots behind each verdict. It opens on a summary — a count for every bucket, and both capture sets named above the results.
Most of a report is the review loop. Variants are marked reviewed one at a time, and the page tracks the progress, jumps to the next unreviewed card, hides what is done and filters down to a story by title. The loop is walkable by keyboard, which is a requirement rather than a nicety.
When a difference needs a closer look, the comparison modal opens over it: before, after and the generated diff, a slider to move the boundary between the two, and a blink mode that alternates them. The modal state travels in the URL, so a link carries what you were looking at.


- a finished comparison report exists
The report summarizes the comparison by bucket
- When I open the report
- Then I see a count chip for every bucket
- And both capture sets are identified above the results
The unstable-story warning is visible
- When I open the report
- Then the corpus warning names the unstable stories
The skipped-story warning names what was never captured
- When I open the report
- Then the corpus warning names the skipped stories
Marking a variant reviewed advances the progress
- When I open the report
- And I mark the first changed story as reviewed
- Then the review progress increases by one
Jumping to the next unreviewed variant
- When I open the report
- And I jump to the next unreviewed variant
- Then an unreviewed story card is scrolled into view
Hiding reviewed variants collapses them
- When I open the report
- And I mark the first changed story as reviewed
- And I hide the reviewed variants
- Then no reviewed story card remains visible
Filtering narrows the report to matching stories
- When I open the report
- And I filter by a story's title
- Then only story cards matching the filter remain visible
A removed variant shows its missing side
- When I open the report
- Then the removed story shows a placeholder for the side it never had
The review loop is keyboard-walkable
- When I open the report
- And I walk the review loop with the keyboard
- Then the walked variant is marked reviewed without a pointer
The comparison modal opens from the compare tools
- When I open the report
- And I open the slider overlay on the first changed story
- Then the comparison modal is open with slider mode active
The modal switches between baseline, candidate and diff
- Given the comparison modal is open
- When I switch the modal to candidate
- Then the modal shows only the candidate shot
Blink mode alternates the two shots
- Given the comparison modal is open
- When I switch the modal to blink
- Then the shot alternates between baseline and candidate
Moving the scrubber moves the divider
- Given the comparison modal is open
- When I move the slider position
- Then the divider follows the scrubber
Escape closes the modal
- Given the comparison modal is open
- When I press escape
- Then the comparison modal is closed
A shared link restores the modal state
- When I open a report link carrying a story and slider mode
- Then the comparison modal is open with slider mode active