setTimeout(fn, 0) requests a minimum, not an instant
The common read: setTimeout(fn, 0) runs the callback at the zero-millisecond mark, essentially "now"
You already know what a parked task waits for. Name it before reading on: it's the one thing the last lesson built its whole model around.
setTimeout hands its number to the runtime as a countdown, not as a place in line. That countdown runs off the call stack entirely, which is why it can finish while the stack is still busy running your synchronous code. Finishing the countdown does exactly one thing: it makes the callback eligible to run, and eligible work parks in the task queue, the same resting place any ready work waits in.
The stack has to run to completion and empty out before the loop even looks at that queue. So a callback can sit there, fully ready, for as long as the running code takes, whether that's a tight loop or a slow synchronous parse. The countdown was never a promise about when the callback runs. It only promises when the countdown ends.
Read "0" the same way you'd read any other number here: as a floor. setTimeout(fn, 0) means "make this eligible as soon as possible", and "as soon as possible" is still bounded by whatever's already running.
