Reducir el alcance de una inyección, sin fingir que desaparece.
Agents City mantiene yolo para que un comité pueda trabajar, pero estrecha lo que un agente de repo puede leer, escribir y autorizar. La seguridad se reparte entre el kernel, las credenciales, el bus y el protocolo del asiento.
Capas de control
- 01
Jaula de repo en macOS
Claude, OpenCode y Kimi pueden arrancar bajo un perfil seatbelt generado: escritura denegada por defecto, permitida en el repo y cachés necesarias, y credenciales selladas al final. Codex usa su sandbox workspace-write nativo para evitar dos capas incompatibles.
- 02
Broker de credenciales
Con CITY_BROKER=1 un agente pide push o PR a un proceso externo. El token es por ventana, ligado a un repo, el branch por defecto siempre se rechaza y nunca se permite force push.
- 03
Cadena de auditoría
Cada petición servida o rechazada enlaza el hash de la anterior. El vocabulario separa control aplicado, atribución, desconocido, ambiguo y no soportado. Unknown nunca autoriza.
- 04
Contención de rutas
La jaula y el broker resuelven rutas reales, incluso con symlinks o hojas inexistentes, y rechazan repos dentro de almacenes sellados.
- 05
Admisión de carretera
Un grafo ordenado comprueba dirección, carretera, remitente y payload. El primer bloqueo decide y devuelve un motivo estable sin filtrar la allowlist.
- 06
Primitivo de pairing
El código fuente prueba un código corto con TTL, límite de pendientes y aprobación opaca, pero la beta operativa todavía no lo conecta al router ni al CLI de carreteras. Hoy el alta remota usa invitaciones públicas en ambos sentidos.
- 07
Texto no confiable
Cada mensaje entrante se envuelve en un límite aleatorio y se desactivan tokens de roles de chat. Es defensa en profundidad, no una promesa de obediencia del modelo.
Controles de la jaula
La jaula nunca cubre el asiento. El asiento no es yolo y conserva la decisión frente al exterior.
CITY_CAGE=0desactiva la jaula; Codex cambia a dangerFullAccess.CITY_CAGE_DENY=a:bsella rutas adicionales, por ejemplo ~/.npmrc.CITY_CAGE_ALLOW_WRITE=a:bañade raíces de escritura para toolchains especiales.CITY_BROKER=1arranca el broker opt-in para PR y push.$CITY_BROKER=1 agents-city seat$python3 plugin/scripts/broker.py call pr --title "Add X" --body "Why"Carreteras remotas
El relay opcional autentica un prefijo de owner mediante una credencial emitida por su operador, acepta sólo sobres road de seat a seat y puede encolar mensajes directos offline hasta 72 horas. road invite no genera ni comparte esa credencial.
$agents-city road invite product > product.invitation.json$agents-city road connect product research.invitation.jsonLo que no resuelve
La inyección de prompt sigue existiendo; las capas reducen su valor y alcance.
La red saliente permanece abierta. Un agente todavía puede exfiltrar lo que ya ve dentro de su propio repo.
Todos los procesos corren como tu usuario del sistema. La jaula no es aislamiento de proceso hostil.
En Linux sin sandbox-exec no existe la capa seatbelt. Usa usuarios, contenedores o VM para código no fiable.
Credenciales del llavero pueden funcionar por IPC aunque el fichero esté sellado; protege ramas y usa el broker.
Verificar las invariantes
El repositorio convierte cada fallo pasado en una prueba transversal: secretos sellados, orden del perfil, unknown sin autoridad, diagnósticos redactados y asiento fuera de la jaula.
$python3 bin/test-security.py$python3 bin/test-cage.py$python3 bin/test-broker.py$python3 bin/test-pairing.py