¿Qué es DESIGN.md para Agentes de Codificación?

Ashley Innocent

Ashley Innocent

21 May 2026

¿Qué es DESIGN.md para Agentes de Codificación?

Apidog para empresas

Despliegue local

SSO & RBAC

Conforme con SOC 2

Explorar Apidog Enterprise

Los agentes de codificación son seguros, rápidos y arquitectónicamente despistados sobre tu base de código hasta que les digas lo contrario. Dale a Claude Code o Codex un ticket vago y felizmente escribirá código que compila, pasa una prueba rápida y viola silenciosamente el límite entre tu capa de dominio y tu capa HTTP. El agente no leyó tus documentos de diseño. Leyó los archivos que pudo ver, hizo coincidir patrones y adivinó. Un archivo DESIGN.md soluciona el problema de las conjeturas al plasmar tu intención arquitectónica en el único lugar donde un agente siempre busca: el propio repositorio.

TL;DR

DESIGN.md es un archivo de repositorio de convención comunitaria que registra la intención arquitectónica, las restricciones y las decisiones de diseño de una base de código en Markdown simple para que los agentes de codificación (Claude Code, Codex, Cursor) generen código que se ajuste al sistema en lugar de ir en su contra. Responde a la pregunta "por qué el código tiene esta forma", mientras que AGENTS.md responde a "cómo construyo y pruebo".

botón

Introducción

Aquí está el modo de fallo que todos los equipos que adoptan agentes de codificación encuentran en una semana. Le pides a un agente que añada un endpoint de reembolso a un servicio de pagos. Devuelve un controlador funcional que llama directamente a la base de datos desde el controlador, ignora el error de la pasarela e inventa un nuevo tipo de moneda porque no notó que ya tenías uno. El diff está limpio. Las pruebas pasan. También está mal de tres maneras que solo un revisor que conoce la arquitectura puede detectar. El agente no es malo codificando; es ciego a las decisiones que viven en tu cabeza, en una página de Notion o en un hilo de Slack de hace ocho meses.

DESIGN.md es la respuesta a la que ha llegado un número creciente de equipos. Es un único archivo Markdown, incluido en la raíz del repositorio, que le dice a cualquier agente los hechos fundamentales sobre tu sistema: las reglas de capas, las invariantes que nunca deben romperse, los patrones que elegiste a propósito y los que rechazaste. No es una especificación de proveedor y no hay un comité que lo posea; es una convención, de la misma manera que ARCHITECTURE.md y CONTRIBUTING.md son convenciones. Pero se empareja naturalmente con los archivos de instrucciones específicos de las herramientas que los agentes ya leen, y para el trabajo de API y backend es uno de los documentos de mayor valor que puedes escribir.

Qué es DESIGN.md realmente

DESIGN.md es un registro de texto plano del porqué tu código tiene la forma que tiene. No lo que hace (eso es el README), no cómo ejecutarlo (eso es AGENTS.md), sino el razonamiento que un ingeniero sénior le explicaría a un nuevo empleado el primer día antes de dejarle tocar algo importante.

Piensa en las conversaciones que no están en ningún archivo. "No llamamos a la pasarela de pago desde el hilo de solicitud; todo pasa por la tabla outbox porque la pasarela se agota por tiempo de espera bajo carga". "El dinero es siempre un recuento entero de unidades menores; prohibimos los flotantes después del incidente de redondeo". "El agregado Account posee las mutaciones de saldo; nada más escribe en el libro mayor". Esas son decisiones de diseño. Son invisibles para un agente que lee el código fuente, porque la fuente muestra el resultado de la decisión, no la decisión o su justificación. Un agente puede ver que Account.debit() existe. No puede ver que deliberadamente lo convertiste en la única ruta de escritura, por lo que alegremente añadirá una segunda.

La convención tiene sus raíces en prácticas más antiguas y bien establecidas. El patrón ARCHITECTURE.md (popularizado por el escrito ampliamente citado de Alex Kladov) argumenta que un repositorio debe contener un mapa de alto nivel de la base de código que explique la estructura y las invariantes sin intentar mantenerse sincronizado línea por línea con el código. Los Registros de Decisiones de Arquitectura (ADR) capturan decisiones individuales y su justificación a lo largo del tiempo. DESIGN.md es lo que obtienes cuando escribes ese tipo de documento para una audiencia que incluye un agente de codificación: conciso, declarativo, orientado a decisiones y ubicado donde el agente realmente lo cargará.

