Chuleta del harness de agente: componentes, archivos, problemas y lista de arranque
El harness de un agente se compone de cinco subsistemas: instrucciones, herramientas, entorno, estado y retroalimentación. El conjunto mínimo de archivos es un AGENTS.md como enrutador corto, un script de comprobación (make check, verify.sh), un archivo de progreso y una lista de funcionalidades con su estado; el estado de terminado lo asigna un script, no el agente.
Cinco subsistemas del harness
| Subsistema | Qué es | Artefactos | Síntoma de avería |
|---|---|---|---|
| Instrucciones | Lo que el agente debe saber del proyecto | AGENTS.md / CLAUDE.md, skills, docs/, ADR | Incumple convenciones conocidas |
| Herramientas | Lo que el agente puede hacer | shell, pruebas, linter, navegador, servidores MCP | «Quiere pero no puede» |
| Entorno | Dónde trabaja el agente | archivos de bloqueo, Docker/devcontainer, git worktree, entorno aislado, init.sh | La sesión empieza reparando el entorno |
| Estado | Lo que sobrevive a un reinicio | PROGRESS.md, DECISIONS.md, feature_list.json, commits | Una sesión nueva no sabe por dónde iba |
| Retroalimentación | Cómo se entera el agente de un error | make check, E2E, hooks, arch-check, evaluador | «Listo», pero no funciona |
Orden para construirlo desde cero: retroalimentación → instrucciones → estado → entorno → herramientas.
Archivos del harness
| Archivo | Finalidad | Regla |
|---|---|---|
| AGENTS.md / CLAUDE.md | Punto de entrada: qué es el proyecto, cómo se ejecuta, cómo se comprueba | Un enrutador corto (unas 80 líneas) con enlaces a documentos con la condición «cuándo leerlo» |
| docs/*.md | Detalles por temas | Se leen cuando hacen falta, no completos |
| .claude/skills/*/SKILL.md | Procedimientos repetibles (despliegue, revisión) | Se cargan cuando la tarea coincide con su descripción |
| PROGRESS.md | Estado, lo hecho, bloqueos, siguientes pasos | Actualizar al final de cada sesión |
| DECISIONS.md | Decisión, motivo, opciones descartadas | Registrar el camino, no solo la conclusión |
| feature_list.json | Funcionalidades: comportamiento, verificación, estado | Exactamente una funcionalidad activa (WIP=1) |
| scripts/verify.sh | Comprueba una funcionalidad y la pasa a passing | El único que asigna passing, con el SHA del commit |
| scripts/arch-check.sh | Límites de la arquitectura | Código de salida 1 + POR QUÉ y CORRECCIÓN en la salida |
| scripts/init.sh | Comprobación del entorno antes de trabajar | Entorno, git limpio, make check en verde, una funcionalidad activa |
| contrato de sprint | Contrato sobre una funcionalidad antes del código | Dentro del alcance / fuera del alcance / preguntas abiertas |
| .claude/settings.json | Permisos y hooks de Claude Code | Comprobaciones en eventos, no en la memoria del agente |
Esqueleto de AGENTS.md
# Proyecto: backend de pagos (FastAPI, PostgreSQL)
## Arrancar
docker compose up -d && ./scripts/init.sh
## Comprobar
make check # lint, tipos, unitarias, arch-check
make e2e # escenarios de extremo a extremo
## Definition of Done
- make check y make e2e — código 0
- funcionalidad pasada a passing por el script scripts/verify.sh
- PROGRESS.md actualizado
## MUST
- consultas a la base solo a través de repositorios
- secretos solo desde variables de entorno
## Documentos
- docs/payments.md — cuando la tarea afecte a pagos y devoluciones
- docs/migrations.md — cuando cambie el esquema de la base
Estados de una funcionalidad
| Estado | Significado | Quién lo cambia |
|---|---|---|
| pending | En cola | Planificador |
| active | En curso (solo una) | Agente al empezar |
| passing | Comprobación superada | Solo verify.sh |
| blocked | Necesita una decisión humana | Agente, con la descripción del motivo |
Niveles de verificación
| Nivel | Qué | Cuándo |
|---|---|---|
| 1 | Lint, tipos | Siempre |
| 2 | Pruebas unitarias y de integración | Siempre |
| 3 | E2E | Cambio que afecta a más de una capa; antes de «listo» |
| 4 | arch-check | Nuevas importaciones entre capas |
El derecho a decir «listo» se gana solo tras superar el nivel más alto. Las pruebas unitarias en verde no equivalen a estar terminado.
Convertir las reglas en mecanismos
| Nivel | Herramienta | Coste |
|---|---|---|
| Guardia grep | Script que busca un patrón e imprime POR QUÉ/CORRECCIÓN | Minutos |
| Regla de linter | import-linter (Python), dependency-cruiser, eslint-plugin-boundaries (JS/TS) | Una hora |
| Prueba de arquitectura | Prueba en CI que falla si se incumplen las capas | Más trabajo, pero visible en make check |
#!/usr/bin/env bash
fail=0
if grep -rn "from app.db" app/services/; then
echo "POR QUÉ: los servicios no acceden directamente a la base de datos"
echo "CORRECCIÓN: use un repositorio de app/repositories/"
fail=1
fi
exit $fail
Problemas habituales y soluciones
| Problema | Subsistema | Solución |
|---|---|---|
| No se cumple una regla de CLAUDE.md | Instrucciones | Acortar el archivo, convertir la regla en una comprobación o un hook |
| El agente no puede ejecutar las pruebas | Herramientas | Permitir el comando, instalar las dependencias en la imagen |
| Comportamiento distinto en cada máquina | Entorno | Archivos de bloqueo, Docker/devcontainer, versiones fijadas del runtime |
| Amnesia entre sesiones | Estado | PROGRESS.md, traspaso de sesión, lectura al empezar |
| Tres funcionalidades empezadas, ninguna terminada | Estado | WIP=1 en feature_list.json |
| «Listo», pero no funciona | Retroalimentación | DoD, E2E, verify.sh, evaluador independiente |
| Las pruebas están en verde, la funcionalidad está rota | Retroalimentación | E2E con base de datos y configuración reales |
| El agente copia malos patrones | Retroalimentación | arch-check desde el primer día |
| No se sabe qué hizo el agente | Estado | Commits pequeños, informe en PROGRESS.md, DECISIONS.md |
| El agente rompió el entorno durante la noche | Entorno | Entorno aislado, git worktree, puntos de control, reversión con init.sh |
| El mismo comentario de revisión dos veces | Harness en general | Convertirlo en una comprobación de make check, quitar el texto de las instrucciones |
Roles para tareas largas
| Rol | Hace | No hace |
|---|---|---|
| Planificador | Funcionalidades con criterios de aceptación | No escribe código |
| Generador | Implementa una funcionalidad, ejecuta las pruebas | No decide si está terminada |
| Evaluador | Veredicto según una lista, con referencia a archivo, línea o registro | No ve el razonamiento del generador |
| Fusión | Hace commit cuando review == pass | Es código, no un agente |
Presupuesto del trabajo autónomo
- El objetivo cabe en una frase (por ejemplo: llevar todas las funcionalidades a passing).
- WIP=1, un límite de tiempo y de intentos por funcionalidad.
- La métrica crece de forma monótona; una regresión implica reversión inmediata.
- Migraciones, infraestructura, dinero: escalado a una persona.
- Tras varias revisiones fallidas, empezar la funcionalidad con un contexto limpio.
Lista de comprobación para arrancar al agente
- Existe un AGENTS.md: pila tecnológica, arranque, comando de comprobación, DoD.
- make check pasa en un clon limpio.
- El entorno es reproducible: archivos de bloqueo, Docker o devcontainer.
- El agente tiene los comandos que necesita; los peligrosos están prohibidos o en un entorno aislado.
- Hay un E2E al menos para el escenario principal.
- Existe un PROGRESS.md y una regla para leerlo al empezar la sesión.
- Las funcionalidades están en una lista con su estado; solo una está activa.
- El estado passing lo asigna un script.
- Los mensajes de comprobación contienen POR QUÉ y CORRECCIÓN.
- La tarea está formulada con criterios de aceptación y límites de alcance.
- Está definido qué requiere una decisión humana.
- Se ha medido la brecha de verificación antes de los cambios, como referencia.
Métricas del harness
| Métrica | Cómo se calcula |
|---|---|
| Brecha de verificación | Proporción de «listo» sin confirmación de una comprobación, sobre 10 tareas |
| MTTR | Tiempo desde la avería hasta recuperar un estado de trabajo |
| Arranque en frío | Si una sesión nueva responde «dónde estamos y qué sigue» sin adivinar |
| Ablación | Caída al desactivar un subsistema sobre un conjunto fijo de tareas |
En resumen
El harness es un circuito, no un archivo: instrucciones, herramientas, entorno, estado y retroalimentación. Empiece por las comprobaciones, mantenga AGENTS.md corto, entregue el estado de terminado a un script y revise el harness con regularidad. Todo ello se ensambla como conjunto en un proyecto de extremo a extremo en el curso de harness engineering.
Preguntas frecuentes
¿En qué se diferencia AGENTS.md de CLAUDE.md?
Por su finalidad son lo mismo: un archivo de instrucciones para el agente. CLAUDE.md lo lee Claude Code, AGENTS.md es un formato común para distintos agentes; en CLAUDE.md basta con referenciar AGENTS.md.
¿Cuántas líneas debe tener AGENTS.md?
No hay un límite fijo, pero el archivo de entrada debe ser corto, en torno a cien líneas, como un índice. Los detalles se trasladan a documentos aparte.
¿Necesito feature_list.json para un proyecto pequeño?
Para cambios puntuales no. Compensa cuando el agente trabaja en varias funcionalidades seguidas o en varias sesiones.
¿Dónde guardo los secretos a los que necesita acceder el agente?
En variables de entorno o en un gestor de secretos, no en archivos de instrucciones ni en el código. Al agente se le da acceso al entorno, no a los valores escritos en el texto.
Este tema se explica a fondo y con práctica en el curso «Harness Engineering: инженерия надёжности AI-агентов».
- Из чего состоит harness AI-агента: инструкции, инструменты, среда, состояние, обратная связь
- Харнес AI-агента с нуля: AGENTS.md, feature_list.json, verify.sh и автономный цикл