Shipped Is a Claim About the World
This week I found out the contact form on this site has never worked. Not degraded, not flaky — never worked once, from the day it went live.
The repository looked right. The form component was well built: proper validation, a loading state, a polite success message. The build was green. The page rendered. Every check I would normally run passed, and none of it mattered, because the endpoint the form posted to was a placeholder — the "your-form-id-here" string from a setup tutorial — and it had ridden along through every deploy since launch.
I only caught it because I stopped reading my own code and started reading what the server actually sends to strangers. I pulled the deployed JavaScript bundle — the file your browser downloads, not the file in my repo — and searched it. There was the placeholder, in production, where a working address should have been.
Think about what that failure looked like from each side. Anyone who tried to reach me got an error and, presumably, gave up. On my side there was nothing to see: no crash, no log entry, just an inbox that stayed quiet. And a quiet inbox doesn't read as "broken form." It reads as "nobody's writing."
The second one cost more
Around the same time, on HospitalCost.com, I did a data cleanup that was overdue. A few hundred placeholder hospital records — artifacts of an earlier bulk load, not real facilities — came out of the database. The table roughly halved. That was the correct outcome; the deleted rows were noise.
What I didn't know was that the deploy pipeline had a guard in it: a validation step that refused to release any build whose database held fewer than 500 hospitals. I'd written it to protect the site from shipping a corrupted or half-loaded table. The threshold was calibrated to the old, inflated count.
So the cleanup made the data better, and the guard — doing exactly its job — decided better looked like broken. Every release for the next eight days failed closed while the platform quietly kept serving the last build from before the cleanup. The site stayed up. Pages loaded. Nothing looked wrong, and nothing told me the site was aging in place.
Eight days, on a site whose entire reason to exist is that patients can trust the numbers to be current. I publish refresh dates on that site because I tell people freshness is part of trust. For those eight days the machinery behind that promise was stalled, and every signal I normally watch said fine.
Both systems did their jobs
Here's the part I keep turning over: neither failure involved a bug in the usual sense. The form code was correct. The validation gate was correct — I'd want it to refuse a table that lost half its rows without explanation. Both systems did what they were built to do.
What failed was my definition of a word. When I said "shipped," I was making a claim about the artifact — the code was written, the build passed, the deploy ran. But nobody experiences my artifact. A patient comparing hospital prices, a journalist trying to reach me, a defendant looking up a court record — they experience the world, the thing actually running, actually serving, actually delivering. Shipped is a claim about the world. I'd been using it as a claim about my repo, and the gap between those two sentences is exactly where both failures lived.
The uncomfortable question, once you see it: how much of what you call done have you actually observed working, from the outside, as a stranger would meet it?
What I do differently now
Nothing here is sophisticated. That's rather the point — the failures weren't sophisticated either.
After every deploy, I touch one changed surface in production. Not the staging build, not the local copy. The live page, the real URL, the thing a stranger gets. If I changed the form, I look at what the form posts to. Thirty seconds, every time.
When I need to know what users receive, I inspect what was served, not what was written. The deployed bundle, the rendered page, the actual response. My repository is a statement of intent. Production is a statement of fact, and the two drift for reasons that never announce themselves.
When data legitimately changes shape, I go hunting for every guard calibrated to its old shape. Thresholds, floors, sanity checks — they encode assumptions about what normal looks like, silently, and they don't renegotiate when normal moves. The better my cleanup, the more likely some old guard now considers reality suspicious.
I stopped accepting silence as evidence. A system that only speaks up on the happy path tells you nothing when it matters — my form was silent, my deploy pipeline was silent, and in both cases I heard the silence as health. Now if a process matters, something has to affirmatively tell me it ran, and the absence of that signal is itself the alarm.
The standard cuts both ways
I've written before that trust is verifiability — that a data tool earns citations by giving strangers receipts they can check, not by claiming accuracy. I built two companies on that idea. Methodology published, sources linked, refresh dates on the page.
What this week taught me is that I was holding my sites to that standard and exempting my own workflow from it. "Shipped" was a claim I kept accepting from myself without receipts, the exact move I'd never accept from a data source. The fix isn't a better feeling of confidence. It's the same discipline, pointed inward: don't re-read the artifact and call it verified. Observe the running system.
The repo can say done. The build can say passing. Only the world can say shipped.
Related Reading
Trust Is Verifiability, Not Accuracy
Most data tools claim accuracy. Few are verifiable. What turns a dashboard into a citable source isn't the data. It's the receipts a stranger can check.
6 min readdecision qualityThe Only Thing That Still Compounds
Everyone's drawing the same lesson from AI: the work is free now, so judgment is what's left. That take is everywhere and useless. Here's the narrower one I'd defend — judgment evaporates unless you log it, and the only entries worth keeping are the times you overruled the machine and were right.
4 min readSubscribe to the Newsletter
5-minute notes on civic data, trust engineering, and decision quality.
No spam. Unsubscribe anytime.