Harnesses efectivos para agentes de larga duración

Por: Artiko
agentesclaudearquitecturalong-runningharnessanthropic

Harnesses efectivos para agentes de larga duración

Basado en el artículo de ingeniería de Anthropic: Effective Harnesses for Long-Running Agents por Justin Young (noviembre 2025).


El problema fundamental

Los agentes de IA operan en sesiones discretas sin memoria entre ellas. Cada vez que un agente inicia, parte de cero — sin recordar qué hizo en la sesión anterior, qué archivos modificó, qué falló o qué quedó pendiente.

Es como tener un equipo de ingenieros que trabaja por turnos pero ninguno le deja notas al siguiente. El turno nuevo no sabe en qué estado quedó el sistema, qué decisiones se tomaron, ni qué queda por hacer.

Para tareas cortas esto no importa. Pero cuando una tarea requiere horas o días de trabajo — implementar 200+ features, auditar un codebase entero, migrar una base de datos — la falta de continuidad entre sesiones se convierte en el obstáculo principal.


Patrones de fallo comunes

Antes de la solución, conviene entender por qué fallan los agentes sin harness:

Sobre-ambición al inicio

El agente intenta implementar todo de una vez. A mitad de la implementación, agota el context window. El resultado: código a medio terminar, sin tests, sin commit. La siguiente sesión no sabe que el trabajo comenzó.

Victoria prematura

El agente implementa algunas features, ve progreso, y declara la tarea completada. No tiene forma de saber cuánto falta ni si lo que implementó realmente funciona.

Entorno desconocido

Sin instrucciones explícitas, cada sesión nueva tiene que redescubrir cómo iniciar el servidor, qué scripts existen, qué convenciones sigue el proyecto. Esto consume contexto y tiempo antes de poder hacer trabajo real.

Regresiones silenciosas

Al implementar feature B, el agente rompe feature A. Sin un mecanismo de tracking, no hay forma de detectarlo hasta que alguien lo prueba manualmente.


La solución: arquitectura de dos agentes

La investigación de Anthropic Engineering propone separar la responsabilidad en dos agentes especializados:

flowchart LR
    A[Agente\nInicializador] -->|"crea infraestructura\nen sesión inicial"| B[Harness]
    B --> C[feature-list.json]
    B --> D[claude-progress.txt]
    B --> E[init.sh]
    B --> F[Git con commits]
    G[Agente\nCodificador] -->|"lee harness\nen cada sesión"| B
    G -->|"una feature\npor sesión"| H[Código producción-ready]

Agente Inicializador

Se ejecuta una sola vez al inicio del proyecto. Su trabajo es construir toda la infraestructura de soporte que el agente codificador usará en cada sesión posterior:

La calidad de este trabajo inicial determina qué tan efectivas serán todas las sesiones posteriores.

Agente Codificador

Se ejecuta en cada sesión de trabajo. Su protocolo de inicio es siempre el mismo:

  1. Verificar ubicación con pwd
  2. Leer git log para entender qué se hizo en sesiones previas
  3. Leer claude-progress.txt para contexto adicional
  4. Leer feature-list.json para seleccionar la siguiente tarea
  5. Ejecutar init.sh para levantar el entorno
  6. Correr tests básicos de extremo a extremo
  7. Implementar una sola feature
  8. Hacer commit con mensaje descriptivo
  9. Actualizar claude-progress.txt

Componentes del harness en detalle

feature-list.json

El archivo de features es el corazón del harness. Contiene una descripción estructurada de cada característica del sistema, con pasos de verificación y estado actual:

[
  {
    "category": "functional",
    "description": "El botón 'Nueva conversación' crea una sesión limpia",
    "steps": [
      "Navegar a la interfaz principal",
      "Hacer click en el botón 'Nueva conversación'",
      "Verificar que se creó una nueva conversación",
      "Comprobar que el área de chat muestra estado de bienvenida",
      "Verificar que la conversación aparece en el sidebar"
    ],
    "passes": false
  },
  {
    "category": "visual",
    "description": "Los mensajes del usuario se alinean a la derecha con fondo azul",
    "steps": [
      "Enviar un mensaje cualquiera",
      "Verificar alineación derecha del bubble",
      "Verificar color de fondo #3B82F6",
      "Verificar que el texto es legible (contraste suficiente)"
    ],
    "passes": true
  }
]

Regla crítica: el agente nunca puede eliminar ni modificar tests existentes. Solo puede cambiar passes de false a true cuando implementa correctamente la feature. Remover tests equivale a ignorar funcionalidad rota.

El formato JSON es preferible a Markdown para este archivo: el agente tiene menos tendencia a modificar campos inadecuadamente con JSON que con Markdown.

claude-progress.txt

Archivo de log donde el agente documenta su trabajo en cada sesión:

[2026-04-28 14:32] Sesión 1
- Implementé feature: botón nueva conversación (functional/01)
- El sidebar no actualizaba en tiempo real — usé useEffect con dependencia en conversations
- Problema: el botón no visible en mobile < 380px → agregué breakpoint adicional
- Siguiente: implementar historial de conversaciones

[2026-04-28 17:15] Sesión 2
- Intenté implementar feature de búsqueda — bloqueado por falta de endpoint
- Salté a features visuales: alineación de mensajes (visual/03, visual/04, visual/05)
- Todas pasan tests
- Pendiente: revisar contraste en modo oscuro

Este archivo sirve como memoria persistente entre sesiones. La nueva sesión no recuerda qué hizo la anterior, pero puede leer este archivo y reconstruir el estado del trabajo.

init.sh

Script que el agente ejecuta al inicio de cada sesión para levantar el entorno:

#!/bin/bash
set -e

