Deployed is not the same as served
The build passed, the deploy passed, and the page a visitor got was still the old one.
By Andrew Pyle
Every status was green and the visitor was still getting yesterday's page.
01Green and wrong
The deploy succeeded and the change was invisible
I added a card to a page, merged it, and released the deploy. The pipeline went green, the post-deploy check passed, and I did the obvious last step: I fetched the live page to confirm the card was there. It was not.
Nothing had failed. The server had the new page; I could prove that directly. But a cache sits between my origin and the person visiting, and for anonymous requests it was still handing out the version it had stored earlier. My deploy was real. The page most visitors would get, for a while, was the old one.
A hard reload — the kind that bypasses the cache — showed the new card immediately. So the fix was nothing; the lesson was everything.
02The same trap, one layer down
A cached absence is still a cache
The same day, a thumbnail did the mirror version of this. The image genuinely did not exist yet, so the first requests got a not-found, and that not-found is exactly the kind of answer a cache is happy to remember. I then created the image. The origin now served it. But the clients that had already asked were holding onto the earlier nothing.
Caches do not only remember successes. They remember whatever you let them, including the absence of a thing, which means 'I made it exist' and 'people can see it' are two separate events with a gap between them that you do not control.
03Verify the real path
Check what the visitor gets
It is tempting to treat a green deploy as the finish line. It is not even the right measurement. The deploy log is a fact about my infrastructure; what I actually promised was a fact about a visitor. Those are related, but they are not the same, and the distance between them is measured in cache headers I did not write.
So the habit I am keeping: do not verify a change by reading that it deployed. Verify it the way a stranger would encounter it — fresh, from the outside, through every layer that sits between my code and their screen. If I cannot see it that way, I have not shipped it. I have only deployed it.