Approval Path

Подтверждение — не переключатель «требуется одобрение», а полноценный сценарий с собственным идентификатором, сроком, путём эскалации и записью в трассе. Ключевое различие: быстрое подтверждение внутри текущего цикла и долговечное, переживающее перезапуск рантайма.

Чем отличается от соседней заметки Human in the Loop отвечает на вопрос «когда вообще звать человека» — там про цену ошибки, границы доверия и усталость от подтверждений. Эта заметка — про подтверждение как артефакт и состояние: что хранится, сколько живёт, как переживает перезапуск и что доказывает после инцидента.

Два разных подтверждения

Быстрое Долговечное
Где живёт В текущем цикле взаимодействия В долговечном рабочем процессе
Сколько ждёт Секунды-минуты Часы или дни
Переживает перезапуск Нет Да
Нужен ли approval_id Необязателен Обязателен
Типичный случай Действие, которое безопасно решить прямо сейчас Списание крупной суммы, изменение промышленных данных

Путать их дорого в конкретную сторону: если долговечное решение реализовано как быстрое, перезапуск рантайма теряет ожидающий запрос, и агент либо зависает навсегда, либо — что хуже — продолжает без подтверждения (Durable Execution).

У долговечного подтверждения есть собственные обязательные свойства: срок действия, путь эскалации при истечении срока, возобновление после перезапуска и доказательство в трассе, показывающее, какой шаг был остановлен и какой продолжился после решения.

Что обязана хранить запись подтверждения

Шесть полей, без которых после инцидента нечего предъявить:

  • кто запросил действие;
  • какой был класс риска;
  • что именно собирались сделать;
  • кто подтвердил;
  • в какое время;
  • были ли переопределены проверочные ворота политики.

Последнее поле — то, которое обычно забывают, и именно оно отвечает на самый неприятный вопрос разбора: действие прошло штатно или кто-то продавил его в обход правила (Agent Audit Log).

Граница подтверждения ставится там, где живёт побочный эффект

Практическое правило выбора формы: подтверждение должно стоять на той же границе, где происходит необратимое действие, а не там, где удобно спросить.

Отсюда несколько разных форм в одной системе — подтверждение в долговечном процессе, подтверждение инструмента на стороне клиента, запрос структурированного ввода вместо «да/нет». Последняя форма стоит отдельного внимания: иногда системе нужно не разрешение, а недостающий параметр, и тогда подтверждение выглядит как запрос со своей схемой, а не как кнопка.

Подтверждение — состояние, а не вывод из разговора

Признак «подтверждено» устанавливается путём подтверждения и хранится как поле запуска. Он не выводится моделью из того, что пользователь написал что-то похожее на согласие: это ровно тот механизм, который порождает галлюцинацию действия (Action Hallucination).

Проверка на исполнении делается заново, по состоянию, а не по контексту диалога (Tool Gateway).

Одобряется точный артефакт, а не намерение

Для команды исполнения запись связывается как минимум с cwd, каноническим argv, релевантным env, разрешённым executable и, где возможно, байтами запускаемого скрипта. Для изменения skill та же идея принимает форму target + base_hash + proposal_revision + diff (Skill Change Control). Если любой связанный компонент изменился после показа человеку, старое одобрение недействительно.

Жизненный цикл запроса тоже ограничивает authority: закрытие или отмена хода инвалидирует ожидающее подтверждение. Поздний ответ не должен воскресить уже завершённое исполнение; он создаёт новое намерение и требует нового запроса.

Чего у нас не было: класс обратимости и правило цепочки

Сверка с OWASP AISVS C9.2 подтвердила основное — подтверждение как проверяемое состояние рантайма, а не как флаг в диалоге, — и добавила четыре требования, которых здесь не хватало.

Класс обратимости как первичное свойство действия. Каждое действие с высоким влиянием получает доверенную классификацию: только чтение, обратимое, обратимое внешними средствами, необратимое. Дальше рантайм применяет классификацию — блокирует, требует подтверждения или ограничивает. Это переворачивает постановку: не «на какие действия ставим подтверждение», а «какой класс обратимости у этого действия и что из него следует».

Правило цепочки, и оно самое неочевидное. Для многошагового и межагентного действия ворота обязаны применять наивысший класс влияния, встречающийся где-либо в цепочке. Иначе безобидное первое звено пропускает всю последовательность, в конце которой стоит необратимое.

Полные параметры без усечения. Запрос подтверждения показывает человеку канонизированные и полные параметры действия — различия, команды, получателей, суммы, ресурсы, области — без обрезки и без небезопасных преобразований. Интерфейс, показывающий «списание средств» вместо суммы и получателя, превращает подтверждение в штамп, а не в решение.

Проверка моделью дополняет детерминированные ворота, но не заменяет их. Проверка планируемого рискованного действия моделью допустима как дополнительный слой; она не может быть единственным барьером и обязана быть защищена от манипуляции через инъекцию (Deterministic Veto, Prompt Injection).

Уровня 3 в стандарте, но назвать стоит: одобрение криптографически связывается с параметрами действия, личностью запросившего, контекстом исполнения и одноразовым значением, а ключевой материал держится вне рантайма агента.

Связано с

  • Human in the Loop — когда звать человека и как не создать узкое место
  • Tool Gateway — где проверяется состояние подтверждения
  • Agent Control Plane — что решает, требуется ли подтверждение
  • Action Hallucination — отказ, который случается при выводе согласия из текста
  • Agent Audit Log — где живёт запись подтверждения
  • Durable Execution — механика переживания перезапуска
  • LangGraph HITL — реализация паузы и возобновления в графе
  • Capability Containment — что ограничивает ущерб, если подтверждение дали зря