# Humano en el circuito para agentes de IA — approve, confirm y ask son primitivas del lenguaje

> Una compuerta que espera a una persona de verdad — en la terminal, o encolada detrás de enlaces de un solo uso cuando el programa corre como servidor — y que deniega cuando no hay nadie. Un agente no puede falsificar una aprobación.

Published 2026-09-02 · https://synsema.org/es/blog/human-in-the-loop-approve-confirm-ask


Todos los frameworks de agentes tienen su historia de humano en el circuito: casi siempre un
callback que cableás vos y del que esperás que pase por todos los caminos. En Synsema la compuerta es
una sentencia del lenguaje, así que quien decide de dónde puede venir la respuesta es el runtime, no
tu disciplina.

## Cuatro palabras

```synsema
approve "Deploy to production?"                         -- yes/no gate
confirm "Send this email to 500 customers?"             -- confirmation
let env be ask "Which environment?" with ["staging", "prod"]
show plan as "What the agent is about to do"            -- preview for the human

let ok be approve "Refund " + text(amount) + " to " + customer + "?" within 1h
when not ok
    give nothing
```

`within` acota la espera (`s`, `m`, `h`, `d`). Al vencer, la compuerta devuelve `false` y lo dice una
vez. Nunca se cuelga para siempre.

## De dónde viene la respuesta

- **Una terminal.** Aparece la pregunta y el programa espera `y`/`n`.
- **Sin terminal** — un pipe, CI, un agente manejando el programa: la compuerta **deniega al
  instante**, con un aviso que le dice a un agente de IA que tiene que aprobar una persona. No hay
  variable de entorno que apruebe sola.
- **Bajo `serve`.** La compuerta se encola; el pedido queda bloqueado hasta que alguien responde o
  hasta que vence y deniega. La consola imprime un token de un solo uso y el comando listo para
  usar; `GET /approvals` lista lo pendiente y `POST /approvals/{id}` responde. Con
  `SYNSEMA_HUMAN_WEBHOOK` cada compuerta además avisa en tu canal con enlaces firmados de sí/no que
  podés tocar desde el teléfono.

## Por qué una primitiva y no un callback

Porque la propiedad que querés es negativa: *no existe ningún camino* donde la salida del propio
modelo cuente como consentimiento. Con un callback eso es cierto hasta que alguien se olvida. Con
una sentencia que implementa el intérprete, es cierto por construcción — igual que un `fetch` a un
host no declarado se rechaza antes de que salga un solo byte.

Así aprueba Lampson el paso peligroso de una tarea programada desde tu teléfono, y así el agente de
tickets de soporte de la [portada](/) no reembolsa nada sin una persona.

**Miralo correr:** la [página de interacción humana](https://synsema.dev/es/0.6.x/62-human) de la
documentación tiene todas las opciones, y en [try.synsema.org](https://try.synsema.org) podés
escribir la compuerta y ver cómo te deniega en el navegador.

