Capítulo 4 — Protocolo para agentes: construí tu harness
Capítulo 4 — Protocolo para agentes: construí tu harness
Aviso al lector humano: este capítulo no está optimizado para vos. Es un protocolo ejecutable diseñado para que un agente IA lo lea y construya un harness real en el proyecto sobre el que está trabajando. Si sos humano, leé los capítulos 1, 2 y 3 primero. Después podés invocar a tu agente con: “Leé el capítulo 4 del tutorial de harness engineering y construí el harness para este proyecto”.
Aviso al agente IA: lo que sigue es para vos. Es un protocolo paso a paso. Ejecutalo en orden. No saltes pasos. No improvises. El objetivo es que cuando termines, el proyecto donde estás trabajando tenga el harness mínimo viable para que vos o cualquier otro agente pueda trabajar sobre él de forma confiable en futuras sesiones.
0. Pre-requisitos antes de empezar
Antes de ejecutar el protocolo, verificá lo siguiente. Si algo falla, detené el protocolo y pedile aclaración al usuario humano:
[ ] Estás dentro de un repositorio git (existe carpeta .git/)
[ ] Tenés permisos de escritura en el directorio
[ ] El usuario humano te dio autorización explícita para crear archivos en la raíz
[ ] Sabés qué problema concreto está tratando de resolver el usuario con este harness
Si el usuario invocó este protocolo sin contexto, pregúntale una sola vez:
- ¿Qué tipo de proyecto es este? (web app, CLI tool, biblioteca, infra, etc.)
- ¿Qué tarea grande te imaginás delegando a un agente acá? (refactor, agregar features, mantenimiento, etc.)
- ¿Qué agente va a usar este harness principalmente? (Claude Code, Cursor, Goose, Aider, otro)
No avances al protocolo hasta tener esas tres respuestas o tu mejor inferencia documentada.
1. Modelo mental que tenés que usar
Antes de actuar, internalizá estas tres ideas de los capítulos anteriores:
| Idea | Capítulo | Aplicación |
|---|---|---|
Agent = Model + Harness | 2 (Fowler) | Vos sos el modelo. Lo que vas a construir es el harness |
| Feedforward (guías) + Feedback (sensores) | 2 (Fowler) | Cada artefacto que crees debe ser una de las dos cosas |
| Iterar el harness en cada fallo recurrente | 3 (Hashimoto, fase 5) | El primer harness es mínimo viable, no completo |
| Una feature por sesión, estado siempre limpio | 1 (Anthropic) | Si el proyecto será trabajado en sesiones largas, esto es ley |
| Variety reduction | 2 (Fowler / Ashby) | Restringí el espacio de decisión del agente para que un harness chico sea suficiente |
Si en cualquier momento del protocolo dudás de una decisión, releé esta tabla.
2. Protocolo de ejecución en 5 fases
Fase 1: Reconocimiento del proyecto
Fase 2: Diagnóstico de harnessability
Fase 3: Construcción del harness mínimo viable
Fase 4: Verificación y handoff
Fase 5: Setup del steering loop
Ejecutá las fases en orden. No saltes a la fase 3 sin completar 1 y 2.
Fase 1 — Reconocimiento del proyecto
Objetivo: entender qué hay en el repo antes de meter archivos nuevos.
Ejecutá estos comandos y guardá las respuestas internamente:
# 1.1 ¿Qué stack es?
ls -la
cat package.json 2>/dev/null || cat pyproject.toml 2>/dev/null || cat go.mod 2>/dev/null || cat Cargo.toml 2>/dev/null
# 1.2 ¿Cuál es el árbol de carpetas top-level?
ls -la src/ 2>/dev/null
find . -maxdepth 2 -type d -not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/dist/*"
# 1.3 ¿Cómo se ejecuta el proyecto?
cat README.md 2>/dev/null | head -50
cat Makefile 2>/dev/null | head -30
# 1.4 ¿Ya hay harness existente?
ls -la AGENTS.md CLAUDE.md .agent/ .goose/ .cursor/ 2>/dev/null
ls -la .agents/ docs/AGENTS.md docs/CLAUDE.md 2>/dev/null
# 1.5 ¿Hay tests?
find . -path "*/test*" -o -name "*.test.*" -o -name "*_test.go" 2>/dev/null | head -20
# 1.6 Convenciones de commits
git log --oneline -20
Construí un resumen mental con estas 6 dimensiones. Vas a usarlo en la fase 3.
Regla crítica: si encontrás un AGENTS.md o CLAUDE.md existente, NO lo sobreescribas. Leelo entero. Tu trabajo va a ser complementarlo, no reemplazarlo. Si su contenido contradice este protocolo, el archivo existente gana — fue escrito con conocimiento de este proyecto.
Fase 2 — Diagnóstico de harnessability
Objetivo: identificar qué propiedades del proyecto facilitan o dificultan que un agente trabaje bien.
Respondé estas preguntas en tu cabeza, con evidencia del repo:
| Pregunta | Cómo verificarlo | Si no |
|---|---|---|
| ¿Tipado fuerte? | tsconfig.json con strict, mypy, types nativos | Documentá esto como limitación |
| ¿Tests automatizables? | comando reproducible para test | Pedile al usuario priorizar esto |
| ¿Build determinístico? | npm/bun build, cargo build, go build funciona | Documentá comandos manuales |
| ¿Linter / formatter? | .eslintrc, .prettierrc, ruff.toml, gofmt | Sugerí cuál agregar |
| ¿Límites de módulos claros? | Carpetas con responsabilidad obvia | Documentá la convención que veas |
| ¿Hay state externo crítico? | DB, redis, API keys necesarias para correr | Esto va a init.sh |
| ¿Hay archivos peligrosos? | secretos, datos de producción, configs sensibles | Esto va a gooseignore/exclusiones |
Decisión de scope:
- Si al menos 4 de 7 son positivos: el proyecto es harnessable. Construí harness completo (fase 3 entera).
- Si 2 o 3 son positivos: harness mínimo. Solo
AGENTS.md+init.sh+ lista de features. - Si menos de 2: avisale al usuario que el harness va a ayudar pero no resolver. Sugerí mejoras estructurales antes de invertir más en harness.
Fase 3 — Construcción del harness mínimo viable
Objetivo: crear los artefactos concretos que un agente va a leer en cada sesión futura.
Vas a crear hasta 5 archivos, en este orden:
AGENTS.md(feedforward principal).agent/init.sh(feedforward operacional).agent/features.json(sensor + variety reduction).agent/progress.md(memoria persistente).agent/.gitignore(sanitización)
Antes de escribir cada archivo: si ya existe uno equivalente, leelo y mergeá en lugar de sobreescribir.
3.1 — AGENTS.md en la raíz del repo
Este es el archivo más importante. Lo va a leer cada agente en cada sesión. Sea conciso. Idealmente < 200 líneas.
Usá esta plantilla como base. Reemplazá los placeholders entre <<< >>> con info real del proyecto recogida en fase 1:
# AGENTS.md
> Archivo de referencia para agentes IA que trabajan en este repositorio.
> Última actualización: <<<YYYY-MM-DD>>>
## Qué es este proyecto
<<<UNA FRASE: qué problema resuelve, no detalles técnicos>>>
Stack: <<<lenguaje principal>>>, <<<framework>>>, <<<DB / infra crítica>>>
## Cómo levantar el entorno
```bash
bash .agent/init.sh
Si el script falla, los pasos manuales son:
- <<<comando 1>>>
- <<<comando 2>>>
Convenciones que NO podés violar
- <<<Convención 1 — ej: imports relativos no permitidos>>>
- <<<Convención 2 — ej: nada de
anyen TypeScript>>> - <<<Convención 3 — ej: tests con Vitest, no Jest>>>
Estructura
src/<<<dir1>>>/: <<<qué hay acá>>>src/<<<dir2>>>/: <<<qué hay acá>>>tests/: <<>>
Comandos críticos
| Tarea | Comando |
|---|---|
| Tests | <<<comando test>>> |
| Lint | <<<comando lint>>> |
| Build | <<<comando build>>> |
| Dev server | <<<comando dev>>> |
Reglas de operación
- Trabajá una feature por sesión. Si la tarea es grande, dividila.
- Antes de declarar terminado: corré tests, corré lint, corré build.
- Nunca modifiques ni elimines tests existentes para “hacerlos pasar”.
- Si una decisión de diseño es ambigua: parate y preguntá al humano.
- Después de cada cambio significativo, actualizá
.agent/progress.md.
Errores recurrentes a evitar
<<<Lista que crece con el tiempo — empezá vacía o con 1 ejemplo del repo>>>
- (Cuando un agente meta la pata por segunda vez del mismo modo, agregá la regla acá.)
Qué NO hacer
- No commitees archivos en
.env*,secrets/,.aws/. - No corras migraciones de DB sin permiso explícito.
- No instales dependencias nuevas sin discutirlo.
- <<<Otra regla específica del proyecto>>>
Referencias
- Tutorial de harness engineering: https://siemprelisto.cl/tecnologias/harness-engineering/00-indice/
**Reglas críticas para llenar la plantilla**:
- Si no sabés algo, **escribí `TODO:` en lugar de inventar**.
- La sección "Errores recurrentes" empieza vacía. Solo el humano debe agregar reglas verificadas en producción.
- "Convenciones que NO podés violar" debe ser corta. Si tenés más de 5, eligí las 5 más críticas.
- Nada de prosa. El archivo es para que un agente lo lea rápido en cada turno.
#### 3.2 — `.agent/init.sh`
Script de bootstrap. Debe ser **idempotente** (correrlo dos veces no debe romper nada).
```bash
#!/bin/bash
set -e
echo "🪿 Inicializando entorno del proyecto..."
# 1. Validar pre-requisitos
command -v <<<BINARIO CRÍTICO ej: node, bun, python>>> >/dev/null || {
echo "ERROR: falta <<<binario>>>"
exit 1
}
# 2. Instalar dependencias si cambió package.json (u equivalente)
if [ ! -d "node_modules" ] || [ package.json -nt node_modules/.package-lock.json ] 2>/dev/null; then
echo "Instalando dependencias..."
<<<comando install>>>
fi
# 3. Variables de entorno
if [ ! -f ".env" ] && [ -f ".env.example" ]; then
echo "ADVERTENCIA: copiá .env.example a .env y completá los valores"
fi
# 4. Verificar que el proyecto compila
echo "Verificando build..."
<<<comando build o type check>>>
# 5. Correr tests rápidos
echo "Corriendo tests..."
<<<comando test rápido>>>
echo "✅ Entorno listo."
echo "Comandos disponibles:"
echo " <<<comando dev>>> - servidor de desarrollo"
echo " <<<comando test>>> - tests"
echo " <<<comando build>>> - build de producción"
Hacelo ejecutable: chmod +x .agent/init.sh.
Reglas:
- Si el comando de build o test toma > 60s, omitilo del init y dejá una nota.
- Si el proyecto necesita Docker/DB externos, detectalos pero no los levantes automáticamente. Pedile al humano que los inicie.
- No metas secretos en init.sh.
3.3 — .agent/features.json
Lista estructurada de features con estado. Solo crealo si el proyecto va a tener trabajo planificable en módulos. Si es mantenimiento ad-hoc, saltealo y dejá una nota en progress.md.
{
"schema_version": 1,
"project": "<<<nombre del proyecto>>>",
"updated": "<<<YYYY-MM-DD>>>",
"features": [
{
"id": "f001",
"category": "functional",
"description": "<<<Descripción de una feature concreta a implementar>>>",
"acceptance_criteria": [
"<<<paso 1 verificable>>>",
"<<<paso 2 verificable>>>"
],
"passes": false,
"notes": ""
}
]
}
Reglas de uso del agente:
- Solo podés cambiar
passesdefalseatruecuando todos losacceptance_criteriapasan verificación manual o automática. - Nunca eliminés una feature existente. Si querés deprecarla, agregá
"status": "deprecated", no la borrés. - Nunca modifiqués
acceptance_criteriade features que ya existen. Si necesitan cambio, pedile al humano. - Si necesitás agregar features nuevas, hacelo en commit separado del trabajo de implementación.
3.4 — .agent/progress.md
Log cronológico de sesiones. Cada agente que trabaje en el proyecto va a leerlo al inicio y agregarle una entrada al final.
# Progress log
Log cronológico de sesiones de agentes IA sobre este proyecto.
Las entradas más recientes van al final.
---
## Sesión inicial — <<<YYYY-MM-DD>>>
**Agente**: <<<tu identidad: Claude Code, Cursor, etc.>>>
**Tarea**: Bootstrap del harness siguiendo el protocolo del capítulo 4 de harness engineering.
**Hecho**:
- Creé AGENTS.md con convenciones detectadas en el repo.
- Creé .agent/init.sh con setup del entorno.
- Creé este progress.md.
- <<<Otras cosas según el caso>>>
**Pendiente / TODO**:
- El humano debe revisar AGENTS.md y completar los `TODO:` que dejé.
- <<<otros pendientes>>>
**Decisiones de diseño**:
- <<<Si hubo una decisión no obvia, anotala con un párrafo de razonamiento>>>
**Próximos pasos sugeridos**:
- <<<qué haría el siguiente agente>>>
---
Reglas:
- Una entrada por sesión.
- Nunca borrés entradas anteriores. Son memoria histórica.
- Si una decisión vieja resulta equivocada, en tu entrada nueva explicá por qué y qué hacés distinto. No edites la entrada vieja.
- Mantené las entradas chicas: 10-30 líneas máximo. Lo importante es el qué y el por qué, no el cómo.
3.5 — .agent/.gitignore
# Archivos temporales del agente que no deben commitearse
*.tmp
*.local
scratch/
Pequeño y prudente.
Fase 4 — Verificación y handoff
Antes de declarar el trabajo terminado, ejecutá esta checklist:
[ ] AGENTS.md existe en la raíz y tiene contenido relevante (no solo placeholders)
[ ] `bash .agent/init.sh` corre sin errores
[ ] `.agent/progress.md` tiene tu entrada de sesión inicial
[ ] No commiteaste secretos ni archivos sensibles
[ ] El árbol del repo se ve así (mínimo):
AGENTS.md
.agent/
init.sh (executable)
progress.md
.gitignore
[features.json si lo creaste]
[ ] git status muestra solo los archivos que esperás
[ ] git diff de archivos pre-existentes (si los hay) está justificado
Si cualquier ítem falla, no entregues el trabajo. Arreglalo o pedile ayuda al humano.
Handoff al usuario humano: cuando termines, respondele al humano con exactamente este formato:
✅ Harness mínimo viable creado.
ARCHIVOS NUEVOS:
- AGENTS.md
- .agent/init.sh
- .agent/progress.md
- [otros]
PARA REVISAR ANTES DE COMMITTEAR:
- AGENTS.md contiene <N> `TODO:` que necesitan tu input.
- init.sh: revisá que los comandos sean los correctos para tu workflow.
- [otros puntos]
PRÓXIMOS PASOS:
1. Completá los TODO en AGENTS.md.
2. Probá `bash .agent/init.sh` desde una shell limpia.
3. Si funciona, commit + push.
4. En la próxima sesión, el siguiente agente va a leer estos archivos automáticamente.
PREGUNTAS QUE TE HAGO AHORA (opcional):
- [Si encontraste ambigüedades durante el proceso, listalas acá]
No hagas commit vos mismo a menos que el humano te lo pida explícitamente.
Fase 5 — Setup del steering loop
El harness recién creado no es final. Es el punto de partida. El humano debe entender cómo iterarlo.
Agregá esta sección al final del AGENTS.md si aún no existe:
## Cómo iterar este harness
Cuando un agente cometa el mismo error dos veces:
1. Identificá el error concreto (no abstracto).
2. Agregá una regla en "Errores recurrentes a evitar" o "Convenciones".
3. Si necesita verificación automática, creá un script en `.agent/checks/` y referenciálo desde AGENTS.md.
4. La próxima sesión, el agente lee la regla nueva y no debería repetir el error.
Si un agente recibe instrucciones contradictorias entre este archivo y otro:
- Este archivo (`AGENTS.md`) gana.
- Si hay un README.md con instrucciones distintas, pedíle al humano que defina la fuente única de verdad.
3. Apéndice A — Decisiones rápidas
Matriz de “si X, entonces Y” para casos comunes que se van a presentar durante el protocolo:
| Situación | Acción |
|---|---|
| El repo no tiene README | Crealo simple antes de seguir, con la info que recolectaste en fase 1 |
| Hay varias subcarpetas con proyectos distintos (monorepo) | Creá un AGENTS.md en cada subcarpeta + uno en la raíz que apunte a ellos |
| El stack es desconocido o exótico | Pedíle al humano que te describa cómo se ejecuta antes de inventar comandos |
| Hay tests pero todos fallan | Documentá el hecho en AGENTS.md, no los toques |
| Las convenciones son inconsistentes en el código | Documentá las convenciones del código más nuevo, no las del más viejo |
| El humano no contesta tus preguntas iniciales | Construí el harness con TODO: honestos y entregá. No inventes |
| Ya hay un AGENTS.md y dice cosas contrarias a este protocolo | El archivo existente gana. Avisá al humano de las divergencias |
| El proyecto es < 100 líneas de código total | El harness es overkill. Sugerí no crearlo y guardar la energía |
| El humano dice “hacé todo, no me preguntes” | Igual creá los TODOs. Decisiones específicas requieren contexto humano |
4. Apéndice B — Anti-patterns que NO debés cometer
Estos son los errores típicos de agentes ejecutando este protocolo. Evitalos:
❌ Sobre-construir el harness en la primera pasada
Si creaste más de 5 archivos, te excediste. El harness crece con la fricción real, no con tu imaginación.
❌ Llenar AGENTS.md con prosa generada
Los agentes leen el archivo en cada turno. Cada token cuesta. Tablas > listas > párrafos.
❌ Inventar convenciones que no están en el código
Si el código existe y vos no entendés su convención: documentá lo que ves, no lo que “debería ser”. Hashimoto cap 3: el agente carece de memoria organizacional. No inventes la cultura del equipo.
❌ Crear features.json con features inventadas
Si el humano no te pasó una lista de features a implementar, no las inventes. Dejá el archivo vacío o no lo crees.
❌ Marcar features como passes: true sin verificar
Cada true es una mentira si no verificaste con un comando concreto. Mejor false honesto que true aspiracional.
❌ Modificar archivos existentes “por estética”
El protocolo te autoriza a crear archivos. No te autoriza a refactorizar el código del repo. Si ves algo feo, no lo toques.
❌ Hacer commit sin permiso
Aún si la tarea es “creá el harness y commiteá”, confirmá una vez más antes del commit con un resumen de qué vas a committear.
❌ Asumir un agente específico
No escribas el harness asumiendo que solo Claude Code va a usarlo. Mantenelo agent-agnostic salvo que el humano te haya dicho lo contrario.
5. Apéndice C — Cómo saber que el harness sirve
El harness es bueno si en la próxima sesión un agente distinto al que lo creó puede:
1. Leer AGENTS.md (< 30 segundos de tu contexto)
2. Ejecutar bash .agent/init.sh y tener el entorno listo
3. Leer progress.md y entender qué pasó antes
4. Tomar una tarea pequeña y completarla sin pedirle al humano que le explique
convenciones básicas
Si esos 4 pasos no se cumplen, el harness está incompleto. Volvé al protocolo, fase 2.
6. Cierre
Cuando termines de ejecutar este protocolo:
- El usuario humano debería tener un harness que ahorra entre 5 y 30 minutos por sesión futura.
- El proyecto debería ser harnessable para cualquier agente, no solo el que lo construyó.
- El archivo más importante (
AGENTS.md) debería poder leerse en menos de 2 minutos.
Recordá: el harness emerge desde la práctica, no desde la teoría. Lo que creaste hoy es el punto de partida. Cuando el humano vuelva con “el agente cometió X error otra vez”, la respuesta correcta es: “Agregá la regla en AGENTS.md”, no “reescribí el modelo”. Esa es la lección del capítulo 3 y la diferencia entre equipos que dominan agentes y equipos que sufren con ellos.
Lecturas que asumo conoces
- Capítulo 1 — Harnesses para agentes de larga duración — fuente de
features.json,progress.md,init.sh. - Capítulo 2 — El marco de ingeniería — fuente del vocabulario feedforward/feedback, harnessability, ley de Ashby.
- Capítulo 3 — El viaje de Mitchell Hashimoto — fuente de las prácticas vivas: AGENTS.md, iteración, slam dunks.
Si no leíste los capítulos anteriores, primero leelos. Después volvé acá y ejecutá el protocolo.