feat(review): review the captures in ozalid rather than a local report - #93
Merged
Conversation
This was referenced Sep 9, 2026
haribo
force-pushed
the
feat/ozalid-visual-review
branch
from
September 9, 2026 08:33
43bc283 to
b68d3c4
Compare
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.
Summary
The journeys' captures now go to ozalid, where the user reviews them. The local HTML report and its
reviews.jsonare removed — 392 lines that generated a page nobody could act on, and whose verdict file was still empty.Local, and before the pull request. A capture that reaches CI is a capture nobody looked at while there was still time to change what it shows. CI keeps running the journeys — it checks that they pass, not what they look like.
What changed is not computed here
Every capture is hashed; ozalid is asked which addresses it does not hold; what it does not hold is what changed. Content addressing answers the question, so nothing here compares images. A capture ozalid already holds is never sent twice.
A first push sent 49 distinct captures for 59 cells: the same screen rendered identically in two variants is stored once and judged twice.
The case map is committed
tools/ozalid/cases.jsonholds which ozalid case each journey is. ozalid generates a case's id and says the client stores it and never invents one; matching on the title instead would open a second case the day somebody rewords a test — silently, leaving the history on the old one. The map makes a rename visible in review, where it is fixed by editing one line.The push warns when the map holds a case the run did not produce, which is what a rename looks like from here.
Structure on the server
Categories follow the design documents rather than the test files, so the path from a screen to the rule that governs it is the same in both directions:
No empty category. A branch with no case promises a journey that does not exist — the opposite fault to the catch-all it replaces. The twenty other branches the v1 scope implies are written down in the issue, and each will be created with its first case.
Axes are
viewportthentheme, ordered so a variant readsdesktop·light— the name it already has here. ozalid creates axes by first use and ships no list of its own.Not done, on purpose
just e2e. A failed experiment would land in the book alongside the real thing.Test plan
just frontend-check— typecheck, lint, theme tokens, type scalejust frontend-test— 190 testsjust e2e— desktop-light 4, desktop-dark 4, mobile-light 5, and it now ends without building a reportjust ozalid-dryafter the push — 0 cases to open, 0 captures to send, which is the change detection workinggrepover docs and the justfile.env.examplecarries an empty placeholderBackend untouched, so
backend-check,backend-testandapi-checkdo not apply.One commit rather than the three I first proposed: the justfile carries both the addition and the removal, and the documentation describes exactly this change. Splitting them would have produced states where the code and the docs disagree.