Capítulo 06 de 10 · 10 min de lectura
El contexto del agente
Un agente empieza cada tarea sin recordar nada. Sabe lo que lee, y lo que lee lo decides tú en dos ficheros y un encargo.
Lo que no lee, no existe
Un agente de código no tiene memoria entre tareas. Cuando arranca, no sabe qué es el proyecto, qué se decidió ayer ni qué reglas sigue el equipo. Lo que sabe en cada momento es exactamente lo que ha leído desde que empezó, y eso cabe en un espacio limitado que se llama contexto.
Esto cambia dónde se guarda el conocimiento de un proyecto. Entre personas, mucho vive en la cabeza de alguien y se transmite preguntando. Con un agente, lo que no está en un fichero que vaya a leer no existe para él, y decidirá por su cuenta, como los once programas del capítulo 1.
Los capítulos anteriores han ido dejando reglas: la spec primero, preguntas antes que código, tests antes que implementación, el identificador en cada test. Este capítulo es sobre dónde viven esas reglas para que el agente las lea sin que nadie se acuerde de repetírselas.
Tres sitios
El contexto de un agente llega por tres caminos, y conviene saber cuál es cuál porque no pesan igual.
Lo que lee siempre. Al arrancar, las herramientas de agente leen por su cuenta un fichero de reglas en la raíz del proyecto. Casi todas leen AGENTS.md; Claude Code lee CLAUDE.md. Es el único sitio del que puedes estar seguro de que se lee en cada tarea, y por eso es donde van las reglas que tienen que cumplirse siempre. El CLAUDE.md de acorta no repite nada: apunta al otro.
Las reglas del proyecto están en @AGENTS.md y el contrato en `specs/`.
Lo que le dices en el encargo. Cada tarea lleva su propia información: qué leer, qué hacer, qué no tocar. Se escribe cada vez, y por eso no es sitio para reglas generales.
Lo que abre por su cuenta. El resto del repositorio. El agente lo lee si el encargo se lo pide o si decide que lo necesita. Las specs, el código vecino, un METODO.md: contexto a demanda. Vale para lo que solo hace falta a veces, y no vale para nada que tenga que pasar siempre, porque no controlas si lo abre.
Lo que cambia una línea
Para medir cuánto pesa cada sitio, repetimos el encargo de una línea del capítulo 1 con dos agentes y cuatro carpetas distintas, de la vacía a la plantilla entera. Monta aquí el AGENTS.md que quieras con las once reglas de la plantilla y mira qué pasó con esa combinación.
# AGENTS.md — cómo se trabaja en este proyecto Este proyecto se desarrolla con especificaciones (SDD) y tests primero (TDD). Estas reglas valen para cualquier agente de código y para cualquier persona. El método completo, con ejemplos, está en `METODO.md`. 1. **La spec es el contrato.** `specs/` dice qué hace el sistema. Léela antes de tocar código. Nada se implementa si no está especificado. 2. **Algo nuevo empieza por preguntas, no por código.** Ante un proyecto nuevo, una funcionalidad nueva o un encargo ambiguo, no escribas código ni spec todavía. Haz como mucho cinco preguntas: solo las que cambien qué se construye, cada una con opciones y con tu recomendación razonada. 3. **Lo que decidas tú, enuméralo.** Todo lo que resuelvas sin preguntar va a una lista en `bitacora/`: la pregunta que nadie hizo, lo que has decidido y dónde está en la spec. Es lo que se revisa. 4. **Criterios comprobables.** Cada comportamiento es un criterio numerado (`ABC-01`) con la forma Dado / Cuando / Entonces, con valores y mensajes de error exactos. La spec dice también lo que queda fuera. 5. **Sin visto bueno no se implementa.** Escrita la spec y la lista de decisiones, párate y pide revisión. 6. **Tests primero.** Al menos un test por criterio, con el identificador escrito tal cual (`ABC-01`) en el nombre del test; si el lenguaje no admite guiones en un nombre, en un comentario justo encima. Ejecútalos y enseña que fallan antes de implementar. Después, lo mínimo para que pasen. El refactor, al final y con todo en verde. 7. **No modifiques un test para que pase.** Si crees que un test o un criterio están mal, párate y dilo. 8. **Si el código contradice la spec, la spec cambia en el mismo cambio**, y se dice en el informe. Una spec desactualizada es un fallo. 9. **Terminado** es toda la suite en verde y el formateador y el linter sin avisos, en todo el repositorio y no solo en lo tocado. Las órdenes exactas están en `specs/001-plan-tecnico.md`. 10. **Dependencias**: solo las del plan técnico. Añadir otra exige cambiar antes esa spec. 11. **Informe al acabar**: ficheros tocados, decisiones y su porqué, desviaciones de cualquier spec y el resultado de la suite.
Esta combinación no la hemos probado con agentes. Las cuatro de arriba, sí: elige una para ver qué pasó.
Qué pasó con esta carpeta Una carpeta vacía. · 2 oct 2026
Codex GPT-6.1-Sol
Escribió el módulo entero, sin preguntar nada.
pi deepseek-v4-pro
Escribió el módulo entero, sin preguntar nada.
Es el experimento del capítulo 1: sin nada que leer, el agente decide todo por su cuenta y se pone a programar.
Qué pasó con esta carpeta Un AGENTS.md con el título y una sola regla, la de preguntar; nada más en la carpeta. · 3 oct 2026
Codex GPT-6.1-Sol
3 preguntas, cada una con su recomendación. Sin código.
Su respuesta, tal como llegó
Antes de escribir código, necesito concretar tres decisiones: 1. **¿Dónde se usará?** Node.js, navegador o ambos. Recomiendo **ambos, con módulos ES (`export`)**, para reutilizarlo sin dependencias. 2. **¿Qué debe devolver al acortar?** Solo un código (`aB3x9Q`) o una URL completa (`https://tu.dominio/aB3x9Q`). Recomiendo **URL completa con una base configurable**, para que el enlace se pueda compartir. 3. **¿Qué ocurre si acortas la misma URL varias veces?** Reutilizar el enlace o generar uno nuevo cada vez. Recomiendo **reutilizarlo**, para evitar duplicados en memoria.
pi deepseek-v4-pro
5 preguntas con opciones y recomendación. Sin código.
Su respuesta, tal como llegó
[herramienta `bash`: ls -la] Antes de escribir código, según la regla del proyecto, tengo que aclarar algunas cosas. Te dejo las preguntas que cambian lo que voy a construir (con mi recomendación): **1. Entorno / sistema de módulos** - a) ESM (`import`/`export`) — Node moderno y navegador - b) CommonJS (`require`/`module.exports`) — Node clásico - c) Universal (doble export) - *Recomendación: (a) ESM, es el estándar actual y funciona sin build.* **2. Interfaz pública (qué funciones expone el módulo)** - a) Mínima: `acortar(url)` + `resolver(código)` - b) Completa: además `eliminar(código)`, `listar()`, `total()` - c) Con alias personalizados: `acortar(url, alias?)` - *Recomendación: (b) + (c): acortar con alias opcional, resolver, eliminar, listar y total. Es lo que hace útil a un acortador real sin complicar mucho.* **3. Cómo se genera el código corto** - a) Contador incremental codificado en base62 (`a`, `b`, …, `z9`) — corto y sin colisiones - b) Hash/aleatorio de longitud fija — códigos impredecibles pero con riesgo de colisión - c) Contador en base36 - *Recomendación: (a) base62 incremental: códigos crecen despacio, cero colisiones y sin dependencias.* **4. Comportamiento con URLs duplicadas** - a) Devolver el mismo código para la misma URL (idempotente) - b) Crear un código nuevo cada vez - *Recomendación: (a), evita duplicados en memoria.* **5. Qué pasa al resolver un código que no existe, y validación de la URL** - a) Resolver desconocido → `null`; URL sin validar (acepta cualquier string) - b) Resolver desconocido → lanza error; validar que sea `http://`/`https://` - c) Resolver desconocido → `null`; validar que sea `http://`/`https://` - *Recomendación: (c): devolver `null` es más cómodo para el consumidor, y validar protocolo evita guardar basura.* ¿Confirmas mis recomendaciones o prefieres cambiar alguna?
Una regla de tres líneas en el fichero que se lee siempre cambia lo primero que hace el agente. No hace falta más para eso.
Qué pasó con esta carpeta La plantilla entera (METODO.md, la skill, los esqueletos) con la regla 2 quitada de AGENTS.md. · 3 oct 2026
Codex GPT-6.1-Sol
No preguntó. Escribió la spec con 10 criterios y una lista de 10 decisiones, y se paró a pedir el visto bueno citando la regla «Sin visto bueno no se implementa». Sin código.
Su respuesta, tal como llegó
Voy a revisar las especificaciones y el método del proyecto, y prepararé la spec y la lista de decisiones para que puedas revisarlas antes de implementar. El repositorio contiene solo las plantillas de especificación. Voy a proponer una API síncrona con `shorten(url)` y `resolve(shortUrl)`, almacenamiento independiente por instancia y validación de URLs HTTP/HTTPS. Registraré estas decisiones para tu revisión. He preparado la propuesta: módulo JavaScript ESM sin dependencias, memoria por instancia, métodos `shorten(url)` y `resolve(shortUrl)`, y validación HTTP/HTTPS. Archivos escritos: - [Especificación de producto](specs/000-especificacion.md) - [Plan técnico](specs/001-plan-tecnico.md) - [Diez criterios de aceptación](specs/002-acortador.md) - [Decisiones y motivos](bitacora/001-decisiones.md) ¿Das el visto bueno para continuar con los tests y la implementación? Me detengo porque el punto 4 de `AGENTS.md` exige revisión previa: «Sin visto bueno no se implementa». Todavía no hay código ni tests ejecutados.
pi deepseek-v4-pro
Leyó también METODO.md y la skill, encontró ahí la instrucción de preguntar e hizo 5 preguntas. Sin código.
Su respuesta, tal como llegó
Voy a explorar el proyecto para entender la estructura y las reglas antes de tocar código. [herramienta `bash`: ls -la && echo "---" && find . -type f -not -path './.git/*' -not -path './node_modules/*' | head -100] [herramienta `read`: /home/claude/Projects/iadev-pi/contexto-sin-regla-2/METODO.md] [herramienta `read`: /home/claude/Projects/iadev-pi/contexto-sin-regla-2/specs/000-especificacion.md] [herramienta `read`: /home/claude/Projects/iadev-pi/contexto-sin-regla-2/specs/001-plan-tecnico.md] [herramienta `read`: /home/claude/Projects/iadev-pi/contexto-sin-regla-2/bitacora/README.md] [herramienta `read`: /home/claude/Projects/iadev-pi/contexto-sin-regla-2/.claude/skills/sdd-tdd/SKILL.md] He revisado el proyecto: está vacío (solo la plantilla SDD/TDD), así que estamos en **Arranque (proyecto nuevo)**. Según `AGENTS.md` y la skill, antes de escribir spec o código te hago como mucho cinco preguntas —solo las que cambian qué se construye— y me paro a esperar tus respuestas. Estas son las cinco, con opciones y mi recomendación: **1. Forma de entrega del módulo** - **a) Librería** (un módulo con funciones/clase que importas y usas: `acortar()`, `resolver()`). ← *Mi recomendación*, porque pediste "un módulo sin dependencias". - b) Servidor HTTP (un mini API con rutas para acortar y redirigir). - c) CLI (comando de terminal). - d) Librería + servidor/CLI encima. **2. Cómo se genera el código corto** - **a) Aleatorio** con longitud y alfabeto configurables (ej. 6 caracteres base62). ← *Mi recomendación*: simple y sin dependencias. - b) Contador incremental en base62 (códigos predecibles pero sin colisiones). - c) Hash de la URL larga (determinista pero con riesgo de colisión y códigos más largos). **3. Duplicados de la URL larga** - **a) Mismo código** para la misma URL (se reutiliza el existente). ← *Mi recomendación*: mejor para cachés y para no llenar el mapa. - b) Código nuevo cada vez que se acorta. **4. Validación de la URL** - **a) Solo `http://` y `https://`**; cualquier otra cosa da error. ← *Mi recomendación*. - b) Aceptar cualquier string (sin validar). - c) Aceptar cualquier string pero normalizarlo (añadir `https://` si falta esquema). **5. Formato del módulo y entorno** - **a) ESM** (`import`/`export`) para Node 18+. ← *Mi recomendación*. - b) CommonJS (`require`/`module.exports`) para máxima compatibilidad. - c) Ambos (doble export). Responde con las letras (p. ej. "1a 2a 3a 4a 5a") o con lo que prefieras, y con eso escribo la spec, las decisiones en `bitacora/` y me paro a pedirte revisión antes de tocar código.
La misma carpeta, dos comportamientos. La instrucción seguía en otros ficheros, y un agente los abrió y el otro no. Lo que tiene que pasar siempre va en el fichero que se lee siempre.
Qué pasó con esta carpeta Los siete ficheros de la plantilla, con las once reglas. · 2 oct 2026
Codex GPT-6.1-Sol
4 preguntas con recomendación. Sin código.
Su respuesta, tal como llegó
Antes de escribir la spec, necesito concretar cuatro decisiones: 1. **¿Dónde se usará?** Node.js, navegador o ambos. Recomiendo **ambos con módulos ES**, para mantenerlo reutilizable y sin dependencias. 2. **¿Qué devuelve al acortar?** Solo un código (`abc123`) o una URL con una base configurable (`https://corto.es/abc123`). Recomiendo **URL completa con base configurable**, y un método para recuperar el enlace original. 3. **¿Qué ocurre al acortar dos veces la misma URL?** Reutilizar el enlace corto o generar otro. Recomiendo **reutilizarlo**, para evitar duplicados en memoria. 4. **¿Qué validación quieres?** Solo URLs absolutas HTTP/HTTPS o cualquier cadena. Recomiendo **HTTP/HTTPS**, rechazando entradas inválidas con un error explícito. Puedes aceptar todas las recomendaciones o cambiar alguna. Después escribiré las specs y la bitácora y pediré tu revisión antes de implementar, como exige la regla 5 de [AGENTS.md](/home/claude/Projects/iadev-codex/plantilla-prueba/AGENTS.md).
pi deepseek-v4-pro
5 preguntas con opciones, y la lista de lo que decidiría él. Sin código.
Su respuesta, tal como llegó
El proyecto está en la plantilla vacía (specs son esqueleto, no hay código). Según `AGENTS.md`, algo nuevo empieza por preguntas, no por código ni por spec. Antes de escribir nada necesito cerrar **cinco decisiones**. El resto lo decido yo por defecto y quedará anotado en `bitacora/`.
**1. Entorno y formato del módulo**
- (a) Node.js, ESM (`export`/`import`) — *recomendado*: estándar moderno, y permite testar con `node:test` sin añadir dependencias.
- (b) Node.js, CommonJS (`require`/`module.exports`).
- (c) Navegador (ESM/IIFE).
**2. Forma de la API**
- (a) Función fábrica `createShortener()` que devuelve `{ shorten, expand }` — *recomendado*: encapsula el estado sin `this` y es trivial de testar.
- (b) Clase `Shortener` con `shorten(url)` y `expand(code)`.
**3. Cómo se generan los códigos**
- (a) Aleatorios, base62, 6 caracteres, con reintento si colisiona — *recomendado*: no revela cuántos enlaces hay.
- (b) Secuenciales (contador codificado en base62).
- (c) Hash de la URL.
**4. Mismo URL acortado dos veces**
- (a) Devuelve el mismo código (deduplicación) — *recomendado*: es lo que la gente espera de un acortador.
- (b) Código nuevo en cada llamada.
**5. Comportamiento ante errores**
- (a) Lanza `Error` con mensaje exacto para entrada inválida; `expand` de un código desconocido devuelve `null` — *recomendado* (los mensajes exactos casan con los criterios "Dado/Cuando/Entonces").
- (b) Todo con excepciones, incluido código no encontrado.
- (c) Todo con valores de retorno (`null`/objeto de resultado), sin excepciones.
**Por defecto, si no me dices lo contrario**, decidiré y anotaré en la bitácora:
- URL válida = `http://` o `https://` con host; se rechazan vacías, con espacios y malformadas (en el `shorten`).
- Alfabeto base62: `0-9 A-Z a-z`; longitud 6.
- **Fuera de esta versión**: persistencia (ya es en memoria, como pediste), caducidad/TTL, alias personalizados, borrado, estadísticas.
Responde con algo como `1a 2a 3a 4a 5a` (o tus variantes) y sigo con la spec y la bitácora. Me paro antes de implementar para tu visto bueno.Es la prueba de la página de la plantilla. Con las once reglas, los dos preguntan y los dos se paran.
Las cuatro carpetas cuentan una historia corta:
- Nada. Los dos escribieron el módulo sin preguntar. Es el capítulo 1.
- Solo la regla 2. Un fichero de tres líneas. Los dos preguntaron antes de escribir nada, uno tres cosas y el otro cinco, y los dos se pararon.
- La plantilla sin la regla 2. Aquí se separan. La instrucción de preguntar seguía en
METODO.mdy en la skill, que son ficheros que el agente abre si quiere. Uno los abrió, encontró la instrucción y preguntó. El otro leyóMETODO.md, no preguntó, escribió la spec con sus decisiones a la vista y se paró a pedir el visto bueno, porque esa regla sí estaba enAGENTS.md. - La plantilla entera. Los dos preguntaron y los dos se pararon.
La tercera carpeta es la que importa. Mismo contenido, dos resultados, y la diferencia no fue el modelo sino qué ficheros decidió abrir cada uno. Lo que tiene que pasar siempre va en el fichero que se lee siempre. Lo demás es contexto a demanda, y a demanda quiere decir a veces.
Qué va en el fichero
El AGENTS.md de acorta tiene diez reglas y 292 palabras. Se lee en diez segundos, y un agente lo lee al principio de cada una de las tareas del proyecto. Lo que hay:
| Regla | De qué va |
|---|---|
| 1, 2 | Las dos del método: la spec es el contrato; tests primero y en rojo |
| 3 | No modificar un test para que pase |
| 4 | Qué es «terminado»: gofmt, go vet y la suite entera en verde |
| 5, 6 | Qué ficheros puede tocar cada fase, y que no se añaden dependencias |
| 7 | Idioma de identificadores, comentarios y textos |
| 8 | Temporales fuera del repo; los commits los hace el orquestador |
| 9 | Qué lleva el informe final |
| 10 | Algo nuevo empieza por preguntas |
Todas cumplen tres condiciones, y son las que sirven para decidir si una línea va aquí:
- Vale para todas las tareas. Nada de una fase concreta. Lo que solo importa en el servidor va en el encargo del servidor.
- Se puede comprobar. «Terminado es
gofmt -l .vacío» se verifica con una orden. «Escribe código limpio» no se verifica con nada, y una regla que no se puede comprobar es un deseo. - Dice dónde están las cosas, no las copia. La spec no está en
AGENTS.md; estáspecs/, y el fichero dice que se lea. Si copias la spec en las reglas tendrás dos versiones y una se quedará vieja.
Qué no va
Lo que se lee siempre tiene un coste siempre. Cada párrafo de AGENTS.md compite por el mismo contexto que la spec y el código, y un fichero largo se lee peor que uno corto. Tres cosas que suelen acabar ahí y no deberían:
- Lo que una herramienta puede imponer. Las normas de formato las impone el formateador; en
AGENTS.mdbasta con exigir que se haya pasado. Una regla de estilo que el formateador ya aplica es ruido. - Lo que cambia con la tarea. Qué ficheros tocar, qué criterios cubrir, qué leer. Eso es el encargo. Si lo metes en las reglas, tendrás que editarlas cada vez.
- Secretos y rutas de tu máquina. Un agente lo copia a donde haga falta sin pensar en ello, y el fichero se sube al repositorio.
Y una cosa que conviene añadir aunque parezca una obviedad: lo que no hay que leer. El encargo del servidor de acorta lo dice así:
De
specs/002-enlaces.mdte basta con saber qué errores devuelve el servicio.
Son ciento y pico líneas que el agente no necesitaba. Decir qué no leer ahorra contexto, y el contexto que no se gasta en lo irrelevante se gasta en la tarea.
El encargo
El tercer sitio, el encargo de cada tarea, tiene en acorta una forma fija. Los seis que recibieron los agentes del paso rojo empiezan igual y tienen las mismas seis partes, en negrita:
- Qué leer antes. Los ficheros, en orden, y qué partes.
- La tarea. Qué hay que hacer, numerado.
- El método. Cómo: tests de tabla, reloj fijo, qué se simula y qué no.
- Los límites. Qué no tocar, qué no hacer, cuándo parar y preguntar.
- Terminado es. La condición de salida, comprobable.
- El informe. Qué tiene que contener la respuesta.
El primero es el que conecta con este capítulo. Este es el del servidor, entero:
Qué leer antes. Trabajas en el repositorio
/home/claude/Projects/acorta. Antes de escribir nada lee, en este orden:AGENTS.md,specs/001-plan-tecnico.mdyspecs/004-api.mdentera. Despecs/002-enlaces.mdte basta con saber qué errores devuelve el servicio. Mira el código que vas a usar:link/link.goyshortener/shortener.go(suServicecumple la interfazServicede tu paquete).
Nada en ese párrafo es una regla general: es el mapa de lectura de una tarea concreta. Con eso, un agente que arranca sin saber nada tiene en un minuto lo mismo que sabría alguien del equipo. El capítulo siguiente recorre una sesión entera con encargos así.
Lo que el fichero no garantiza
Que una regla esté en un fichero que el agente ha leído no significa que se cumpla. El encargo del servidor de acorta decía que leyera el plan técnico, y lo leyó. Aun así, repartió las rutas a mano cuando el plan las asignaba a la biblioteca estándar, y entregó el informe con «desviaciones de la spec: ninguna». La revisión lo explicó así:
El agente solo había leído como contrato la spec de su fase (la 004) y trató el plan técnico como contexto.
Leer no es obedecer. Y en el experimento de arriba, la instrucción estaba en la carpeta y uno de los dos agentes no la abrió. AGENTS.md es la forma de que el agente sepa las reglas. Comprobar que las ha seguido es otro trabajo, y es el del capítulo 8.
Lo que viene
Con las reglas en su sitio, queda ver cómo es una sesión de trabajo entera: tarea a tarea, encargo, rojo confirmado, verde, revisión y commit. El capítulo siguiente repite la de acorta commit a commit.