Human Approval para agentes de IA: cómo controlar de forma segura las acciones write

Flow de approval práctico en producción: approval_required, TTL, stop reasons, approval token y audit trail para acciones write.
En esta página
  1. Idea en 30 segundos
  2. Problema
  3. Solución
  4. Human Approval != Manual Mode
  5. Métricas de control de approval
  6. Cómo se ve en la arquitectura
  7. Ejemplo
  8. En código se ve así
  9. Cómo se ve durante la ejecución
  10. Errores típicos
  11. Autoevaluación
  12. FAQ
  13. Dónde encaja Human Approval en el sistema general
  14. Páginas relacionadas

Idea en 30 segundos

Human approval es un runtime-gate para acciones write de riesgo: antes de ejecutar, el agente recibe approval_required y espera confirmación humana.

Cuándo se necesita: cuando el agente puede modificar datos, enviar mensajes a clientes o lanzar acciones irreversibles en producción.

Problema

Sin approval, las acciones write se ejecutan de inmediato si la policy las permite. En demo esto es cómodo. En producción, un solo error del agente se convierte en incidente real.

El problema no es solo un modelo "malo". Incluso un buen modelo se equivoca a veces en solicitudes atípicas. Si no hay un gate humano entre el agente y la herramienta write, el error se convierte al instante en side effect dentro de sistemas reales.

Analogía: es como un pago sin 3D Secure. Mientras todo va bien, no hay retraso. Cuando algo sale mal, las consecuencias se vuelven costosas en segundos.

Solución

La solución es agregar en la policy layer un flow de approval específico para acciones write de riesgo. La policy devuelve una de estas decisiones: allow, deny o approval_required.

approval_required no ejecuta la acción de inmediato: runtime crea una approval request, espera una decisión humana y solo después de approval_granted ejecuta el tool call. Esta decisión se toma en cada paso, no solo al final del run.

Human Approval != Manual Mode

Son modelos diferentes:

  • Manual mode: una persona ejecuta casi cada acción en lugar del agente.
  • Human approval: el agente trabaja de forma autónoma, y la persona confirma solo acciones write de riesgo.

Uno sin el otro no alcanza:

  • sin approval, acciones riesgosas pasan sin control adicional
  • si se usa manual mode para todo, el sistema pierde velocidad y escalabilidad

Ejemplo:

  • sin approval: ticket.close_bulk se ejecuta de inmediato
  • con approval: policy devuelve approval_required y la acción espera confirmación

Métricas de control de approval

Estas métricas y señales trabajan juntas en cada paso del agente.

MétricaQué controlaMecánicas clavePara qué sirve
Approval scopePara qué acciones se requiere confirmaciónwrite policy
risk tiers
Reduce el riesgo en acciones irreversibles
Approval request contextQué ve exactamente la persona antes de decidirpreview + args hash
reason + policy context
Permite tomar una decisión fundamentada
TTL y cancelaciónCiclo de vida de la approval requestapproval TTL
cancel flow
Evita que el run quede bloqueado indefinidamente
Execution gateEjecución real de la acción writeapproval token
gateway enforcement
Garantiza que write no se ejecute sin confirmación
Approval observabilityVisibilidad de decisiones de approvalaudit logs
alerts on timeout spikes
No limita la acción directamente, pero ayuda a detectar cuellos de botella del proceso de approval

Cómo se ve en la arquitectura

La policy layer (tool gateway) se ubica entre runtime y tools y es el único punto de control de acceso antes de cada paso. Cada decisión (allow, deny, approval_required) se registra en audit log.

Cada paso del agente pasa por este flow antes de ejecutarse: runtime no ejecuta acciones write directamente — primero chequeo de policy -> approval gate -> ejecución.

Resumen del flow:

  • Runtime forma un tool call
  • Policy layer valida riesgo y puede devolver approval_required
  • con approval_granted, se ejecuta write
  • con approval_denied o approval_timeout, el run recibe stop reason
  • cada decisión se escribe en audit log

En runtime, deny también se convierte en stop reason explícito, visible en logs y respuesta del run.

Una approval request normalmente contiene:

  • tool
  • preview breve de la acción
  • args hash
  • reason / risk tier
  • TTL

Ejemplo

Un agente de soporte quiere ejecutar email.send para un cliente. La policy define que este tool requiere confirmación humana.

Resultado:

  • sin approval token, write no se ejecuta
  • después de approval_granted, el llamado se permite
  • con timeout, el agente devuelve stop("approval_timeout")

Human approval detiene la acción riesgosa antes del side effect, no después del incidente.

En código se ve así

En el esquema simplificado de arriba se muestra el control flow principal. En la práctica, validación y ejecución deben pasar por un único policy/tool gateway.

Ejemplo de configuración de approval:

YAML
approvals:
  required_for:
    - email.send
    - ticket.close_bulk
    - db.write
  ttl_seconds: 300
  fallback_when_not_approved: stop
PYTHON
decision = policy.evaluate(tool, user_context, mode="normal")

if decision.outcome == "approval_required":
    request = approvals.create_request(
        run_id=run_id,
        tool=tool,
        args_hash=hash_args(args),
        ttl_seconds=300,
    )
    audit.log(run_id, decision.outcome, reason="pending_human_review", tool=tool, pending_id=request.id)
    return stop("approval_required", pending_id=request.id)