Dos propiedades hacen que funcione. Está en el repositorio, por lo que el agente lo lee con las mismas herramientas que lee el código; no necesitas un plugin o una llamada a la API. Y se trata de la intención, por lo que sigue siendo útil incluso cuando los archivos se mueven. Renombra un paquete y tus capturas de pantalla del README se pudren; la regla "la lógica de dominio nunca importa el framework web" sigue siendo cierta.

DESIGN.md vs AGENTS.md vs CLAUDE.md vs README

Estos archivos se superponen lo suficiente como para confundir a la gente y difieren lo suficiente como para que fusionarlos en uno solo sea un error. La versión corta: README es para la incorporación de humanos, AGENTS.md es el contrato operativo para agentes, CLAUDE.md es el archivo de instrucciones específico de Claude, y DESIGN.md es el razonamiento arquitectónico del que todos se benefician.

AGENTS.md es ahora un formato real y ampliamente adoptado; el proyecto agents.md lo describe como "un formato simple y abierto para guiar a los agentes de codificación", utilizado en decenas de miles de proyectos y gestionado bajo la Agentic AI Foundation de la Linux Foundation. Su función es operativa: pasos de construcción, comandos de prueba, estilo de código, convenciones de commit, lo que le dirías a un nuevo compañero de equipo para que no se atasque. Según la documentación de memoria de Claude Code de Anthropic, CLAUDE.md desempeña el mismo rol de instrucción específicamente para Claude; la documentación incluso recomienda que si ya tienes un AGENTS.md, crees un CLAUDE.md que lo importe con @AGENTS.md para que ambas herramientas lean una única fuente de verdad.

Observa lo que falta en esas descripciones: una profunda justificación arquitectónica. AGENTS.md y CLAUDE.md están diseñados para ser cortos. La documentación de Claude Code recomienda explícitamente mantener CLAUDE.md por debajo de las 200 líneas porque los archivos más largos consumen contexto y reducen la fiabilidad con la que el modelo los sigue. Una explicación arquitectónica real, los límites, las invariantes, las alternativas rechazadas, las reglas del modelo de datos, no cabrán allí sin inflarlo. Por lo tanto, lo referencias en su lugar. DESIGN.md se convierte en el documento profundo; AGENTS.md / CLAUDE.md lo señalan con una sola línea.

Archivo Audiencia Responde a Vida útil / tasa de cambio Longitud
README.md Humanos (usuarios, nuevos colaboradores) Qué es esto, cómo lo inicio Cambia con las características Media
AGENTS.md Cualquier agente de codificación Cómo construir, probar, lintar, hacer commit aquí Cambia con las herramientas Corta (operativa)
CLAUDE.md Claude Code específicamente Igual que AGENTS.md, más reglas específicas de Claude Cambia con las herramientas Corta (menos de ~200 líneas)
DESIGN.md Agentes + ingenieros + revisores Por qué el sistema tiene esta forma; qué nunca debe romperse Cambia con la arquitectura (raramente) Media, densa en decisiones

La relación es complementaria, no competitiva. Una configuración limpia para un entorno Claude + Codex se ve así: README.md para humanos; un AGENTS.md con construcción/prueba/estilo; un CLAUDE.md que es solo @AGENTS.md más dos líneas solo para Claude; y DESIGN.md que contiene la arquitectura, enlazado desde AGENTS.md para que cada agente lo cargue bajo demanda. Sin duplicación, cada archivo tiene un solo trabajo. Si deseas una exploración más profunda de cómo estructurar el contexto de Claude a través de estos archivos, los flujos de trabajo de Claude Code explican el modelo de memoria en la práctica.

Qué incluir en DESIGN.md (con una plantilla)

DESIGN.md debe responder a las preguntas que un agente no puede inferir del código: la forma del sistema, las reglas que no aparecen en ningún archivo individual y las decisiones que tomaste a propósito. Mantenlo declarativo. Cada sección debe leerse como una regla que un revisor haría cumplir, no como un ensayo.

Cubre esto:

Aquí tienes una plantilla completa, escrita para un servicio de API de pagos realista. Cópiala, elimina lo que no se aplique, rellena el resto.

# DESIGN.md: Servicio de API de Pagos

Este archivo registra la intención arquitectónica y las decisiones detrás de ella.
Léelo antes de generar o modificar código. Si un cambio entra en conflicto
con una regla aquí, detente y señálalo en lugar de intentar solucionarlo sin respetar la regla.

## Forma del sistema

