En resumen:
- CLAUDE.md es un archivo markdown que Claude Code carga automáticamente al inicio de cada sesión. No se ejecuta como una configuración, sino que se inserta en el contexto como texto, por lo que es una sugerencia para el modelo, no una regla estricta.
- El principal error técnico es dividir el archivo en @imports para ahorrar contexto. Las importaciones se cargan completas de inmediato. Solo las reglas con ámbito de ruta (path-scoped rules) en
.claude/rules/realmente ahorran contexto. - La referencia de tamaño es de hasta 200 líneas para el CLAUDE.md del proyecto. No es un límite estricto: la densidad de instrucciones útiles es más importante que el número de líneas.
- Desde la versión 2.1.277, Claude Code también lee AGENTS.md, pero por defecto solo cuando no hay CLAUDE.md en el proyecto. Cursor tiene su propio sistema
.cursor/rules/. - Cuando CLAUDE.md se queda corto: reglas, habilidades (skills), ganchos (hooks) y permisos: qué poner dónde.
- El artículo incluye un ejemplo de trabajo para Spring Boot, errores comunes y una forma sencilla de comprobar si un archivo afecta realmente al resultado.
Contenido
- ¿Qué es CLAUDE.md y para qué sirve?
- ¿Cómo utiliza Claude CLAUDE.md?
- ¿Cómo carga técnicamente Claude Code CLAUDE.md: imports vs. rules vs. compaction
- ¿Qué debe incluir obligatoriamente CLAUDE.md?
- ¿Qué nunca debes escribir en CLAUDE.md?
- Estructura óptima de CLAUDE.md
- Mejores prácticas para escribir CLAUDE.md
- CLAUDE.md vs. rules vs. skills vs. hooks: qué poner dónde
- Ejemplo de un buen CLAUDE.md
- Ejemplo de un mal CLAUDE.md
- CLAUDE.md para Spring Boot
- CLAUDE.md para monorepos
- CLAUDE.md para microservicios
- CLAUDE.md vs. AGENTS.md
- CLAUDE.md vs. Cursor Rules
- CLAUDE.md vs. Codex Instructions
- Errores comunes de los desarrolladores
- Preguntas frecuentes
- Conclusiones
¿Qué es CLAUDE.md y para qué sirve?
CLAUDE.md es un archivo markdown normal que Claude Code carga automáticamente al inicio de cada sesión, proporcionando al modelo lo que se puede llamar una memoria persistente del proyecto: comandos, arquitectura, convenciones, todo aquello que el modelo no puede deducir del código en sí (documentación oficial de Claude Code). Formularía la esencia del archivo de la manera más sencilla posible: CLAUDE.md no hace a Claude más inteligente, sino que evita que Claude olvide.
Esto no es una hipérbole. Personalmente me he encontrado en una situación en la que, durante una semana, tuve que repetir la misma observación sobre el patrón arquitectónico del proyecto en cada sesión, y tan pronto como esa línea se trasladó a CLAUDE.md, la necesidad de repetirla desapareció (una experiencia similar se describe en el análisis de maketocreate.com en el ejemplo de un proyecto Laravel con el patrón "repositorio en lugar de Eloquent en los controladores").
Diferencia con README.md: README está escrito para personas que abren el repositorio por primera vez; es la vitrina del proyecto. CLAUDE.md está escrito para el modelo, que ya "sabe" cómo se ve el código típico y solo necesita aquello que distingue a tu proyecto de las suposiciones predeterminadas.
Diferencia con AGENTS.md: AGENTS.md es un estándar abierto multiplataforma que leen Codex, Cursor, Copilot, Gemini CLI, OpenCode y otros. Claude Code, desde la versión 2.1.277, también lo lee, pero por defecto solo como una opción de respaldo, cuando no hay CLAUDE.md en el proyecto. Detalles y modos en la sección de comparación.
Diferencia con Cursor Rules: Cursor Rules es un formato específico para Cursor (.cursor/rules/*.mdc), con su propio sistema de frontmatter YAML y modos de activación. Es un sistema paralelo, incompatible con CLAUDE.md: si pones CLAUDE.md en un proyecto de Cursor, Cursor simplemente lo ignorará.
¿Cómo utiliza Claude CLAUDE.md?
Claude Code busca CLAUDE.md según la jerarquía de directorios, y el comportamiento depende del nivel:
- Global (
~/.claude/CLAUDE.md) — configuración personal para todos los proyectos en tu máquina. - Raíz del proyecto (
./CLAUDE.mdo./.claude/CLAUDE.md) — el archivo principal, se commitea en git y funciona para todo el equipo. - Local (
./CLAUDE.local.md) — tus notas personales para este proyecto (URL local, cuentas de prueba). Añádelo a.gitignore. - CLAUDE.md anidados en subdirectorios — se cargan solo cuando Claude lee archivos de ese subdirectorio. Un monorepo con 50 módulos no infla el contexto con lo que no es necesario en ese momento.
- Managed policy — un archivo que el administrador distribuye a todas las máquinas de la organización. No es relevante para un desarrollador individual, pero en empresas es importante saber que este nivel existe.
Independientemente de estos archivos, funciona la memoria automática (auto memory) — notas que Claude mantiene por sí mismo en ~/.claude/projects/<proyecto>/memory/MEMORY.md. Al inicio se cargan las primeras 200 líneas o 25 KB. Puedes verlas y editarlas a través de /memory. Tú escribes CLAUDE.md, Claude escribe MEMORY.md.
Todos los archivos encontrados entran juntos en el contexto. Cuando las instrucciones se contradicen, generalmente prevalece la más específica (el proyecto es más fuerte que el archivo global), pero esto no está garantizado: el modelo ve ambas versiones. Por lo tanto, la regla es simple: no dejes contradicciones, y marca explícitamente la excepción en el nivel inferior.
¿Cómo carga técnicamente Claude Code CLAUDE.md: imports vs. rules vs. compaction
Casi todas las guías dicen "mantén el archivo corto", pero no explican qué técnicas de reducción funcionan realmente y cuáles solo lo parecen. La diferencia radica en el mecanismo de carga.
@imports se cargan inmediatamente y en su totalidad. Divide un CLAUDE.md de 500 líneas en cinco importaciones de 100 líneas cada una, y obtendrás archivos más manejables, pero la misma cantidad de contexto. La importación se expande al inicio de la sesión, como si el contenido se hubiera insertado directamente. La anidación es de hasta 5 niveles. Dentro de `código` y bloques de código, @ruta no se procesa, por lo que puedes mencionar la ruta sin importar el archivo.
Las reglas en .claude/rules/*.md se comportan de manera diferente:
| Tipo | Cuándo se carga |
|---|---|
Regla sin paths: | Al inicio, como un CLAUDE.md normal — no ahorra contexto |
Regla con paths: | Solo cuando Claude trabaja con un archivo que coincide con el patrón glob — el único mecanismo que realmente reduce el contexto |
⚠️ Las reglas personales en~/.claude/rules/conpaths:no funcionaron durante mucho tiempo (issue #21858, cerrado en marzo de 2026), y los informes posteriores muestran que el problema reaparece. Las reglas con ámbito de ruta (path-scoped rules) funcionan de manera fiable a nivel de proyecto. Después de los cambios, verifica a través de/memoryque el archivo se cargó correctamente.
Qué sobrevive a /compact:
| Se devuelve inmediatamente | Se devuelve solo al leer los archivos correspondientes |
|---|---|
CLAUDE.md raíz, reglas sin paths:, memoria automática | CLAUDE.md anidados, reglas con paths: |
Conclusión práctica: una instrucción dada solo en el chat puede desaparecer después de la compactación. Si una regla es importante, su lugar está en un archivo.
Los comentarios HTML no cuestan contexto. Los comentarios de bloque <!-- ... --> se eliminan antes de la carga. Útil para notas a colegas: "por qué está esta regla aquí".
Recorte integrado. Desde la v2.1.206, el comando /doctor (alias /checkup) analiza el CLAUDE.md commiteado y sugiere eliminar lo que el modelo puede deducir del código: estructura de carpetas, lista de dependencias, resumen general. Deja los obstáculos, las justificaciones de las decisiones y las convenciones no estándar. También encuentra duplicados entre CLAUDE.md y CLAUDE.local.md y sugiere mover parte de las instrucciones a skills o CLAUDE.md anidados. El criterio "¿se puede deducir esto del código?" es la mejor prueba para cualquier línea.
¿Qué debe incluir obligatoriamente CLAUDE.md?
El mismo criterio: solo aquello que el modelo no deducirá con certeza del código. Estas son las categorías donde, sin una instrucción explícita, a menudo adivina incorrectamente:
- Pila y versiones — especialmente en el período de transición (parte de los módulos en Java 17, parte en 21). De lo contrario, el modelo aplicará la API de una versión más reciente y la compilación fallará.
- Arquitectura — hacia dónde va el nuevo código. Sin esto, la lógica de negocio termina regularmente en el controlador: funciona, pero rompe las capas.
- Reglas de nomenclatura no estándar — por ejemplo, el sufijo
Dtoen lugar deRequest/Response. El modelo conoce los valores predeterminados de Java, pero no tus acuerdos. - Comandos de compilación — literalmente
./gradlew build, no "compila el proyecto". De lo contrario, obtendrásmvn installen un proyecto Gradle. - Pruebas — framework, comando de ejecución, cuándo escribir pruebas. De esto depende si el modelo verifica su propio trabajo antes de decir "listo".
- Restricciones — qué no tocar sin permiso (por ejemplo, migraciones ya aplicadas). Importante: una prohibición textual es una solicitud, no un candado. Para lo crítico, usa permisos y hooks (ver abajo).
- Definición de Hecho (Definition of Done) — las pruebas pasaron, el linter está limpio, la documentación está actualizada. Sin esto, "el código está escrito" y "la tarea está completada" son cosas diferentes.
¿Qué nunca debes escribir en CLAUDE.md?
Detrás de cada punto hay un mecanismo específico de daño, no una cuestión de "gusto":
- Secretos, claves, contraseñas. CLAUDE.md se commitea en git y entra en el contexto de cada sesión. Las claves deben estar en variables de entorno o en un gestor de secretos, y el acceso a
.enves mejor prohibirlo a través de permisos. - Grandes fragmentos de código. Un ejemplo insertado se vuelve obsoleto más rápido que una descripción. Después de una refactorización, el modelo se basará en el ejemplo antiguo, no en el código real. Haz referencia al archivo.
- Documentación de API. Una copia obsoleta es peor que la ausencia: el modelo ofrecerá con confianza un endpoint que ya no existe. El resultado no será un error de compilación, sino un error lógico silencioso.
- Copia de README. README se actualiza en los lanzamientos porque la gente lo mira. La copia en CLAUDE.md se olvida y los archivos divergen.
- Changelog e historial de decisiones. "Antes era Redux, ahora es Zustand": el modelo no distingue el historial de la regla actual, lee todo como si tuviera el mismo valor.
- Instrucciones de un solo uso. "Actualiza la dependencia X" es una tarea para el chat. Olvidada en el archivo, obligará al modelo a repetir o verificar algo ya hecho.
- Cosas obvias. "Escribe código limpio", "añade comentarios" — el modelo ya lo hace. Estas líneas solo diluyen aquellas que realmente afectan el resultado.
Estructura óptima de CLAUDE.md
Según lo que he visto en archivos de producción funcionales y en las recomendaciones de la comunidad, la estructura óptima se ve así:
- Resumen del proyecto
- Arquitectura
- Convenciones de codificación
- Estructura de directorios
- Comandos
- Pruebas
- Seguridad
- Definición de Hecho
- Comportamiento del agente
- Referencias útiles
El orden aquí no es casual: primero, el contexto en el que el modelo debe entender qué tipo de proyecto es (overview, architecture), luego, las reglas para escribir código (conventions, structure), luego, cómo verificar su propio trabajo (commands, testing, security, DoD), y finalmente, las instrucciones de comportamiento y referencias a materiales adicionales.
Mejores prácticas para escribir CLAUDE.md
Mantén el archivo corto. La referencia práctica de Anthropic es de hasta 200 líneas por CLAUDE.md, para el ~/.claude/CLAUDE.md personal, unas pocas docenas. No es un límite estricto: cada línea consume contexto en cada sesión, y cuanto más largo es el archivo, menos consistentemente Claude lo ejecuta. La densidad es más importante que la longitud.
Escribe de forma inequívoca. "Usa exportaciones nombradas, no por defecto" es mejor que "intenta usar exportaciones nombradas".
No dejes contradicciones. La excepción para un módulo debe estar en su CLAUDE.md anidado o en una regla con paths:, no en una segunda regla junto a la primera.
Separa los niveles. Las preferencias personales van en ~/.claude/CLAUDE.md, lo personal para el proyecto va en CLAUDE.local.md, las convenciones del equipo van en el CLAUDE.md del proyecto bajo git.
Mantén solo el estado actual. Sin historial, sin comandos obsoletos. Un archivo que no se ha editado en tres meses en un proyecto activo, casi con certeza miente.
Haz referencia, no copies. Una línea con una referencia vive más que un párrafo copiado.
Añade una regla después de un error repetido. No intentes prever todo. El modelo puso la lógica en el controlador dos veces: es un candidato para CLAUDE.md. Un problema hipotético, no.
Prueba principal: ¿se puede deducir esto del código? Si es así, elimínalo. El comando /doctor utiliza esta misma lógica; aplícala antes de que el archivo crezca a 300 líneas.
Cómo verificar que CLAUDE.md realmente funciona
- Toma 3-5 tareas típicas del proyecto (nuevo endpoint, corrección de error, prueba).
- Ejecútalas con CLAUDE.md y sin él (renombra temporalmente el archivo).
- Compara cuántas correcciones tuviste que hacer manualmente y si se respetaron la arquitectura y las convenciones.
- Las reglas que no cambiaron el resultado, a eliminar.
- Ejecuta periódicamente
/doctor prompt-audit— encuentra contradicciones entre los archivos de instrucciones.
💡 Esto no es una precaución excesiva. Un estudio de ETH Zurich (138 repositorios, 5.694 PR) demostró que los archivos de instrucciones escritos como README empeoran ligeramente el resultado del agente y aumentan el consumo de tokens. Un archivo largo ≠ un archivo útil.
CLAUDE.md vs. rules vs. skills vs. hooks: qué poner dónde
Cuando CLAUDE.md se expande, el problema generalmente no es que sea largo. Simplemente contiene cosas que deberían estar en otro mecanismo:
| Mecanismo | Qué poner ahí | Cuándo se carga |
|---|---|---|
| CLAUDE.md | Pila, arquitectura, comandos, convenciones para todo el proyecto | Siempre, al inicio |
.claude/rules/ | Reglas para archivos y carpetas específicos (migraciones, pruebas, frontend) | Con paths: — solo al trabajar con esos archivos |
Skills (.claude/skills/) | Procedimientos repetitivos: release, nueva migración, revisión de código según checklist | Al inicio solo la descripción, texto completo — cuando se necesita la skill |
Subagents (.claude/agents/) | Roles separados con su propio contexto: revisor, explorador de la base de código | Cuando Claude les delega una tarea |
| Hooks | Lo que debe ocurrir siempre: formato después de una edición, bloqueo de comandos peligrosos | Se ejecutan como código, no dependen del modelo |
Permissions (settings.json) | Prohibiciones estrictas: lectura de .env, git push, acceso a producción | Se verifican antes de la acción |
| Auto memory | Conclusiones de Claude de sesiones anteriores — lo escribe él mismo | Primeras 200 líneas / 25 KB al inicio |
Diferencia clave: CLAUDE.md, rules y skills son texto que el modelo puede violar. Hooks y permissions son deterministas: se activan independientemente de lo que el modelo "decida". Por lo tanto, la regla "nunca hacer push a main" en CLAUDE.md es un deseo, mientras que deny en permissions es una garantía:
// .claude/settings.json
{
"permissions": {
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Bash(git push:*)"
]
}
}
Una regla simple para elegir: si violar la instrucción es una inconveniencia, escríbelo en CLAUDE.md. Si violar la instrucción es un incidente, usa permissions o un hook.