pending_approval, вызов инструмента
агента удерживается вместо диспетча — теперь он ждёт человека. Эта страница
— для ревьюера: как одобрить удержание вызова инструмента агента (или
отклонить его) из консоли, что показывает вам очередь, и как OrcaRouter не даёт
двум ревьюерам столкнуться на одном решении.
Это половина-разрешение human-in-the-loop. О том, почему вызов удерживается и
как удержанный агент повторно отправляет потом, см.
вердикты и более глубокий
справочник подтверждений. Чтобы разрешать из
вашей собственной системы вместо консоли, см.
вебхуки подтверждений.
1. Жизненный цикл удержанного вызова с места ревьюера
Удержанный вызов — это короткий цикл вне основного канала. Ваша работа — средний шаг:Вызов удержан
Правило разрешается в
pending_approval. Ретрансляция возвращает HTTP
400 с кодом firewall_approval_pending и id подтверждения; вызов никогда
не достигает инструмента. Агент начинает опрашивать по этому id.Вы его разрешаете
Вы открываете очередь Approvals, читаете, почему вызов был удержан, и
одобряете или отклоняете его — фокус этой страницы.
Разрешение удержания ограничено Developer+ — тот же шлюз, что у ленты
событий firewall. Более низкие роли могут читать политику firewall, настройки и
обнаруженные инструменты, но только роли Developer-и-выше могут перечислить
очередь подтверждений или одобрить/отклонить удержанный вызов инструмента. См.
роли и область.
2. Перечислите очередь pending
Вкладка Approvals читаетGET /api/workspace/firewall/approvals. Без фильтра
она возвращает очередь pending, старейшими первыми — так что
дольше-всего-ждущий вызов сидит наверху, и вы обрабатываете backlog по порядку.
state — единственный фильтр, который важен. Значения отображаются на
жизненный цикл подтверждения:
state | Возвращаемые подтверждения |
|---|---|
pending (по умолчанию) | Удержано, ожидает решения — ваша рабочая очередь. |
approved | Уже пропущено. |
rejected | Уже заблокировано. |
3. Прочитайте, почему вызов был удержан
Каждая строка несёт входные данные решения, нужные ревьюеру — имя инструмента (tool_name), отпечаток аргументов (args_hash, SHA-256
канонизированных аргументов вызова — сырые значения аргументов не хранятся в
подтверждении), id запроса и строку происхождения на обычном языке, которая
называет политику, правило и клаузу, которая сработала:
policy_name — какая политика его удержала
policy_name — какая политика его удержала
Названная политика, которой принадлежит совпавшее правило, разрешённая в
области рабочего пространства, так что устаревший id никогда не всплывёт имя
политики другого тенанта.
rule_label + matched_clause — человеческая причина
rule_label + matched_clause — человеческая причина
Метка правила и однострочный дескриптор «почему» — например,
command contains rm -rf или tool matches "http_fetch" для правила
только-с-глобом. Это рендерит строку «Held because…» в очереди.rule_changed — происхождение, которому можно доверять
rule_changed — происхождение, которому можно доверять
true, когда совпавшее правило было отредактировано в момент или после
создания этого подтверждения. Живая метка и клауза тогда подавляются (они
могут больше не отражать то, что реально удержало вызов), и очередь
показывает заметку «rule since changed» вместо устаревшего происхождения.
Имя инструмента и аргументы — реальные входные данные решения — показываются
всегда.4. Одобрить или отклонить
Разрешение отправляетPATCH /api/workspace/firewall/approvals/:id с
decision approved или rejected и опциональным reason. Консоль делает
это за вас, когда вы кликаете кнопку; форма такая:
approved→ удержанный вызов может продолжить. Следующая повторная отправка агента, несущая одноразовый заголовок подтверждения, пропускается один раз.rejected→ вызов остаётся заблокированным. Агент видит отклонение и может выбрать другой путь, спросить пользователя или остановиться.
decision валидируется против закрытого набора {approved, rejected} — всё
остальное отклоняется. reason записывается с решением и пишется в журнал
аудита firewall вместе с актором, именем инструмента и id запроса.
Каждое разрешение пишет строку аудита рабочего пространства, называющую,
кто решил, решение и причину. Консольные разрешения записывают человеческого
актора; разрешения через вебхук
записывают системного актора. Происхождение разрешения никогда не отбрасывается
молча.
5. First-writer-wins: нет двойного разрешения
Pending-подтверждение может попасть в гонку — два ревьюера в консоли или консольный клик и вебхук-колбэк, приходящие вместе. OrcaRouter решает это единственным правилом first-writer-wins:- Решение — это атомарное условное обновление, которое срабатывает только
пока подтверждение всё ещё
pending. Первый писатель побеждает и применяет решение. - Каждый более поздний писатель наблюдает «уже разрешено» и трактуется как идемпотентный no-op — он получает HTTP 200 с уже-разрешённым документом, не ошибку.
resolved: true означает, что ваш вызов применил решение; already_resolved: true означает, что кто-то (или какой-то вебхук) добрался туда первым, и вы
видите их исход. В любом случае очередь сходится к одному согласованному
состоянию.
6. Конкретный проход по очереди
Рабочее пространство с balanced-автономией удерживает вызовshell.exec
агента, потому что правило совпало command contains rm -rf. Как ревьюер вы:
- Откройте Approvals — удержанный
shell.execсидит наверху спискаpendingстарейшими-первыми. - Прочитайте строку: инструмент
shell.exec, отпечатокargs_hash, id запроса и строку «Held because…command contains rm -rf» (отрендеренную из клаузы совпавшего правила). Нет флагаrule_changed, так что происхождение актуально. - Цель — временная директория, так что вы одобряете с причиной.
- Ваш
PATCHвозвращаетresolved: true; следующий опрос агента видитapproved, повторно отправляет со своим одноразовым заголовком, и команда выполняется ровно один раз.
already_resolved: true с их решением — без вреда, без двойного запуска.
Куда двигаться дальше
Справочник подтверждений
Полный цикл HITL: удержание, опрос, повторная отправка и одноразовый заголовок.
Вебхуки подтверждений
Разрешайте удержания из вашей собственной системы подписанным HMAC колбэком.
Вердикты
Где pending_approval сидит среди шести вердиктов firewall.
Журнал событий
Подтвердите downstream-исход разрешённого вызова в ленте.
