The most common gap behind a stalled or over-budget migration isn't a technical failure during cutover — it's a dependency map that was incomplete or never built in the first place. A list of servers tells you what exists. It doesn't tell you which application talks to which database, which service account a scheduled task depends on, or which "temporary" integration built two years ago quietly became load-bearing.

A useful dependency map starts at the application layer, not the infrastructure layer: for each application, what does it call, what calls it, and what breaks — visibly or silently — if either side moves independently of the other. Network-level dependency discovery tools can surface a lot of this automatically, but they need to be run over a long enough window to catch monthly or quarterly processes, not just the daily traffic pattern.

The map also needs to capture identity and authentication dependencies specifically, because these are the ones that fail silently rather than loudly. An application that authenticates against an on-premises directory will often "work" during testing and then fail intermittently in production once the directory it depends on is on the other side of a migration boundary with different latency or availability characteristics.

Undocumented and informal dependencies are the hardest category and the most consequential: a scheduled task on a server nobody remembers configuring, a hardcoded IP address in an application config file, a firewall rule that exists because of an integration nobody currently owns. These are exactly the dependencies a purely automated discovery tool misses and a purely manual interview process also misses — finding them usually needs both.

Building this map properly takes real time before a migration starts, which is precisely why it gets compressed or skipped under schedule pressure — and precisely why the migrations that skip it are the ones that stall six weeks in in ways nobody predicted.

All technical perspectives