workflow de agentes autónomos

Dejá objetivos grandes corriendo.
Volvé a algo 99% prod-ready.

Un patrón que cualquier builder puede armar: el agente itera con vos, parte las tareas grandes en workspaces aislados, y un agente de E2E corrige sus propios errores hasta cumplir el objetivo. Acá está cómo lo hacemos en 021.

Vos sos el loop

  • Le pedís algo grande, vuelve a medias, le repetís el contexto
  • 2 agentes en paralelo se pisan archivos, ramas y puertos
  • Vos probás a mano, encontrás el bug, se lo explicás, repetís
  • Te quedás de niñera mirando cada paso

El agente es el loop

  • Itera el objetivo con vos, genera el prompt, parte lo grande solo
  • Cada tarea en su clon aislado + su bloque de puertos → nadie se cruza
  • Un agente E2E reproduce, encuentra la causa raíz y se auto-corrige
  • Volvés a capturas, feedback y el qué/por qué de cada fix
El patrón

Cuatro movimientos

No es magia: es estructura. Cada pieza saca una decisión de tus manos y se la da al agente, con barreras para que no rompa nada.

💬
01

Iterar → prompt

El agente charla el objetivo con vos y genera el spec/prompt antes de tocar código.

🧩
02

Partir → workspace

Si la tarea es grande, la divide y crea un workspace aislado por sub-tarea.

🧪
03

Agente E2E

Prueba en el navegador, encuentra bugs, analiza causa raíz y se auto-corrige.

📦
04

Volvés listo

Capturas, feedback y fixes documentados. 99% prod-ready con ajustes menores.

Movimiento 02 · por qué no se pisan

Una feature = un workspace aislado

Cada tarea recibe un clon real de cada repo que toca (no un worktree compartido) y un bloque de puertos propio. Dos agentes corriendo en paralelo nunca comparten archivos, ramas ni puertos — y si uno se manda una macana, solo rompe su tarea.

~/021 — nueva feature
$ task-new checkout-v2 web agents
▸ slot 0 → bloque 21000  (web=21000  agents=21001)
 web        clon aislado · rama checkout-v2 · env ✓
 agents     clon aislado · rama checkout-v2 · env ✓
✓ workspace listo: tasks/checkout-v2/

$ task-start checkout-v2
  web     → http://localhost:21000
  agents  → http://localhost:21001
# otro agente en paralelo arranca en el slot siguiente, sin cruzarse:
slot 0 · feature A
web = 21000 agents = 21001
slot 1 · feature B
web = 21100 agents = 21101
slot 2 · feature C
web = 21200 agents = 21201
barrera anti-accidentes
$ git push origin staging
✗ Push directo a 'staging' BLOQUEADO. Abrí un PR.
# el agente trabaja libre en su rama; lo importante queda protegido

Y arranca solo: escribís feat: … o describís la feature, y el agente infiere nombre + repos, te confirma, y crea el workspace. Cero ceremonia.

La pregunta que más me hicieron

¿Por qué clones y no worktrees?

Arranqué con worktrees. Con un agente andan; con varios autónomos corriendo a la vez empezaron los archivos corruptos y los cruces de rama. El problema de fondo: los worktrees comparten el mismo .git.

Worktrees compartidos

  • Un agente que se manda un gc --prune, reset --hard, branch -D o reescribe historia puede afectar a todos los worktrees
  • Git no deja checkoutear la misma rama en dos worktrees → casos borde feos cuando dos agentes autónomos se cruzan
  • Config y hooks heredados del padre: un agente que los toca afecta a todos
  • Mantenerlo con varios agentes en paralelo = niñera otra vez

Clones reales desde un mirror

  • Mirror bare local → clonar es instantáneo y sin red; cada task queda 100% aislada
  • Archivos, ramas, config y hooks propios: una macana solo rompe su task
  • Hook anti-push (staging/main) instalado por clon, sin ensuciar a los demás
  • Teardown seguro: task-rm aborta si hay cambios sin commitear

Nada de framework pesado — bash + git. Una capa fina de helpers que en un comando: clona del mirror, ramea desde la base, hace el pull/render del env, asigna el bloque de puertos, instala el hook y crea la carpeta de reportes E2E.

Movimiento 03 · el que cierra el loop

El agente de E2E se corrige a sí mismo

No alcanza con reportar bugs. El agente reproduce en el navegador, cruza las trazas y los logs, encuentra la causa raíz (no el síntoma), aplica el fix y vuelve a probar. Repite hasta que sale limpio.

1 · Correrconversación / flujo completo en el navegador (capturas incluidas)
2 · Observartrazas del agente + logs del backend + UI/consola
3 · ¿Bug?visual o de comportamiento, o desvío de lo esperado
SÍ → causa raíz + fix Ubica el porqué real en el código. Fix simple → lo aplica solo. Fix riesgoso (auth, datos, migraciones) → lo propone y espera OK.
racha = 0 (un fix cambia el comportamiento → re-verificar)
NO → limpia Cumple los criterios, sin errores.
racha + 1
🏁 E2E completo = 3 conversaciones limpias seguidas. Cualquier fix resetea la racha — el objetivo no es "pasó una vez", es "pasa consistente".
Lo que más mueve la aguja

El handoff importa más que la verbosidad

