At the beginning, do the simplest, most constrained thing that might work.
Then gradually relax the constraints when you run into problems.
Conceptually related to the Rule of least power
Or the IETF's rough consensus and working code.
This works because you cut down to the very core, which means you don't have the ballooning complexity from accommodating edge cases, you simply cut them out of the possibility space.
You get less possibility space, but in a trade for them being significantly more likely to be viable and self-consistent.
Then you can grow from viability into more capable over time through adaptation.