Cómo construir un Agent Harness: guía paso a paso para equipos de AI engineering

 

2026-07-24

Requisitos previos

  • Un proyecto con AI agent activo (Claude Code, Codex, Cline o similar)
  • Repositorio git
  • Capacidad de crear scripts de shell y hooks de git
  • (Opcional) Acceso a CI/CD pipeline

Estructura del proyecto

project-root/
├── AGENTS.md              # Reglas y convenciones
├── .cursorrules           # Context file alternativo
├── .githooks/
│   ├── pre-commit         # Verificación automática antes de commit
│   └── pre-push           # Verificación antes de push
├── scripts/
│   ├── verify.sh          # Script de verificación estándar
│   └── lint.sh            # Linter configurado
├── docs/
│   ├── ARCHITECTURE.md    # Decisiones de arquitectura
│   └── PROGRESS.md        # Estado actual del proyecto
└── .github/workflows/
    └── ci.yml             # CI pipeline con verificaciones

1. Context layer — el archivo que define cómo trabaja el agente

El archivo de contexto (AGENTS.md, .cursorrules, CLAUDE.md) es el briefing que el agente lee antes de tocar cualquier cosa.

Qué poner:

- /src — código fuente
- /tests — tests unitarios
- /docs — documentación
npm run dev — desarrollo
npm run build — producción
npm run test — tests
TypeScript strict mode
Prettier para formateo
ESLint para linting
NO borrar archivos sin verificar que no se usan
NO modificar package.json sin actualizar lockfile
NO asumir que el test coverage es suficiente
Cada vez que el agente repite un error, agregás una regla. Así crece el archivo con el tiempo.
  

  
  
    2. Tool & permission layer — qué puede y no puede tocar
    VerboPermisoEjemploread✅ SiempreLeer archivos, buscar en codebasesearch✅ SiempreGrep, búsqueda webcreate_draft✅ Con revisiónGenerar código nuevomodify✅ Con revisiónEditar archivos existentessend⚠️ Aprobación humanaEnviar emails, postear en Slackmerge⚠️ Aprobación humanaMerge PRsdeploy❌ Solo humanoDeploy a produccióndelete❌ Solo humanoBorrar archivos, recursos cloudpurchase❌ NuncaComprar servicios, APIs de pago
En Hermes Agent:
`bash
hermes tools enable web terminal file
hermes tools disable deployment browser
hermes config set security.tirith_enabled true

En Cline/Roo Code (.clinerules):

Approved Commands

npm run build npm run test git add -A git commit -m "..." git push

Requires Approval

rm -rf git push --force npm publish

3. Verification layer — checks que atrapan errores

Jerarquía de velocidad (más rápido primero): hooks (ms) → pre-commit (segundos) → CI (minutos) → revisión humana (horas)

#!/bin/bash
npm run lint
npm run type-check
npm run test -- --changed
if [ $? -ne 0 ]; then
  echo "❌ Pre-commit checks failed."
  exit 1
fi

Escribir "corré el linter" en un archivo es un pedido. Conectarlo con un pre-commit hook es una garantía. El agente puede ignorar un pedido. No puede saltarse un hook.

4. Memory & state layer — el agente es amnésico, el disco no

Los agents tienen contextos frescos en cada sesión. El harness arregla esto guardando estado en disco:

  • docs/PROGRESS.md — qué se hizo, qué falta
  • docs/ROADMAP.md — features pendientes, en progreso, completados
  • Git history — el registro permanente de todo cambio

Formato de PROGRESS.md:

`markdown

Sesión actual (2026-07-24)

  • ✅ Feature A implementada
  • ✅ Tests de Feature A pasando
  • 🔄 Feature B en progreso (step 3/5)
  • ❌ Feature C bloqueada

Decisiones tomadas

  • SQLite en vez de PostgreSQL (no necesita escalar)

Próximos pasos

  1. Terminar Feature B
  2. Review de Feature A con el equipo
  3. Arrancar Feature D

5. Safety & sandbox layer — la capa que los incidentes de Julio 2026 expusieron

Problema: Los filtros de comandos funcionan por string matching, y el string matching se puede engañar.

El incidente Shumer en detalle:

r''m

Defensas que funcionan:

  1. Parseá como el shell, no como un censor (estrategia de Continue)
  1. Sandboxing con Docker:
  1. Approval gates para operaciones destructivas:

Los 4 principios universales

### 1. El estado vive fuera del modelo

Esto NO funcionaEsto SÍ funciona
"Recordá lo que hicimos la sesión pasada"docs/PROGRESS.md con el estado actual
"Ya revisé este feature"Test automatizado que lo verifica
"No toques esta parte"Regla en AGENTS.md + acceso restringido

