-- Идемпотентность сообщений мессенджера (conversation_messages): клиентский ключ. -- Та же защита, что у task_messages (миграция 0086): multi-tab replay -- офлайн-очереди, ретраи после сетевых сбоев, двойные клики. -- Partial unique index: NULL-значения (старые сообщения, боты) не конфликтуют. ALTER TABLE conversation_messages ADD COLUMN IF NOT EXISTS client_message_id varchar(64); CREATE UNIQUE INDEX IF NOT EXISTS conv_messages_client_message_id_unique ON conversation_messages (client_message_id) WHERE client_message_id IS NOT NULL;