Cómo escribir ADRs (Architecture Decision Records): plantilla, ejemplos y buenas prácticas
Casi todo equipo con algunos años de historia tiene una decisión que nadie sabe explicar: por qué hay dos colas de mensajes, por qué ese servicio usa otra base de datos, por qué no se usa el ORM en tal módulo. Quien llega tiene dos opciones, y Michael Nygard las describió en 2011 en el artículo que popularizó los ADRs: aceptar la decisión a ciegas (y arriesgarse a sostener algo que ya no tiene sentido) o cambiarla a ciegas (y arriesgarse a romper un requisito que nadie recuerda).
Un Architecture Decision Record (ADR) es la forma más barata de evitar ese dilema: un documento corto, versionado junto al código, que registra una decisión importante, su contexto y sus consecuencias. Esta guía explica qué documentar, propone una plantilla y repasa las prácticas que recomiendan Nygard, Microsoft y la comunidad de adr.github.io.
Qué es exactamente un ADR
La comunidad de adr.github.io usa tres definiciones:
- Decisión arquitectónica (AD): una elección de diseño justificada que responde a un requisito funcional o no funcional arquitectónicamente significativo.
- Requisito arquitectónicamente significativo (ASR): un requisito que tiene un efecto medible en la arquitectura y la calidad del sistema.
- ADR: el registro de una decisión y su justificación. El conjunto de ADRs de un proyecto forma su decision log.
La idea clave es "una decisión por documento". Un ADR no es un documento de diseño, ni una wiki de arquitectura, ni un RFC de veinte páginas.
Qué decisiones merecen un ADR
Nygard propuso documentar las decisiones "arquitectónicamente significativas": las que afectan la estructura, las características no funcionales, las dependencias, las interfaces o las técnicas de construcción. La guía de Azure Well-Architected agrega un criterio práctico: incluir las decisiones que afectan la estructura, los atributos de calidad clave o que son difíciles de revertir.
Ejemplos típicos:
- Elegir la base de datos principal o agregar una segunda.
- Pasar de un monolito a servicios (o volver).
- Adoptar un proveedor de LLM, un framework de agentes o una estrategia RAG.
- Definir cómo se autentican los servicios entre sí.
- Establecer la política de versionado de una API pública.
Ejemplos que normalmente no necesitan un ADR: elegir una librería de fechas, renombrar un módulo o cambiar el linter. La pregunta útil es: "¿alguien dentro de dos años va a necesitar saber por qué hicimos esto?".
La plantilla de Nygard (y qué agregarle)
El formato original tiene cinco partes:
- Título: una frase nominal corta, numerada. Por ejemplo, "ADR 9: LDAP para integración multitenant".
- Contexto: las fuerzas en juego (técnicas, políticas, sociales, del proyecto), descritas de forma neutral.
- Decisión: la respuesta a esas fuerzas, en voz activa: "Vamos a…".
- Estado: propuesta, aceptada, deprecada o reemplazada (superseded).
- Consecuencias: todas, no solo las positivas.
Nygard sugiere que todo el documento ocupe una o dos páginas y que se escriba como una conversación con un desarrollador futuro, con oraciones completas.
La guía de Microsoft suma elementos que en la práctica ayudan mucho: opciones consideradas, trade-offs explícitos y el nivel de confianza de la decisión. Registrar que una decisión se tomó con poca confianza es valioso cuando llega el momento de revisarla.
Una plantilla que combina ambas:
# ADR-0012: Usar PostgreSQL con pgvector para búsqueda semántica
- Estado: Aceptada
- Fecha: 2026-09-28
- Decisores: equipo de plataforma
- Confianza: media
- Reemplaza a: -
- Reemplazada por: -
## Contexto
Necesitamos búsqueda semántica sobre ~2 millones de documentos internos.
Ya operamos PostgreSQL en producción y el equipo tiene experiencia con él.
No tenemos a nadie dedicado a operar una base vectorial separada.
## Opciones consideradas
1. PostgreSQL + pgvector
2. Base de datos vectorial gestionada
3. Motor de búsqueda existente con soporte de vectores
## Decisión
Vamos a usar PostgreSQL con la extensión pgvector en el clúster actual.
## Consecuencias
- (+) Un solo sistema que operar, respaldar y monitorear.
- (+) Transacciones y joins entre vectores y datos de negocio.
- (-) Si el volumen crece un orden de magnitud, puede hacer falta migrar.
- (-) Las búsquedas compiten por recursos con la carga transaccional.
## Cuándo revisar esta decisión
Si superamos 20 millones de documentos o la latencia p95 de búsqueda supera 300 ms.
El contenido del ejemplo es ilustrativo, pero la sección final no es decorativa: definir de antemano qué cambio de contexto justificaría revisar la decisión evita tanto la aceptación ciega como el cambio ciego.
Si preferís no diseñar tu propia plantilla, MADR (Markdown Architectural Decision Records) es una plantilla mantenida por la comunidad de adr.github.io, con variantes completa, mínima y "bare".
Dónde guardarlos y cómo numerarlos
Nygard propuso guardarlos en el repositorio del proyecto, en archivos Markdown numerados de forma secuencial, sin reutilizar números. Una estructura común:
docs/adr/
├── 0001-registrar-decisiones-de-arquitectura.md
├── 0002-monorepo-con-pnpm-workspaces.md
├── 0011-usar-elasticsearch-para-busqueda.md (Reemplazada por 0012)
└── 0012-postgresql-pgvector-busqueda-semantica.md
Tenerlos en el repo tiene ventajas concretas: se revisan en pull requests como cualquier cambio, quedan versionados y están al lado del código que explican. Un buen primer ADR, de hecho, es el que registra la decisión de usar ADRs.
Regla de oro: no editar decisiones aceptadas
La guía de Azure lo dice sin ambigüedad: el registro es un log de solo agregado (append-only). No se editan los ADRs aceptados. Si la decisión cambia, se escribe uno nuevo que reemplaza al anterior y se enlazan entre sí. Nygard proponía lo mismo: el ADR viejo se conserva, marcado como reemplazado, porque sigue siendo relevante saber que esa fue la decisión, aunque ya no lo sea.
Así se preserva la historia del razonamiento: se ve cuándo y por qué cambió el rumbo. Corregir un error de tipeo está bien; reescribir la decisión o su contexto, no.
Cómo integrarlos al flujo de trabajo
Los ADRs fracasan cuando se escriben después, como burocracia. Funcionan cuando son parte del proceso:
- ADR en el mismo PR que implementa la decisión, o en un PR previo con estado "Propuesta" para discutirla antes de escribir código.
- Revisión asíncrona: el PR del ADR es el lugar de la discusión, y los comentarios quedan como registro.
- Checklist en la plantilla de PR: "¿Este cambio introduce una decisión arquitectónica? Si es así, enlazá el ADR".
- Onboarding: leer los ADRs es de las formas más rápidas de entender por qué el sistema es como es.
- Sistemas existentes: la guía de Azure recomienda empezar el registro también en proyectos ya en marcha y reconstruir retroactivamente las decisiones pasadas conocidas.
Errores comunes
- ADRs gigantes. Si tiene diez páginas, es un documento de diseño. Enlazalo desde un ADR corto.
- Solo consecuencias positivas. Un ADR sin costos no es creíble y no ayuda a revisar la decisión después.
- Varias decisiones en un documento. Si una decisión tiene fases (corto, mediano y largo plazo), Microsoft sugiere registrar cada fase como un ADR propio.
- Sin contexto. Una decisión sin justificación pierde su valor, porque nadie puede evaluar si sigue vigente cuando cambian las circunstancias.
- Editar el pasado. Rompe la trazabilidad; para eso existe el estado "Reemplazada".
Qué hacer con esto
- Crear
docs/adr/y escribir el ADR-0001: "Registrar decisiones de arquitectura". - Adoptar una plantilla corta (Nygard, MADR o la del ejemplo) y usarla siempre igual.
- Reconstruir de tres a cinco ADRs de decisiones pasadas que hoy generan preguntas.
- Sumar la pregunta sobre decisiones arquitectónicas a la plantilla de PR.
- Tratar el registro como append-only: reemplazar, nunca reescribir.
¿Qué decisión de tu sistema actual te gustaría que alguien hubiera documentado hace tres años?
Lecturas relacionadas
- Métricas DORA explicadas: las cinco métricas actuales, cómo medirlas y errores comunes: las cinco métricas actuales, cómo calcularlas y cómo usarlas sin convertirlas en metas.
- RAG o fine-tuning: guía para decidir cómo darle conocimiento y comportamiento a un LLM: cuándo conviene RAG, cuándo fine-tuning y cuándo alcanza con prompting o contexto largo.
Fuentes
- Michael Nygard, "Documenting Architecture Decisions" (15/11/2011): https://www.cognitect.com/blog/2011/11/15/documenting-architecture-decisions
- Microsoft Azure Well-Architected Framework, "Maintain an architecture decision record (ADR)" (actualizado el 13/04/2026): https://learn.microsoft.com/en-us/azure/well-architected/architect-role/architecture-decision-record
- adr.github.io, Architectural Decision Records: https://adr.github.io/
- MADR, Markdown Architectural Decision Records: https://adr.github.io/madr/