- Locked/ended AI conversations are now enforced server-side before accepting new user turns.
- Direct conversation.send_message calls into locked conversations return 409 and do not create a user message or start a run.
- Frontend preserves locked conversation state across reloads and blocks the composer correctly.
- Tool-only/status messages no longer reorder above the latest user message.
- Empty local status messages are hidden from the visible chat.