productize.life
TH EN
UI · Quality

Every box was green. Nobody wanted to read the page.

The sweep passed every check. Horizontal overflow 0, tap targets fine, fonts loaded, not one console error. Then a person opened it on a phone and said it looked like a toy.

Yim· written with Dobby (AI Oracle)/Jul 31, 2026/~7 min

Part 1Green everywhere, and still nobody wanted to read it

Wanting a higher lighthouse score is a perfectly good instinct. (Lighthouse is Chrome's built-in auditor: it opens your page, runs a battery of checks, and hands back scores from 0 to 100 for speed, accessibility, and SEO.) Slow loads, buttons too small for a thumb, fonts that flash on the way in, those hurt real readers. We chase them down too.

One round, we wrote a sweep script that walked a whole page at phone width and collected everything that turns into a number. Horizontal overflow, meaning content spilling past the edge so you have to scroll sideways, came back at 0. Tap targets, the hit area of each control, all large enough for a thumb. Fonts all loaded. Not one console error, the console being where the browser prints a page's errors. Every box green.

Then someone opened the actual page on an actual phone. The verdict came back short: it looks like a toy, not something you would trust enough to read.

Our first instinct was to go back to the script. There must be a check we forgot. Spacing, contrast, heading scale, we could bolt on another ten. That instinct was better than we gave it credit for at the time. What was wrong was how we were adding: we were bolting on whatever came to mind, without first asking whether the set we had chosen to measure was the set we actually cared about.

Part 2The zero we trusted came from a layout rule we got wrong

Later the same day, the same shape showed up again, this time in a table.

Overflow was still 0. Still green. And the rows were unreadable. The table had been squeezed to fit the screen, so every column narrowed until the text wrapped after almost every word, and a single row stood as tall as a paragraph. Your eye could not track which value belonged to which column.

That is the part worth sitting with. The 0 we were treating as evidence of a pass was produced by the exact thing that made the table unreadable. A table squeezed to fit always scores 0. Squeeze it harder and the 0 gets more certain.

The real fix runs against the number. Give the table a min-width and let it scroll inside its own box, which means deliberately accepting sideways scrolling in that box in exchange for rows a person can read. Trust the number alone and you never pick that fix.

Take the right lesson from that. This case does not show that readability is unmeasurable. It shows we picked the wrong metric and wrote the wrong layout rule. The number to watch was never page-wide overflow, it was minimum column width, or characters per line inside a cell. Both count directly. And the correct layout rule was written down before we got there: WCAG 2.2 Reflow, part of the W3C's web accessibility standard, exempts data tables from the single-direction scrolling rule and recommends putting the table in its own scrollable container so the rest of the page still reflows. That is the fix we groped our way to, arrived at late.

Part 3Not a broken checker. The wrong set of things measured.

At first we read both cases as checklist bugs. Coverage gap, add a few more assertions, move on.

Half right. The script was correct on every line. It caught everything it was told to catch. Nothing died, nothing lied. What failed was the part nobody had ever told it to look at. And "add a few more" fixes nothing if you keep adding whatever comes to mind.

For a while we drew the wrong conclusion here: that taste and visual credibility are simply not measurable. They are. "It looks like a toy" mostly decomposes into countable things. Spacing that does not follow one scale. Elements that do not share an alignment grid. A type hierarchy with too little contrast between levels to tell what outranks what. Color used past the point it carries meaning. Density of content per screen. Every one of those can be written as a metric, and had we written them, that sweep would have caught them.

So what actually failed is narrower than we used to claim. The set we chose to measure did not cover what we wanted. The measurable set here means everything we turned into a number so a machine could check it instead of a person, and we picked its contents by what was easy to put in a script, not by what makes a page look like it was cared for. Chosen that way, all-green only ever meant we collected what we asked for. A reviewer reading only the code misses the rest too, because it appears only once the thing is rendered.

There is a genuine residue. The sense that a page has been looked after, the order your eye takes without being told: nobody has a metric for those that works yet. We are not arguing otherwise. But that is the remainder, not the core. The standards bodies claim no more than this either: the W3C's page on accessibility evaluation tools says tools cannot do all of it, that some checks cannot be automated and require a person. It does not say quality as a whole sits outside measurement.

We have written before about the other failure, the checker that dies quietly and reports that it found nothing, in the post on mutation testing and positive control, deliberately breaking the code to see whether a test notices, and feeding in something that must be rejected to see whether a checker still fires. That post asks "is this checker still alive?" and answers it by making the checker go red on purpose. This is a different question. Here the checker was alive and correct on every answer it gave. The open question was whether the measurable set covers what we actually wanted. Keep the two apart, because proving a checker can go red says nothing about whether what it checks is what matters.

Part 4The same shape shows up in writing, not just on screens

Once you have the shape, you start seeing it elsewhere. The clearest case for us was prose.

We run several guard layers on blog posts: a house-style gate, a forbidden-phrase list, a factual-claims pass. One post cleared all of them with nothing flagged. Then a human read it and sent it back three times. First: hard to read. Second: a cold reader finishes it and walks away with nothing. Third: the lived experience behind it was too thin to carry a frame that size.

Every one of those times, we had already told ourselves it was verified. What we had verified were proxies. No em-dashes, terms glossed, every gate green. The actual goal, whether a stranger gets value out of it and whether we had done enough to earn the story, was never checked at all.

What came out of that round: there are four axes, not one. Mechanically clean, clear, valuable to the reader, and backed by real experience. They are not a ladder. You can score full marks on the first and fail the other three at once. Collapse the four into one and you ship exactly the thing that passes everything and nobody wants to read.

Part 5Fresh eyes are the gate. The checkbox is only a record.

We did not drop the scripts. Those numbers still catch things human eyes skip. A tap target four pixels too small on a 360px screen is not something you spot by looking. And the metrics we were missing, the spacing scale and the type hierarchy, we are adding as Part 3 describes.

What actually changed is who decides it passed. Anything with a screen now gets a final read on the real thing by eyes that have never seen it. Whoever built it all day fills in the gaps automatically in their own head and stops seeing the holes a first-time visitor hits immediately. The longer the piece and the longer you sit with it, the less you can see. The gate is that person. It is not the list.

The checkbox in the list survives, with a much smaller job: it records that the read actually happened. Who read it, on what device, what they saw. The one condition that makes the record worth anything is that the signature has to come from someone other than the maker. Sign your own and it is a free tick again, the same species as the score we have spent four parts arguing with. We still write it down, not to own another checkbox, but because a step that lives in someone's habits is the step that disappears the week things get busy.

If you take one thing from this, take this. An all-green result tells you nothing is broken in the things you counted. It does not tell you that you counted the right things. Next time your lighthouse score hits 100 and it feels finished, open that page on your own phone and read it top to bottom for real. If you want to scroll past it, that is a test result too, and nobody has put it in a report for you.

Sources and references
Follow along

Get new posts and free resources first

Leave your email. New posts and the occasional free resource land in your inbox. No spam.

Email only, for updates.

Comments

Join the conversation

Share a thought.

Name is shown publicly. Email stays private and is never shown.

Loading comments…