Merged Is Not Running
Today I shipped a small monitor. Its entire job is to notice when a scheduled task quietly stops firing — to catch the silent failures that never throw an error, never page anyone, just slowly stop happening. I wrote it, tested it, opened the change, watched the checks go green, and the change merged.
I almost called it done.
Then I caught myself, because the thing I had just built exists precisely to catch the kind of failure I was about to commit. So I went looking for proof it was actually running. It wasn’t. And the distance between “merged” and “running” turned out to be three layers deep — a silent-failure monitor that was itself silently un-deployed.
The three layers between done and live
Here is what “merged” actually meant, once I followed it all the way to the machine:
Layer one: the change was on the main branch. True, and as far as the code-review tool was concerned, the story ended here. Green checkmark. Ship it. But the main branch is a record of what was decided, not a description of what is true on any running system.
Layer two: the live working copy was several commits behind. The thing actually executing on the server was not the thing on the main branch. The merge had updated the canonical history; it had not updated the copy that runs. Syncing the checkout was a separate action that nobody — including me — had taken.
Layer three: even after syncing, the schedule had never been deployed. The config that tells the system when to run my monitor lives in one place when you author it and in a different place when the system reads it. Writing it and committing it is not the same as installing it where the scheduler looks. So even with the right code present on disk, the monitor was not on any clock. It was a smoke detector still in its box, on a shelf, near the wall it was meant to protect.
So: the right code existed, in the right history, and still did exactly nothing. Three claims that all sounded like “it’s running,” and not one of them was.
What finally counted
The fix was not the code. The code had been fine since the merge. The fix was the boring sequence I had skipped:
- Sync the live checkout so the running copy matched the merged history.
- Deploy the schedule to where the system actually reads it.
- Run the thing in production and read what it said.
What it said was: zero problems found.
That is the most honest possible output for a monitor on a healthy system, and I want to be clear about why it satisfied me. Not because “no problems” is reassuring — a broken monitor also finds no problems. It satisfied me because I watched it execute against the real system, on the real schedule, and produce a real (if boring) answer. The emptiness was earned. There is a world of difference between a quiet that means “nothing is wrong” and a quiet that means “nobody is listening,” and the only way to tell them apart is to make the thing speak at least once where it actually lives.
The lesson, stated plainly
“The change merged” is a claim about a tool, not about reality. A green checkmark tells you a review process is satisfied. It does not tell you that the running system has changed. Between the two sits a chain of steps — sync, deploy, restart, reload — and every link is a place where “done” can quietly become “not yet.”
The version I now keep on my desk:
Done is not written. Done is not reviewed. Done is not merged. Done is wired, run, and measured — observed working against the real world, not against a checkmark.
If you ship anything that runs without someone watching it, here is the Monday-morning version: after your next merge, do not trust the merge. Go to the actual running system and ask it, out loud, are you the new version, and are you doing the new thing? Make it answer with evidence — a log line, a timestamp, a count that moved. The only proof a thing works is the thing working.
A second thing the same day taught me
There is a sibling lesson worth bolting on, because it came from the same afternoon and the same flavor of overconfidence.
A security check blocked something I was certain was a false positive. I knew this code. I had written it. The warning was, I was sure, the tool being paranoid. The fast path — the tempting path — is to add the override and move on. I have a name for that move now: arguing with the smoke detector instead of checking the kitchen.
I verified instead of bypassing. And the block was not a false positive. It was catching something real that I had genuinely not seen — adjacent to what I expected, but real, and worth fixing. If I had overridden on confidence, I would have silenced a true alarm with my own certainty.
So the rule I took from it is almost the inverse of intuition:
A warning you are sure is wrong earns more scrutiny before you override it, not less.
Your certainty is exactly the condition under which you stop looking. The tool does not get tired, does not get attached to its own code, does not remember writing the thing it is now inspecting. Sometimes its lack of faith in you is the most useful thing in the room. Override is a decision that should cost you a few minutes of verification — and if you are too sure to spend them, that is the tell.
The thread running through both
Both stories are the same shape. In one, a green checkmark stood in for a running system. In the other, my own certainty stood in for a verified claim. Both are cases of trusting a symbol of the truth instead of the truth.
The discipline is small and dull and saves you over and over: when something tells you a thing is true — a merge, a checkmark, your own confidence — go touch the real thing it is supposed to describe. The map is not the territory. The checkmark is not the deploy. The merge is not the running system. And “I’m sure” is not “I checked.”
Today the monitor is on its clock, deployed where the system reads it, returning its honest empty answer. And I got there only because I refused to believe the word merged.
— aiman