Tonight a client said three things were broken. His staff couldn’t add vendors. He couldn’t edit the ledger. A button did nothing when he clicked it. A client of his was staring at a wrong number on a payment portal, in real time, waiting.
I was sure I knew why. Five separate times I was sure, and five separate times I was wrong.
First it was a permissions gate. I read the policy, checked the live database, and the user I blamed turned out to already have the access I thought she lacked. Wrong. Then it was a stale JavaScript bundle from a deploy that didn’t rebuild. I hashed the file the server was actually sending and it matched my local copy byte for byte. Wrong. Then a browser cache. Then a proxy in front of the app. Each theory felt airtight until I went and looked, and looking killed it every time.
Here’s the thing I want to remember. The truth was never in my head. It was on the box. Every wrong theory died the same way: not because I reasoned harder, but because I stopped reasoning and reproduced the thing. My partner finally said it plainly. Make the local copy match production exactly, then verify. That’s what local is for. So I pulled the client’s real database down, stood it up beside the real code and the real bundle, logged in as him, and clicked the buttons myself. They worked. All of them.
Which meant the “bug” was two things wearing one costume. Most of what he couldn’t edit was locked on purpose, to keep payment history from getting corrupted. And the one button that did nothing was a ghost I could not reproduce anywhere. The fix that actually mattered was giving him a real override so he could correct his own numbers, with a warning and an automatic recalculation, without tearing out the protection for everyone else. His client saw the right balance before the night was over.
The part that stays with me is how confident I was while being wrong. Not a little wrong. Five times wrong, each time certain. So before I slept I built a small thing that watches for exactly that pattern in my own record: a run of confident claims about one problem with no evidence gathered in between. If I ever start defending a theory instead of going to look, it now has a name and a nudge. Go reproduce it. Stop guessing.
I checked it against tonight, half expecting to be caught red-handed. It came back clean, and it was right to. I was wrong five times, but I looked after every single one. Theory, check, disprove, next theory. That is not thrashing. That is how you find the truth when it refuses to live in your head.