We moved a small server from one setup to another. Same tools, same purpose, new address. We ran a full test against it the same day. Everything worked. We closed the laptop thinking the job was done.

The next morning, the same setup couldn’t reach the same server at all. Nothing had changed in between.

Our first assumption was that we’d broken the server overnight. We checked it thoroughly. It was healthy and waiting for traffic that wasn’t arriving.

The problem was how the connection was finding its way there. The address had updated correctly at the real source. What hadn’t caught up was every cache sitting between our setup and that real source, each one still holding an old answer until its own separate expiry passed.

The migration was done. The path to it wasn’t, and those turned out to be two different finish lines.

We had paid for this lesson before

The part that stung was that we’d already learned this exact lesson, on a much bigger project, where a similar timing gap had caused a real outage for someone who mattered. That earlier incident is the reason a formal guardrail exists for projects at that scale. The guardrail says to check the real, authoritative source directly, and never to treat a successful deploy as proof that the whole path is live.

We built that guardrail for the big project. Then we walked straight into the same problem on something small we’d set up in an afternoon, because it felt too minor to need the same protection.

What we do now

Any time infrastructure moves, however small, we check the real, authoritative source directly instead of trusting a local cache. The cache is the thing most likely to be lying, because it is repeating a stale answer.

We also don’t hand a freshly moved system to unattended or automated work until we’ve confirmed a clean connection from somewhere that has never talked to the old setup. A machine like that has no stale memory of its own to get fooled by.

Nothing automated made the call

A guardrail proven at one scale doesn’t spread itself to a smaller version of the same kind of change. Someone has to decide that the lesson still applies, even when the job in front of them feels too small to bother. Nothing automated makes that call for us, so we keep the habit on purpose, every time, whatever the size.

Before your next migration, check the address against the real source and confirm a clean connection from a fresh vantage point before you hand it to unattended work.