Skip to content

docs: traer los registros al repositorio y poner TD-001/ADR-0067/G-066 al día (cierra TD-010) - #21

Merged
beyondnetPeru merged 4 commits into
mainfrom
docs/td010-registros-propios
Aug 10, 2026
Merged

docs: traer los registros al repositorio y poner TD-001/ADR-0067/G-066 al día (cierra TD-010)#21
beyondnetPeru merged 4 commits into
mainfrom
docs/td010-registros-propios

Conversation

@beyondnetPeru

@beyondnetPeru beyondnetPeru commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Cierra TD-010 y pone al día tres registros que afirmaban cosas que el código contradice. Cero líneas de código: ninguna corrección es una decisión nueva.


Parte 1 — Los registros vienen al repositorio (TD-010)

DECISIONS.md y GAPS.md no estaban aquí y nunca habían estado. Los D-NNN y G-NNN que citan la arquitectura de solución, los objetivos de calidad, el modelo de amenazas, el PRD y ~180 comentarios del código apuntaban a ficheros inexistentes.

Lo que costó: preguntado si se había descartado GraphQL, los ADRs eran el sitio natural donde mirar — y 0055 y 0059 decían Aceptado, así que la respuesta fue «no se decidió nada». Falso. D-007 lo había decidido el 2026-07-14, un mes antes, y el código seguía con el tier completo.

  • 255 brechas y 39 decisiones portadas desde unimar-peru/unimar-ums y rebrandeadas.
  • 134 enlaces resuelven, 0 rotos. 55 necesitaron recalcular su profundidad de ../.
  • 77 enlaces muertos que traían los ficheros portados (./reference/..., rutas del origen) se convierten en referencia textual: un enlace muerto miente más que una referencia sin enlazar.
  • Las entradas heredadas conservan numeración y describen el estado del origen. DECISIONS.md abre con una tabla de qué se ha verificado aquí —D-007, D-008, D-009— y dice que el resto no.

Parte 2 — Tres registros puestos al día

TD-001 — decía que se viola el aislamiento, y no es cierto

Las tablas ya están separadas por esquema, que es lo que pide ADR-0067:

Esquema Configs Esquema Configs
ums_authorization 413 ums_platform 90
ums_identity 337 iga 36
ums_configuration 264 audit 33
approvals 264

Es un contexto sobre siete esquemas. Lo compartido —y esa sí es la deuda— son tres cosas: un snapshot EF de 3.424 líneas que todos regeneran, un outbox único, y una frontera transaccional única.

Lo que de verdad bloquea la extracción: dos handlers, ya registrados como excepciones formales de D-016 y ya marcados con TODO(D-016) en el código:

Handler Escribe Estado
E1 ApproveTenantSignupCommandHandler Tenant + UserAccount + SignupRequest Justificada (arranque indivisible)
E2 ApproveRequestCommandHandler ApprovalRequest + Profile Provisional

Orden correcto: saga primero, partir después. Partir manteniendo conexión compartida arregla el conflicto de migraciones y no avanza un metro hacia la extracción: muda el acoplamiento de «un DbContext» a «una transacción compartida».

Se documenta también el cómo: un outbox por contexto (ya hay dos registrados aquí), y por qué E2 es menor de lo que «saga» sugiere — su consumidor ya es idempotente (if (isNewProfile) Add else Update) y el evento que consumiría, ProfileAssignedToUserEvent, ya se emite hoy.

ADR-0067 — promete una extracción hoy imposible

«Puede migrarse a otra base con cambios mínimos» no se cumple mientras E1 y E2 escriban entre esquemas en una transacción. Anotado en ambos idiomas: retirarlas es la precondición de esa promesa, no su consecuencia.

G-066 — su D4.1 ya está arreglado

Declara como bug la publicación pre-commit («mensaje fantasma»). Verificado: EnableOutbox: true en los tres entornos y UseBusOutbox(), así que el publish previo a SaveChangesAsync no va al broker — escribe en el outbox del mismo DbContext y se entrega tras el commit. Lo dice el propio código en DependencyInjection.cs:294. La ficha no se actualizó al activarlo.


Lo que este PR no autoriza