# Instalar dependencias si hay cambios
if [ package.json -nt node_modules/.package-lock.json ] 2>/dev/null; then
  npm install
fi

# Variables de entorno de desarrollo
export NODE_ENV=development
export API_URL=http://localhost:3001

# Iniciar backend en background
npm run start:api &
API_PID=$!

# Esperar a que el backend esté listo
until curl -s http://localhost:3001/health > /dev/null 2>&1; do
  sleep 1
done

# Iniciar frontend
npm run dev &

echo "Entorno listo. API PID: $API_PID"
echo "Frontend: http://localhost:5173"
echo "API: http://localhost:3001"

Sin este script, cada sesión consume tokens descubriendo cómo levantar el entorno. Con él, el agente puede ejecutar bash init.sh y estar listo en segundos.


Testing con automatización de navegador

Un harness efectivo no solo trackea features — también verifica que funcionan. La investigación de Anthropic muestra que usar Puppeteer MCP (automatización de navegador) mejora significativamente la detección de bugs visuales que no serían detectables solo con código.

El agente codificador debe:

  1. Levantar el servidor con init.sh
  2. Usar Puppeteer para navegar la UI como lo haría un usuario
  3. Verificar cada step de la feature que está implementando
  4. Hacer screenshot si algo se ve incorrecto
  5. Corregir antes de declarar la feature como passes: true

Limitación conocida: los agentes no pueden ver diálogos nativos del navegador (alert, confirm, prompt). Las features que dependen de estos diálogos son difíciles de verificar automáticamente.


Anti-patterns y sus soluciones

ProblemaSin harnessCon harness
Contexto agotado a mitad de implementaciónCódigo a medias, sin commitFeature definida atomicamente — o completa o no se empieza
Victoria prematuraEl agente cree que terminóLee feature-list.json: hay 180 features con passes: false
Entorno desconocido30% del contexto en redescubrimientobash init.sh — listo en 5 segundos
Regresiones silenciosasNadie lo sabe hasta QARe-run de todos los tests en git log
Pérdida de decisiones de diseñoLa siguiente sesión hace lo mismo diferenteclaude-progress.txt documenta el razonamiento

Principios de diseño del harness

Una feature por sesión

El agente elige una sola feature de la lista, la implementa completamente, la verifica, la commitea, y actualiza la lista. Esto garantiza:

Estado producción-ready al terminar

Antes de cerrar la sesión, el agente verifica que el código compila, los tests pasan, y el servidor inicia correctamente. No deja trabajo a medias. La siguiente sesión siempre parte de un estado estable.

Git como fuente de verdad

El historial de Git es la memoria más confiable. El agente lee git log --oneline -20 al inicio de cada sesión para entender el estado reciente del proyecto. Los mensajes de commit deben ser descriptivos:

feat: implementar botón nueva conversación con actualización de sidebar en tiempo real
fix: corregir alineación de mensajes en viewports < 380px
test: verificar historial de conversaciones con 50+ items (paginación)

JSON > Markdown para estado

Para archivos que el agente modifica frecuentemente (como la feature list), JSON es más seguro que Markdown. El modelo tiene menor tendencia a reformatear, reordenar o editar contenido colateral en JSON estructurado.


Extensiones de la arquitectura

La investigación sugiere varias evoluciones del patrón básico:

Multi-agente especializado

En lugar de un único agente codificador, múltiples agentes con roles distintos:

flowchart TD
    H[Harness] --> A[Agente\nImplementador]
    H --> B[Agente\nQA]
    H --> C[Agente\nRevisor de código]
    A -->|"feature implementada"| H
    B -->|"tests pasando"| H
    C -->|"código aprobado"| H

Generalización a otros dominios

El patrón harness no es exclusivo del desarrollo de software. La misma arquitectura aplica a:


Implementación mínima viable

Para empezar con harnesses en tu propio proyecto:

mi-proyecto/
├── .agent/
│   ├── feature-list.json     # Lista de features con passes: bool
│   ├── claude-progress.txt   # Log de sesiones
│   └── init.sh               # Script de setup del entorno
├── src/
└── ...

System prompt del agente codificador (estructura base):

Eres un agente de implementación incremental. Al inicio de cada sesión:

1. Ejecuta: pwd
2. Ejecuta: git log --oneline -10
3. Lee: .agent/claude-progress.txt
4. Lee: .agent/feature-list.json
5. Ejecuta: bash .agent/init.sh
6. Selecciona UNA feature con passes: false
7. Impleméntala completamente
8. Verifica que funciona (usa browser automation si está disponible)
9. Cambia passes a true en feature-list.json
10. Haz commit con mensaje descriptivo
11. Actualiza claude-progress.txt con lo que hiciste y cualquier decisión de diseño

Reglas:
- Trabaja en una sola feature por sesión
- Nunca elimines ni modifiques tests existentes
- El código debe compilar y los tests deben pasar antes de cerrar
- Deja el entorno en estado producción-ready

Conclusión

Los agentes de larga duración fallan no por falta de capacidad sino por falta de infraestructura. Un harness efectivo resuelve los tres problemas fundamentales:

  1. Continuidad: git log + progress file reemplazan la memoria entre sesiones
  2. Scope: feature list garantiza trabajo incremental y medible
  3. Entorno: init.sh elimina el redescubrimiento en cada sesión

El insight clave de la investigación de Anthropic: las prácticas de ingeniería humana son el modelo correcto para agentes de larga duración. Los turnos de guardia en ingeniería tienen handoff notes, runbooks, y listas de incidentes. Los agentes necesitan exactamente lo mismo.


Fuente: Effective Harnesses for Long-Running Agents — Anthropic Engineering Blog, Justin Young, noviembre 2025.