In this guide (16 items)
Specification Traceability
Trazabilidad de especificación funcional externa → código
Para qué existe. Cuando la especificación funcional no la escribimos nosotros —la entrega el cliente o la consultora, versionada, con identificadores propios— el trabajo no es diseñar: es demostrar, criterio a criterio, qué está cumplido y qué no, y de quién es lo que falta. Esta guía define los dos artefactos que sostienen esa demostración y las reglas que impiden que cada auditoría cueste lo mismo que la primera.
Cuándo aplica. Hay un documento funcional externo con identificadores (
RF-,CA-,RNF-) y alguien va a preguntar «¿esto ya está?». Si la spec la escribimos nosotros, el camino es el contrario y manda arch-doc-spec.md y adr.md.
Guías compañeras: spec-funcional.md (anatomía del documento funcional) · testing.md (cómo se prueba un criterio) · adr.md (cuando el hueco es una decisión).
1. La cadena
Funcional externo (vNN) → Especificación técnica → Código → Matriz de cobertura RF-XX-01 RF → componente clase CA-XX-01 ✅ + evidencia CA-XX-01 testCuatro eslabones, y cada uno cruza por identificador. Si el identificador no cruza, la cadena está rota aunque las cuatro piezas existan.
Deriva real medida: la especificación técnica de abonos escribe CA-AB-001 (tres dígitos) y el
funcional escribe CA-AB-01 (dos). Ninguna verificación automática cruza esa frontera, y la
trazabilidad parece completa cuando no lo es.
Regla: el identificador se escribe exactamente como lo escribe el funcional vigente. En la técnica, en el código, en los tests y en los commits. Sin ceros de relleno, sin variantes.
2. Regla de vigencia — qué documento mide
Manda un solo documento, y se nombra. El resto es historia del porqué, no medida de cumplimiento.
| Documento | Qué es |
|---|---|
Funcional vigente (vNN) | La única medida de cumplimiento |
| Especificaciones técnicas previas | Historia del diseño previsto. Parcialmente derogadas por ADR. No se auditan |
| ADR | Explican por qué el código se apartó. No sustituyen al funcional |
Sin esta regla, cada auditoría vuelve a discutir si el código incumple la técnica o si la técnica quedó atrás. Es discusión sin final: la técnica siempre queda atrás.
3. Artefacto A — matriz de cobertura criterio por criterio
Fichero: cobertura-criterio-por-criterio-<vNN>.md, junto a la spec.
Cabecera obligatoria
Módulo · fecha de corte · número de revisión · resultado del build verificado en ese corte
(./mvnw verify exit 0, con el commit). Un corte sin build verificado no es un corte.
Y un bloque «qué cambió respecto del corte anterior», y sólo eso. Es lo que hace que la revisión número nueve se lea en dos minutos.
Secciones
| # | Sección | Contenido |
|---|---|---|
| — | Regla de vigencia | Qué documento mide (§2) |
| 1 | Superficie construida | Clases, migraciones, ADR por estado, pruebas y cobertura, trazabilidad por citación del identificador en src/ |
| 2 | Los N criterios | Una fila por criterio: id · veredicto · evidencia |
| 3 | Criterios técnicos | Los CAT-, aparte: tienen otro dueño con frecuencia |
| 4 | Requisitos, casos de uso e historias | Qué RF/UC/HU no aparecen citados, y qué significa cada ausencia |
| 5 | Los huecos, con dueño | La sección que más se usa. Ver §5 de esta guía |
| 5b | Reparto por fase | Qué criterio es de qué fase según el funcional, que no es lo mismo que quién lo construyó |
| 6 | Cómo se audita esto | Las seis reglas, copiadas dentro del documento |
Veredictos
| Símbolo | Significa |
|---|---|
| ✅ | Cubierto con evidencia nombrada |
| ⚠️ | Cubierto pero inerte — el código existe y nada lo ejercita (catálogo vacío, topic sin consumidor, doble local) |
| 🔴 | Hueco |
| ⛔ | Defecto del propio funcional, no del código |
| ↗ | Traspasado a otro servicio. Nombra lo que se fue, para que nadie busque un fichero que ya no existe |
⚠️ es el veredicto que más trabajo ahorra: distingue “está programado” de “funciona”. Sin él, un
catálogo creado y vacío pasa por verde.
Una fila
| `CA-AB-01` | ✅ | `RecibirNotificacionUseCase`, `V2`, `NotificacionAbonoControllerIT` |Evidencia = ficheros que existen. Nada más.
Medir una cosa por casilla
La fila de trazabilidad mide una sola cosa: que el identificador aparezca citado en src/. No
mezclar con “tiene escenario” ni con “está probado”. Un corte anterior de abonos decía HU-AB 8/8
mezclando dos medidas, y dos medidas en una casilla no se pueden auditar.
4. Las seis reglas de auditoría
Se copian dentro del documento, no se enlazan. Existen porque una auditoría sin línea base ni criterio de parada vuelve a resolver todos los criterios cada vez y produce hallazgos que no lo son.
- Sólo se audita el funcional vigente.
- Se compara contra la matriz anterior, no se re-deriva. Un criterio que nadie tocó no se vuelve a resolver. Se reporta lo que cambió respecto del corte previo.
- Una ausencia no se afirma sin verificarla dos veces. Que un identificador no aparezca en el
código es información, no veredicto: se confirma leyendo la implementación, no el
grep. - Un veredicto nombra su evidencia. Una fila ✅ sin fichero que la sostenga es una opinión.
- Lo que depende de un tercero se queda en rojo con su identificador al lado. No se marca verde
lo que no ejecutamos, aunque la puerta exista y funcione en el
pom.xml. - Cuando cambia la versión del funcional: primero el delta, después la matriz. Rebasear sin delta es volver a resolverlo todo — justo lo que la regla 2 prohíbe.
El corolario de la regla 6
Un identificador puede cambiar de significado entre versiones sin cambiar de nombre. En abonos,
S-05 era el contrato de respuesta en v19 y es la ventana de retención del duplicado en v20. Al
rebasear se comprueban también los identificadores que no aparecen en la lista de cambios.
5. Los huecos, con dueño
La sección de mayor valor operativo, y la entrada natural de /tasking.
| Hueco | Bloqueo | Dueño ||:--|:--|:--|| `CA-XX-27a` | Qué forma tiene el asiento cuando el payload no trae cliente ni monto. Ni el funcional ni Ledger_v1 §2.2 lo dicen. El transporte está construido | Producto + Ledger || ~~`CA-XX-16`~~ | **Cerrado el 2026-09-08** | — |Tres reglas:
- Un hueco cerrado no se borra: se tacha con su fecha. Borrarlo hace que la siguiente revisión lo vuelva a investigar.
- El dueño es un equipo, no una persona, y va siempre. Un hueco sin dueño es un hueco sin destinatario.
- Distinguir “falta código” de “falta contrato”. Si lo que falta es que un tercero defina algo, construirlo es adjudicar en nombre de otro. Se queda en rojo y se manda.
Marca los huecos nuevos del corte (🆕) para que el lector no los busque.
6. Artefacto B — delta entre versiones del funcional
Fichero: delta-funcional-<vN>-a-<vM>.md. Se escribe antes de rebasear la matriz.
Cabecera: módulo · corte · las dos fuentes con sus fechas · build verificado.
Se recorre bloque por bloque y cada cambio cae en uno de cinco cubos:
| Cubo | Qué implica |
|---|---|
| Ratifica lo construido | Nada que hacer. Puede cerrar un hueco o legitimar una decisión tomada sin autorización |
| Cambia el contrato | Trabajo nuestro, acotado. Vigilar el defecto latente que un cambio de contrato destapa |
| Abre trabajo nuevo | Lo caro. Cada uno con su pregunta delante y su dueño |
| Cambia de dueño | Un criterio deja de ser exigible aquí. Se documenta, no se borra |
| Sin efecto en código | Redacción, renumeración, documentos relacionados. Es la mayoría |
Cierra con dos secciones: efecto sobre la matriz de cobertura (qué veredictos se mueven y por qué) y orden propuesto (en qué secuencia atacar lo que abrió).
El resumen va arriba, en una tabla de cuentas: 60 bloques cambiados, 3 identificadores nuevos, ninguno retirado. Es lo que permite decidir si el delta es asumible antes de leerlo entero.
7. Disparadores
Se rehace la matriz cuando: cambia el funcional · se toca el código de un requisito · hay auditoría externa. Nada más. Una matriz que se rehace “por si acaso” deja de tener línea base.
8. Registro de identificadores
El funcional define sus prefijos en su propia tabla (ver spec-funcional.md). Lo que nosotros añadimos encima necesita su propio registro, y es donde aparece la deriva:
| Prefijo | Qué identifica | Quién lo define |
|---|---|---|
RF-, RNF-, CA-, UC-, HU-, S- | Requisitos, criterios, casos, historias, supuestos | El funcional externo |
CAT- | Criterio de aceptación técnico | Nuestro |
B- | Bloqueo: falta un contrato o una definición de un tercero | Nuestro |
D- | Dependencia de ejecución: infraestructura, CI, configuración de ambiente | Nuestro |
H- | Hallazgo de auditoría | Nuestro |
P- | Pendiente de aclaración con el cliente | Nuestro |
Todo prefijo que usemos se define en una tabla del documento donde aparece. En la técnica de
abonos conviven P-01…P-08 y B-02…B-07 en una sola tabla titulada «Pendientes Críticos», y
ninguno de los dos está definido en la guía de identificadores. El lector no puede saber si son lo
mismo.
B- y D- no son intercambiables: B- bloquea el diseño (no sabemos qué construir), D-
bloquea la ejecución (sabemos qué construir, falta que alguien lo encienda).
9. Anti-patrones
| No hagas | Haz |
|---|---|
| Marcar ✅ citando un fichero que no existe | Verificar que existe. Una auditoría de abonos encontró 12 ficheros citados inexistentes |
Marcar ✅ porque la puerta existe en el pom.xml | Si no se ejecuta, no es verde. CAT-10 estuvo en verde con 20 % de cobertura real |
| Re-derivar todos los criterios en cada revisión | Regla 2: sólo el delta |
| Rebasear a una versión nueva sin escribir el delta | Regla 6 |
| Borrar un hueco al cerrarlo | Tacharlo con la fecha |
| Borrar un criterio traspasado | ↗, nombrando lo que se fue |
| Construir lo que un tercero no ha definido | Rojo, con dueño, y mandarlo |
| Meter dos medidas en una casilla | Una casilla, una medida |
Escribir CA-XX-001 donde el funcional dice CA-XX-01 | Copiar el identificador literal |
| Confundir “programado” con “funciona” | ⚠️ para lo inerte |
10. Checklist antes de publicar un corte
- El funcional vigente está nombrado y es el único que mide
-
./mvnw verifyverificado en este corte, con el commit anotado - Cabecera «qué cambió respecto del corte anterior», y sólo eso
- Cada ✅ nombra evidencia, y cada fichero citado existe
- Lo inerte está en
⚠️, no en ✅ - Cada hueco tiene dueño; los cerrados están tachados con fecha
- Si cambió la versión del funcional, el delta está escrito y se comprobaron los identificadores que no aparecen en su lista de cambios
- Las seis reglas están copiadas dentro del documento
- Los prefijos usados están definidos en una tabla del propio documento