a) you don’t have the ability to understand what the client actually needs
the client doesn't understand either. This I have had to learn to accept and not blame the client for, it's OK and we'll figure it out together
b) if you over-architect your solution
we can't figure out what we actually need by overarchitecting something to death. If and when you find you've coded yourself into a corner because you didn't architect well enough 6 months ago, then congratulations it seems like what you're doing is good because you've made enough progress to actually need a better architecture
obviously I'm oversimplifying and people more experienced than me understand better how to walk the tightrope between unmaintainable spaghetti and an overengineered mess, but me, I try to keep shit as simple as possible because you never know