This is essentially the same "lost wakeup" problem you see with condition variables in pthreads, but asyncio makes it more insidious because the single-threaded event loop gives you a false sense of safety. The per-consumer queue approach is really just reinventing what Go channels and Rust's tokio::sync::watch do at the primitive level — buffer transitions so observers never miss intermediate states.