Community Edition completa bajo Apache 2.0. Sin telemetría.Ver el código

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.
TERMINAL
CITY_BROKER=1 agents-city seatpython3 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.

TERMINAL
agents-city road invite product > product.invitation.jsonagents-city road connect product research.invitation.json

Lo 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.

TERMINAL
python3 bin/test-security.pypython3 bin/test-cage.pypython3 bin/test-broker.pypython3 bin/test-pairing.py