Saltar al contenido principal
Cuando una regla de firewall devuelve el veredicto pending_approval, la llamada a herramienta del agente se retiene en vez de despacharse — ahora está esperando a un humano. Esta página es para el revisor: cómo aprobar las retenciones de llamadas a herramienta de agentes (o rechazarlas) desde la consola, qué te muestra la cola, y cómo OrcaRouter evita que dos revisores colisionen en la misma decisión. Es la mitad de resolución del humano en el ciclo. Para por qué se retiene una llamada y cómo el agente retenido reenvía después, ver veredictos y la referencia de aprobaciones más profunda. Para resolver desde tu propio sistema en vez de la consola, ver webhooks de aprobación.

1. El ciclo de vida de la llamada retenida, desde el asiento de un revisor

Una llamada retenida es un bucle corto fuera de banda. Tu trabajo es el paso del medio:
1

La llamada se retiene

Una regla resuelve a pending_approval. El relay devuelve HTTP 400 con el código firewall_approval_pending y un id de aprobación; la llamada nunca llega a la herramienta. El agente empieza a hacer polling de ese id.
2

La resuelves

Abres la cola Approvals, lees por qué se retuvo la llamada, y la apruebas o rechazas — el foco de esta página.
3

El agente procede (o se detiene)

Al aprobar, el agente reenvía la llamada original con una cabecera X-OrcaRouter-Firewall-Approval de un solo uso y el gateway la deja pasar esa única vez. Al rechazar, la llamada sigue bloqueada.
Resolver una retención está gobernado a Developer+ — la misma compuerta que el feed de Events del firewall. Los roles inferiores pueden leer la política de firewall, la configuración y las herramientas descubiertas, pero solo los roles Developer y superiores pueden listar la cola de aprobaciones o aprobar/rechazar una llamada a herramienta retenida. Ver roles y alcance.

2. Listar la cola pendiente