Nada aquí es una decisión, así que nada requiere código. Cuando llegue el disparador de la Fase 3 tampoco hará falta un ADR nuevo: D-016 y ADR-0098 ya lo gobiernan. Lo que sí lo exigiría, por S-06 y el precedente de D-012 («la implementación arranca al aceptarse el ADR»), es cambiar la postura — y eso sería un ADR superador aceptado aguas arriba en evolith-core.

Pendiente

Trece identificadores (G-276G-291) citan un segundo registro, de evolith-core, que no he podido localizar. ums cita dos registros que comparten el espacio G-NNN. Anotado en GAPS.md.

🤖 Generated with Claude Code

beyondnetPeru and others added 2 commits August 10, 2026 15:13
…rra TD-010)

`DECISIONS.md` y `GAPS.md` no estaban aquí y nunca habían estado. Los identificadores
`D-NNN` y `G-NNN` que citan la arquitectura de solución, los objetivos de calidad, el
modelo de amenazas, el PRD y ~180 comentarios del código apuntaban a `../../DECISIONS.md`
y `../../GAPS.md`: ficheros inexistentes. Todos esos enlaces estaban muertos.

Lo que costó: preguntado si se había descartado GraphQL, los ADRs eran el sitio natural
donde mirar, y 0055 y 0059 decían Aceptado, así que la respuesta fue «no se decidió
nada». Falso. D-007 lo había decidido el 2026-07-14, un mes antes, y el código seguía
con el tier completo. Salió a la luz por una frase suelta de solution-architecture.es.md.

Ambos registros pasan a la raíz, portados desde `unimar-peru/unimar-ums` y rebrandeados
al satélite: 255 brechas y 39 decisiones. Los 134 enlaces relativos de `docs/` resuelven;
55 necesitaron recalcular su profundidad de `../`, porque se escribieron para la taxonomía
del repositorio de origen y la resincronización remapeó los documentos sin ajustarlos.

Las entradas heredadas conservan su numeración para que las citas existentes sigan
resolviendo, y su redacción describe el estado de la PLATAFORMA DE ORIGEN en el momento
del porte. `DECISIONS.md` abre con una tabla explícita de qué decisiones se han
verificado aquí —D-007, D-008, D-009— y dice sin rodeos que el resto no. D-007 es la
prueba permanente de que «decidido» e «implementado» pueden separarse un mes sin que
nadie lo note.

## Queda abierto: el segundo registro

Trece identificadores que este repositorio cita —G-276, G-277, G-278, G-280 a G-285,
G-287, G-289, G-290 y G-291— NO existen en el registro portado, que termina en G-257.
Los documentos que los citan (plan de paralelización e2e, gating de RoboSoft) los
atribuyen a `evolith-core`, cuyo registro no se ha podido localizar: ni en el clon local
de `evolith` ni en la raíz de `evolith_arch32`.

Es decir: ums cita DOS registros que comparten el espacio de nombres `G-NNN`, lo que
además permite que un mismo identificador signifique cosas distintas según de cuál venga.
Queda anotado en GAPS.md bajo «Brechas citadas sin entrada localizable».

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Tres registros que afirmaban cosas que el código contradice. Ninguna corrección es una
decisión nueva, así que ninguna trae código.

## TD-001 — decía que se viola el aislamiento, y no es cierto

Las tablas YA están separadas por esquema PostgreSQL —ums_authorization 413 configs,
ums_identity 337, ums_configuration 264, approvals 264, ums_platform 90, iga 36,
audit 33—, que es justo lo que pide ADR-0067. Es un contexto sobre siete esquemas, no
sobre una base plana.

Lo compartido, y esa sí es la deuda, son tres cosas: un snapshot EF único de 3.424
líneas (dos personas en contextos distintos regeneran el mismo fichero → conflicto
seguro), un outbox único, y una frontera transaccional única.

Se nombra además lo que de verdad bloquea la extracción: DOS handlers, ya registrados
como excepciones formales de D-016 y ya marcados en el código con `TODO(D-016)` —
ApproveTenantSignupCommandHandler (E1, justificada) y ApproveRequestCommandHandler
(E2, provisional). Y el orden correcto cuando llegue el disparador: SAGA PRIMERO,
partir después. Partir manteniendo una conexión compartida arregla el conflicto de
migraciones y no avanza un metro hacia la extracción: muda el acoplamiento de «un
DbContext» a «una transacción compartida».