¿Qué tan detallado tiene que ser el prompt para que vuelva 99% prod-ready? No es la longitud: es darle al agente forma de verificar sus iteraciones — y un handoff específico en el QUÉ / POR QUÉ / criterios, suelto en el CÓMO. Lo que le doy por frente:

  • 1 · Síntoma observable  — qué se ve mal, reproducible.
  • 2 · Causa raíz verificada  — contra el código, con archivo:línea ← lo más importante; le saca la ambigüedad, no re-descubre.
  • 3 · Dirección del fix + constraints  — "NO montes X", "reutilizá Y" — no línea por línea.
  • 4 · Archivos exactos  — principal + cuáles reusar / no tocar.
  • 5 · Criterios de aceptación testeables  — el guardrail junto al loop de E2E.
  • 6 · Convenciones del repo  — para que el código salga nativo, no trasplantado.
handoff de ejemplo — un frente
## Síntoma
checkout duplica el descuento con 2 cupones

## Causa raíz (verificada)
web/lib/cart.ts:142 — recalcula total
sin limpiar el descuento previo

## Fix + constraints
acumular en una pasada.
NO montes sistema de promos nuevo;
reutilizá applyDiscount()

## Criterios
- 2 cupones → 1 descuento c/u
- test:e2e checkout verde

Y lo grande lo parto en frentes disjuntos — archivos que no se cruzan — para correrlos en paralelo, cada uno con su propio loop de verificación.

Una sesión por frenteGUI de Claude / Codex: cada frente vive en su sesión, con su workspace.
Rotás como tabsvolvés a cada sesión a revisar avances — no a hacer de niñera.
Playwright MCP = ojosel agente ve el navegador de verdad: prueba, captura, se corrige.
Lo que hace que arranque orientado

Mapa para entrar · rastro para volver

Dos carpetas hacen toda la diferencia: una que el agente lee primero para saber cómo es el proyecto, y otra donde deja evidencia de cada prueba que hizo.

toolbox/ — el mapa
toolbox/
  AGENT_CONTEXT.md   qué hace cada repo, cuándo usar cuál
  E2E_TESTING.md     cómo testear (target, loop, reportes)
  ENVIRONMENTS.md    dev / staging / prod
  …docs de orientación…
  scripts/          checks read-only (contexto, env, deploys)
  start.sh          levanta los servicios

toolbox/ = el hub de orientación del proyecto (no es un repo). El agente —Claude, Codex o Cursor— lo lee antes de tocar nada: docs de cómo funciona cada parte, scripts que verifican sin romper ni exponer secretos, y un start. Así cualquier agente arranca con el mismo mapa.

tasks/checkout-v2/ — el rastro
tasks/checkout-v2/
  web/  agents/        clones aislados
  e2e-reports/
    conv-1.md          bug → causa raíz → fix
    conv-2.md          limpia (racha 1/3)
    conv-3.md          limpia (racha 2/3)
    conv-4.md          limpia (racha 3/3) 🏁
    screenshots/
      conv-1/ 01-login.png …
      conv-1/ bug-precio.png
      conv-4/ final.png

Después de cada E2E, por feature, el agente deja un reporte por conversación y capturas de los pasos clave, el bug y el estado final. Volvés y ves qué probó, qué encontró y cómo se corrigió — sin reconstruir nada.

El resultado

Dejás un objetivo grande y volvés a esto

99%

prod-ready de entrada, con ajustes menores tuyos al final.

📸 + 📝

capturas de las pruebas que hizo, feedback, y cómo se auto-corrigió.

varios objetivos en paralelo, cada uno en su workspace, sin cruzarse.

"Dejo objetivos grandes corriendo y cuando vuelvo tengo capturas con las pruebas que hizo, feedback, cómo se autocorrigió, y gran parte del tiempo está 99% prod-ready con ajustes menores."
Armalo en tu proyecto

Se settea una vez, por proyecto

Cada proyecto tiene su stack y su forma de E2E — pero el esqueleto es el mismo. Cuatro piezas:

  • 1 · Instrucciones del repo  — un archivo que el agente lee siempre: cómo trabajar, reglas, cuándo crear una tarea.
  • 2 · Helpers de workspace  — un mirror bare local por repo + comandos para crear/levantar/limpiar tareas aisladas (clon instantáneo, bloque de puertos, hook anti-push).
  • 3 · Disparador automático  — un hook que, ante trabajo nuevo, le recuerda al agente crear la tarea antes de tocar código.
  • 4 · Guía de E2E  — el target, las credenciales de test, y el loop causa-raíz → fix → hasta 3 limpias.
el ciclo, end to end
# 1. describís el objetivo
> feat: rehacer el checkout con cupones

# 2. el agente lo parte y aísla
 tasks/checkout-v2/  (web + agents)

# 3. construye + corre el loop E2E
 conv 1: bug → causa raíz → fix
 conv 2: limpia   (racha 1/3)
 conv 3: limpia   (racha 2/3)
 conv 4: limpia   (racha 3/3)
🏁 E2E completo · 99% prod-ready

Lo importante no son los comandos exactos — es la estructura: aislar para escalar, proteger lo crítico, y hacer que el agente cierre su propio loop de calidad.

clones aislados por tareabloques de puertos auto task-newpush a base bloqueado E2E causa-raíz + auto-fix3 limpias seguidas handoff QUÉ / POR QUÉ / criteriosfrentes disjuntos en paralelo