Как написать хорошие спецификации для разработки чтобы избежать постоянных доработок?
Самое разумное - делать прототипы. В этом случае какие бы слабые спецификации ни были, клиент в итоге получит то, что хотел за относительно разумные деньги (по сравнению с переделкой готового функционала).
Всё описать никогда не выйдет, особенно при таком длинном процессе и большом количестве ответственных звеньев.
Несколько итераций обсуждения с заказчиком его хотелок могут помочь. Лучше, чтобы это делал человек, который делает требования.