326fb24367
The previous #runSerialized waited on the shared #dispatchTail, then ran unconditionally: when two or more events queued behind an in-flight run, each resumed from the same settled await and started its own run in parallel, defeating the ordering guarantee for a burst landing in one coalescing window (message_end + agent_end behind a suspended flush). Each waiter now chains its own link onto the current tail (tail.then(run, run)), so queued runs start strictly one after another; the idle path still runs synchronously, preserving the flush timing the coalescing tests assert on. The in-flight flag clears only when the settling link is still the tail, so a later chained link's settle does not clear it early. Regression test: two message_end events queued behind a suspended window flush stay serialized (init call count steps 1 -> 2 -> 3 as each gate opens); fails on the previous implementation.