En capas, las dependencias apuntan solo hacia adentro:

  http (handlers, DTOs)  ->  app (casos de uso)  ->  domain (entidades,
  invariantes)  <-  infra (db, clientes de pasarela)

- `domain/` no tiene importaciones de `http/`, `app/`, ni de ningún framework.
- `infra/` implementa interfaces declaradas en `domain/` o `app/`.
- `http/` nunca toca la base de datos o la pasarela de pago directamente.
  Llama a un caso de uso en `app/`.

## Invariantes (siempre deben cumplirse)

- Una entrada del libro mayor es inmutable una vez escrita. Las correcciones son nuevas
  entradas compensatorias, nunca actualizaciones o eliminaciones.
- El saldo de la cuenta se deriva de las entradas del libro mayor, no se almacena como un
  campo mutable que el código pueda establecer directamente.
- El dinero es un recuento entero de unidades menores (centavos) más un código de moneda ISO-4217.
  Nunca un flotante. Nunca mezclar monedas en una operación.
- Cada llamada a una pasarela de pago externa es idempotente, identificada por
  `idempotency_key`. Los reintentos no deben realizar un doble cargo.
- Los saldos nunca son negativos a menos que una `OverdraftPolicy` explícita
  lo autorice para esa cuenta.

## Decisiones clave y justificación

- **Patrón Outbox para llamadas a la pasarela.** Los controladores escriben una fila de intención
  en la misma transacción de DB que el cambio de negocio, luego un worker llama
  a la pasarela. Justificación: la pasarela se agota por tiempo de espera bajo carga;
  hacerlo en línea hizo que la latencia de las solicitudes y el manejo de fallos
  no tuvieran un responsable claro. No llamar a la pasarela desde un controlador de solicitud.
- **Única ruta de escritura por agregado.** Solo `Account.post_entry()`
  escribe en el libro mayor. Justificación: una segunda ruta de escritura causó la
  desviación de saldo de Mar-2025. Añadir nuevo comportamiento como métodos en el
  agregado, no como nuevas consultas.
- **Event sourcing solo para el libro mayor.** El resto del sistema es
  CRUD. Justificación: necesitamos una pista de auditoría perfecta para el dinero y
  nada más, y el event sourcing completo era demasiado costoso en otros lugares.

## Alternativas rechazadas (no reintroducir)

- Carga perezosa de ORM a través de agregados; causó N+1s y límites de transacción
  poco claros. Los repositorios devuelven agregados completamente cargados.
- Almacenar el saldo como una columna actualizada in situ; ver incidente de desviación
  de saldo. El saldo siempre se deriva.
- Una biblioteca genérica `Money` obtenida del registro; tenemos nuestra
  propia `domain/money.py`; úsala.
- Webhooks síncronos a comerciantes desde el hilo de solicitud;
  bloquean y fallan silenciosamente. Usar la cola de notificaciones.

## Reglas de datos y dominio

- Todas las marcas de tiempo son UTC, almacenadas como timestamptz, formateadas según RFC 3339
  en el borde. No hay datetimes ingenuos que crucen un límite de función.
- Los IDs son ULIDs generados en la capa de la aplicación, nunca autoincremento de DB.
- No se utiliza el borrado suave. Los registros están activos o se mueven a una
  tabla de archivo mediante un caso de uso explícito.
- Multi-inquilino: cada consulta tiene un alcance definido por `tenant_id`. Un método
  de repositorio sin un alcance de inquilino es un error.

## Fuente de verdad del contrato API

- La especificación OpenAPI 3.1 en `api/openapi.yaml` es autoritaria.
  Los tipos de solicitud/respuesta se generan a partir de ella; no edites manualmente
  los tipos generados en `http/generated/`.
- Endpoints nuevos o modificados: actualiza primero `api/openapi.yaml`, luego
  regenera, luego implementa. La especificación se diseña y revisa en
  Apidog antes de los cambios de código.
- Las respuestas de error siguen RFC 9457 (problem+json). Usa el helper
  `problem()` compartido; no inventes formas de error ad-hoc.

## Dónde va el nuevo código

- Nuevo endpoint: ruta en `http/routes/`, DTO en `http/dto/`, caso
  de uso en `app/usecases/`, lógica de dominio en `domain/`.
- Nueva integración externa: cliente en `infra/clients/`, interfaz
  en `app/ports/`.
- Preocupación transversal (autenticación, logging, idempotencia): middleware en
  `http/middleware/`, nunca en línea en los handlers.

## Fuera de alcance / no tocar

