Perhaps that is the core problem, but that problem is caused by not knowing the requirements to begin with. Which again is usually caused by not knowing what your customer wants (which you should be able to do, even if they don’t know themselves what they want), or not knowing who your customers are. Contract work is the best environment for fostering a culture of not knowing what your customers want, because it is the ultimate exercise in fence-throwing (often to somebody who’s just going to throw it over yet another fence).
Problems tend not to change so dramatically over the course of a project. What usually happens is some stakeholder realizes at some point that they didn’t actually understand the problem the first time around, and thus need to change the requirements. Even significant regulatory changes won’t usually cause that. In almost all cases, regulatory changes have a significant amount of time between announcement and enforcement.
Making your development practices more responsive to change is a good goal, but it doesn’t solve this problem. Because this problem is typically created before the first line of code is written. If the defined requirements don’t actually solve the customers problem, then they’re going to be delivered a non-functional solution, whether it takes one year to deliver, or one day.