elif decision.outcome == "deny":
    audit.log(run_id, decision.outcome, reason=decision.reason, tool=tool)
    return deny(decision.reason)

# later, in resume flow with pending_id
approval = approvals.get_decision(pending_id)
if approval.outcome != "approved":
    audit.log(run_id, "deny", reason=approval.outcome, tool=tool, pending_id=pending_id)
    return stop(approval.outcome)

audit.log(run_id, "approval_granted", reason="human_approved", tool=tool, approver=approval.approved_by)
result = tool.execute({**args, "approval_token": approval.token})
decision = Decision.allow(reason="policy_ok")
audit.log(run_id, decision.outcome, reason=decision.reason, tool=tool, result=result.status)
return result

En producción, el flow de approval suele ser asíncrono: runtime crea la request, devuelve estado pending/stop sin bloquear worker y reanuda el run después de la decisión humana.

Cómo se ve durante la ejecución

TEXT
Escenario 1: confirmado (approval granted)

1. Runtime forma llamada email.send.
2. Policy devuelve approval_required.
3. Runtime crea approval request y devuelve estado pending/stop.
4. Una persona confirma la acción dentro de TTL.
5. Runtime reanuda el run, ejecuta tool call y registra `approval_granted -> allow`.

---

Escenario 2: timeout de aprobación

1. Runtime forma llamada db.write.
2. Policy devuelve approval_required.
3. Runtime crea approval request y devuelve estado pending/stop.
4. No llega confirmación antes de que termine TTL.
5. Runtime devuelve stop (approval_timeout), acción no ejecutada.

---

Escenario 3: policy deny sin approval

1. Runtime forma llamada write fuera del scope permitido.
2. Policy devuelve deny de inmediato.
3. Runtime devuelve stop reason.
4. Audit: decision=deny, reason=policy_denied.
5. Acción no ejecutada.

Errores típicos

  • approval solo en UI, pero no en policy/tool gateway
  • approval sin TTL ni cancelación
  • mismo enfoque para acciones write low-risk y high-risk
  • falta de approval token al ejecutar el tool
  • no loggear approval_required ni approval_granted
  • bloquear todos los runs esperando approval en vez de devolver estado stop/pending explícito

Como resultado, el sistema o deja pasar acciones inseguras, o queda colgado en colas de approval sin estado transparente.

Autoevaluación

Chequeo rápido de human-approval antes de lanzar en producción:

Progreso: 0/8

⚠ Faltan controles base de governance

Antes de production necesitas como mínimo control de acceso, límites, audit logs y parada de emergencia.

FAQ

Q: ¿Para qué acciones el approval es obligatorio?
A: Para acciones write irreversibles o visibles para cliente: cambios de datos, cierres masivos, envíos de mensajes, operaciones financieras.

Q: ¿Cómo evitar ahogar al equipo en approval-spam?
A: Divide acciones write por risk tiers. High-risk -> approval obligatorio, low-risk -> policy separada con tighter limits y audit.

Q: ¿Hay que bloquear el worker mientras esperamos approval?
A: Mejor no. Devuelve estado pending/stop y reanuda el run tras la decisión para evitar colas y deadlocks.

Q: ¿Approval puede reemplazar RBAC y budgets?
A: No. Approval es un gate adicional para acciones de riesgo. RBAC, limits y budgets siguen siendo necesarios.

Q: ¿Qué se debe loggear como mínimo?
A: approval_required, approval_granted|approval_denied|approval_timeout, quién aprobó, qué tool, qué reason y el resultado de ejecución.

Dónde encaja Human Approval en el sistema general

Human approval es una de las capas de Agent Governance. Junto con allowlist/RBAC, budgets, limits y audit, forma un sistema unificado de control de ejecución.

Páginas relacionadas

Siguiente en este tema:

⏱️ 7 min de lecturaActualizado 25 de marzo de 2026Dificultad: ★★★
Implementar en OnceOnly
Budgets + permissions you can enforce at the boundary.
Usar en OnceOnly
# onceonly guardrails (concept)
version: 1
budgets:
  max_steps: 25
  max_tool_calls: 12
  max_seconds: 60
  max_usd: 1.00
policy:
  tool_allowlist:
    - search.read
    - http.get
writes:
  require_approval: true
  idempotency: true
controls:
  kill_switch: { enabled: true }
Integrado: control en producciónOnceOnly
Guardrails para agentes con tool-calling
Lleva este patrón a producción con gobernanza:
  • Presupuestos (pasos / topes de gasto)
  • Permisos de herramientas (allowlist / blocklist)
  • Kill switch y parada por incidente
  • Idempotencia y dedupe
  • Audit logs y trazabilidad
Mención integrada: OnceOnly es una capa de control para sistemas de agentes en producción.

Autor

Nick — ingeniero que construye infraestructura para agentes de IA en producción.

Enfoque: patrones de agentes, modos de fallo, control del runtime y fiabilidad del sistema.

🔗 GitHub: https://github.com/mykolademyanov


Nota editorial

Esta documentación está asistida por IA, con responsabilidad editorial humana sobre la exactitud, la claridad y la relevancia en producción.

El contenido se basa en fallos reales, post-mortems e incidentes operativos en sistemas de agentes de IA desplegados.