Sistema interno · resumen técnico
Un sistema que convierte issues de un repositorio en pull requests revisados por una persona, ejecutando cada tarea en un espacio aislado, con límites de concurrencia, turnos y presupuesto, y con la decisión de fusionar siempre en manos de un humano.
Un agente de programación suelto es un becario con mucha confianza: escribe rápido, no sabe cuándo parar, y no tiene idea de lo que cuesta. El orquestador resuelve eso. No es "un bot que programa"; es una fábrica con estaciones, guardarraíles y contabilidad.
La tesis de diseño, copiada de la metodología Symphony y adaptada: gestionar trabajo, no agentes.
git worktree por issue, con hooks de creación y preparación. El clon principal nunca se ensucia.| Pieza | Implementación |
|---|---|
| Lenguaje del orquestador | Bash + Python |
| Planificador | systemd timer, cada 5 min |
| Estado | ficheros por issue + CSV append-only + SQLite derivado |
| Cola | issues con etiqueta; la etiqueta es el lock |
| Concurrencia | tope por repo y global; locks con flock |
| Notificación | bot de Telegram con botones |
| Interfaz de agente | MCP con 13 herramientas |
| Observabilidad | Grafana sobre el SQLite derivado |
No hay demonio. El tick arranca, hace su trabajo y termina. Eso hace cada ejecución idempotente y un crash no deja nada a medias. El precio es la latencia: hasta cinco minutos entre despachar y arrancar.
| Decisión | Por qué |
|---|---|
| Un worktree por issue | Dos agentes en el mismo checkout se pisan el índice de git |
| Reconciliar antes de despachar | El estado remoto es la verdad, no la memoria del orquestador |
| Claim con relectura | No hay CAS en la API de issues; se mitiga la carrera en vez de ignorarla |
| Credenciales fuera del agente | El token del tracker se elimina del entorno del runner; solo el orquestador habla con la API |
| Enrutar por verificabilidad | Si el repo tiene tests y un comando único, un fallo se detecta; si no, el fallo es silencioso y merece un modelo más caro |
| Escalar solo si falló el modelo | Escalar porque faltaba un .env es quemar dinero por un error de entorno |
| Presupuesto como ciudadano de primera | Cuota del motor leída del log, saldo en vivo y horario punta: si el motor lo eligió un humano, espera; si era la ruta por defecto, reencamina |
Antes de decidir si subir de modelo, el sistema clasifica el fallo en modelo, infraestructura
o infraestructura fija (un .env que falta, un workspace que no arranca, un
timeout de red).
"El valor no está en que el agente escriba código. Está en que el sistema sepa cuándo no debe seguir."
| Métrica | Valor |
|---|---|
| Ejecuciones | 259 |
| Periodo | 1 – 23 de octubre |
| Completadas | 86 |
| Fallidas | 100 |
| Continuaciones | 38 |
| Timeout | 18 |
| Canceladas | 13 |
| Coste total | 46,89 USD |
| Coste por ejecución | 0,32 USD |
| Duración media | 463 s |
| Tiempo total de agente | 33,3 h |
| Repos atendidos | 3 |
259 ejecuciones por 47 dólares y un operador. Ese es el titular.
"Construí un sistema que convierte el backlog de un repositorio en pull requests revisables por agentes, sin conducirlos. El humano decide qué se hace y qué se fusiona; el sistema reclama el issue, aísla el trabajo, elige el motor según coste y cuota, valida, abre el PR y avisa por Telegram con botones. En tres semanas: 259 ejecuciones por 47 dólares, un solo operador. Lo importante no es que sea autónomo: es que mide lo que cuesta y distingue cuándo falló el modelo de cuándo falló el entorno."
La respuesta que demuestra seniority: no empezaría por el agente, sino por el registro de estado.
Lo que no cambiaría: el gate humano, la separación de credenciales y el clasificador de fallos.