From e1010c375219ede1aac4788f81114637d342986e Mon Sep 17 00:00:00 2001 From: aarroyo Date: Sat, 1 Aug 2026 20:33:54 -0500 Subject: [PATCH] docs(adr): escribir el racional de T-001, y corregir que la unica linea que tenia era falsa MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `GAP-015` pide el racional tecnico de T-001. Verificarlo produjo un segundo hallazgo que la fila no menciona: **la unica linea que la entrada SI tenia era inexacta.** Decia «Inicializado en `src/` utilizando npm workspaces con Nx». Ningun `package.json` de este repositorio declara un campo `workspaces` — comprobado sobre todos ellos. Nunca se usaron. Nx orquesta por GRAFO DE PROYECTOS: `project.json` mas los plugins de inferencia `@nx/vite`, `@nx/webpack`, `@nx/eslint` y `@nx/jest` declarados en `src/nx.json`. Eso importa mas que la ausencia del racional: quien leyera la entrada buscaria un array `workspaces`, no lo encontraria, y concluiria razonablemente que el monorepo esta mal configurado — cuando lo cierto es que esta configurado de otra manera. El ADR registra las tres razones, en el orden que decidio: 1. El repositorio NO es homogeneo. `tracker-api` es .NET, y npm workspaces enlaza `node_modules` entre paquetes npm: no tiene opinion sobre un `.csproj` ni puede ordenar un `dotnet build` frente a un `vite build`. Habria cubierto tres proyectos de cuatro dejando fuera al mayor. 2. Inferencia antes que declaracion, porque una lista de targets escrita a mano deriva — el mismo modo de fallo que ya costo tiempo en `GT-647`, `GT-640` y `ADR T-038`. 3. `nx affected` vale lo que valgan sus aristas; sin ellas, «ejecuta lo que cambio» degenera en «ejecuta todo» y se va el valor que justificaba el monorepo. Se registra tambien el COSTE, que un ADR sin contrapartidas es propaganda: Nx pineado en `^22.7.5` hace de una subida mayor un evento de todo el repositorio. La entrada de `DECISIONS.md` queda corregida en ambos idiomas y enlazada al ADR. Verificado: `validate-docs`, `check-bilingual-parity`, `doc-inventory --check` y `check-gap-registry` en verde; registro intacto (mismos 107 IDs). Resultado del board: 8 OPEN, 1 DEFERRED, 98 RESOLVED. Co-Authored-By: Claude Opus 5 --- DECISIONS.es.md | 2 +- DECISIONS.md | 2 +- .../T-001-nx-monorepo-orchestration.es.md | 100 ++++++++++++++++++ docs/adrs/T-001-nx-monorepo-orchestration.md | 98 +++++++++++++++++ .../tracker-gaps-opportunities-tracking.md | 18 ++-- 5 files changed, 209 insertions(+), 11 deletions(-) create mode 100644 docs/adrs/T-001-nx-monorepo-orchestration.es.md create mode 100644 docs/adrs/T-001-nx-monorepo-orchestration.md diff --git a/DECISIONS.es.md b/DECISIONS.es.md index 82f8b83..70652f8 100644 --- a/DECISIONS.es.md +++ b/DECISIONS.es.md @@ -17,7 +17,7 @@ _Nota: Las decisiones universales se heredan del Upstream Base ([evolith_arch32] | ID | Título | Operación | Ref Upstream | ADR Local | Notas | | :---- | :---------------------------------- | :----------- | :----------- | :------------------------------------- | :------------------------------------------------------ | -| T-001 | Orquestación de Monorepo con Nx | Adoptar | ADR-0001 | — | Inicializado en `src/` utilizando npm workspaces con Nx para projects discretos | +| T-001 | Orquestación de Monorepo con Nx | Adoptar | ADR-0001 | [T-001](./docs/adrs/T-001-nx-monorepo-orchestration.es.md) | **Corregido 2026-08-01 (`GAP-015`):** la entrada anterior decía «npm workspaces con Nx», y ningún `package.json` del repositorio declara `workspaces` — nunca se usaron. Nx orquesta por GRAFO DE PROYECTOS: `project.json` más los plugins de inferencia `@nx/vite`, `@nx/webpack`, `@nx/eslint` y `@nx/jest` declarados en `src/nx.json`. La razón que decidió es que el repositorio no es homogéneo: `tracker-api` es .NET, y npm workspaces enlaza `node_modules` entre paquetes npm — habría cubierto tres proyectos de cuatro dejando fuera al mayor. | | T-002 | Adopción de Microfrontends en Fase 1| Sobrescribir | N/A | [T-002](docs/adrs/T-002-microfrontends.md) | Desviación de la topología base de Fase 1 para permitir escalabilidad concurrente de UI | | T-003 | Arquitectura Hexagonal (Ports & Adapters) | Adoptar | ADR-0002 (Core Node.js) | — | Capa de dominio sin imports de NestJS, ORM ni SDKs externos | | T-004 | TypeScript estricto como lenguaje primario | Adoptar | ADR-0003 | — | `strict: true` habilitado; imports sin usar prohibidos | diff --git a/DECISIONS.md b/DECISIONS.md index 39e51e4..4db1bce 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -24,7 +24,7 @@ _Nota: Las decisiones universales se heredan del Upstream Base ([evolith_arch32] | ID | Título | Operación | Ref Upstream | ADR Local | Notas | | :--- | :--- | :--- | :--- | :--- | :--- | -| T-001 | Orquestación de Monorepo con Nx | Adoptar | ADR-0001 | — | Inicializado en `src/` utilizando npm workspaces con Nx. | +| T-001 | Orquestación de Monorepo con Nx | Adoptar | ADR-0001 | [T-001](./docs/adrs/T-001-nx-monorepo-orchestration.md) | **Corregido 2026-08-01 (`GAP-015`):** la entrada anterior decía «npm workspaces con Nx», y ningún `package.json` del repositorio declara `workspaces` — nunca se usaron. Nx orquesta por GRAFO DE PROYECTOS: `project.json` más los plugins de inferencia `@nx/vite`, `@nx/webpack`, `@nx/eslint` y `@nx/jest` declarados en `src/nx.json`. La razón que decidió es que el repositorio no es homogéneo: `tracker-api` es .NET, y npm workspaces enlaza `node_modules` entre paquetes npm — habría cubierto tres proyectos de cuatro dejando fuera al mayor. | | T-002 | Adopción de Microfrontends en Fase 1 | Sobrescribir | N/A | [T-002](./docs/adrs/T-002-microfrontends-fase1.md) | Desviación de topología para escalabilidad de UI. | | T-003 | Arquitectura Hexagonal (Ports & Adapters) | Adoptar | ADR-0002 | — | Capa de dominio pura sin dependencias externas. | | T-004 | TypeScript estricto como lenguaje primario | Adoptar | ADR-0003 | — | `strict: true` habilitado. | diff --git a/docs/adrs/T-001-nx-monorepo-orchestration.es.md b/docs/adrs/T-001-nx-monorepo-orchestration.es.md new file mode 100644 index 0000000..6ebdfb4 --- /dev/null +++ b/docs/adrs/T-001-nx-monorepo-orchestration.es.md @@ -0,0 +1,100 @@ +--- +adr: T-001 +title: Nx orquesta el monorepo, y lo hace por grafo de proyectos — no con npm workspaces +status: Accepted +date: 2026-08-01 +tags: [EvolithSatellite, monorepo, build, tooling, nx] +authority: Retro-documenta la decisión registrada como T-001 en DECISIONS.md desde el primer commit del repositorio +relates: [T-006 frontend Vite, T-002 microfrontends fase 1, T-043 Helm supersede a Kustomize] +gaps: [GAP-015] +--- + +# ADR T-001 — Nx orquesta el monorepo + +## Status + +Aceptado, **escrito el 2026-08-01** para cerrar `GAP-015`. La decisión en sí es la más antigua del +repositorio: `DECISIONS.md` lleva `T-001` desde el principio. Lo que nunca llevó fue el *porqué* — +su entrada entera decía *«Inicializado en `src/` utilizando npm workspaces con Nx»*, que enuncia un +resultado y, según resulta, lo enuncia mal. + +## Context + +`GAP-015` dice que a `DECISIONS.md` le falta el racional técnico de T-001. Verificarlo produjo un +segundo hallazgo que la fila no menciona: **la única línea que sí tiene es inexacta.** + +Medido contra el repositorio el 2026-08-01: + +- **Ningún `package.json` de este repositorio declara un campo `workspaces`.** Ni + `src/package.json` ni ningún otro. npm workspaces no se usa, ni se usó nunca. +- Nx descubre proyectos mediante **ficheros `project.json` y plugins de inferencia** — + `@nx/vite/plugin`, `@nx/webpack/plugin`, `@nx/eslint/plugin` y `@nx/jest/plugin` están declarados + en `src/nx.json`, e infieren los targets de la configuración propia de cada proyecto en vez de + una lista de paquetes. +- El workspace tiene cuatro proyectos bajo `src/apps/`: `tracker-api`, `tracker-gateway`, + `tracker-web` y `tracker-web-e2e`. + +Que eso importe es justamente el motivo de escribirlo. Quien leyera la entrada antigua buscaría un +array `workspaces`, no lo encontraría, y concluiría razonablemente que el monorepo está mal +configurado — cuando lo cierto es que está configurado de otra manera. + +## Decision + +**Nx es el orquestador de este monorepo, a través de su grafo de proyectos. npm workspaces no se +usa, y eso es deliberado y no un olvido.** + +Tres razones, en el orden que decidió: + +### 1. El repositorio no es homogéneo, y npm workspaces da por hecho que sí + +`tracker-api` es **.NET**. npm workspaces enlaza `node_modules` entre paquetes npm; no tiene +opinión sobre un `.csproj`, no puede ordenar un `dotnet build` frente a un `vite build`, y no puede +expresar que los tests de contrato del gateway dependen del schema de la API. Adoptarlo habría +cubierto tres proyectos de cuatro y dejado fuera al mayor, precisamente de la herramienta que debe +describir el conjunto. + +El grafo de Nx es agnóstico del lenguaje: un proyecto es lo que se declare como tal, y una +dependencia es lo que se declare. + +### 2. Inferencia antes que declaración, porque una lista de targets escrita a mano deriva + +Los plugins derivan los targets de cada proyecto de la configuración que ese proyecto ya tiene —su +config de Vite, de ESLint, de Jest—. La alternativa es una segunda copia de esa información dentro +de un manifiesto de workspace, y una segunda copia es algo que olvidar. Este repositorio ha gastado +tiempo real exactamente en ese modo de fallo: listas de paquetes de Docker escritas a mano +(`GT-647`), un snapshot de evaluabilidad mantenido a mano (`GT-640`), un contrato transcrito a mano +(`ADR T-038`). Aquí aplica el mismo razonamiento. + +### 3. La ejecución por afectación necesita un grafo de verdad + +`nx affected` vale lo que valgan las aristas de dependencia que es capaz de ver. npm workspaces +expresa «el paquete A depende del B» y nada sobre un `.csproj` que referencia a otro, o un proyecto +e2e que depende de la app que conduce. Sin esas aristas, «ejecuta lo que cambió» degenera en +«ejecuta todo», y con ello se va el valor que justificaba el monorepo. + +## Consequences + +- **Quien contribuya no debe buscar `workspaces` en `package.json`.** Está ausente a propósito. El + grafo lo definen `src/nx.json` y el `project.json` de cada proyecto. +- **Añadir un proyecto es darle un `project.json`** (o una configuración que un plugin de + inferencia reconozca), no añadir una ruta a un array. +- **El coste es una dependencia de herramienta.** Nx está pineado en `^22.7.5`; sus plugins son lo + que sabe construir cada proyecto, así que una subida mayor es un evento de todo el repositorio y + no de un paquete. Ese es el intercambio aceptado a cambio de un solo grafo sobre cuatro proyectos + heterogéneos. +- **npm workspaces sigue disponible** si el repositorio llegara a ser solo npm, cosa que no ocurrirá + mientras la API sea .NET. Cambiarlo pasa por revisar este ADR, no por añadir el campo. + +## Validation + +- `grep -L workspaces $(find . -name package.json -not -path '*/node_modules/*')` devuelve todos los + ficheros — ninguno lo declara. +- `src/nx.json` lista los cuatro plugins de inferencia nombrados arriba. +- `src/apps/tracker-web/project.json` existe; `src/apps/tracker-api` no tiene ninguno, porque su + build lo conduce `dotnet` y sus targets no los infiere un plugin de npm — el caso concreto que + describen las razones 1 y 3. + +## References + +- `DECISIONS.md` → `T-001`, cuya entrada de una línea este ADR corrige y amplía. +- `GAP-015` — la fila que pidió este racional. diff --git a/docs/adrs/T-001-nx-monorepo-orchestration.md b/docs/adrs/T-001-nx-monorepo-orchestration.md new file mode 100644 index 0000000..debd1db --- /dev/null +++ b/docs/adrs/T-001-nx-monorepo-orchestration.md @@ -0,0 +1,98 @@ +--- +adr: T-001 +title: Nx orchestrates the monorepo, and it does so through project graphs — not npm workspaces +status: Accepted +date: 2026-08-01 +tags: [EvolithSatellite, monorepo, build, tooling, nx] +authority: Retro-documents the decision recorded as T-001 in DECISIONS.md since the repository's first commit +relates: [T-006 frontend Vite, T-002 microfrontends phase 1, T-043 Helm supersedes Kustomize] +gaps: [GAP-015] +--- + +# ADR T-001 — Nx orchestrates the monorepo + +## Status + +Accepted, **written 2026-08-01** to close `GAP-015`. The decision itself is the repository's +oldest: `DECISIONS.md` has carried `T-001` since the beginning. What it never carried was the +*why* — its whole entry read *"Inicializado en `src/` utilizando npm workspaces con Nx"*, which +states an outcome and, as it turns out, states it wrongly. + +## Context + +`GAP-015` says `DECISIONS.md` lacks T-001's technical rationale. Verifying it produced a second +finding the row does not mention: **the one line the entry does have is inaccurate.** + +Measured against the repository on 2026-08-01: + +- **No `package.json` in this repository declares a `workspaces` field.** Not `src/package.json`, + not any other. npm workspaces is not in use and never was. +- Nx discovers projects through **`project.json` files and inference plugins** — `@nx/vite/plugin`, + `@nx/webpack/plugin`, `@nx/eslint/plugin` and `@nx/jest/plugin` are declared in `src/nx.json`, + and they infer targets from each project's own configuration rather than from a package list. +- The workspace holds four projects under `src/apps/`: `tracker-api`, `tracker-gateway`, + `tracker-web` and `tracker-web-e2e`. + +That mattering is the point of writing this down. Someone reading the old entry would look for a +`workspaces` array, not find one, and reasonably conclude the monorepo was misconfigured — when +what is actually true is that it was configured a different way. + +## Decision + +**Nx is the orchestrator of this monorepo, through its project graph. npm workspaces is not used, +and this is deliberate rather than an omission.** + +Three reasons, in the order that decided it: + +### 1. The repository is not homogeneous, and npm workspaces assumes it is + +`tracker-api` is **.NET**. npm workspaces links `node_modules` between npm packages; it has no +opinion about a `.csproj`, cannot order a `dotnet build` against a `vite build`, and cannot express +that the gateway's contract tests depend on the API's schema. Adopting it would have covered three +projects of four and left the largest one outside the tool that is supposed to describe the whole. + +Nx's graph is language-agnostic: a project is whatever declares itself one, and a dependency is +whatever is declared. + +### 2. Inference over declaration, because a hand-maintained target list drifts + +The plugins derive each project's targets from the configuration that project already has — its +Vite config, its ESLint config, its Jest config. The alternative is a second copy of that +information inside a workspace manifest, and a second copy is a thing to forget. This repository +has spent real time on exactly that failure mode elsewhere: hand-written Docker package lists +(`GT-647`), a hand-maintained evaluability snapshot (`GT-640`), a hand-transcribed contract +(`ADR T-038`). The same reasoning applies here. + +### 3. Affected-based execution needs a real graph + +`nx affected` is only as good as the dependency edges it can see. npm workspaces expresses +"package A depends on package B" and nothing about a `.csproj` referencing another, or an e2e +project depending on the app it drives. Without those edges, "run what changed" degrades to "run +everything", and the value that justified a monorepo goes with it. + +## Consequences + +- **Contributors must not look for `workspaces` in `package.json`.** It is absent on purpose. The + project graph is defined by `src/nx.json` plus each project's `project.json`. +- **Adding a project means giving it a `project.json`** (or a configuration an inference plugin + recognises), not adding a path to a workspace array. +- **The cost is a tool dependency.** Nx is pinned at `^22.7.5`; its plugins are the thing that + knows how to build each project, so a major upgrade is a repository-wide event rather than a + package-local one. That is the trade accepted in exchange for one graph over four heterogeneous + projects. +- **npm workspaces remains available** if the repository ever becomes npm-only, which it will not + while the API is .NET. Revisiting this ADR is the way to change that, not adding the field. + +## Validation + +- `grep -L workspaces $(find . -name package.json -not -path '*/node_modules/*')` returns every + file — none declares one. +- `src/nx.json` lists the four inference plugins named above. +- `src/apps/tracker-web/project.json` exists; `src/apps/tracker-api` has none, because its build is + driven by `dotnet` and its targets are not inferred by an npm plugin — the concrete case that + rules 1 and 3 describe. + +## References + +- `DECISIONS.md` → `T-001`, whose one-line entry this ADR corrects and expands. +- `GAP-015` — the row that asked for this rationale. diff --git a/docs/audit/tracker-gaps-opportunities-tracking.md b/docs/audit/tracker-gaps-opportunities-tracking.md index 8fd3399..8b53281 100644 --- a/docs/audit/tracker-gaps-opportunities-tracking.md +++ b/docs/audit/tracker-gaps-opportunities-tracking.md @@ -27,14 +27,14 @@ This document is the only operational gap register in this repository. The maste |---:|---|---|---|---|---|---|---|---|---|:---:|:---:| | 1 | 🟡 OPEN | [GAP-011](#detail-gap-011) | Docs | Documentation gap | Docs | Docs | N/A | C4 Topology No English version | Pending owner/action definition in this register. | 🟡 MEDIUM | 🟡 MEDIUM | | 2 | 🟡 OPEN | [GAP-013](#detail-gap-013) | Docs | Documentation gap | Docs | Docs | N/A | 14 Technical Design Docs Lack ES Version | Pending owner/action definition in this register. | 🟡 MEDIUM | 🟡 MEDIUM | -| 3 | 🟡 OPEN | [GAP-015](#detail-gap-015) | Docs | Documentation gap | Docs | Docs | N/A | DECISIONS.md Lacks Description of T-001 Technical Rationale | Pending owner/action definition in this register. | 🟡 MEDIUM | 🟡 MEDIUM | -| 4 | 🟡 OPEN | [GAP-016](#detail-gap-016) | Docs | Documentation gap | Docs | Docs | N/A | Roadmap Has No Calendar Dates | Pending owner/action definition in this register. | 🟡 MEDIUM | 🟡 MEDIUM | -| 5 | 🟡 OPEN | [GAP-017](#detail-gap-017) | Docs | Documentation gap | Docs | Docs | N/A | Discovery Canvas Has No ES Version | Pending owner/action definition in this register. | 🟡 MEDIUM | 🟡 MEDIUM | -| 6 | 🟡 OPEN | [GAP-023](#detail-gap-023) | Docs | Documentation gap | Docs | Docs | N/A | Re-Do Flow Not Fully Designed | Pending owner/action definition in this register. | 🟡 MEDIUM | 🟡 MEDIUM | -| 7 | 🟡 OPEN | [GAP-025](#detail-gap-025) | Docs | Documentation gap | Docs | Docs | N/A | Portal DDD incomplete — NARROWED 2026-08-01: the strategic-map half is DONE (`reference/specs/architecture/bounded-context-map.md` calls itself «the single, authoritative strategic map» of the 9 contexts, with integration patterns and cross-context events). What remains is the four support contexts. | Only the remaining half is open. Withdrawn from `falsifiable-claims.json`: «four support contexts» needs judgement about WHICH four, and a probe that pretended to check it would refute the row on any document mentioning a context. | 🟡 MEDIUM | 🟡 MEDIUM | -| 8 | 🟡 OPEN | [COH-012](#detail-coh-012) | GAP | Missing capability / corrective gap | Backend | Discovery | US-DIS-006 | Gherkin covers only 2 of 4 CRUD operations (Create, Update). Delete and Read entirely missing. Zero edge cases. | Pending owner/action definition in this register. | 🟢 | 🟢 | -| 9 | 🟡 OPEN | [COH-009](#detail-coh-009) | INCO | Source incoherence | Backend | Release | All REL | BR-003 conflated: product-brief = "no deploy without QA gate", but 5+ stories invoke as "human authorization required." Two rules sharing one ID. | Pending owner/action definition in this register. | 🟢 | 🟢 | -| 10 | 🟡⏳ DEFERRED | [OPP-002](#detail-opp-002) | OPP | Improvement opportunity | Backend | N/A | N/A | Extraer AuditTrail como Shared Kernel — 5+ contextos implementan historiales inmutables | Pending owner/action definition in this register. | 🟠 HIGH | 🔴 HIGH | +| 3 | 🟡 OPEN | [GAP-016](#detail-gap-016) | Docs | Documentation gap | Docs | Docs | N/A | Roadmap Has No Calendar Dates | Pending owner/action definition in this register. | 🟡 MEDIUM | 🟡 MEDIUM | +| 4 | 🟡 OPEN | [GAP-017](#detail-gap-017) | Docs | Documentation gap | Docs | Docs | N/A | Discovery Canvas Has No ES Version | Pending owner/action definition in this register. | 🟡 MEDIUM | 🟡 MEDIUM | +| 5 | 🟡 OPEN | [GAP-023](#detail-gap-023) | Docs | Documentation gap | Docs | Docs | N/A | Re-Do Flow Not Fully Designed | Pending owner/action definition in this register. | 🟡 MEDIUM | 🟡 MEDIUM | +| 6 | 🟡 OPEN | [GAP-025](#detail-gap-025) | Docs | Documentation gap | Docs | Docs | N/A | Portal DDD incomplete — NARROWED 2026-08-01: the strategic-map half is DONE (`reference/specs/architecture/bounded-context-map.md` calls itself «the single, authoritative strategic map» of the 9 contexts, with integration patterns and cross-context events). What remains is the four support contexts. | Only the remaining half is open. Withdrawn from `falsifiable-claims.json`: «four support contexts» needs judgement about WHICH four, and a probe that pretended to check it would refute the row on any document mentioning a context. | 🟡 MEDIUM | 🟡 MEDIUM | +| 7 | 🟡 OPEN | [COH-012](#detail-coh-012) | GAP | Missing capability / corrective gap | Backend | Discovery | US-DIS-006 | Gherkin covers only 2 of 4 CRUD operations (Create, Update). Delete and Read entirely missing. Zero edge cases. | Pending owner/action definition in this register. | 🟢 | 🟢 | +| 8 | 🟡 OPEN | [COH-009](#detail-coh-009) | INCO | Source incoherence | Backend | Release | All REL | BR-003 conflated: product-brief = "no deploy without QA gate", but 5+ stories invoke as "human authorization required." Two rules sharing one ID. | Pending owner/action definition in this register. | 🟢 | 🟢 | +| 9 | 🟡⏳ DEFERRED | [OPP-002](#detail-opp-002) | OPP | Improvement opportunity | Backend | N/A | N/A | Extraer AuditTrail como Shared Kernel — 5+ contextos implementan historiales inmutables | Pending owner/action definition in this register. | 🟠 HIGH | 🔴 HIGH | +| 10 | 🟢 RESOLVED | [GAP-015](#detail-gap-015) | Docs | Documentation gap | Docs | Docs | N/A | DECISIONS.md Lacks Description of T-001 Technical Rationale | Resolved 2026-08-01 by writing `docs/adrs/T-001-nx-monorepo-orchestration.md` (+ `.es`). **The row was right and understated it:** the single line T-001 did carry was also WRONG. It said «npm workspaces con Nx», and no `package.json` in this repository declares a `workspaces` field — Nx orchestrates by PROJECT GRAPH (`project.json` plus the `@nx/vite`, `@nx/webpack`, `@nx/eslint` and `@nx/jest` inference plugins in `src/nx.json`). A reader would have looked for a `workspaces` array, not found one, and concluded the monorepo was misconfigured. The ADR records the reason that decided it — `tracker-api` is .NET, and npm workspaces links `node_modules` between npm packages, so it would have covered three projects of four and left the largest outside — and the DECISIONS entry is corrected in both languages. | 🟡 MEDIUM | 🟡 MEDIUM | | 11 | 🟢 RESOLVED | [GAP-021](#detail-gap-021) | Docs | Documentation gap | Docs | Docs | N/A | Redis in Docker Compose Without Requirement | REFUTED TWICE against the repository 2026-08-01. **The premise is gone:** there is no `docker-compose` file in this repository at all, no Redis in the Helm charts under `product/infra/helm/` — which is the real deployment — and no Redis in application code. **And the requirement it says is missing was decided:** `T-026` («Redis solo para soporte operacional») is recorded in `AdrRegistryEndpoints`, stating «Redis is operational support only (cache/locks/jobs/idempotency); PostgreSQL is the system of record». The row asks for a requirement that exists, about a file that does not. | 🟢 LOW | 🟡 MEDIUM | | 12 | 🟢 RESOLVED | [GAP-022](#detail-gap-022) | Docs | Documentation gap | Docs | Docs | N/A | SPACE Metrics Not Defined | REFUTED by `check-falsifiable-claims` 2026-08-01: `reference/specs/metrics/prd.md` carries `REQ-MET-03` — «Compute SPACE metrics (Satisfaction, Performance, Activity, Communication, Efficiency)» — with acceptance criteria naming all five scores plus trend, threshold and last-computed timestamp. The framework is defined; the row is stale. | 🟡 MEDIUM | 🟡 MEDIUM | | 13 | 🟢 RESOLVED | [COH-008](#detail-coh-008) | GAP | Missing capability / corrective gap | Backend | Release | US-REL-004 | DeploymentRecord Aggregate Root NEVER created by any story. UC-005b ("records a DeploymentRecord") cannot be fulfilled. | REFUTED against the code 2026-08-01: the aggregate the row says was never created EXISTS, complete. `Tracker.Domain/Release/DeploymentRecord` ships `Start`, `Finish` and `RollBack`; it persists to `tracker_release.deployment_records`; three endpoints expose it in `ConstructionReleaseEndpoints` (`POST /`, `POST /{id}/finish`, `POST /{id}/rollback`); and `ConstructionReleaseTests` covers it. UC-005b («records a DeploymentRecord») is therefore fulfillable — the row describes a state of the repository that has not held for some time, and nobody moved it. | 🟡 | 🟡 | @@ -364,7 +364,7 @@ This document is the only operational gap register in this repository. The maste ### Detail GAP-015 -- **Status:** 🟡 OPEN +- **Status:** 🟢 RESOLVED - **Type:** Docs (Documentation gap) - **Component:** Docs - **Module:** Docs