pending_approval, a chamada de
ferramenta do agente é retida em vez de despachada — ela agora está esperando
por um humano. Esta página é para o revisor: como aprovar retenções de chamada
de ferramenta de agente (ou rejeitá-las) a partir do console, o que a fila lhe
mostra, e como o OrcaRouter impede que dois revisores colidam na mesma decisão.
É a metade de resolução do human-in-the-loop. Para por que uma chamada é retida
e como o agente retido reenvia depois, veja
vereditos e a
referência de aprovações mais profunda. Para
resolver do seu próprio sistema em vez do console, veja
webhooks de aprovação.
1. O ciclo de vida da chamada retida, do assento de um revisor
Uma chamada retida é um loop curto fora de banda. Seu trabalho é o passo do meio:A chamada é retida
Uma regra resolve para
pending_approval. O relay retorna HTTP 400 com o
código firewall_approval_pending e um id de aprovação; a chamada nunca chega
à ferramenta. O agente começa a consultar nesse id.Você a resolve
Você abre a fila Approvals, lê por que a chamada foi retida, e a
aprova ou rejeita — o foco desta página.
Resolver uma retenção é restrito a Developer+ — o mesmo controle que o feed de
Events do firewall. Papéis inferiores podem ler a política de firewall, as
configurações e as ferramentas descobertas, mas apenas papéis Developer-e-acima
podem listar a fila de aprovação ou aprovar/rejeitar uma chamada de ferramenta
retida. Veja
papéis e escopo.
2. Liste a fila pendente
A aba Approvals lêGET /api/workspace/firewall/approvals. Sem filtro ela retorna
a fila pending, mais antigas primeiro — então a chamada que espera há mais
tempo fica no topo e você trabalha o backlog em ordem.
state é o único filtro que importa. Os valores mapeiam para o ciclo de vida da
aprovação:
state | Aprovações retornadas |
|---|---|
pending (padrão) | Retida, aguardando uma decisão — sua fila de trabalho. |
approved | Já deixada passar. |
rejected | Já bloqueada. |
3. Leia por que a chamada foi retida
Cada linha carrega os inputs de decisão de que um revisor precisa — o nome da ferramenta (tool_name), uma impressão digital de argumentos (args_hash,
o SHA-256 dos argumentos canonicalizados da chamada — os valores crus de argumento
não são armazenados na aprovação), o request id, e uma linha de proveniência
em inglês simples que nomeia a política, a regra e a cláusula que disparou:
policy_name — qual política a reteve
policy_name — qual política a reteve
A política nomeada à qual a regra correspondida pertence, resolvida com escopo
de workspace para que um id obsoleto nunca possa revelar o nome de política de
outro tenant.
rule_label + matched_clause — o motivo humano
rule_label + matched_clause — o motivo humano
O label da regra e um descritor “por quê” de uma linha — ex.:
command contains rm -rf, ou tool matches "http_fetch" para uma regra só de
glob. Isso renderiza a linha “Held because…” na fila.rule_changed — proveniência em que você pode confiar
rule_changed — proveniência em que você pode confiar
true quando a regra correspondida foi editada em ou após esta aprovação
ter sido criada. O label e a cláusula ao vivo são então suprimidos (eles podem
não mais refletir o que de fato reteve a chamada), e a fila mostra uma nota
“rule since changed” em vez de proveniência obsoleta. O nome da ferramenta e
os argumentos — os inputs de decisão reais — são sempre mostrados.4. Aprove ou rejeite
Resolver enviaPATCH /api/workspace/firewall/approvals/:id com um decision de
approved ou rejected e um reason opcional. O console faz isso por você
quando você clica no botão; a forma é:
approved→ a chamada retida pode prosseguir. O próximo reenvio do agente, carregando o header de aprovação de uso único, é deixado passar uma vez.rejected→ a chamada permanece bloqueada. O agente vê a rejeição e pode escolher outro caminho, perguntar ao usuário, ou parar.
decision é validado contra o conjunto fechado {approved, rejected} —
qualquer outra coisa é rejeitada. O reason é registrado com a decisão e escrito
no log de auditoria do firewall ao lado do ator, do nome da ferramenta e do
request id.
Cada resolução escreve uma linha de auditoria de workspace nomeando quem
decidiu, a decisão e o motivo. Resoluções de console registram o ator humano;
resoluções de webhook registram um ator
de sistema. A proveniência de resolução nunca é silenciosamente descartada.
5. First-writer-wins: sem dupla resolução
Uma aprovação pendente pode sofrer corrida — dois revisores no console, ou um clique de console e um callback de webhook chegando juntos. O OrcaRouter resolve isso com uma única regra de first-writer-wins:- A decisão é um update condicional atômico que só dispara enquanto a
aprovação ainda está
pending. O primeiro escritor vence e aplica a decisão. - Todo escritor posterior observa “já resolvida” e é tratado como um no-op idempotente — ele recebe HTTP 200 com o documento já resolvido, não um erro.
resolved: true significa que sua chamada aplicou a decisão; already_resolved: true significa que alguém (ou algum webhook) chegou primeiro e você está vendo o
resultado deles. De qualquer forma a fila reconcilia para um estado consistente.
6. Uma passagem concreta pela fila
Um workspace de autonomia balanced retém a chamadashell.exec de um agente
porque uma regra correspondeu a command contains rm -rf. Como o revisor você:
- Abre Approvals — o
shell.execretido fica no topo da listapendingmais-antigas-primeiro. - Lê a linha: ferramenta
shell.exec, a impressão digitalargs_hash, o request id, e a linha “Held because…command contains rm -rf” (renderizada a partir da cláusula da regra correspondida). Sem flagrule_changed, então a proveniência é atual. - O alvo é um diretório descartável, então você aprova com um motivo.
- Seu
PATCHretornaresolved: true; a próxima consulta do agente vêapproved, reenvia com seu header de uso único, e o comando roda exatamente uma vez.
already_resolved: true com a decisão deles — sem dano, sem dupla execução.
Para onde ir a seguir
Referência de aprovações
O loop HITL completo: reter, consultar, reenviar, e o header de uso único.
Webhooks de aprovação
Resolva retenções do seu próprio sistema com um callback assinado por HMAC.
Vereditos
Onde pending_approval fica entre os seis vereditos de firewall.
Log de events
Confirme o resultado downstream de uma chamada resolvida no feed.
