ADR 0011 — Reglas de arquitectura en `.codarch.yml`
This content is not available in your language yet.
Development
Estado: aceptado ✅ · Fecha: 2026-10-20
Contexto
Sección titulada «Contexto»El diff ya responde a qué cambió. Falta responder a si el cambio rompe una decisión de arquitectura. Esa política no pertenece al snapshot: el mismo commit debe poder evaluarse contra la política del repositorio y contra una política más estricta en una release.
Decisión
Sección titulada «Decisión»- Configuración en
.codarch.yml, junto al código.codarch diffla carga por defecto si existe;--config <file>permite otra y--no-configla desactiva.analyzeno la lee. - Tres tipos de regla en M2:
forbidden(una capa no puede depender de otra),threshold(métrica por fichero fuera de rango) ycycles(componentes cíclicos). No hay DSL ni plugins. - Capas por glob, primera coincidencia. Cada capa tiene
patterns(opaths) relativos al root. Si un fichero coincide con varias, gana la primera capa declarada; si no coincide con ninguna, no tiene capa y no participa en reglas de capas. - Severidad explícita, por defecto
error.info,warnyerrorsolo cambian la política: el reporte muestra todas, pero--fail-on violationssolo bloquea las introducidas con severidaderror. Así conviven una política de aviso y una de bloqueo sin duplicar reglas. - Solo lo introducido bloquea. Se evalúan base y head; una violación con la misma clave en
ambos lados es deuda existente.
introduced,existingyresolvedse publican por separado. La clave es estable: regla + arista, regla + fichero, o regla + conjunto de ids del ciclo. - Umbral por fichero, no por carpeta. Un fichero nuevo que nace por encima del máximo es una violación introducida; un fichero que ya estaba por encima no bloquea por el simple hecho de seguir ahí.
- Sin hallazgos inventados. Si una métrica no existe, el umbral no se evalúa. Si un import no
resuelve, no se crea una arista. Si no hay configuración,
rules.configuredesfalsey el reporte no contiene violaciones. - El reporte sigue siendo determinista. Violaciones ordenadas por clave, sin timestamps. La configuración no se copia al snapshot.
Consecuencias
Sección titulada «Consecuencias»- La misma pareja de snapshots puede evaluarse contra dos configuraciones y compararse.
- El bot de PR puede publicar avisos sin bloquear, y reservar
errorpara lo que el equipo decidió que es innegociable. - Las reglas de capas solo ven aristas internas resueltas; no opinan sobre imports externos.
- No hay supresiones por línea ni baseline separado: la deuda existente se reconoce por comparación
con base. Si se necesita un
ignoreexplícito, se añadirá con una clave y una justificación. - El parser YAML es estricto con la forma, pero tolera claves desconocidas para no romper configuraciones futuras.
thresholdno agrega por carpeta ni por capa todavía; eso requiere decidir el nivel de agregación y llegará con una lente propia.
Alternativas descartadas
Sección titulada «Alternativas descartadas»- Reglas dentro del snapshot. Rompe la separación entre “cómo es” y “cómo debería ser”, y obliga a regenerar snapshots al cambiar la política.
- Solo aristas prohibidas. No cubre complejidad ni ciclos, que son la mitad de la cuña.
- Bloquear cualquier violación, incluidas las existentes. Un repo con deuda previa no podría mergear nunca; el PR debe pagar solo lo que añade.
- Un lenguaje de consultas propio. Demasiado pronto; tres tipos de regla cubren el caso real y se pueden explicar en un comentario de PR.
Hoja de ruta
Sección titulada «Hoja de ruta»Sin fases abiertas; esta decisión se aplica en M2 y M9.