Pools answer the question schedulers cannot: not when to run, but what to work on. A cron expression fires blind; a pool evaluates the actual state of the work at the moment of asking: what is stale, what is unblocked, what is finished enough for the next stage.
Two design decisions make pools trustworthy. Resolution is live, never cached, because a staleness predicate goes wrong the moment the clock crosses a threshold, and the pool must never hand back a task someone already finished. And the answer is exactly one item or nothing, so the consuming workflow can branch deterministically on emptiness rather than juggling a list.
The queries earn their keep through computed fields: predicates like "stale for more than three days" or "all children complete" express what is rotting and what is ready, which is precisely what a flat filter list cannot say.
Pools pair naturally with schedules. The schedule decides when the loop wakes up; the pool decides what it works on once awake. A loop that wakes every hour, asks its pool for the stalest unblocked item, and goes back to sleep when the answer is empty does no wasted work and needs no list of jobs maintained by hand.