Se documenta el «cómo» del outbox al partir (uno por contexto, dos ya registrados aquí)
y por qué E2 es menor de lo que «saga» sugiere: su consumidor ya es idempotente
—`if (isNewProfile) Add else Update`— y el evento que consumiría, ProfileAssignedToUserEvent,
ya se emite hoy.

## ADR-0067 — promete una extracción que hoy es imposible

Su «puede migrarse a otra base con cambios mínimos» no se cumple mientras E1 y E2
escriban entre esquemas en una sola transacción. Se anota en ambos idiomas que retirarlas
es la PRECONDICIÓN de esa promesa, no su consecuencia.

## G-066 — su D4.1 ya está arreglado

Declara como bug la publicación pre-commit («mensaje fantasma»). Verificado en ums:
`EnableOutbox: true` en los tres entornos y `AddEntityFrameworkOutbox` con
`UseBusOutbox()`, así que el publish previo a SaveChangesAsync NO va al broker: escribe
en la tabla de outbox del mismo DbContext y se entrega tras el commit. Lo dice el propio
registro en DependencyInjection.cs:294. La entrada no se actualizó al activarlo.

## Enlaces de los registros importados

Los ficheros portados traían 77 enlaces relativos a rutas del repositorio de origen
(`./reference/...`, `./docs/...`) que aquí no existen. Se convierten en referencia
textual con su ruta y la nota de que viven en la plataforma de origen: un enlace muerto
miente más que una referencia sin enlazar. Verificado: 0 enlaces rotos en los ficheros
que toca este trabajo.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@beyondnetPeru beyondnetPeru changed the title docs: traer los registros de decisiones y brechas al repositorio (cierra TD-010) docs: traer los registros al repositorio y poner TD-001/ADR-0067/G-066 al día (cierra TD-010) Aug 10, 2026
beyondnetPeru and others added 2 commits August 10, 2026 15:46
El primer análisis dio por «perdidos» trece identificadores (G-276 a G-291) que este
repositorio cita y su registro no tiene. No están perdidos: pertenecen a los registros
de OTROS repositorios, y el propio plan de paralelización e2e los atribuye en su tabla
— G-283 es del Tablero SDLC, G-290 de evolith-core, G-277 compartida.

La brecha real es otra y es más interesante: tres repositorios numeran G-NNN de forma
independiente, así que un identificador suelto no dice dónde buscarlo, y nada impide
que el mismo número signifique cosas distintas en dos de ellos.

Medida provisional: el plan e2e abre con una leyenda que reparte los identificadores
por registro y avisa de que este registro llega a G-257, de modo que cualquier número
por encima no es de ums. Arreglo de raíz: cualificar en origen (evolith-core#G-290),
que es convención de escritura y no herramienta.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…-012)

Pasada de verificación sobre las 25 historias marcadas «Implemented / usable».

Las 25 responden por REST contra una API viva: el backend no es el problema. El
problema es que los tres defectos corregidos hoy eran de FRONT e invisibles desde la
API — FS-20/FS-13 guardaban false en todo parámetro booleano y FS-05 enviaba undefined
como id de usuario. Tres historias en verde mientras estaban rotas.

La causa es estructural: NADA conecta una historia con la prueba que la respalda. 23
ficheros e2e, 84 casos, y exactamente uno nombra una historia (FS-26, que ni siquiera
está entre las 25). La matriz de trazabilidad mapea FS → ADR → Enabler, nunca FS →
prueba. Por palabra clave, FS-16, FS-38 y FS-39 no tienen ningún rastro en el e2e.

La columna se lee como verificación y es intención. Se anota en ambos trackers y se
registra como TD-012, con el arreglo barato: nombrar la historia en cada caso e2e y que
CI exija al menos uno por historia marcada usable. Misma forma que TD-004 — no añade
trabajo y hace imposible sostener la afirmación en falso.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@beyondnetPeru
beyondnetPeru merged commit 16e1bae into main Aug 10, 2026
12 checks passed
@beyondnetPeru
beyondnetPeru deleted the docs/td010-registros-propios branch August 10, 2026 21:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant