At least one worker is usable right now.
WARM workers with no task in flight (the ones a batch may go to).
A worker's codec is warm; if not, start warming one (decode locally meanwhile).
Run fn on the least-busy WARM worker (timeout-guarded, never pool-aborted).
The pool surface the dispatcher needs (a port, so tests can fake it).