If I may "yes, and" this: spec → plan → critique → improve plan → implement plan → code review
It may sound absurd to review an implementation with the same model you used to write it, but it works extremely well. You can optionally crank the "effort" knob (if your model has one) to "max" for the code review.
A blanket follow-up "are you sure this is the best way to do it?"
Frequently returns, "Oh, you are absolutely correct, let me redo this part better."