This is the crux, and I wish the discussion started by posing and answering this question.
Futures are NOT inert. This is referenced only obliquely:
When a future is not ready yet, poll returns Poll::Pending and stores a clone of the Waker copied from the current Context. This Waker is then woken once the future can make progress
The passive voice "the waker is woken" obscures the fact that the Future itself is responsible for arranging the call to wake(). This means that the Future maintains some sort of dual active presence: it owns a thread, or a timer, or adds a file descriptor to an fd set, etc.
An example from futures::io::AsyncRead::poll:
If no data is available for reading, the method returns Poll::Pending and arranges for the current task to receive a notification when the object becomes readable or is closed.
So `poll()` is a misleading name: it is not a passive check but a hook for the Future to materialize its dual, active half.