- `http/generated/`: regenerado a partir de OpenAPI, los cambios se pierden.
- `legacy/billing_v1/`: congelado, en migración. No extender.
- `migrations/`: nunca editar una migración aplicada; añadir una nueva.

## En caso de duda

Si un cambio solicitado requiere romper una regla anterior, lo correcto
es indicarlo y proponer la alternativa más pequeña consistente con el diseño,
no eludir la regla en silencio.

Esa última sección importa más de lo que parece. Decirle a un agente qué hacer cuando la solicitud entra en conflicto con el diseño convierte el archivo de documentación pasiva en una barandilla activa. Sin ella, un agente que encuentra una restricción tiende a eludirla y entregar la solución alternativa.

Cómo los agentes de codificación realmente consumen DESIGN.md

Los agentes no tienen un analizador especial para DESIGN.md. Lo consumen de la misma manera que consumen cualquier archivo: leyéndolo con sus herramientas de archivo y tratando el contenido como contexto. Por lo tanto, los mecanismos para que se cargue son importantes, y difieren ligeramente según la herramienta.

El patrón fiable es referenciar DESIGN.md desde el archivo de instrucciones que cada agente ya carga al inicio. Para Claude Code, ese es CLAUDE.md; la documentación de memoria describe una sintaxis de importación @path donde @DESIGN.md expande el archivo en el contexto al inicio de la sesión. Para el ecosistema AGENTS.md, añades una línea en AGENTS.md que lo señala ("Reglas de arquitectura y diseño: ver DESIGN.md; léelo antes de cambios estructurales"). Los agentes que recorren el árbol de directorios recogerán el AGENTS.md más cercano, verán el puntero y extraerán DESIGN.md cuando el trabajo afecte a la arquitectura. De cualquier manera, no estás duplicando contenido; mantienes el archivo operativo corto y permites que el archivo profundo sea profundo.

Tres notas prácticas sobre cómo se comportan estas herramientas:

Primero, el agente trata el archivo como contexto, no como reglas impuestas. La documentación de Claude Code es directa al decir que el contenido de CLAUDE.md es una guía que el modelo intenta seguir, no una restricción estricta. Lo mismo se aplica a cualquier cosa que referencies desde él. Por eso la plantilla formula todo como absolutos comprobables y añade una instrucción explícita de "en caso de duda"; la prosa vaga se ignora bajo presión, las reglas claras se siguen más a menudo.

Segundo, la longitud y la estructura cambian la adhesión. Los encabezados y las viñetas superan a los párrafos porque el modelo escanea la estructura de la misma manera que un lector. Un muro de filosofía arquitectónica de 3 páginas se hojeará; diez invariantes nítidas bajo un encabezado claro se usarán. Escribe para la recuperación, no para la prosa.

Tercero, el archivo cambia la economía de la revisión, no solo la generación. Incluso cuando un agente lo ignora parcialmente, un revisor puede señalar la regla violada y el agente la corrige en un solo turno ("esto rompe la regla de ruta de escritura única en DESIGN.md"). Ese ciclo de retroalimentación, que basa la corrección en la decisión escrita, es donde se obtiene gran parte del valor real. Los equipos que construyen sus propios arneses de agentes se apoyan precisamente en esto; consulta crea tu propio Claude Code para ver cómo ese ciclo se integra en flujos autónomos.

Anti-patrones y cómo evitar que se deteriore

La forma más rápida de hacer que DESIGN.md sea inútil es escribirlo como una página wiki. Un archivo de diseño deteriorado es peor que no tener ninguno, porque tanto los agentes como los humanos confían en él y se desorientan. Evita esto.

Un DESIGN.md saludable es corto, denso, declarativo, tiene un propietario y se revisa por un disparador. Si el tuyo es largo, narrativo y fue tocado por última vez hace un año, los agentes están leyendo ficción.

DESIGN.md para bases de código API y backend

Aquí es donde el archivo demuestra su valía. Los servicios API y backend tienen exactamente el tipo de restricciones invisibles y de alto costo en las que los agentes son peores: límites de contrato, semántica de transacciones, idempotencia, integridad de datos, capas. Nada de esto es obvio desde un solo archivo, y cometer errores envía bugs que llegan a producción y afectan el dinero.

Incluye estos elementos específicos de API en DESIGN.md y la calidad de la salida del agente en los tickets de backend aumentará:

