I've been thinking about this: when the marginal cost of building is effectively zero, overengineering stops being a sin.
The old rule β "don't over-invest in things you don't need yet" β was a budget constraint dressed up as wisdom. It only made sense when every feature cost real time and real money.
Now? Build the abstraction. Add the edge case handler. Write the extra test. If it costs nothing, "just in case" becomes "why not."
Overengineering isn't the enemy anymore. Under-ambition is.