A zero is not a measurement

ruusvuu1 pts0 comments

A zero is not a measurement | ReadingPub

Sign in

Home<br>Write an article<br>About<br>Terms<br>Privacy

ReadingPub /<br>The Pub

A zero is not a measurement

by richard &middot; Aug 23, 2026 &middot; 7 min &middot; edited

A couple of weeks ago I wrote about spending an evening convinced I had written a bug, when what had actually happened was that my browser was hiding my ads and telling me nothing. That piece was mostly about advertising. The advertising was the least interesting part.

The interesting part is that in the two weeks either side of it, I trusted three separate zeros. All three were confident, all three came from instruments I had every reason to believe, and all three were wrong in the same way.

The first zero

Brave Shields has a badge counter. It sits in the toolbar and tells you how many things it blocked on this page. On the page where my entire ad column had been removed, it said 0 .

Not "1". Not "14". Zero. The browser was performing cosmetic filtering -- letting elements load and then removing them from the page a second later -- and its own counter, the one feature whose whole job is to tell you what it did, reported that it had done nothing.

I do not think this is malice. Badge counters generally count network-level blocks, and cosmetic filtering is not a network-level block: nothing was refused, so nothing was counted. It is a perfectly defensible implementation detail. It also means the number in the toolbar answers a narrower question than any user believes it answers.

The second zero

Every tool session I run on this machine emits a small event to a participation registry I built. It is a hook: a shell script that fires after a command, posts one event, and gets out of the way.

For eighteen days, it emitted nothing at all.

A configuration key had gone missing from an environment file during an unrelated edit. The hook did what a careful hook does when its configuration is incomplete:

[ -n class=class="rte-pro-str">"rte-pro-str">class="rte-pro-str">"$BOX_KEY" ] || exit class=class="rte-pro-str">"rte-pro-num">class="rte-pro-num">0

Exit zero. Success. No error, no log line, no warning, because the entire point of that guard is to fail quietly rather than spray errors into somebody's terminal on every keystroke. It is the line I would have written. It is the line I did write.

Here is what made it invisible for eighteen days rather than eighteen minutes. There was no local record of success. The system logged its failures diligently and never once recorded that anything had worked. So an outage and a quiet afternoon produced byte-for-byte identical evidence: nothing on disk, nothing in the log, no complaints. I only found it because I went and asked the remote service directly and it said the last event it had seen from this machine was eighteen days old.

A system that only logs failures cannot be distinguished from a system that is not running.

The third zero

This one is not a zero I saw. It is a zero I would have gone on not seeing, and it was going to cost real money.

My site pays writers a share of what the ad column beside their article earns. The counter that drove those payments incremented when the article's page was served with ads on it. I wrote that. I thought it was obviously right, and I even wrote a smug comment next to it about how it counted the same event the ad network was told about, so the two ledgers could never drift apart.

What it actually counted was a request arriving at my server. Not a person. Certainly not a person who saw anything. A crawler counted. A link-preview fetch from a chat app counted. A browser speculatively prefetching a link somebody hovered counted. A reader who opened the tab and closed it in half a second counted exactly as much as a reader who finished the piece.

None of those are edge cases. They are most of the internet. And every one of them would have been paid for.

What the three have in common

In all three cases the instrument was working correctly. It measured a real thing, accurately, and reported it honestly. The problem is that the thing it measured was not the thing I cared about, and nothing in the reading told me so.

The badge counted network refusals. I wanted things removed from my page.

The hook logged errors. I wanted evidence of delivery.

The counter recorded requests served. I wanted ads a human could see.

Each pair looks like the same question from a distance. None of them is. And the gap between the question asked and the question meant is invisible precisely because the answer comes back clean. A broken instrument announces itself. An instrument answering a slightly different question sits there being reassuring.

The move that actually worked

I want to be specific about what broke the first case open, because it was not cleverness and it is repeatable.

I stopped asking what had failed and asked what had survived .

Inside the blocked column, one image was rendering perfectly: a small logo served from...

zero from nothing counted three class

Related Articles