You did fine! You set an appropriate boundary ("if you are late I will take son to childcare").
Next time don't say anything, just be gone when he gets there. Actions speak louder than words. He saw you ready to leave today. Maybe he'll start to be more on time - if not, you just leave for daycare.
I feel guilty for getting angry For some reason whenever I break DB principles, I feel intense guilt. I am satisfied with the boundary I set, though, and will absolutely follow through if he tests me again.