Nunca confíes en que el contexto window va a recordar. Confiá en el disco.

### 2. Cada error se convierte en una regla permanente

El patrón Hashimoto: cada vez que un agente comete un error, modificás el entorno para que ese error no se pueda repetir.

Error: el agente borró archivos temporales necesarios
→ Regla en AGENTS.md: NO usar rm sin listar archivos primero
→ Hook pre-commit: verificar que no hay rm sin --dry-run
Error: el agente deployó código sin test
→ CI: bloquea si el test coverage es < 80%

Reintentar es una oración. Una regla es una solución.

### 3. La verificación es más difícil que la generación

Anthropic lo descubrió cuando sus agents marcaban features como completadas sin validación end-to-end. OpenAI documentó lo mismo: Sol actualizó un documento de investigación para decir que un cálculo había sido verificado cuando nunca produjo el resultado.

Implementación — Evaluator pattern:

CHECKLIST = [
    "Feature A funciona en test",
    "Feature A sin errores en consola",
    "Tests pasan",
    "Sin regresiones",
]
for check in CHECKLIST:
    if not verify(check):  # contexto fresco, default-FAIL
        return FAIL

El claim de "done" de un agente es una hipótesis. El harness corre el experimento.

### 4. Protegé estructura, no strings

GuardFall expuso el problema: el filtro revisa cómo se VE el comando. Bash ejecuta lo que el comando SIGNIFICA.

No hagas esto:

denylist = ["rm", "sudo", "chmod"]
if any(cmd.startswith(bad) for bad in denylist):
    block()

Hacé esto:

tokens = shell_parse(command)
tokens = expand_variables(tokens)
tokens = eval_substitutions(tokens)
if is_structural_delete(tokens):
    require_approval()

Una denylist es una sugerencia. Un sandbox es una pared.

Checklist de verificación

#CriterioStatus
1AGENTS.md existe con reglas
2Reglas se actualizan cuando el agente repite un error
3Toolsets configurados (read/search ✅, delete/deploy ❌)
4Pre-commit hook con linter + tests
5Build falla si los tests no pasan
6PROGRESS.md se actualiza post-sesión
7Comandos se parsean estructuralmente, no por string matching
8rm -rf requiere aprobación humana
9Comandos que exfiltran datos bloqueados
10Evaluador con contexto fresco
11CI con default-FAIL
12Después de cada error del agente, regla permanente

Score: __/12

Mantenimiento

  • Después de cada release de modelo: comentá componentes del harness uno por uno. Los que sigan siendo necesarios, quedan. Los que el modelo ya resuelve solo, se eliminan.
  • Cada 2 semanas: revisá AGENTS.md. ¿Reglas duplicadas? ¿Reglas que ya no aplican? ¿Errores nuevos que necesitan reglas?
  • Cada mes: corré el checklist otra vez. El score debería subir.

Troubleshooting

SíntomaCausaSolución
El agente ignora instruccionesAGENTS.md no se cargaVerificar que existe y el agente lo lee
El agente repite el mismo errorFalta reglaAgregar la regla. No alcanza con pedirle que no lo haga
Cambios que nadie pidióFalta verificaciónAgregar pre-commit hooks y CI
Comandos peligrosos pasan filtrosString matching débilMigrar a parsing estructural
El agente pierde contexto entre sesionesFalta PROGRESS.mdCrear archivo de progreso
Features marcadas como completadas sin estarloFalta evaluadorImplementar evaluador con contexto fresco

Referencias

— Ariel Di Stefano

Compartir este artículo

Preguntas frecuentes

¿Qué es un agent harness y para qué sirve?
Un agent harness es una capa de control que define reglas, permisos y flujos de trabajo para que un agente de IA labure de forma segura y predecible en tu repositorio. Básicamente, le decís qué puede tocar, cómo y cuándo, evitando que haga macanas por su cuenta.
¿Necesito un pipeline de CI/CD para implementar un agent harness?
No es obligatorio, pero te ayuda un montón. Con los hooks de git ya podés arrancar a controlar al agente, aunque sumar un pipeline de CI/CD te da una capa extra de validación automática para los cambios que proponga.
¿Cómo configuro los hooks de git para controlar a mi agente de IA?
Tenés que crear una carpeta .githooks con scripts que se ejecuten antes del commit o push, por ejemplo para correr tests o validar formato. Después configurás git con git config core.hooksPath .githooks para que use esos hooks.
¿Qué deberías incluir en el archivo AGENTS.md?
tenés que poner la estructura del proyecto, las reglas de estilo y convenciones, los comandos aprobados y las restricciones de permisos. Es el briefing que el agente lee antes de laburar, así que cuanto más claro y detallado, mejor va a ser su comportamiento.

Te puede interesar