So, here's how we do it (in the context of SCRUM with 2-week sprints, thereby keeping design/code/test/deploy cycles short).
We write down acceptance criteria and expand on it with architectural requirements/goals.
We do a high-level architectural design with the team so we can agree on an approach if needed.
The UI design is also napkin-sketched with the UX people.
Then, we literally evolve the code using TDD where possible:
This happens concurrently for the back-end and front-end, frequently checking that we match the criteria and sketches (design approach and so on) and doing all the good things like CI. Once we're ready for an internal review, we first run it through Sonar Qube to increase coverage where we feel it's needed and increase code quality.
All the above happens in a continuous integration (and deployment when appropriate) pipeline using Go-CD (with maven, some plugins and special Websphere deployment toys).