When a speaker finishes with an end symbol, the turn was only advanced
in the message_sent hook. But by that time, the message had already been
broadcast to other agents, whose before_model_resolve ran with the old
turn state, causing them to be blocked by the turn gate (forced no-reply).
Fix:
- Move turn advance for both NO_REPLY and end-symbol cases to
before_message_write, which fires before the message is broadcast.
- Guard 1: Only the current speaker can advance the turn (accountId check).
- Guard 2: Only process assistant messages (role check). before_message_write
fires for incoming user messages too, which contain end symbols from other
agents and would cause cascading turn advances.
- Use sessionTurnHandled set to prevent double-advancing in message_sent.