I try to do this as well. It certainly feels better and makes me more confident that the code will make sense when it implements it. But I’ve found even with a very firm design an LLM will undermine it in the details. It will be convinced there is a particular way to do something, I will tell it not to do that and give it a complete alternative, and it will say it implemented it as written. And if you just look at the data structures and function signatures things look fine. But you look at the actual implementation details and it will try in some awkward way to implement things totally differently.