Skill: arch-manage
Crea y actualiza los dos artefactos de arquitectura del proyecto — ADRs y estándares de dominio —
siguiendo el flujo de este documento.
Este SKILL.md es el router. El detalle de consulta puntual (catálogo de dominios, convenciones de
frontmatter, fitness functions/runner, instalación de dependencias) vive en references/ y se lee
solo cuando aplica — ver Archivos del skill al final.
Concepto: ADR ≠ estándar (y el estándar es más amplio)
Este skill mantiene separados dos artefactos que suelen confundirse. La distinción es la razón de ser
de esta versión: el ADR es la decisión; el estándar es la norma de dominio que la decisión alimenta.
|
ADR (docs/adr/) |
Estándar (docs/standards/) |
| Qué es |
El registro de una decisión arquitectónica en un punto del tiempo |
Un documento normativo de dominio (p. ej. Testing Standards) que agrupa varios requisitos |
| Granularidad |
Fino: una decisión |
Amplio: un dominio entero, alimentado por muchas decisiones |
| Pregunta que responde |
¿Por qué elegimos X sobre Y? |
¿Qué debe cumplir el proyecto hoy en este dominio, y cómo se verifica |
| Naturaleza |
Histórico, narrativo, inmutable una vez Accepted |
Vivo y prescriptivo; crece y se actualiza a medida que llegan nuevas decisiones |
| Contenido |
Contexto, drivers, decisión, alternativas, consecuencias |
Requisitos redactados con RFC 2119 / RFC 8174 (MUST/SHOULD/MAY…), cada uno con su descripción normativa y excepciones, y sus criterios de cumplimiento (CR-XXX) verificables, agrupados en una tabla única al final del documento |
| Verificación |
No se audita en sí mismo (es historia) |
Es lo que audita arch-audit: cada criterio de cumplimiento (CR) con su fitness function |
| Relación |
Emite/actualiza criterios de cumplimiento (emits) dentro de un estándar de dominio |
Nace de los ADR que aportaron sus criterios (source_adrs) |
El estándar es de dominio, no de decisión
Qué es "dominio" aquí. Un dominio técnico o funcional del proyecto: un área o aspecto
transversal (testing, architecture, api, security, coding-style, frontend, persistence, devops, observability — ver references/functional-domains.md). No es
un dominio de negocio/DDD (bounded context) ni un dominio de internet. Se agrupa por aspecto de
arquitectura, no por feature de negocio.
La clave de esta versión: un estándar no es "usar PHPUnit para unit tests". Ese es un requisito.
El estándar es "Testing Standards", el documento de dominio (identificado por su nombre, sin
código) que contiene ese requisito («Unit testing») y todos los demás del mismo dominio.
- Decides "unit tests con PHPUnit" → no creas el estándar "usar PHPUnit"; creas (o actualizas) el
estándar de dominio
Testing Standards (docs/standards/testing.md) y añades dentro el requisito
Unit testing: "Las pruebas unitarias DEBEN implementarse con PHPUnit." (en un estándar en
inglés sería "Unit tests MUST be implemented with PHPUnit." — ver sección
"Resolución de idioma" más abajo)
- Después decides "e2e con Playwright" → no creas un estándar nuevo: añades al mismo
Testing Standards el requisito E2E testing: "Las pruebas end-to-end DEBEN implementarse con
Playwright."
Así el estándar de dominio va agregando requisitos. Dentro de cada requisito, la unidad verificable
y trazable es el criterio de cumplimiento (CR-XXX): cada CR mide algo concreto (p. ej. cobertura
≥ 80%), traza a su ADR de origen y —si es automatizable— tiene su propia fitness function. Un requisito
agrupa uno o varios CR.
Requisitos en lenguaje normativo (RFC 2119 / RFC 8174). Cada requisito del estándar se redacta
con la palabra clave normativa correspondiente, en MAYÚSCULAS (solo en mayúsculas tienen el
significado normativo, según RFC 8174) y en el idioma de preferencia (ver sección
"Resolución de idioma" más abajo):
| Inglés |
Español |
| MUST |
DEBE |
| MUST NOT |
NO DEBE |
| REQUIRED |
REQUERIDO |
| SHALL |
DEBERÁ |
| SHALL NOT |
NO DEBERÁ |
| SHOULD |
DEBERÍA |
| SHOULD NOT |
NO DEBERÍA |
| RECOMMENDED |
RECOMENDADO |
| MAY |
PUEDE |
| OPTIONAL |
OPCIONAL |
Regla práctica: toda decisión se registra como ADR. Si además establece una regla continua,
esa regla entra como un requisito en el estándar de su dominio (creándolo si el dominio aún no
tiene estándar, o ampliándolo si ya existe). Una decisión puntual e histórica (p. ej. "en 2026
migramos de MySQL a Postgres") es un ADR sin requisito: no hay norma continua que cumplir.
Las plantillas canónicas están en assets/adr-template.md y assets/standard-template.md.
Leer la que corresponda antes de redactar.
Clasificar el input antes de redactar: ¿ADR, estándar, o ambos?
Primer paso, siempre. Antes de recopilar información o tocar cualquier archivo, clasificar qué pide
el input para saber qué documento(s) se producen y con qué alcance. No asumir que todo input
crea un ADR y un estándar: cada uno tiene su propio alcance y pueden existir de forma independiente.
Preguntarse dos cosas, en este orden:
- ¿Hay una decisión nueva que documentar (una elección técnica y su porqué)?
- ¿Hay una regla continua y verificable que el equipo deba cumplir de aquí en adelante?
Según las respuestas, el input cae en uno de tres casos:
| Caso |
El input es… |
Qué se produce |
Ruta |
| A. Solo ADR |
Una decisión puntual/histórica sin regla continua que cumplir (p. ej. "en 2026 migramos de MySQL a Postgres", "adoptamos Vite como bundler") |
Un ADR con emits: []. No toca docs/standards/ |
Crear una decisión (ADR), deteniéndose en el paso 4 (rama "No") |
| B. ADR + estándar |
Una decisión que además fija una regla continua y verificable (p. ej. "las APIs son GraphQL", "unit tests con PHPUnit y cobertura ≥ 80%") |
Un ADR (el porqué) y su(s) criterio(s) de cumplimiento emitido(s) al estándar del dominio (el qué verificable) |
Crear una decisión (ADR) y su requisito de estándar, completo |
| C. Solo estándar / requisito |
Una regla o convención verificable sin decisión nueva que documentar: refinar un umbral, aclarar una excepción, o añadir/editar un requisito o criterio en un dominio existente |
Un requisito/criterio en un estándar. Idealmente traza a un ADR; si no existe, ofrecer crearlo, pero se permite dejar constancia de que su decisión de origen está pendiente |
Crear o actualizar un estándar / requisito directamente |
Independencia de los dos documentos. Un ADR puede no tener estándar (emits: [], caso A) y un
requisito/criterio puede no tener ADR registrado (caso C). No forzar la creación del otro documento
solo por simetría: se crea el que el alcance del input justifique.
Regla de oro: no mezclar el alcance de cada documento
El ADR y el estándar se enlazan por referencia, nunca duplicando contenido:
- El ADR contiene solo el porqué — contexto, drivers, decisión, alternativas, consecuencias — y
emits (las referencias <estándar>/CR-XXX que fija). Nunca aloja el enunciado normativo
(MUST/SHOULD…) ni los criterios verificables: el ADR emite la regla, no la contiene.
- El estándar contiene solo el qué hay que cumplir hoy — requisitos con su descripción normativa
(RFC 2119) y sus criterios de cumplimiento (
CR-XXX) verificables — y source_adrs. Nunca aloja el porqué,
los drivers ni las alternativas: eso es historia y vive en el ADR.
- El enlace es cruzado, no copiado:
emits (ADR) ↔ source_adrs / columna Origen (estándar). Si
te descubres copiando el enunciado normativo dentro del ADR, o el contexto/alternativas dentro del
estándar, estás mezclando alcances: mueve cada parte a su documento y deja solo la referencia.
Si el input es ambiguo sobre si fija o no una regla continua (caso A vs B), confirmarlo con el
usuario en la tanda de preguntas inicial (ver "Información requerida"), no decidirlo por cuenta propia.
Rutas de las referencias compartidas
${PLUGIN_ROOT} es la raíz del plugin instalado (la carpeta que contiene skills/, agents/ y reference/), y toda referencia compartida de este skill se escribe como ${PLUGIN_ROOT}/reference/<archivo>.md. Resolverla así, en este orden: (1) en Claude Code, ${PLUGIN_ROOT} es ${CLAUDE_PLUGIN_ROOT} — comprobar con echo "$CLAUDE_PLUGIN_ROOT" y usar ese valor; (2) en cualquier otro cliente, o si la variable está vacía, la carpeta desde la que se cargó este archivo, dos niveles arriba. El destino de cada enlace markdown (../../reference/…) existe solo para navegar el repositorio en GitHub o en un editor: no resolverlo desde el directorio de trabajo. Nunca buscar reference/ en el proyecto: un <proyecto>/reference/language.md que no existe no es un archivo que falte, es una ruta mal resuelta — corregir la raíz y volver a leer, sin preguntar al usuario ni saltarse la lectura.
Resolución de idioma
Antes de ejecutar este skill, DEBES leer ${PLUGIN_ROOT}/reference/language.md.
Las reglas de language.md son obligatorias y tienen prioridad para determinar el idioma de todos los artefactos y mensajes generados por este skill.
No continúes hasta haber leído y aplicado language.md.
Resolución de la raíz de arquitectura
Antes de leer, numerar o escribir cualquier artefacto, resolver dónde vive la arquitectura del
código del que trata la decisión. Los ADR, los estándares y las fitness functions describen el código de
un repositorio concreto y se versionan junto a él: si ese código está en un submódulo (o repositorio
anidado), sus artefactos van en el docs/ de ese submódulo, no en el del repo principal.
Regla completa —detección, pregunta, numeración por raíz— en
${PLUGIN_ROOT}/reference/artifacts.md.
En resumen:
- Listar los repositorios anidados (
git submodule status / .gitmodules, más directorios con .git
propio). Si no hay ninguno, la raíz es el repo principal y no se pregunta nada.
- Si los hay, preguntar al usuario en qué raíz vive esta decisión (raíz principal o submódulo
X),
dentro de la misma tanda de preguntas inicial.
- Fijar
<raíz-arq> una sola vez por invocación (o por lote, cuando otro skill invoca este en lote) y
escribir todo bajo ella.
Notación del resto de este documento. Cada vez que aparecen docs/adr/, docs/standards/ o
scripts/arch/, se leen relativas a <raíz-arq> — no al repo principal ni al directorio de
invocación. En un repo sin submódulos ambas cosas coinciden.
Las especificaciones no se ven afectadas. docs/specs/… sigue resolviéndose contra
specification.basePath de .sdd-devkit/settings.json, sobre el repositorio principal. Elegir un
submódulo como raíz de arquitectura no mueve, duplica ni redirige nada bajo docs/specs/.
Al commitear en un submódulo, los artefactos se commitean dentro del submódulo y después se
actualiza el puntero en el repo padre: un git add lanzado desde el padre no stagea el contenido del
submódulo. Advertirlo al confirmar (paso 10) para que el cambio no quede a medias.
Información requerida antes de redactar
Recopilar en una sola tanda de preguntas al inicio usando la herramienta de preguntas estructuradas del cliente (máx. 3 preguntas por bloque; opciones cortas y mutuamente excluyentes). No inventar datos — si no están en contexto, preguntar.
| Dato |
Fuente preferida |
Si no está |
Raíz de arquitectura (<raíz-arq>): repo principal o submódulo |
Detección de submódulos + alcance de la decisión |
Preguntar si hay repositorios anidados; no preguntar si no los hay |
| Problema / tensión arquitectónica |
Descripción del usuario |
Preguntar |
| Decisión concreta |
Descripción del usuario |
Preguntar |
¿Establece una regla continua? (→ requisito de estándar) y ¿de qué dominio? (ver references/functional-domains.md) |
Inferir del alcance; confirmar con el usuario |
Preguntar si es ambiguo |
| Decisores |
Indicado por el usuario |
Preguntar siempre |
| Stack tecnológico |
package.json, pom.xml, etc. |
Preguntar |
| Alternativas consideradas |
Solo si el usuario las mencionó |
Omitir la sección si no las mencionó |
| ADRs / estándares relacionados |
docs/adr/ + docs/standards/ de <raíz-arq> + contexto |
Preguntar si hay referencias a citar |
ADRs en estado Draft o Proposed también requieren problema y decisión tentativa.
Validación de conflictos (solo al crear)
Antes de redactar un ADR nuevo o de añadir un requisito, con la raíz de arquitectura ya resuelta:
- Leer títulos y la sección clave (
## Decisión de los ADR; los requisitos de los estándares de docs/standards/) dentro de <raíz-arq>. Un ADR de otra raíz no es un conflicto: son series independientes. Si la decisión parece contradecir la arquitectura de la raíz principal desde un submódulo (o al revés), señalarlo al usuario como tensión entre raíces en vez de tratarlo como duplicado.
- Si hay conflicto (misma tecnología/componente ya cubierto por un ADR
Accepted o por un requisito Active, contradicción directa, o duplicación):
- No redactar; informar al usuario con enlace(s) al artefacto en conflicto.
- Sugerir: (a) actualizar el existente, (b) crear ADR nuevo marcando el anterior como
Superseded, o (c) ajustar el alcance/requisito.
Flujo: Crear una decisión (ADR) y su requisito de estándar
Aplica a los casos A (solo ADR) y B (ADR + estándar) de la clasificación del input. El paso 4 bifurca entre ambos. Mantener separado el alcance: el ADR solo registra el porqué y emits; el enunciado normativo y los criterios viven en el estándar.
- Resolver
<raíz-arq> si aún no está fijada (ver Resolución de la raíz de arquitectura). Todos los pasos siguientes escriben bajo ella.
- Número y archivo del ADR — correlativo en el
docs/adr/ de <raíz-arq> (nunca sobre el de otra raíz: cada repositorio lleva su propia serie); archivo docs/adr/ADR-XXX-<slug>.md. Convenciones de identidad/numeración y frontmatter: references/conventions.md.
- Recopilar información faltante (ver tabla anterior).
- Escribir el ADR desde
assets/adr-template.md:
- Frontmatter YAML:
id: ADR-XXX, status (ver regla de default abajo), last_update = hoy, deciders, tags, supersedes: null, superseded_by: null, emits: [] (campos completos en references/conventions.md).
- Default de
status:
- Por defecto,
Draft — la decisión todavía no está en vigor o sigue en discusión.
Accepted si la decisión ya está vigente y el código la implementa y cumple hoy — típicamente al venir de arch-discover documentando retroactivamente algo que el repo ya hace (no una decisión nueva a futuro). No usar Draft para una decisión que ya rige: Draft/Proposed implican que aún no aplica, lo cual sería falso en ese caso.
- Cuerpo:
## Contexto, ## Decisión, ## Alternativas consideradas (opcional), ## Consecuencias, ## Referencias. Solo el porqué — sin enunciados normativos ni criterios (eso va al estándar).
- Decidir si la decisión establece una regla continua. Preguntarse: ¿esta decisión fija una regla
que el equipo deberá cumplir de forma continua?
- No (decisión puntual o histórica) →
emits: []. No toca estándares. Fin del bloque de estándares.
- Sí → identificar el dominio técnico/funcional clasificándolo con
references/functional-domains.md (proponer otro solo si no encaja en ninguno) y continuar al paso 5.
- Ubicar o crear el estándar de dominio en
docs/standards/ (identificado por su nombre, sin código):
- Si ya existe un estándar para ese dominio (p. ej.
docs/standards/testing.md o docs/standards/testing/README.md) → actualizarlo: añadir (o modificar) el requisito correspondiente, sin reescribir los requisitos existentes.
- Si no existe → crearlo desde
assets/standard-template.md con name (p. ej. Testing Standards), domain (slug), status: Draft (o Active si ya rige), last_update = hoy y source_adrs.
- Forma simple:
docs/standards/<slug>.md.
- Forma con documentos adicionales: si el estándar necesita archivos de apoyo (guías, ejemplos, matrices), crear la carpeta
docs/standards/<slug>/, escribir el estándar en docs/standards/<slug>/README.md y colocar los documentos adicionales dentro de esa carpeta (enlazados con rutas relativas desde el estándar). Si un estándar simple pasa a necesitar extras, migrarlo de <slug>.md a <slug>/README.md.
- Redactar el requisito y proponer sus criterios de cumplimiento (campos exactos en
references/conventions.md):
- Un bloque
## <Nombre del requisito> con: **ID:** <slug-requisito>, **Estado:** Active (los otros valores, Deprecated y Superseded, son para retirarlo después sin borrarlo), el párrafo de qué es / cómo se usa / cómo se implementa, que debe incluir el enunciado normativo con RFC 2119 (MUST/SHOULD/MAY… en mayúsculas), y ### Excepciones. No incluir aquí los criterios de cumplimiento: van todos juntos en la tabla única ## Criterios de cumplimiento, al final del documento (antes de ## Referencias). El origen y la verificación se registran por criterio (CR), no a nivel de requisito.
- Los CR no se escriben directamente: se proponen y el usuario elige. Cada criterio define un resultado arquitectónico medible y su umbral, no una decisión de implementación — la tecnología o herramienta con que se logra o verifica pertenece a la implementación, salvo que sea explícitamente una restricción arquitectónica (ver el objetivo en
references/fitness-functions.md). Derivar los criterios candidatos del requisito, investigar el mecanismo de verificación de cada uno, presentarlos en una tabla de propuesta simplificada (#, criterio, enfoque y la herramienta con la que se verificaría — sin comandos ni código, que aún no existen) y preguntar al usuario cuáles quiere crear y para cuáles quiere la fitness function ahora — flujo completo en references/fitness-functions.md. Solo lo seleccionado se escribe.
- Añadir a la tabla única
## Criterios de cumplimiento la fila (o filas) CR-XXX seleccionadas: ID (CR-XXX, correlativo único en el estándar), Requisito (el ID del requisito al que pertenece), Descripción (medible, con RFC 2119 si es normativa), Origen (ADR-XXX), Automatizable (yes/no), Enfoque (bloqueante/warning; por defecto bloqueante) y Verificación (yes/no: si la verificación ya existe; la ruta del chequeo no se escribe — se resuelve por convención).
- Enlazar en ambos sentidos: añadir la referencia global de cada CR (
<slug-estándar>/CR-XXX, p. ej. testing/CR-001) al emits del ADR, y el ADR-XXX a source_adrs del estándar (a nivel de documento) además de en la columna Origen del CR.
- Crear las fitness functions que el usuario seleccionó en el paso 6 — flujo completo en
references/fitness-functions.md: instalar y configurar la herramienta ya decidida en la propuesta si hace falta, y registrar el chequeo en el archivo de checks de su estándar (scripts/arch/checks/<slug-estándar>.<ext>, un archivo por estándar, con la trazabilidad CR-XXX en comentarios y líneas de salida), asegurando el runner scripts/arch/verify.<ext> — ambos escritos en el lenguaje del stack del repo (p. ej. Node en un proyecto Angular/React/Vue). Al quedar registrado el chequeo, volver a la fila del CR y poner Verificación: yes (los CR seleccionados sin fitness function se quedan en no, pendientes). La verificación cuelga de cada criterio de cumplimiento, no del requisito, del ADR ni del estándar entero.
- Ofrecer instalar dependencias referenciadas ausentes — flujo en
references/dependencies.md (no repite las herramientas de fitness function ya resueltas en el paso 7).
- Actualizar los índices
README.md (los de <raíz-arq>, nunca los de otra raíz):
docs/adr/README.md: añadir - [ADR-XXX: Título](ADR-XXX-slug.md) en orden ascendente.
docs/standards/README.md: si el estándar de dominio es nuevo, añadir - [Nombre del estándar](<slug>.md) (forma simple) o - [Nombre del estándar](<slug>/README.md) (forma carpeta); si ya existía, no duplicar.
- Si el índice no existe todavía y la carpeta ya tenía artefactos previos (p. ej.
docs/adr/ADR-001-*.md y ADR-002-*.md ya existían pero nunca hubo docs/adr/README.md): al crear el índice por primera vez, listar todos los artefactos existentes en la carpeta (ls docs/adr/*.md / docs/standards/*.md o */README.md), no solo el que se acaba de crear — el índice debe reflejar el estado real de la carpeta desde su primera versión, en el mismo orden ascendente que usaría en adelante. Si la carpeta no tenía nada más, el índice arranca con la única entrada nueva.
- Crearlos con encabezado y lista si no existen. Nunca reordenar ni eliminar entradas.
- Confirmar mostrando: la raíz de arquitectura usada (ruta relativa al repo principal; indicarlo explícitamente cuando no sea la raíz principal), ruta del ADR, estándar de dominio y requisito(s) añadido(s)/actualizado(s), líneas de índice, y —si aplica— la fitness function creada (en qué archivo de checks quedó), el comando del runner (
node scripts/arch/verify.mjs en un repo Node, o el equivalente del stack; con el slug del estándar para correr solo ese) y desde qué directorio se ejecuta — el runner vive en <raíz-arq>/scripts/arch/ y se corre desde <raíz-arq> y las dependencias instaladas.
Flujo: Actualizar un ADR existente
Recordar que un ADR es histórico: se actualiza su estado o se corrigen datos, pero no se reescribe
la decisión ya tomada — para cambiar de rumbo se crea un ADR nuevo que supersede al anterior.
- Identificar el archivo por número, slug o título. El identificador solo desambigua dentro de su raíz: si hay repositorios anidados con ADR propios y el número existe en más de uno, preguntar a cuál se refiere el usuario antes de abrir nada.
- Leer el contenido completo antes de editar.
- Aplicar los cambios; actualizar
last_update a hoy si el cambio es sustantivo. Nunca reescribir una decisión Accepted; para eso, superseder.
- Si el nuevo estado es
Superseded:
- Marcar
status: Superseded y superseded_by: ADR-XXX. Si el usuario no lo indicó, preguntar antes de guardar.
- En el ADR reemplazante, fijar
supersedes: ADR-<anterior>.
- Revisar los criterios emitidos (
emits): si la decisión superseded había fijado criterios de cumplimiento (CR) que ya no rigen, actualizarlos o retirarlos de su estándar de dominio (marcando el **Estado:** del requisito, o el status del estándar entero, como Deprecated/Superseded según alcance), y enlazar el CR reemplazante si lo hay. Un ADR obsoleto no debe dejar criterios vivos huérfanos.
Si el nuevo estado es Deprecated: status: Deprecated, actualizar last_update, registrar el motivo en ## Referencias y aplicar el mismo repaso a sus criterios.
- Actualizar
docs/adr/README.md si el título cambió.
- Confirmar mostrando los campos modificados y el impacto en criterios emitidos.
Flujo: Crear o actualizar un estándar / requisito directamente
Aplica al caso C de la clasificación del input: una regla verificable sin decisión nueva. No arrastrar aquí el porqué/drivers/alternativas — eso, si hace falta documentarlo, es un ADR aparte.
A veces se refina una regla sin una decisión nueva (afinar un umbral, ampliar el alcance, aclarar una
excepción, añadir un requisito a un dominio existente). El estándar es vivo: se edita.
- Todo criterio de cumplimiento (CR) debería trazar a un ADR (columna
Origen + source_adrs). Si se pide añadir un criterio
sin decisión registrada, ofrecer crear primero el ADR de origen (flujo de arriba). Si el usuario
prefiere no crearlo, permitir el CR dejando constancia de que su decisión de origen está
pendiente de documentar (lo señalará arch-audit).
- Resolver
<raíz-arq> si aún no está fijada e identificar el estándar de dominio dentro de ella (o crearlo, docs/standards/<slug>.md o docs/standards/<slug>/README.md si lleva documentos adicionales; dominio según references/functional-domains.md).
- Añadir o editar el bloque de requisito (
ID, Estado, descripción con el enunciado normativo en RFC 2119, Excepciones). Si el cambio implica CR nuevos, pasar antes por la propuesta y selección de references/fitness-functions.md (tabla simplificada de criterios candidatos → el usuario elige cuáles crear), y escribir solo los seleccionados como filas CR-XXX en la tabla única ## Criterios de cumplimiento, al final del documento (Requisito, Descripción, Origen, Automatizable, Enfoque, Verificación; ver references/conventions.md). Actualizar last_update a hoy.
- Reevaluar la fitness function de cada CR afectado: si cambió su descripción, ajustar su chequeo en el archivo de checks de su estándar (
scripts/arch/checks/<slug-estándar>.<ext>; ver references/fitness-functions.md).
- Si el nuevo estado del estándar o de un requisito es
Deprecated/Superseded, enlazar el reemplazo y actualizar docs/standards/README.md.
- Confirmar los cambios.
Anti-patterns
- Narrar el flujo interno: anunciar que se resuelve el idioma o la política, que se lee
settings.json, que se carga una referencia, o ir enumerando los pasos en voz alta. Al usuario se le comunica el resultado, las preguntas que el flujo exija y lo que quede pendiente — no la maquinaria.
- Mezclar el alcance de ADR y estándar: meter el enunciado normativo (RFC 2119) o los criterios de cumplimiento dentro del ADR, o el contexto/alternativas/consecuencias dentro del estándar. Cada uno contiene solo lo suyo y se enlazan por referencia (
emits ↔ source_adrs/Origen).
- Crear un estándar nuevo por cada decisión en vez de añadir un requisito al estándar de dominio existente — el estándar es de dominio, no de decisión.
- Redactar un ADR o un requisito sin pasar primero por la Validación de conflictos: duplicar o contradecir un ADR
Accepted o un requisito Active ya existente.
- Reescribir la decisión de un ADR
Accepted en vez de crear uno nuevo que lo supersede — un ADR es histórico e inmutable una vez aceptado.
- Marcar un ADR
Superseded/Deprecated sin revisar los criterios (emits) que fijó: dejar CR huérfanos vigentes en un estándar cuando la decisión que los originó ya no rige.
- Escribir los
CR-XXX en el estándar sin presentar antes la tabla de propuesta y dejar que el usuario elija cuáles crear — los criterios se proponen, no se imponen (references/fitness-functions.md).
- Escribir en la tabla del estándar filas de criterios que el usuario no seleccionó (aunque se hayan propuesto, aunque parezcan buena idea, aunque sea «para dejarlos pendientes») — solo lo seleccionado se crea y se registra.
- Preguntar «¿creo la fitness function?» sin haber investigado ni mostrado la herramienta concreta con la que se verificaría (y si hay que instalarla): el usuario no puede decidir sobre un chequeo que no sabe cómo se hará. El comando y el código no se muestran aquí — todavía no existen.
- Crear una fitness function sin la aprobación explícita del usuario, o sin investigar primero si ya existe una herramienta/convención establecida para ese chequeo en el stack — un script propio a medida es el último recurso, no el primero (
references/fitness-functions.md).
- Quemar números
CR-XXX en criterios que el usuario aún no ha seleccionado — los candidatos se numeran C1, C2… solo para la conversación; el CR-XXX se asigna al escribir.
- Dejar la herramienta de verificación de una fitness function sin instalar cuando el usuario aceptó instalarla, o repreguntar por ella en el paso de dependencias generales (
references/dependencies.md) después de ya haberla resuelto en references/fitness-functions.md.
- Escribir el runner o los checks en un lenguaje ajeno al stack del repo (p. ej. shell en un proyecto Node) — se escriben con el runtime que el proyecto ya usa; el shell POSIX es solo el último recurso cuando el repo no tiene ningún runtime de stack.
- Crear un archivo de chequeo por criterio de cumplimiento — el archivo de checks es por estándar (
scripts/arch/checks/<slug-estándar>.<ext>); la trazabilidad por CR va dentro, en comentarios y en las líneas de salida de cada chequeo.
- Instalar o configurar dependencias sin la aprobación explícita del usuario, o correr build/suites completas por iniciativa propia.
- Al invocarse en lote (p. ej. desde
arch-discover), volver a preguntar los decisores o la instalación de dependencias por cada artefacto en vez de resolverlo una sola vez para todo el lote.
- Pedirle al usuario el número del próximo ADR o CR — siempre se calcula releyendo
docs/adr/ o la tabla del estándar, nunca se pregunta.
- Escribir los artefactos de arquitectura en el
docs/ del repo principal cuando la decisión trata del código de un submódulo (o al revés). El ADR, el estándar y sus checks se versionan junto al código que gobiernan: se resuelve <raíz-arq> antes de tocar nada.
- Dar por hecha la raíz cuando el workspace tiene submódulos: se pregunta (una vez por invocación o lote). Y al revés: preguntarla en un repo sin repositorios anidados, donde no hay nada que elegir.
- Continuar la numeración
ADR-XXX de una raíz en otra, o tratar como conflicto/duplicado un ADR que vive en otra raíz — cada repositorio lleva su propia serie independiente.
- Redirigir, mover o duplicar artefactos de
docs/specs/ por haber elegido un submódulo como raíz de arquitectura: las especificaciones se resuelven siempre contra specification.basePath, sobre el repo principal.
Archivos del skill (contexto progresivo)
Este SKILL.md contiene el concepto, la clasificación del input y los flujos. El detalle de consulta
puntual está en archivos aparte; leer cada uno solo cuando la tarea lo pida (así el contexto se
mantiene ligero):
Plantillas y activos (assets/ — copiar/rellenar al redactar):
assets/adr-template.md — plantilla del ADR. Leer antes de escribir un ADR.
assets/standard-template.md — plantilla del estándar (requisitos + tabla de CR-XXX). Leer antes de crear/editar un estándar.
assets/arch-fitness/ — implementación de referencia del runner, en Node (verify.mjs, checks/example.mjs.template, README.md con el contrato). En un repo Node se copia al crear el runner; en otro stack se genera el equivalente en ese lenguaje con el mismo contrato.
Referencias de consulta (references/ — leer bajo demanda):
references/functional-domains.md — catálogo de los 9 dominios funcionales canónicos. Leer al clasificar el dominio de un estándar (casos B/C).
references/conventions.md — convenciones de identidad, numeración y frontmatter de ADR / estándar / requisito / CR. Leer al escribir frontmatter o identificadores.
references/fitness-functions.md — cómo proponer los criterios (CR) con su mecanismo de verificación para que el usuario elija cuáles crear, cómo crear la fitness function de los seleccionados, registrarla en el archivo de checks de su estándar y mantener el runner scripts/arch/verify.<ext>. Leer antes de escribir CR nuevos, al automatizar un CR o al tocar el runner.
references/dependencies.md — flujo para ofrecer instalar dependencias ausentes que referencia la decisión. Leer tras crear los artefactos si referencian una tecnología concreta.
Referencias compartidas del plugin
Reglas transversales del catálogo; viven en la raíz del plugin, no en este skill.
${PLUGIN_ROOT}/reference/language.md: Idioma — resolución obligatoria del idioma de artefactos y mensajes. Lectura obligatoria antes de ejecutar el skill.
${PLUGIN_ROOT}/reference/artifacts.md: Artefactos — rutas del harness, resolución de la raíz de arquitectura (repo principal vs. submódulo), identificadores, archivado. Lectura obligatoria al resolver una ruta o calcular un ID.
Referencias
1---2name: arch-manage3description: Crear o actualizar la arquitectura documentada del proyecto: Architecture Decision Records (ADR, en docs/adr/) y estándares de arquitectura por dominio (en docs/standards/), en la raíz del repositorio al que pertenece el código (repo principal o submódulo). Un ADR registra el "por qué" de una decisión (histórico, inmutable); un estándar agrupa los requisitos verificables de un dominio — el "qué hay que cumplir hoy". Cada decisión que fija una regla actualiza el estándar de su dominio, no crea uno nuevo. Activar para documentar, registrar o cambiar el estado de una decisión arquitectónica o norma del proyecto, aunque no use las palabras "ADR" o "estándar". Frases: "registrar decisión", "documentar por qué usamos X", "decision record", "cambiar ADR a Accepted", "marcar como Superseded", "crear/actualizar ADR", "ADR-XXX", "definir un estándar", "añadir un requisito". Usar también ante una tensión arquitectónica que deba quedar documentada.4license: MIT5---67# Skill: arch-manage89Crea y actualiza los dos artefactos de arquitectura del proyecto — **ADRs** y **estándares de dominio** —10siguiendo el flujo de este documento.1112> **Este SKILL.md es el router.** El detalle de consulta puntual (catálogo de dominios, convenciones de13> frontmatter, fitness functions/runner, instalación de dependencias) vive en `references/` y se lee14> **solo cuando aplica** — ver [Archivos del skill](#archivos-del-skill-contexto-progresivo) al final.1516## Concepto: ADR ≠ estándar (y el estándar es más amplio)1718Este skill mantiene separados dos artefactos que suelen confundirse. La distinción es la razón de ser19de esta versión: **el ADR es la decisión; el estándar es la norma de dominio que la decisión alimenta.**2021| | **ADR** (`docs/adr/`) | **Estándar** (`docs/standards/`) |22|---|---|---|23| Qué es | El registro de **una decisión** arquitectónica en un punto del tiempo | Un documento normativo de **dominio** (p. ej. *Testing Standards*) que **agrupa varios requisitos** |24| Granularidad | Fino: una decisión | **Amplio: un dominio** entero, alimentado por muchas decisiones |25| Pregunta que responde | *¿Por qué* elegimos X sobre Y? | *¿Qué* debe cumplir el proyecto hoy en este dominio, y *cómo* se verifica |26| Naturaleza | Histórico, narrativo, **inmutable** una vez `Accepted` | **Vivo y prescriptivo**; crece y se actualiza a medida que llegan nuevas decisiones |27| Contenido | Contexto, drivers, decisión, alternativas, consecuencias | Requisitos redactados con **RFC 2119 / RFC 8174** (MUST/SHOULD/MAY…), cada uno con su descripción normativa y excepciones, y sus **criterios de cumplimiento** (`CR-XXX`) verificables, agrupados en una tabla única al final del documento |28| Verificación | No se audita en sí mismo (es historia) | **Es lo que audita `arch-audit`**: cada **criterio de cumplimiento** (CR) con su fitness function |29| Relación | **Emite/actualiza** criterios de cumplimiento (`emits`) dentro de un estándar de dominio | **Nace de** los ADR que aportaron sus criterios (`source_adrs`) |3031### El estándar es de dominio, no de decisión3233> **Qué es "dominio" aquí.** Un **dominio técnico o funcional** del proyecto: un área o aspecto34> transversal (testing, architecture, api, security, coding-style, frontend, persistence, devops, observability — ver [`references/functional-domains.md`](references/functional-domains.md)). **No** es35> un dominio de negocio/DDD (bounded context) ni un dominio de internet. Se agrupa por *aspecto de36> arquitectura*, no por feature de negocio.3738La clave de esta versión: **un estándar no es "usar PHPUnit para unit tests".** Ese es un *requisito*.39El estándar es **"Testing Standards"**, el documento de dominio (identificado por su **nombre**, sin40código) que contiene ese requisito («Unit testing») y todos los demás del mismo dominio.4142- Decides *"unit tests con PHPUnit"* → no creas el estándar "usar PHPUnit"; creas (o actualizas) el43 estándar de dominio **`Testing Standards`** (`docs/standards/testing.md`) y añades dentro el requisito44 **Unit testing**: *"Las pruebas unitarias **DEBEN** implementarse con PHPUnit."* (en un estándar en45 inglés sería *"Unit tests **MUST** be implemented with PHPUnit."* — ver sección46 "Resolución de idioma" más abajo)47- Después decides *"e2e con Playwright"* → **no** creas un estándar nuevo: **añades** al mismo48 `Testing Standards` el requisito **E2E testing**: *"Las pruebas end-to-end **DEBEN** implementarse con49 Playwright."*5051Así el estándar de dominio va agregando requisitos. Dentro de cada requisito, la unidad **verificable52y trazable** es el **criterio de cumplimiento** (`CR-XXX`): cada CR mide algo concreto (p. ej. cobertura53≥ 80%), traza a su ADR de origen y —si es automatizable— tiene su propia fitness function. Un requisito54agrupa uno o varios CR.5556> **Requisitos en lenguaje normativo (RFC 2119 / RFC 8174).** Cada requisito del estándar se redacta57> con la palabra clave normativa correspondiente, **en MAYÚSCULAS** (solo en mayúsculas tienen el58> significado normativo, según RFC 8174) **y en el idioma de preferencia** (ver sección59> "Resolución de idioma" más abajo):60>61> | Inglés | Español |62> |---|---|63> | MUST | DEBE |64> | MUST NOT | NO DEBE |65> | REQUIRED | REQUERIDO |66> | SHALL | DEBERÁ |67> | SHALL NOT | NO DEBERÁ |68> | SHOULD | DEBERÍA |69> | SHOULD NOT | NO DEBERÍA |70> | RECOMMENDED | RECOMENDADO |71> | MAY | PUEDE |72> | OPTIONAL | OPCIONAL |7374> **Regla práctica:** toda decisión se registra como **ADR**. Si además establece una regla continua,75> esa regla entra como **un requisito** en el estándar de su dominio (creándolo si el dominio aún no76> tiene estándar, o ampliándolo si ya existe). Una decisión puntual e histórica (p. ej. "en 202677> migramos de MySQL a Postgres") es un ADR sin requisito: no hay norma continua que cumplir.7879Las plantillas canónicas están en `assets/adr-template.md` y `assets/standard-template.md`.80**Leer la que corresponda antes de redactar.**8182---8384## Clasificar el input antes de redactar: ¿ADR, estándar, o ambos?8586**Primer paso, siempre.** Antes de recopilar información o tocar cualquier archivo, clasificar qué pide87el input para saber **qué documento(s)** se producen y **con qué alcance**. No asumir que todo input88crea un ADR *y* un estándar: cada uno tiene su propio alcance y pueden existir de forma independiente.8990Preguntarse dos cosas, en este orden:91921. **¿Hay una *decisión* nueva que documentar** (una elección técnica y su porqué)?932. **¿Hay una *regla continua y verificable*** que el equipo deba cumplir de aquí en adelante?9495Según las respuestas, el input cae en uno de tres casos:9697| Caso | El input es… | Qué se produce | Ruta |98|---|---|---|---|99| **A. Solo ADR** | Una decisión puntual/histórica **sin** regla continua que cumplir (p. ej. "en 2026 migramos de MySQL a Postgres", "adoptamos Vite como bundler") | Un **ADR** con `emits: []`. **No** toca `docs/standards/` | [Crear una decisión (ADR)](#flujo-crear-una-decisión-adr-y-su-requisito-de-estándar), deteniéndose en el paso 4 (rama "No") |100| **B. ADR + estándar** | Una decisión **que además** fija una regla continua y verificable (p. ej. "las APIs son GraphQL", "unit tests con PHPUnit y cobertura ≥ 80%") | Un **ADR** (el porqué) **y** su(s) **criterio(s) de cumplimiento** emitido(s) al estándar del dominio (el qué verificable) | [Crear una decisión (ADR) y su requisito de estándar](#flujo-crear-una-decisión-adr-y-su-requisito-de-estándar), completo |101| **C. Solo estándar / requisito** | Una regla o convención verificable **sin decisión nueva** que documentar: refinar un umbral, aclarar una excepción, o añadir/editar un requisito o criterio en un dominio existente | Un **requisito/criterio** en un estándar. Idealmente traza a un ADR; si no existe, ofrecer crearlo, pero **se permite** dejar constancia de que su decisión de origen está pendiente | [Crear o actualizar un estándar / requisito directamente](#flujo-crear-o-actualizar-un-estándar--requisito-directamente) |102103> **Independencia de los dos documentos.** Un ADR **puede no tener estándar** (`emits: []`, caso A) y un104> requisito/criterio **puede no tener ADR** registrado (caso C). No forzar la creación del otro documento105> solo por simetría: se crea el que el alcance del input justifique.106107### Regla de oro: no mezclar el alcance de cada documento108109El ADR y el estándar se enlazan **por referencia**, nunca duplicando contenido:110111- **El ADR contiene solo el *porqué*** — contexto, drivers, decisión, alternativas, consecuencias — y112 `emits` (las referencias `<estándar>/CR-XXX` que fija). **Nunca** aloja el enunciado normativo113 (MUST/SHOULD…) ni los criterios verificables: el ADR **emite** la regla, no la **contiene**.114- **El estándar contiene solo el *qué hay que cumplir hoy*** — requisitos con su descripción normativa115 (RFC 2119) y sus criterios de cumplimiento (`CR-XXX`) verificables — y `source_adrs`. **Nunca** aloja el porqué,116 los drivers ni las alternativas: eso es historia y vive en el ADR.117- **El enlace es cruzado, no copiado:** `emits` (ADR) ↔ `source_adrs` / columna `Origen` (estándar). Si118 te descubres copiando el enunciado normativo dentro del ADR, o el contexto/alternativas dentro del119 estándar, estás mezclando alcances: mueve cada parte a su documento y deja solo la referencia.120121> Si el input es ambiguo sobre si fija o no una regla continua (caso A vs B), **confirmarlo con el122> usuario** en la tanda de preguntas inicial (ver "Información requerida"), no decidirlo por cuenta propia.123124---125126## Rutas de las referencias compartidas127128`${PLUGIN_ROOT}` es la **raíz del plugin instalado** (la carpeta que contiene `skills/`, `agents/` y `reference/`), y toda referencia compartida de este skill se escribe como `${PLUGIN_ROOT}/reference/<archivo>.md`. Resolverla así, **en este orden**: (1) en Claude Code, `${PLUGIN_ROOT}` **es** `${CLAUDE_PLUGIN_ROOT}` — comprobar con `echo "$CLAUDE_PLUGIN_ROOT"` y usar ese valor; (2) en cualquier otro cliente, o si la variable está vacía, la carpeta desde la que se cargó este archivo, dos niveles arriba. El destino de cada enlace markdown (`../../reference/…`) existe solo para navegar el repositorio en GitHub o en un editor: **no** resolverlo desde el directorio de trabajo. **Nunca buscar `reference/` en el proyecto**: un `<proyecto>/reference/language.md` que no existe no es un archivo que falte, es una ruta mal resuelta — corregir la raíz y volver a leer, sin preguntar al usuario ni saltarse la lectura.129130## Resolución de idioma131132Antes de ejecutar este skill, DEBES leer [`${PLUGIN_ROOT}/reference/language.md`](../../reference/language.md).133134Las reglas de `language.md` son obligatorias y tienen prioridad para determinar el idioma de todos los artefactos y mensajes generados por este skill.135136No continúes hasta haber leído y aplicado `language.md`.137138---139140## Resolución de la raíz de arquitectura141142**Antes de leer, numerar o escribir cualquier artefacto**, resolver **dónde vive la arquitectura del143código del que trata la decisión**. Los ADR, los estándares y las fitness functions describen el código de144**un repositorio concreto** y se versionan junto a él: si ese código está en un **submódulo (o repositorio145anidado)**, sus artefactos van en el `docs/` de ese submódulo, no en el del repo principal.146147Regla completa —detección, pregunta, numeración por raíz— en148[`${PLUGIN_ROOT}/reference/artifacts.md`](../../reference/artifacts.md#raíz-de-arquitectura-adr-estándares-y-fitness-functions).149En resumen:1501511. Listar los repositorios anidados (`git submodule status` / `.gitmodules`, más directorios con `.git`152 propio). **Si no hay ninguno, la raíz es el repo principal y no se pregunta nada.**1532. Si los hay, **preguntar al usuario** en qué raíz vive esta decisión (raíz principal o submódulo `X`),154 dentro de la misma tanda de preguntas inicial.1553. Fijar `<raíz-arq>` **una sola vez por invocación** (o por lote, cuando otro skill invoca este en lote) y156 escribir todo bajo ella.157158> **Notación del resto de este documento.** Cada vez que aparecen `docs/adr/`, `docs/standards/` o159> `scripts/arch/`, se leen **relativas a `<raíz-arq>`** — no al repo principal ni al directorio de160> invocación. En un repo sin submódulos ambas cosas coinciden.161162> **Las especificaciones no se ven afectadas.** `docs/specs/…` sigue resolviéndose contra163> `specification.basePath` de `.sdd-devkit/settings.json`, sobre el repositorio principal. Elegir un164> submódulo como raíz de arquitectura **no** mueve, duplica ni redirige nada bajo `docs/specs/`.165166> **Al commitear en un submódulo**, los artefactos se commitean **dentro del submódulo** y después se167> actualiza el puntero en el repo padre: un `git add` lanzado desde el padre no stagea el contenido del168> submódulo. Advertirlo al confirmar (paso 10) para que el cambio no quede a medias.169170---171172## Información requerida antes de redactar173174Recopilar en **una sola tanda de preguntas** al inicio usando la herramienta de preguntas estructuradas del cliente (máx. 3 preguntas por bloque; opciones cortas y mutuamente excluyentes). No inventar datos — si no están en contexto, preguntar.175176| Dato | Fuente preferida | Si no está |177|------|-----------------|------------|178| **Raíz de arquitectura** (`<raíz-arq>`): repo principal o submódulo | Detección de submódulos + alcance de la decisión | **Preguntar** si hay repositorios anidados; no preguntar si no los hay |179| Problema / tensión arquitectónica | Descripción del usuario | Preguntar |180| Decisión concreta | Descripción del usuario | Preguntar |181| ¿Establece una regla continua? (→ requisito de estándar) y ¿de qué **dominio**? (ver [`references/functional-domains.md`](references/functional-domains.md)) | Inferir del alcance; confirmar con el usuario | Preguntar si es ambiguo |182| Decisores | Indicado por el usuario | Preguntar siempre |183| Stack tecnológico | `package.json`, `pom.xml`, etc. | Preguntar |184| Alternativas consideradas | Solo si el usuario las mencionó | Omitir la sección si no las mencionó |185| ADRs / estándares relacionados | `docs/adr/` + `docs/standards/` **de `<raíz-arq>`** + contexto | Preguntar si hay referencias a citar |186187> ADRs en estado **Draft** o **Proposed** también requieren problema y decisión tentativa.188189---190191## Validación de conflictos (solo al crear)192193Antes de redactar un ADR nuevo o de añadir un requisito, **con la raíz de arquitectura ya resuelta**:1941951. Leer títulos y la sección clave (`## Decisión` de los ADR; los requisitos de los estándares de `docs/standards/`) **dentro de `<raíz-arq>`**. Un ADR de otra raíz no es un conflicto: son series independientes. Si la decisión parece contradecir la arquitectura de la raíz principal desde un submódulo (o al revés), señalarlo al usuario como tensión entre raíces en vez de tratarlo como duplicado.1962. Si hay conflicto (misma tecnología/componente ya cubierto por un ADR `Accepted` o por un requisito `Active`, contradicción directa, o duplicación):197 - **No redactar**; informar al usuario con enlace(s) al artefacto en conflicto.198 - Sugerir: (a) actualizar el existente, (b) crear ADR nuevo marcando el anterior como `Superseded`, o (c) ajustar el alcance/requisito.199200---201202## Flujo: Crear una decisión (ADR) y su requisito de estándar203204> Aplica a los casos **A** (solo ADR) y **B** (ADR + estándar) de la [clasificación del input](#clasificar-el-input-antes-de-redactar-adr-estándar-o-ambos). El paso 4 bifurca entre ambos. Mantener separado el alcance: el ADR solo registra el porqué y `emits`; el enunciado normativo y los criterios viven en el estándar.2052060. **Resolver `<raíz-arq>`** si aún no está fijada (ver [Resolución de la raíz de arquitectura](#resolución-de-la-raíz-de-arquitectura)). Todos los pasos siguientes escriben bajo ella.2071. **Número y archivo del ADR** — correlativo en el `docs/adr/` **de `<raíz-arq>`** (nunca sobre el de otra raíz: cada repositorio lleva su propia serie); archivo `docs/adr/ADR-XXX-<slug>.md`. Convenciones de identidad/numeración y frontmatter: [`references/conventions.md`](references/conventions.md).2082. **Recopilar información faltante** (ver tabla anterior).2093. **Escribir el ADR** desde `assets/adr-template.md`:210 - Frontmatter YAML: `id: ADR-XXX`, `status` (ver regla de default abajo), `last_update` = hoy, `deciders`, `tags`, `supersedes: null`, `superseded_by: null`, `emits: []` (campos completos en [`references/conventions.md`](references/conventions.md)).211 - **Default de `status`:**212 - **Por defecto, `Draft`** — la decisión todavía no está en vigor o sigue en discusión.213 - **`Accepted`** si la decisión ya está vigente y el código la implementa y cumple **hoy** — típicamente al venir de `arch-discover` documentando retroactivamente algo que el repo ya hace (no una decisión nueva a futuro). No usar `Draft` para una decisión que ya rige: `Draft`/`Proposed` implican que aún no aplica, lo cual sería falso en ese caso.214 - Cuerpo: `## Contexto`, `## Decisión`, `## Alternativas consideradas` (opcional), `## Consecuencias`, `## Referencias`. **Solo el porqué** — sin enunciados normativos ni criterios (eso va al estándar).2154. **Decidir si la decisión establece una regla continua.** Preguntarse: *¿esta decisión fija una regla216 que el equipo deberá cumplir de forma continua?*217 - **No** (decisión puntual o histórica) → `emits: []`. No toca estándares. Fin del bloque de estándares.218 - **Sí** → identificar el **dominio técnico/funcional** clasificándolo con [`references/functional-domains.md`](references/functional-domains.md) (proponer otro solo si no encaja en ninguno) y continuar al paso 5.2195. **Ubicar o crear el estándar de dominio** en `docs/standards/` (identificado por su **nombre**, sin código):220 - **Si ya existe** un estándar para ese dominio (p. ej. `docs/standards/testing.md` o `docs/standards/testing/README.md`) → **actualizarlo**: añadir (o modificar) el **requisito** correspondiente, sin reescribir los requisitos existentes.221 - **Si no existe** → **crearlo** desde `assets/standard-template.md` con `name` (p. ej. `Testing Standards`), `domain` (slug), `status: Draft` (o `Active` si ya rige), `last_update` = hoy y `source_adrs`.222 - **Forma simple:** `docs/standards/<slug>.md`.223 - **Forma con documentos adicionales:** si el estándar necesita archivos de apoyo (guías, ejemplos, matrices), crear la carpeta `docs/standards/<slug>/`, escribir el estándar en `docs/standards/<slug>/README.md` y colocar los documentos adicionales dentro de esa carpeta (enlazados con rutas relativas desde el estándar). Si un estándar simple pasa a necesitar extras, migrarlo de `<slug>.md` a `<slug>/README.md`.2246. **Redactar el requisito y proponer sus criterios de cumplimiento** (campos exactos en [`references/conventions.md`](references/conventions.md)):225 - Un bloque `## <Nombre del requisito>` con: `**ID:** <slug-requisito>`, `**Estado:** Active` (los otros valores, `Deprecated` y `Superseded`, son para retirarlo después sin borrarlo), el párrafo de qué es / cómo se usa / cómo se implementa, que **debe incluir el enunciado normativo con RFC 2119** (MUST/SHOULD/MAY… en mayúsculas), y `### Excepciones`. **No** incluir aquí los criterios de cumplimiento: van todos juntos en la tabla única `## Criterios de cumplimiento`, al final del documento (antes de `## Referencias`). El **origen y la verificación se registran por criterio (CR)**, no a nivel de requisito.226 - **Los CR no se escriben directamente: se proponen y el usuario elige.** Cada criterio define un **resultado arquitectónico medible y su umbral**, no una decisión de implementación — la tecnología o herramienta con que se logra o verifica pertenece a la implementación, salvo que sea explícitamente una restricción arquitectónica (ver el objetivo en [`references/fitness-functions.md`](references/fitness-functions.md)). Derivar los criterios candidatos del requisito, investigar el **mecanismo de verificación** de cada uno, presentarlos en una **tabla de propuesta simplificada** (`#`, criterio, enfoque y la herramienta con la que se verificaría — sin comandos ni código, que aún no existen) y preguntar al usuario **cuáles quiere crear** y **para cuáles quiere la fitness function ahora** — flujo completo en [`references/fitness-functions.md`](references/fitness-functions.md). Solo lo seleccionado se escribe.227 - Añadir a la tabla única `## Criterios de cumplimiento` la fila (o filas) `CR-XXX` **seleccionadas**: `ID` (`CR-XXX`, correlativo único en el estándar), `Requisito` (el `ID` del requisito al que pertenece), `Descripción` (medible, con RFC 2119 si es normativa), `Origen` (`ADR-XXX`), `Automatizable` (yes/no), `Enfoque` (`bloqueante`/`warning`; por defecto `bloqueante`) y `Verificación` (yes/no: si la verificación ya existe; la ruta del chequeo no se escribe — se resuelve por convención).228 - **Enlazar en ambos sentidos:** añadir la referencia global de cada CR (`<slug-estándar>/CR-XXX`, p. ej. `testing/CR-001`) al `emits` del ADR, y el `ADR-XXX` a `source_adrs` del estándar (a nivel de documento) además de en la columna `Origen` del CR.2297. **Crear las fitness functions que el usuario seleccionó en el paso 6** — flujo completo en [`references/fitness-functions.md`](references/fitness-functions.md): **instalar y configurar** la herramienta ya decidida en la propuesta si hace falta, y registrar el chequeo en el **archivo de checks de su estándar** (`scripts/arch/checks/<slug-estándar>.<ext>`, un archivo por estándar, con la trazabilidad `CR-XXX` en comentarios y líneas de salida), asegurando el **runner** `scripts/arch/verify.<ext>` — ambos escritos en el **lenguaje del stack del repo** (p. ej. Node en un proyecto Angular/React/Vue). Al quedar registrado el chequeo, **volver a la fila del CR** y poner `Verificación: yes` (los CR seleccionados sin fitness function se quedan en `no`, pendientes). La verificación cuelga de **cada criterio de cumplimiento**, no del requisito, del ADR ni del estándar entero.2308. **Ofrecer instalar dependencias referenciadas ausentes** — flujo en [`references/dependencies.md`](references/dependencies.md) (no repite las herramientas de fitness function ya resueltas en el paso 7).2319. **Actualizar los índices `README.md`** (los de `<raíz-arq>`, nunca los de otra raíz):232 - `docs/adr/README.md`: añadir `- [ADR-XXX: Título](ADR-XXX-slug.md)` en orden ascendente.233 - `docs/standards/README.md`: si el estándar de dominio es nuevo, añadir `- [Nombre del estándar](<slug>.md)` (forma simple) o `- [Nombre del estándar](<slug>/README.md)` (forma carpeta); si ya existía, no duplicar.234 - **Si el índice no existe todavía y la carpeta ya tenía artefactos previos** (p. ej. `docs/adr/ADR-001-*.md` y `ADR-002-*.md` ya existían pero nunca hubo `docs/adr/README.md`): al crear el índice por primera vez, listar **todos** los artefactos existentes en la carpeta (`ls docs/adr/*.md` / `docs/standards/*.md` o `*/README.md`), no solo el que se acaba de crear — el índice debe reflejar el estado real de la carpeta desde su primera versión, en el mismo orden ascendente que usaría en adelante. Si la carpeta no tenía nada más, el índice arranca con la única entrada nueva.235 - Crearlos con encabezado y lista si no existen. Nunca reordenar ni eliminar entradas.23610. **Confirmar** mostrando: la **raíz de arquitectura** usada (ruta relativa al repo principal; indicarlo explícitamente cuando no sea la raíz principal), ruta del ADR, estándar de dominio y requisito(s) añadido(s)/actualizado(s), líneas de índice, y —si aplica— la fitness function creada (en qué archivo de checks quedó), el comando del runner (`node scripts/arch/verify.mjs` en un repo Node, o el equivalente del stack; con el slug del estándar para correr solo ese) **y desde qué directorio se ejecuta** — el runner vive en `<raíz-arq>/scripts/arch/` y se corre desde `<raíz-arq>` y las dependencias instaladas.237238---239240## Flujo: Actualizar un ADR existente241242Recordar que un ADR es **histórico**: se actualiza su estado o se corrigen datos, pero no se reescribe243la decisión ya tomada — para cambiar de rumbo se crea un ADR nuevo que supersede al anterior.2442451. Identificar el archivo por número, slug o título. **El identificador solo desambigua dentro de su raíz**: si hay repositorios anidados con ADR propios y el número existe en más de uno, preguntar a cuál se refiere el usuario antes de abrir nada.2462. Leer el contenido completo antes de editar.2473. Aplicar los cambios; actualizar `last_update` a hoy si el cambio es sustantivo. **Nunca** reescribir una decisión `Accepted`; para eso, superseder.2484. Si el nuevo estado es `Superseded`:249 - Marcar `status: Superseded` y `superseded_by: ADR-XXX`. Si el usuario no lo indicó, preguntar antes de guardar.250 - En el ADR reemplazante, fijar `supersedes: ADR-<anterior>`.251 - **Revisar los criterios emitidos** (`emits`): si la decisión superseded había fijado criterios de cumplimiento (CR) que ya no rigen, actualizarlos o retirarlos de su estándar de dominio (marcando el `**Estado:**` del requisito, o el `status` del estándar entero, como `Deprecated`/`Superseded` según alcance), y enlazar el CR reemplazante si lo hay. Un ADR obsoleto no debe dejar criterios vivos huérfanos.252 Si el nuevo estado es `Deprecated`: `status: Deprecated`, actualizar `last_update`, registrar el motivo en `## Referencias` y aplicar el mismo repaso a sus criterios.2535. Actualizar `docs/adr/README.md` si el título cambió.2546. **Confirmar** mostrando los campos modificados y el impacto en criterios emitidos.255256---257258## Flujo: Crear o actualizar un estándar / requisito directamente259260> Aplica al caso **C** de la [clasificación del input](#clasificar-el-input-antes-de-redactar-adr-estándar-o-ambos): una regla verificable sin decisión nueva. No arrastrar aquí el porqué/drivers/alternativas — eso, si hace falta documentarlo, es un ADR aparte.261262A veces se refina una regla sin una decisión nueva (afinar un umbral, ampliar el alcance, aclarar una263excepción, añadir un requisito a un dominio existente). El estándar es **vivo**: se edita.2642651. **Todo criterio de cumplimiento (CR) debería trazar a un ADR** (columna `Origen` + `source_adrs`). Si se pide añadir un criterio266 sin decisión registrada, ofrecer crear primero el ADR de origen (flujo de arriba). Si el usuario267 prefiere no crearlo, permitir el CR dejando constancia de que su decisión de origen está268 pendiente de documentar (lo señalará `arch-audit`).2692. Resolver `<raíz-arq>` si aún no está fijada e identificar el estándar de dominio **dentro de ella** (o crearlo, `docs/standards/<slug>.md` o `docs/standards/<slug>/README.md` si lleva documentos adicionales; dominio según [`references/functional-domains.md`](references/functional-domains.md)).2703. Añadir o editar el bloque de requisito (`ID`, `Estado`, descripción con el enunciado normativo en RFC 2119, `Excepciones`). Si el cambio implica **CR nuevos**, pasar antes por la **propuesta y selección** de [`references/fitness-functions.md`](references/fitness-functions.md) (tabla simplificada de criterios candidatos → el usuario elige cuáles crear), y escribir solo los seleccionados como filas `CR-XXX` en la tabla única `## Criterios de cumplimiento`, al final del documento (`Requisito`, `Descripción`, `Origen`, `Automatizable`, `Enfoque`, `Verificación`; ver [`references/conventions.md`](references/conventions.md)). Actualizar `last_update` a hoy.2714. Reevaluar la fitness function de cada CR afectado: si cambió su descripción, ajustar su chequeo en el archivo de checks de su estándar (`scripts/arch/checks/<slug-estándar>.<ext>`; ver [`references/fitness-functions.md`](references/fitness-functions.md)).2725. Si el nuevo estado del estándar o de un requisito es `Deprecated`/`Superseded`, enlazar el reemplazo y actualizar `docs/standards/README.md`.2736. **Confirmar** los cambios.274275---276277## Anti-patterns278279- **Narrar el flujo interno**: anunciar que se resuelve el idioma o la política, que se lee `settings.json`, que se carga una referencia, o ir enumerando los pasos en voz alta. Al usuario se le comunica el resultado, las preguntas que el flujo exija y lo que quede pendiente — no la maquinaria.280- Mezclar el alcance de ADR y estándar: meter el enunciado normativo (RFC 2119) o los criterios de cumplimiento dentro del ADR, o el contexto/alternativas/consecuencias dentro del estándar. Cada uno contiene solo lo suyo y se enlazan por referencia (`emits` ↔ `source_adrs`/`Origen`).281- Crear un estándar nuevo por cada decisión en vez de añadir un requisito al estándar de dominio existente — el estándar es de **dominio**, no de decisión.282- Redactar un ADR o un requisito sin pasar primero por la [Validación de conflictos](#validación-de-conflictos-solo-al-crear): duplicar o contradecir un ADR `Accepted` o un requisito `Active` ya existente.283- Reescribir la decisión de un ADR `Accepted` en vez de crear uno nuevo que lo supersede — un ADR es histórico e inmutable una vez aceptado.284- Marcar un ADR `Superseded`/`Deprecated` sin revisar los criterios (`emits`) que fijó: dejar CR huérfanos vigentes en un estándar cuando la decisión que los originó ya no rige.285- Escribir los `CR-XXX` en el estándar sin presentar antes la **tabla de propuesta** y dejar que el usuario elija cuáles crear — los criterios se proponen, no se imponen (`references/fitness-functions.md`).286- Escribir en la tabla del estándar filas de criterios que el usuario **no seleccionó** (aunque se hayan propuesto, aunque parezcan buena idea, aunque sea «para dejarlos pendientes») — solo lo seleccionado se crea y se registra.287- Preguntar «¿creo la fitness function?» sin haber investigado ni mostrado la **herramienta concreta** con la que se verificaría (y si hay que instalarla): el usuario no puede decidir sobre un chequeo que no sabe cómo se hará. El comando y el código no se muestran aquí — todavía no existen.288- Crear una fitness function sin la aprobación explícita del usuario, o sin investigar primero si ya existe una herramienta/convención establecida para ese chequeo en el stack — un script propio a medida es el último recurso, no el primero (`references/fitness-functions.md`).289- Quemar números `CR-XXX` en criterios que el usuario aún no ha seleccionado — los candidatos se numeran `C1`, `C2`… solo para la conversación; el `CR-XXX` se asigna al escribir.290- Dejar la herramienta de verificación de una fitness function sin instalar cuando el usuario aceptó instalarla, o repreguntar por ella en el paso de dependencias generales (`references/dependencies.md`) después de ya haberla resuelto en `references/fitness-functions.md`.291- Escribir el runner o los checks en un lenguaje ajeno al stack del repo (p. ej. shell en un proyecto Node) — se escriben con el runtime que el proyecto ya usa; el shell POSIX es solo el último recurso cuando el repo no tiene ningún runtime de stack.292- Crear un archivo de chequeo por criterio de cumplimiento — el archivo de checks es **por estándar** (`scripts/arch/checks/<slug-estándar>.<ext>`); la trazabilidad por CR va dentro, en comentarios y en las líneas de salida de cada chequeo.293- Instalar o configurar dependencias sin la aprobación explícita del usuario, o correr build/suites completas por iniciativa propia.294- Al invocarse en lote (p. ej. desde `arch-discover`), volver a preguntar los decisores o la instalación de dependencias por cada artefacto en vez de resolverlo una sola vez para todo el lote.295- Pedirle al usuario el número del próximo ADR o CR — siempre se calcula releyendo `docs/adr/` o la tabla del estándar, nunca se pregunta.296- Escribir los artefactos de arquitectura en el `docs/` del repo principal cuando la decisión trata del código de un **submódulo** (o al revés). El ADR, el estándar y sus checks se versionan junto al código que gobiernan: se resuelve `<raíz-arq>` **antes** de tocar nada.297- Dar por hecha la raíz cuando el workspace tiene submódulos: se **pregunta** (una vez por invocación o lote). Y al revés: preguntarla en un repo sin repositorios anidados, donde no hay nada que elegir.298- Continuar la numeración `ADR-XXX` de una raíz en otra, o tratar como conflicto/duplicado un ADR que vive en otra raíz — cada repositorio lleva su propia serie independiente.299- Redirigir, mover o duplicar artefactos de `docs/specs/` por haber elegido un submódulo como raíz de arquitectura: las especificaciones se resuelven siempre contra `specification.basePath`, sobre el repo principal.300301---302303## Archivos del skill (contexto progresivo)304305Este SKILL.md contiene el concepto, la clasificación del input y los flujos. El detalle de consulta306puntual está en archivos aparte; **leer cada uno solo cuando la tarea lo pida** (así el contexto se307mantiene ligero):308309**Plantillas y activos (`assets/` — copiar/rellenar al redactar):**310311- `assets/adr-template.md` — plantilla del ADR. Leer antes de escribir un ADR.312- `assets/standard-template.md` — plantilla del estándar (requisitos + tabla de `CR-XXX`). Leer antes de crear/editar un estándar.313- `assets/arch-fitness/` — implementación de referencia del runner, en Node (`verify.mjs`, `checks/example.mjs.template`, `README.md` con el contrato). En un repo Node se copia al crear el runner; en otro stack se genera el equivalente en ese lenguaje con el mismo contrato.314315**Referencias de consulta (`references/` — leer bajo demanda):**316317- [`references/functional-domains.md`](references/functional-domains.md) — catálogo de los 9 dominios funcionales canónicos. Leer al **clasificar el dominio** de un estándar (casos B/C).318- [`references/conventions.md`](references/conventions.md) — convenciones de identidad, numeración y **frontmatter** de ADR / estándar / requisito / CR. Leer al escribir frontmatter o identificadores.319- [`references/fitness-functions.md`](references/fitness-functions.md) — cómo **proponer los criterios (CR) con su mecanismo de verificación** para que el usuario elija cuáles crear, cómo crear la **fitness function** de los seleccionados, registrarla en el archivo de checks de su estándar y mantener el **runner** `scripts/arch/verify.<ext>`. Leer **antes de escribir CR nuevos**, al automatizar un CR o al tocar el runner.320- [`references/dependencies.md`](references/dependencies.md) — flujo para ofrecer **instalar dependencias** ausentes que referencia la decisión. Leer tras crear los artefactos si referencian una tecnología concreta.321322323### Referencias compartidas del plugin324325Reglas transversales del catálogo; viven en la raíz del plugin, no en este skill.326327- [`${PLUGIN_ROOT}/reference/language.md`](../../reference/language.md): **Idioma** — resolución obligatoria del idioma de artefactos y mensajes. *Lectura obligatoria antes de ejecutar el skill.*328- [`${PLUGIN_ROOT}/reference/artifacts.md`](../../reference/artifacts.md): **Artefactos** — rutas del harness, **resolución de la raíz de arquitectura** (repo principal vs. submódulo), identificadores, archivado. *Lectura obligatoria al resolver una ruta o calcular un ID.*329330---331332## Referencias333334- [Architecture Decision Records](https://github.com/joelparkerhenderson/architecture-decision-record)335- [Documenting Architecture Decisions — Cognitect](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions)336- [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119) · [RFC 8174](https://www.rfc-editor.org/rfc/rfc8174) (BCP 14) — palabras clave normativas.337- *Building Evolutionary Architectures* (Ford, Parsons, Kua) — concepto de fitness functions.