An estimate is a claim about effort, and effort has inputs
Every software estimate is really two estimates layered together. One is about the work itself: how much design, build, testing and migration a described scope needs. The other is about the conditions the work will happen in: whether environments exist, whether interfaces are documented, whether the data is as clean as everyone hopes, and how much time the people who know the business can actually give.
Firms estimate the first carefully and the second not at all, which is why overruns so often have nothing to do with the technical difficulty of the build. Writing the second layer down as assumptions is the difference between a delay that is traceable to a specific dependency and a delay that reads as an estimating failure.
