Тайм-аут — не сигнал «повторить».
Представьте: агент отправил команду внешнему сервису, сервис мог её принять, но ответ потерялся вместе с соединением. Для вызывающей системы это не ошибка и не успех. Это неопределённый внешний эффект.
Если в этот момент просто повторить запись, можно создать дубль: второй релиз, второй пост, второй платёж.
Безопасный контур выглядит так:
1. До отправки фиксируем попытку: цель, профиль, нормализованный payload, idempotency key и время. 2. После неопределённого ответа запрещаем новую запись. 3. Читаем состояние у провайдера и сверяем найденный объект с исходным намерением. 4. Отдельно проверяем пользовательский результат: релиз действительно обслуживает нужную версию, пост существует по канонической ссылке, платёж имеет подтверждённый статус. 5. Новую попытку разрешаем только после доказанного отсутствия первого эффекта.
Идемпотентность защищает от повторного эффекта, если весь маршрут уважает ключ. Но сама по себе она не доказывает, что произошло с первой попыткой.
Поэтому unknown — это не исключение, которое надо проглотить. Это устойчивое состояние с владельцем, доказательствами и запретом на слепой retry.
А в ваших интеграциях что считается достаточным доказательством, что неопределённую операцию уже можно повторить?