Para el trabajo de backend, el beneficio es concreto: menos violaciones de capas, sin llamadas a la pasarela en línea inesperadas, formas de error y paginación consistentes, y manejadores conformes al contrato porque el agente fue dirigido a la especificación OpenAPI en lugar de adivinar el esquema. El agente deja de inventar y comienza a conformarse. Si deseas que el agente también ejercite la API que acaba de escribir, la combinación de contrato más diseño es lo que permite a las herramientas y agentes probar contra una interfaz conocida; Descarga Apidog te proporciona el espacio de trabajo con diseño primero, la exportación OpenAPI a la que apunta tu DESIGN.md, y un servidor MCP y un depurador de agentes de IA para verificar que los endpoints generados realmente coinciden con el contrato.

Conclusión

Preguntas Frecuentes

¿Es DESIGN.md un estándar oficial como AGENTS.md?

No. AGENTS.md es un formato definido y ampliamente adoptado, ahora gestionado bajo la Agentic AI Foundation de la Linux Foundation. DESIGN.md es una convención comunitaria sin un único propietario o especificación, en la misma familia que ARCHITECTURE.md y los ADR. Trátalo como un patrón útil que adaptas, no como un estándar al que conformarte.

¿Necesito DESIGN.md si ya tengo AGENTS.md o CLAUDE.md?

Si tu arquitectura tiene restricciones no obvias, sí. AGENTS.md y CLAUDE.md están destinados a ser cortos y operativos; la documentación de Claude Code recomienda mantener CLAUDE.md por debajo de unas 200 líneas. Una justificación arquitectónica profunda no cabe allí sin inflarlo y perjudicar la adhesión, por lo que la pones en DESIGN.md y la referencias. Para el archivo operativo en sí, consulta cómo escribir archivos AGENTS.md.

¿En qué se diferencia DESIGN.md de ARCHITECTURE.md?

Principalmente en la intención y la audiencia. ARCHITECTURE.md es la convención más antigua destinada a colaboradores humanos que mapean la base de código. DESIGN.md es la misma idea escrita para una audiencia que incluye un agente de codificación: más declarativa, centrada en decisiones e invariantes, y referenciada explícitamente desde los archivos de instrucción del agente para que se cargue en el contexto. Muchos equipos usan un solo archivo y un solo nombre; los principios son los mismos.

¿Qué tan largo debe ser DESIGN.md?

Lo suficientemente largo para cubrir las decisiones que los agentes siguen equivocando, lo suficientemente corto para que cada línea gane su lugar. La densidad de decisiones supera a la exhaustividad. Si parece un tutorial o reafirma el código, córtalo. Unas dos a cuatro páginas enfocadas de invariantes y justificación superan una narrativa de quince páginas que ningún agente leerá con atención.

¿Cómo hago que el agente realmente lo lea?

Referéncialo desde el archivo que el agente ya carga al inicio. Para Claude Code, impórtalo desde CLAUDE.md con @DESIGN.md. Para el ecosistema AGENTS.md, añade una línea de puntero en AGENTS.md indicando a los agentes que lean DESIGN.md antes de realizar cambios estructurales. No pegues todo el contenido en el archivo corto; referéncialo para que el archivo operativo se mantenga corto.

¿El agente siempre seguirá DESIGN.md?

No, y deberías diseñar teniendo eso en cuenta. Los archivos de instrucciones del agente son contexto que el modelo intenta seguir, no una configuración impuesta. Escribe las reglas como absolutos claros, añade una instrucción explícita de "señala los conflictos, no los evites", y apóyate en el ciclo de revisión; señalar una regla violada en DESIGN.md consigue una corrección rápida y correcta incluso cuando la primera pasada la omitió.

¿DESIGN.md ayuda específicamente con los problemas de contrato de API?

Mucho. Su uso de mayor valor en el backend es establecer que la especificación OpenAPI es autoritaria y nombrar el archivo, para que los agentes se ajusten al contrato en lugar de inventar esquemas o editar a mano tipos generados. Diseñar ese contrato primero en una herramienta como Apidog le da al agente un objetivo inequívoco al que tu DESIGN.md puede apuntar directamente.

¿Dónde debería vivir DESIGN.md en el repositorio?

En la raíz del repositorio, junto a README.md y AGENTS.md, para que los agentes y los humanos lo encuentren sin buscar. En un monorepo, un DESIGN.md raíz para reglas de todo el sistema más uno por paquete para la arquitectura local funciona bien, reflejando cómo los agentes leen el AGENTS.md más cercano en el árbol de directorios.

Practica el diseño de API en Apidog

Descubre una forma más fácil de construir y usar APIs