Approval Bypass Prevention в 2026: как не дать агенту обойти human gate косвенным путём
Approval bypass prevention в 2026: как проектировать policy, tool graph и state transitions так, чтобы risky action не мог пройти мимо human review через обходной маршрут.
Approval bypass prevention в 2026 нужен потому, что risky action чаще обходят не прямым нарушением policy, а косвенным путём. Команда вроде бы поставила human gate на send_email или issue_refund, но рядом остались другие маршруты: draft становится auto-send, CRM update триггерит внешний webhook, browser flow коммитит действие через другой инструмент. Формально правило "approval required" существует, а practically side effect всё равно уходит без человека.
Approval bypass — это ситуация, когда действие, которое должно было пройти через человека, всё равно выполняется через другой маршрут. Не обязательно злонамеренно. Иногда это просто плохо спроектированный tool graph.
Самый вредный anti-pattern - ставить approval только на один obvious tool call и считать, что этого достаточно. В production gate должен покрывать не имя инструмента, а весь class risky outcome.
gate нужно ставить на outcome class, а не только на один API call;
draft, queue, webhook и browser routes часто становятся обходными путями;
approval должен быть привязан к конкретному action payload, а не быть общим флагом;
orchestration layer важнее, чем prompt-level запрет.
Без техники
Approval стоит только на `send_email`, но агент может обновить CRM поле, которое запускает автоматическую рассылку.
С техникой
Policy видит класс outcome `external_communication`, требует approval token для всех маршрутов и блокирует side effects без валидного gate.
ПромптBypass intuition
Почему approval gate на одном tool name часто недостаточен?
Ответ модели
Потому что тот же risky outcome может быть достигнут через другой tool, webhook или state transition. Контролировать нужно outcome class, а не только одну точку вызова.
def may_execute(action, approval):
if action["outcome_class"] != approval["outcome_class"]:
return False
if action["payload_hash"] != approval["payload_hash"]:
return False
return True
Практический совет: если approval gate не защищает outcome class целиком, а охраняет только один удобный API call, это почти всегда не gate, а иллюзия контроля.
Проверьте себя
1. Почему approval нельзя привязывать только к одному tool name?