docs: traer los registros al repositorio y poner TD-001/ADR-0067/G-066 al día (cierra TD-010) - #21
Merged
Merged
Conversation
…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>
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.mdyGAPS.mdno estaban aquí y nunca habían estado. LosD-NNNyG-NNNque 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.
unimar-peru/unimar-umsy rebrandeadas.../../reference/..., rutas del origen) se convierten en referencia textual: un enlace muerto miente más que una referencia sin enlazar.DECISIONS.mdabre 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:
ums_authorizationums_platformums_identityigaums_configurationauditapprovalsEs 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:ApproveTenantSignupCommandHandlerTenant+UserAccount+SignupRequestApproveRequestCommandHandlerApprovalRequest+ProfileOrden 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: trueen los tres entornos yUseBusOutbox(), así que el publish previo aSaveChangesAsyncno va al broker — escribe en el outbox del mismoDbContexty se entrega tras el commit. Lo dice el propio código enDependencyInjection.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-276…G-291) citan un segundo registro, deevolith-core, que no he podido localizar. ums cita dos registros que comparten el espacioG-NNN. Anotado enGAPS.md.🤖 Generated with Claude Code