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.
AI Skills
Use this lesson with the AI assistant you already use
A guardrail built during a large migration project sat unused on a small personal server, because the small one felt too minor to need the same protection, until it failed the exact same way.
Paste the prompt, share only the context needed to answer it, and treat the result as a draft for your review. Do not include confidential information or let an AI assistant make changes without your approval.
Optional: for a visual report and saved memory, run /dxdev first.
Don’t have it? Get it at dxdev.com/skills/dxdev. The prompt works without it.
dxdev LESSON · paste into your AI coding agent
LESSON: A Lesson Learned At One Scale Doesn't Automatically Apply Itself At A Smaller One
SOURCE: dxdev.com/everyday-ai/i-had-already-learned-this-lesson-once
WHAT HAPPENED: A server migration tested completely clean the same day it happened. The next morning, with nothing changed in between, the same setup failed outright. The underlying record had updated correctly; what hadn't caught up was every cache sitting between the machine trying to connect and the real, authoritative source. This nearly repeated a lesson already learned on a much larger project, where a similar timing gap had caused a real outage and led to a formal guardrail being built. That guardrail was never applied to the smaller, personal system, because it felt too minor to need the same protection. The fix: check against the authoritative source directly rather than a local cache, and never hand a freshly migrated system to unattended work until a clean connection has been confirmed from a vantage point with no memory of the old setup.
THE RULE: A deploy finishing successfully and the path to it actually being live end to end are two different finish lines, and the gap between them is invisible from every signal you're normally watching. A guardrail built for one system's scale needs a deliberate decision to also apply it to a smaller one, because it will not apply itself.
CHECK MY CODE, then report PASS or FAIL with file:line for each:
1. Any infrastructure change where a successful deploy is treated as proof the whole path is live, without checking the authoritative source directly.
2. Any freshly migrated system handed to unattended or automated work before a clean connection is confirmed from a fresh vantage point.
3. A known operational lesson that was formalized as a guardrail for one project's scale but never deliberately extended to a smaller instance of the same kind of change.
THEN PRINT: a table (check, PASS/FAIL, evidence, fix) + a verdict (applies / partially / OUT_OF_SCOPE / no) + the single most important next action.