Sandboxes & promote
Apunte un agente de programación de IA a su base de datos de producción de forma segura — capturado, observado, promovido a través de una compuerta y reversible.
Parte de Agent-Safe Change Control. Los comandos
keon sandboxykeon ledgery la vista de Sandboxes de la consola que se describen aquí están en vivo — se requiere un keon reciente (cli-v0.1.46+).
Kisenon le permite entregar a un agente de programación (Claude Code, Cursor, el suyo propio) una base de datos que puede modificar libremente — sin arriesgar producción. Un sandbox es un fork por ejecución de su rama con una credencial acotada, un registro de acciones en vivo y un paso de promoción del lado del servidor. Esta página cubre el bucle completo: captura → trabajo → promoción → aterrizaje (reversible) → demostración.
Por qué es seguro
Dos garantías, ambas deterministas — ningún LLM se sitúa en la ruta de confianza:
- El agente no puede tocar producción. Se conecta con una credencial
acotada que no es de superusuario a un fork. Nunca posee una credencial capaz
de escribir en
main. La promoción se ejecuta del lado del servidor y solo aplica los cambios que ya pasaron en el sandbox. - Usted ve exactamente lo que hizo. Cada sentencia se atribuye y se transmite a una consola de solo lectura — el SQL real, no un resumen.
El bucle
keon sandbox run \
--migrate "alembic upgrade head" \
--verify "pytest tests/db"
# → green/red verdict + schema diff + a sandbox you can inspect
keon sandbox promote <id> # cp applies the validated changes to mainEl agente mantiene el control del bucle; el límite es lo que lo hace seguro.
Captura duradera
El registro de acciones es la fuente de verdad para la promoción, así que tiene
que estar completo. Cada sandbox lleva un capture_state — ok o lost. Si la
captura se ve comprometida en algún momento, el estado cambia a lost y
permanece ahí: un sandbox perdido no puede promocionar (409 sandbox_capture_lost) y nunca aplica un cambio parcial en silencio. No hay
autorreparación — descártelo y vuelva a ejecutar el trabajo en un sandbox nuevo.
keon sandbox get / list muestran la salud de la captura.
Promoción: autoservicio o con aprobación humana
Cada proyecto elige un promote_mode:
| Modo | Quién hace commit a main |
|---|---|
self (default) | El agente promociona una vez que sus comprobaciones pasan — dentro de sus límites. |
human | El agente propone; un propietario/administrador revisa el diff + el registro de acciones y hace clic en Approve. |
Simulación de radio de impacto
Antes de promocionar, puede pedir a la plataforma que mida lo que haría la promoción — niveles de bloqueo reales, duraciones reales de retención de bloqueos, recuentos de filas reales — en lugar de adivinar a partir del texto de la sentencia:
keon sandbox dry-run <id>La plataforma reproduce el conjunto exacto de sentencias del sandbox contra dos
forks desechables de corta duración del padre — uno en el HEAD actual del padre
(donde se miden bloqueos, duraciones y filas) y otro en el punto de fork del
sandbox (la línea base de divergencia) — y luego destruye ambos. Nunca toca
main, y el agente nunca recibe una credencial a ninguno de los dos forks. La
simulación es consultiva: produce el informe, nunca bloquea una promoción.
También responde a la pregunta que un diff estático no puede: ¿se movió la
realidad bajo el agente? Toda sentencia que da error, o afecta a un número
distinto de filas, en el HEAD del padre respecto a lo que hizo en el punto de
fork se expone como un conflicto — p. ej. un UPDATE ... WHERE id = 2 cuya
fila objetivo se eliminó en main después del fork.
El informe completado lleva:
| Campo | Significado |
|---|---|
statements[].lock_level | El bloqueo más fuerte que la sentencia toma nuevamente en la transacción de promoción (p. ej. AccessExclusiveLock para una reescritura de tabla). |
statements[].lock_wait_est_ms | Tiempo de ejecución medido en el fork de cabeza — el mínimo de cuánto tiempo se retiene el bloqueo en main. |
statements[].rows_measured | Filas afectadas en el fork de cabeza (0 para DDL). |
statements[].divergence | {kind:"error"} o {kind:"row_count"} cuando la sentencia se comporta de forma distinta en HEAD que en el momento del fork. |
rollup.conflicts | Cada divergencia, más un marcador baseline_unavailable si el carril de línea base no pudo ejecutarse — de modo que una compuerta de «sin conflictos» falla cerrada ante una medición degradada. |
rollup.max_lock_level / rollup.duration_ms_total | Fuerza de bloqueo agregada y tiempo total de reproducción. |
capture_advanced / parent_head_lsn | Señales de obsolescencia: el informe es una instantánea, y volver a ejecutarlo es barato. |
Los endpoints son POST /v1/sandboxes/{id}/dry-run (inicia una ejecución
asíncrona, 202) y GET /v1/sandboxes/{id}/dry-run (el registro más reciente).
Una simulación fallida lleva un error_code legible por máquina
(capture_fence_failed, incomplete_capture, fork_failed,
compute_unreachable, replay_infra_failed, timeout). El panel Blast
radius en la página de detalle del sandbox renderiza el mismo informe en la
consola.
Deshacer una promoción
Una promoción es reversible. Antes de que cp aplique las sentencias validadas a
main, ancla el estado exacto de la rama padre previo a la promoción (un LSN).
Un comando revierte la rama a ese ancla:
keon sandbox undo <id> # restore the parent branch to its pre-promote stateLa cadena de conexión del padre no cambia — los clientes se reconectan al mismo
endpoint. Deshacer es una acción de propietario/administrador; las claves
con capacidad de agente se rechazan (403 scope_insufficient), porque un
deshacer descarta todo lo que aterrizó en la rama después del ancla.
keon sandbox get <id> lleva un objeto undo — undoable, restored_lsn,
undone_at, y un blocked_reason cuando no puede ejecutarse
(superseded_by_later_promote, already_undone). Deshacer apunta solo a la
promoción más reciente, y rechaza con 409 (sandbox_not_promoted,
undo_anchor_missing, undo_anchor_invalidated) una vez que el ancla
desaparece. Permanece disponible mientras el ancla sea válida y dentro de su
retención de almacenamiento — no hay una cuenta atrás aparte.
Deshacer restaura por LSN: revierte todo lo posterior al ancla, no solo el cambio promovido — incluidas las escrituras directas y las sesiones de agente posteriores en esa rama. Consulte Errores comunes.
Migraciones emitidas
Cada promoción aterrizada emite una migración SQL up/down determinista — sin LLM, generada a partir del cambio de esquema capturado y validada de ida y vuelta en un fork desechable antes de ofrecerse. Obténgala:
keon sandbox migration <id> --out ./migrations --waitEl artefacto lleva el SQL up y down (files[], cada uno con un role), un
indicador coverage (full o partial), down_fidelity, cualesquiera
uncovered_seqs, un resultado de validation y un sha256. Los estados
terminales son validated, validation_failed, emission_failed y
no_schema_changes. v1 emite sql; GET /v1/sandboxes/{id}/migration (y
.../migration/files/{role}) lo sirven. La emisión se ejecuta después de que la
promoción aterriza y nunca la bloquea ni la revierte — una promoción de solo
datos simplemente informa no_schema_changes.
Ledger firmado
Cada promoción y cada deshacer añade un registro firmado y encadenado por hash a un ledger por proyecto — una atestación verificable sin conexión de lo que cambió. La verificación no necesita red y no confía en Kisenon:
keon ledger list --project <id> # the chain (reports chain_ok)
keon ledger export <id> --out att.json # one attestation document
keon ledger verify att.json # offline; exit 0 iff valid
keon ledger keys --save # pin the signing keys you trustkeon ledger verify comprueba las firmas Ed25519 y la cadena de hash e informa
fallos precisos (signature_invalid, statement_chain_mismatch, seq_gap,
key_untrusted, chain_broken, …); la confianza es de tres estados (trusted
/ untrusted / unverified). Rutas: GET /v1/sandboxes/{id}/ledger, GET /v1/projects/{projectId}/ledger, GET /v1/ledger/keys.
Si cp no tiene una clave de firma configurada, las promociones aún tienen éxito pero quedan sin firmar (
ledger_enabled: false) — la firma no es incondicional.
Qué no es un sandbox
- No es un sandbox de código — acota su base de datos, no el proceso del agente.
- No es un juez LLM — la captura, la reproducción y la revisión son deterministas a nivel de byte.
Pruébelo
Pruébelo en kisenon.com y consulte el inicio rápido.
Agent-Safe Change Control (ASCC)
El sistema que le permite apuntar un agente de IA a una base de datos real de forma segura — acotado, atribuido, revisado, reversible.
Guardrails
Presupuestos, niveles de política, autoridad acotada, análisis de riesgo y comprobaciones de radio de impacto — lo que detiene a un agente antes de que le haga daño.