- 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.