7c2eaf09e2
PipePair has no continuous read pump — the test thread drains the pipe only while it sits in ReadUntilAsync — so multi-megabyte DrainEvents frames interleaved with the heartbeat loop wedge both ends inside FlushFileBuffers, each waiting for the other to read. Negotiate a 128 KiB frame maximum instead: the 10,000 byte-heavy events still overflow it many times over, so every assertion (bounded reply, reported truncation, no event loss across repeated drains, surviving session) is unchanged.