TL;DR: Message order describes the sequence a receiver is allowed to observe on one channel; delivery order is the sequence events actually reach each learner after delay, loss, retries, and reconnects. In plain terms, a realtime ordering guarantee has a boundary. For classroom typing indicators and read receipts, do not pretend transport arrival is a global timeline. Put a monotonic sequence on durable events, make ephemeral state expire, and backfill from a receiver-owned cursor before resuming the live stream.
That decision separates two very different promises. A typing indicator can be dropped because its value fades in seconds. A read receipt changes durable state and must survive reconnect. Treating both as ordinary messages creates the worst kind of classroom bug: the UI looks certain while its history is ambiguous.
Why don't realtime message order and delivery guarantees match?
A sender creates an event at one instant, but delivery is a path, not an instant.…