b3f3ef59f5
`handleInboundBidi` previously snapshotted the publisher list at the TOP of the function (= bidi-arrival time) and used the snapshot for the rest of the bidi's lifetime. A publisher registered between bidi-open and the first inbound chunk would miss the dispatcher's view, even though the publisher was already live in `activePublishers` by the time we needed to dispatch. Practical impact today: zero — both nests publishers (`audio/data` and `catalog.json`) register from `MoqLiteNestsSpeaker.startBroadcasting` before the relay's SUBSCRIBE bidi for either track lands. The ~few-ms gap is below the network round-trip floor. But the contract is narrower if we read the list at first-byte time: we then see every publisher that was registered up to the moment we needed to make a routing decision. Closes the L5 row of the audit doc. Move the publishers fetch from the function-top to inside the `if (!dispatched)` block, after the control-type byte has been read. On empty publisher list (the case we previously short-circuited at function-top), we now FIN cleanly so the peer's wait resolves instead of hanging on an idle bidi. Audit doc: nestsClient/plans/2026-05-09-moq-lite-rfc-compliance.md (L5). https://claude.ai/code/session_012TGfo99Ugz7fcCPv85a8Tq