That's the default form action when you run the checkout wizard.
The workflow you describe is exactly how it was working before.
Customer hits checkout > if not logged in, ask them to login > display the checkout.php page and if details exist for user, display them in the form > run server validation, if validation fails then display errors, if validation passes then display confirm.php
I didn't change my approach after re-doing my checkout.php validation so I don't know why it's not working.
I had a look at the completed store but neither checkout.php or confirm.php has any server validation on it.