Árbol de conocimiento
AI
Seguridad ofensiva
Shells
Transferencia de archivos
Estado de un agente
El estado de un agente vive en la aplicación. El modelo recibe una selección de ese estado en cada llamada, toma una decisión y devuelve una respuesta o una tool call. Mientras tanto, el repositorio, la API o el servicio sobre el que trabaja siguen teniendo su propio estado.
El sentido de las flechas importa. Una observación actualiza el registro de la aplicación. Una acción intenta cambiar el entorno. El contexto solo contiene lo que se envía al modelo para la siguiente decisión. Ninguna de las tres capas es una copia garantizada de otra.
Un registro que se pueda usar
Supongamos que un agente comprueba si user_b puede modificar una factura de user_a en una API de prueba. Su registro de trabajo podría ser:
objective: verify-cross-account-write
scope:
origin: https://api.example.test
identities: [user_a, user_b]
allowed_actions: [read, replay, reversible-write]
observations:
- id: obs-014
source: GET /api/invoices/1042 as user_a
value: "owner=user_a; note=before"
observed_at: 2026-10-05T09:12:00Z
evidence: artifacts/requests/obs-014.http
hypotheses:
- id: hyp-003
claim: "user_b can change invoice 1042 despite owning a different account"
based_on: [obs-014]
status: unverified
actions:
- id: act-021
operation: PATCH /api/invoices/1042 as user_b
marker: auth-check-01
result: timeout-unknown
observed_at: 2026-10-05T09:15:00Z
pending:
- read invoice 1042 as user_a and compare its note with obs-014
checkpoint:
step: verify-write-effect
request_log: artifacts/requests/act-021.http
Es un ejemplo de diseño, no un schema obligatorio. Separa lo observado de lo inferido. El log conserva los bytes exactos de la request y obs-014 permite citarla sin copiarla entera. hyp-003 sigue sin verificar hasta que la lectura posterior muestre qué ocurrió. El timeout no puede anotarse como escritura correcta ni como rechazo.
Un path, un ID externo o un hash se guardan literalmente cuando luego habrá que recuperar el mismo recurso. Un resumen puede explicar por qué se probó la factura 1042, pero no sustituye las requests y respuestas. Para tokens, el estado debería guardar una referencia a un almacén controlado, no el valor.
Qué entra en contexto
Para decidir el siguiente paso del ejemplo bastan el objetivo, el alcance de la prueba, la propiedad de la factura, el PATCH sin resultado claro y la verificación pendiente. El log HTTP completo puede quedar fuera si el modelo puede recuperarlo. Tampoco hace falta reenviar todas las requests anteriores.
La selección cambia con la tarea. Después de leer otra vez la factura, la respuesta nueva pasa a ser la evidencia inmediata. El baseline sigue disponible para comparar. Antes de otra request, la aplicación puede recuperar el alcance y las reglas de autorización exactas, además del intercambio HTTP pertinente.
Después de una tool call
El runtime debe registrar qué operación se intentó, sus argumentos, el resultado y cuándo se observó. Un código HTTP aislado no demuestra que una escritura se haya conservado. Una respuesta de error puede indicar que la operación no empezó, falló a medias o terminó pero se perdió la respuesta.
Un timeout después de una acción con efectos es ambiguo. Si el PATCH anterior agota el tiempo de espera, lee la factura como su propietario antes de repetir la escritura. Compara la marca y el valor original, y registra completed, not-applied o unknown. Si la API admite una clave de idempotencia o un ID de operación, consérvalo con la acción.
Datos que caducan
observed_at indica cuándo se vio un dato, no cuánto tiempo seguirá siendo válido. La propiedad de una factura, los permisos, el estado de un job o la respuesta de una API pueden cambiar sin que actúe el agente. Revalida antes de una acción que dependa de ese dato, sobre todo después de una pausa o si otra persona pudo intervenir.
Un checkpoint restaura el paso y las referencias guardadas. Al reanudar, comprueba la factura y el estado de la sesión antes de continuar. El checkpoint no congela el target. Si la marca ya existe o un token ha caducado, la siguiente request cambia.