The screenshot test caught a state bug (external link)
Visual regression testing has always had a credibility problem. It is the test suite that fails because someone changed a font, the one teams add enthusiastically and then start rubber-stamping within a quarter. So a study of what developers actually say when a VRT fails is more useful than another accuracy benchmark.
The authors pulled 307 pull requests from 103 GitHub repositories that run Chromatic, compared them against 299 PRs that carry image attachments but no VRT, and card-sorted 189 flagged issues by hand.
The category split is what you would expect from a pixel differ: Layout 39.7%, Appearance 27.5%, Color 14.8%, Text 9.5%, State 6.9%, Test 6.3%, Image 4.2%. Three-quarters of it is styling.
The remaining quarter is the finding. 35 of 189 issues — 18.5% — were not stylistic at all. Seventeen were content that had simply disappeared. Thirteen were components rendering in an undefined state. Five were regressions the authors classed as visually imperceptible: the screenshot caught something a human looking at the screenshot would not have.
That last group is the one worth sitting with. A tool everybody dismisses as a CSS canary is finding logic bugs, and finding them by the only route left — the rendered output — after the unit tests passed.
Where I would push back is the process numbers. VRT-PRs take 3.8× longer to resolve, draw 10× more discussion comments, and carry 1.75–4.5× larger code changes. Those three facts are not independent. Bigger changes attract more comment and take longer to land, VRT or not; the comparison group was chosen for having images attached, not for being the same size. The paper reports no significant difference in acceptance rate, which is the number I trust most here, and it says the boring thing: the tests are not blocking merges, they are extending the conversation.
The reading I take is not "adopt visual regression testing." It is that when generated code is arriving faster than anyone can read it, the checks that inspect output rather than intent start earning their keep in ways their designers did not plan for. Nobody added Chromatic to catch a component rendering in an undefined state. It caught thirteen of them anyway.