Really clear explanation of why promise callbacks jump ahead of setTimeout even with a zero delay. The step-by-step walkthrough of the microtask queue draining before the next macrotask finally made the ordering click for me. I'll keep this one bookmarked for the next time an async bug has me confused.