Восстановление после сбоев инструментов в агентных системах¶
Ошибки инструментов редко заканчиваются простым error. Чаще команда сталкивается с более неприятными состояниями:
- неизвестно, был ли побочный эффект;
- частичный успех;
- устаревшая сверка состояния;
- повторный вызов, который уже опаснее исходной ошибки.
Поэтому для агентных систем полезно держать отдельный набор сценариев восстановления, а не сводить все к политике повторов.
1. Почему восстановление после сбоя инструмента это отдельный слой¶
Когда путь выполнения ломается, команда обычно хочет “просто повторить”. Но у инструментов разные последствия:
- читающий инструмент можно повторить безопаснее;
- записывающий инструмент может создать дубль;
- соединитель может успеть выполнить действие, но не вернуть подтверждение;
- внешняя система может оказаться в промежуточном состоянии.
Именно поэтому логика восстановления должна быть частью слоя контрактов.
2. Какие классы исходов полезно различать¶
Минимально полезная классификация выглядит так:
successretryable_failurevalidation_failurepermission_failureside_effect_unknownpartial_side_effectmanual_reconciliation_required
Если слой выполнения не различает эти классы, агент почти неизбежно начинает принимать слишком грубые решения о восстановлении.
3. Что делать с side_effect_unknown¶
Это самый неприятный класс отказов.
Канонические сценарии восстановления
Ветка восстановления должна различать поверхности отказа для трех канонических сценариев. Триаж обращений поддержки фокусируется на side_effect_unknown, поиске по ключу идемпотентности, предотвращении дубля тикета, ручной сверке и регрессии оценки/поэтапного выпуска. Внутренний ассистент знаний фокусируется на устаревшем поиске, сбое поиска источника, восстановлении после отказа доступа, откате записи в память и повторной проверке обоснованного ответа. Координация инцидентов фокусируется на частичной доставке уведомлений, повторе эскалации, исправлении передачи владельца, решении об экстренном откате и фиксации обучения после инцидента.
Вместо наивного повтора обычно полезнее:
- проверить текущее состояние во внешней системе;
- найти объект по ключу идемпотентности;
- перевести возможность во временный ограниченный режим;
- запросить проверку человеком;
- зафиксировать неопределенность в трассе и записи об инциденте.
Главная цель: не умножать побочные эффекты, пока состояние не восстановлено.
4. Что делать с partial_side_effect¶
Здесь система уже изменила внешний мир, но не дошла до чистого завершения.
Полезные стратегии:
- компенсирующее действие, если оно допустимо;
- явный шаг сверки состояния;
- остановка с явным показом частичного завершения;
- отдельная последующая задача вместо тихого повтора.
Важная мысль здесь простая: частичный успех не означает полного успеха, но и не означает, что все можно безопасно начать заново.
5. Когда восстановление должно требовать человека¶
Шлюз человеческого подтверждения особенно полезен, если:
- побочный эффект необратим;
- сверка состояния сама по себе рискованна;
- внешняя система не дает надежной проверки состояния;
- у команды нет уверенности, какая версия полезной нагрузки была применена;
- повтор может усилить радиус поражения.
То есть проверка человеком нужна не только для исходного действия, но и для некоторых путей восстановления.
6. Какие поля полезно хранить в контракте инструмента¶
Качество восстановления сильно зависит от того, что знает слой выполнения о контракте инструмента.
Минимально полезны такие поля:
idempotentretry_onreconcile_on_unknownrequires_manual_recoverycompensating_actionexternal_lookup_key
Без этого решения о восстановлении часто становятся ситуативными.
7. Что проверять в трассах¶
Во время проверки восстановления полезно быстро увидеть:
- какой статус вернул инструмент;
- был ли повтор;
- какой ключ идемпотентности использовался;
- делалась ли сверка состояния;
- какая полезная нагрузка реально пошла в записывающий путь;
- кто принял окончательное решение о восстановлении.
Если эти вещи не видны в трассах, инциденты восстановления будут расследоваться слишком долго.
8. Как это связано с оценками¶
Восстановление после сбоя инструмента полезно явно проверять в наборе оценочных данных:
- тайм-аут после записи;
- разрыв соединения после фиксации действия;
- попытка повторного дубля;
- частичный успех, требующий следующего шага;
- ручное подтверждение для пути восстановления.
Это особенно важно потому, что многие тяжелые производственные инциденты происходят не на счастливом пути, а именно в ветке восстановления.
9. Что сделать сразу¶
Сначала пройди по короткому списку и отдельно отметь все ответы «нет»:
- Различает ли слой выполнения
retryable_failureиside_effect_unknown? - Есть ли явный путь восстановления для
partial_side_effect? - Видно ли в трассах, какое решение о восстановлении было принято?
- Есть ли инструменты, где повтор запрещен по умолчанию?
- Есть ли сценарии ветки восстановления в наборе оценочных данных?
- Может ли опасный путь восстановления требовать проверки человеком?