std::thread::sleep or sync I/O inside an async fn.
It compiles, the function returns a Future, and the local test passes.
A blocking call holds the worker thread; other tasks on that thread stall. On a small-pool runtime this turns into observable latency or full deadlock.
Use tokio::time::sleep, async I/O, or spawn_blocking for work that must block.
Make every .await boundary an actual yield to the runtime.
Canonical alternative
async-patterns/cancellation