La pestaña Approvals lee GET /api/workspace/firewall/approvals. Sin filtro devuelve la cola pending, más antigua primero — así que la llamada que más tiempo lleva esperando se sitúa arriba y trabajas el backlog en orden.
GET /api/workspace/firewall/approvals?state=pending
state es el único filtro que importa. Los valores mapean al ciclo de vida de la aprobación:
stateAprobaciones devueltas
pending (por defecto)Retenida, esperando una decisión — tu cola de trabajo.
approvedYa dejada pasar.
rejectedYa bloqueada.
Esta es una ruta de consola sobre tu sesión — configúrala y revísala desde el dashboard, no con una clave de relay sk-orca-…. Las claves de relay son para llamadas a modelo /v1/*; la gestión del firewall se ejecuta bajo tu login de consola.

3. Leer por qué se retuvo la llamada

Cada fila lleva las entradas de decisión que un revisor necesita — el nombre de la herramienta (tool_name), una huella de argumentos (args_hash, el SHA-256 de los argumentos de llamada canonicalizados — los valores de argumento en bruto no se almacenan en la aprobación), el id de solicitud, y una línea de procedencia en lenguaje sencillo que nombra la política, la regla y la cláusula que se disparó:
La política nombrada a la que pertenece la regla coincidente, resuelta con alcance de espacio de trabajo para que un id obsoleto nunca pueda sacar a la luz el nombre de política de otro inquilino.
La etiqueta de la regla y un descriptor de “por qué” de una línea — p. ej. command contains rm -rf, o tool matches "http_fetch" para una regla de solo glob. Esto renderiza la línea “Held because…” en la cola.
true cuando la regla coincidente fue editada en o después de que se creó esta aprobación. La etiqueta y cláusula en vivo se suprimen entonces (pueden ya no reflejar lo que realmente retuvo la llamada), y la cola muestra una nota “regla cambiada desde entonces” en vez de procedencia obsoleta. El nombre de la herramienta y los argumentos — las entradas de decisión reales — siempre se muestran.
rule_changed es una señal de honestidad deliberada, no un error. Si alguien edita la regla del firewall mientras una llamada está en la cola, OrcaRouter preferiría ocultar una razón posiblemente-incorrecta que mostrarte procedencia que ya no coincide. Decide sobre el nombre de la herramienta y el nombre de la política (aún mostrados) en ese caso.

4. Aprobar o rechazar

Resolver envía PATCH /api/workspace/firewall/approvals/:id con un decision de approved o rejected y un reason opcional. La consola lo hace por ti cuando haces clic en el botón; la forma es:
PATCH /api/workspace/firewall/approvals/507f1f77bcf86cd799439011
Content-Type: application/json

{ "decision": "approved", "reason": "verified target host with the on-call" }
  • approved → la llamada retenida puede proceder. El siguiente reenvío del agente, llevando la cabecera de aprobación de un solo uso, se deja pasar una vez.
  • rejected → la llamada sigue bloqueada. El agente ve el rechazo y puede elegir otra ruta, preguntar al usuario o detenerse.
decision se valida contra el conjunto cerrado {approved, rejected} — cualquier otra cosa se rechaza. El reason se registra con la decisión y se escribe en el registro de auditoría del firewall junto al actor, el nombre de la herramienta y el id de solicitud.
Cada resolución escribe una fila de auditoría del espacio de trabajo que nombra quién decidió, la decisión y la razón. Las resoluciones de consola registran el actor humano; las resoluciones de webhook registran un actor de sistema. La procedencia de la resolución nunca se descarta silenciosamente.

5. Gana-el-primer-escritor: sin doble resolución

Una aprobación pendiente puede ser disputada — dos revisores en la consola, o un clic de consola y un callback de webhook llegando juntos. OrcaRouter resuelve esto con una única regla de gana-el-primer-escritor:
  • La decisión es una actualización condicional atómica que solo se dispara mientras la aprobación sigue pending. El primer escritor gana y aplica la decisión.
  • Cada escritor posterior observa “ya resuelta” y se trata como un no-op idempotente — obtiene HTTP 200 con el documento ya resuelto, no un error.
La respuesta te dice en qué lado estabas:
{
  "resolved": false,
  "already_resolved": true,
  "approval": { "state": "approved", "decision": "approved", "...": "..." }
}
resolved: true significa que tu llamada aplicó la decisión; already_resolved: true significa que alguien (o algún webhook) llegó primero y estás viendo su resultado. De cualquier forma la cola se reconcilia a un estado consistente.
Como la resolución es idempotente, una red inestable o un doble clic no pueden corromper una retención ni invertir una decisión. La primera aprobación/rechazo es la única que cuenta; todo después de ella solo lee de vuelta el resultado.

6. Un pase concreto por la cola

Un espacio de trabajo de autonomía balanced retiene una llamada shell.exec de un agente porque una regla coincidió con command contains rm -rf. Como revisor tú:
  1. Abres Approvals — el shell.exec retenido se sitúa arriba de la lista pending de más-antigua-primero.
  2. Lees la fila: herramienta shell.exec, la huella args_hash, id de solicitud, y la línea “Held because… command contains rm -rf” (renderizada de la cláusula de la regla coincidente). Sin flag rule_changed, así que la procedencia es actual.
  3. El objetivo es un directorio de borrador, así que apruebas con una razón.
  4. Tu PATCH devuelve resolved: true; el siguiente polling del agente ve approved, reenvía con su cabecera de un solo uso, y el comando se ejecuta exactamente una vez.
Si un compañero de equipo lo hubiera aprobado un segundo antes, tu clic habría devuelto already_resolved: true con su decisión — sin daño, sin doble ejecución.

Dónde ir a continuación

Referencia de aprobaciones

El bucle HITL completo: retener, hacer polling, reenviar, y la cabecera de un solo uso.

Webhooks de aprobación

Resuelve retenciones desde tu propio sistema con un callback firmado con HMAC.

Veredictos

Dónde se sitúa pending_approval entre los seis veredictos del firewall.

Registro de eventos

Confirma el resultado posterior de una llamada resuelta en el feed.
Para los riesgos que estas retenciones buscan capturar, ver llamadas a herramienta peligrosas y agencia excesiva.