From the 0.9.14 refactor backlog (async discipline pass).
tui/ui/event_loop.rs multiplexes by try_recv() on engine/dispatch/translation channels inside a poll loop with adaptive timeouts. It is well tuned, but still spin-and-sleep: input latency has a poll-interval floor and idle CPU never fully reaches zero.
Rust-native fix: wake-driven multiplexing — crossterm EventStream + tokio::select! over {input, engine rx, dispatch rx, timers}, or keep the dedicated UI thread and replace channel polling with a waker the producer pokes (futures::task::AtomicWaker). Keep the adaptive frame limiter; it is orthogonal. Verify first that nothing on the input path awaits send() into the 32-slot op channel (see the TurnSpec issue).
Size: M. Evidence: measured idle CPU and input latency before/after.
From the 0.9.14 refactor backlog (async discipline pass).
tui/ui/event_loop.rsmultiplexes bytry_recv()on engine/dispatch/translation channels inside a poll loop with adaptive timeouts. It is well tuned, but still spin-and-sleep: input latency has a poll-interval floor and idle CPU never fully reaches zero.Rust-native fix: wake-driven multiplexing — crossterm
EventStream+tokio::select!over {input, engine rx, dispatch rx, timers}, or keep the dedicated UI thread and replace channel polling with a waker the producer pokes (futures::task::AtomicWaker). Keep the adaptive frame limiter; it is orthogonal. Verify first that nothing on the input path awaitssend()into the 32-slot op channel (see the TurnSpec issue).Size: M. Evidence: measured idle CPU and input latency before/after.