Para mim, eu gosto da abordagem que Kent Beck propõe no XP (não tenho certeza se é "dele" ou de outra pessoa, mas foi aí que eu a ouvi pela primeira vez):
Já é difícil resolver os problemas de hoje sem tentar descobrir quais são os problemas de amanhã e resolvê-los também.
Os desenvolvedores podem gastar muito tempo em soluções para requisitos que não existem, casos extremos que nunca ocorrerão ou até mesmo problemas genuínos em que o impacto do problema é significativamente menor que o custo para evitá-lo.
Este é o momento que pode ser colocado nas coisas que os usuários realmente desejam e usarão, coisas que lhes trarão benefícios que superam em massa os inconvenientes causados no improvável evento de que uma dessas coisas realmente aconteça.
Além desse resultado não ideal para o usuário, o impacto sobre o desenvolvedor de mais de engenharia dessa maneira tende a ser sobre códigos complexos que são mais difíceis de suportar e mais difíceis de aprimorar.
Então, para mim, se você sabe, ou pode ter certeza, que algo é um requisito ou vai causar um problema, resolva-o, se não, então não.
Talvez seja necessário voltar e reformular o processo quando houver um requisito mais amplo do que o implementado originalmente, mas geralmente o esforço total que você coloca no projeto ainda será menor, porque na maioria dos casos isso não acontece.