@trycore/spec-build-harness 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/GOVERNANCE.md +1 -1
  3. package/INSTALL.md +4 -4
  4. package/METODOLOGIA.md +50 -7
  5. package/README.md +8 -5
  6. package/VERSION +1 -1
  7. package/agents/build/architecture-evaluator.md +45 -0
  8. package/agents/build/asr-extractor.md +43 -0
  9. package/agents/build/dor-dod-gatekeeper.md +12 -0
  10. package/agents/build/stack-guardian.md +9 -0
  11. package/asset-types.json +75 -0
  12. package/commands/build/architect.md +66 -0
  13. package/docs/agents.md +32 -3
  14. package/docs/commands.md +9 -3
  15. package/docs/getting-started.md +1 -1
  16. package/docs/runtime/plan-migracion-harness-v0.9.md +84 -0
  17. package/docs/runtime/protocolo-cliente-runtime.md +116 -0
  18. package/hooks/build/context-monitor.sh +6 -0
  19. package/package.json +2 -1
  20. package/scripts/tests/test-context-monitor.sh +36 -0
  21. package/skills/building-a-slice/references/dor.md +8 -0
  22. package/skills/releasing-a-version/SKILL.md +1 -1
  23. package/skills/releasing-a-version/references/release-dod.md +1 -1
  24. package/skills/setup-architecture/SKILL.md +94 -0
  25. package/skills/setup-architecture/assets/0000-drivers-y-asrs.template.md +101 -0
  26. package/skills/setup-architecture/assets/_backlog-arquitectonico.template.md +51 -0
  27. package/skills/setup-architecture/assets/adr-add.template.md +84 -0
  28. package/skills/setup-architecture/references/add-method.md +53 -0
  29. package/skills/setup-architecture/references/atam-lite.md +44 -0
  30. package/skills/setup-architecture/references/drivers-extraction.md +39 -0
  31. package/docs/flujo-harness-funcional.md +0 -42
  32. package/docs/flujo-harness.md +0 -192
@@ -0,0 +1,84 @@
1
+ ---
2
+ id: NNNN
3
+ title: "<Título de la decisión>"
4
+ date: YYYY-MM-DD
5
+ status: proposed # proposed | accepted | superseded | deprecated
6
+ authors:
7
+ - <Equipo / persona>
8
+ tags: []
9
+ add:
10
+ iteracion: <n>
11
+ fase_prd: "<Fase X>"
12
+ ---
13
+
14
+ # ADR NNNN — <Título>
15
+
16
+ > Plantilla alineada al método **ADD** (Attribute-Driven Design, Len Bass — *Software Architecture in
17
+ > Practice*). Cada sección numerada corresponde a un paso del método. Las decisiones deben trazar a
18
+ > [0000-drivers-y-asrs.md](0000-drivers-y-asrs.md) y actualizar
19
+ > [_backlog-arquitectonico.md](_backlog-arquitectonico.md). Generada por la skill `setup-architecture`
20
+ > (`/build:architect`); un humano la promueve `proposed → accepted`.
21
+
22
+ ## 1. Objetivo de la iteración y drivers seleccionados (Pasos 2–3)
23
+
24
+ - **Objetivo de la iteración:** <qué se busca resolver en esta ronda>.
25
+ - **Elemento(s) a refinar:** <sistema completo | servicio X | módulo Y>.
26
+ - **Drivers abordados:**
27
+ - Funcionales: UC-…
28
+ - Atributos de calidad: QA-… (con su medida de respuesta)
29
+ - Restricciones: CON-…
30
+ - Concerns: CRN-…
31
+
32
+ ## 2. Conceptos de diseño elegidos (Paso 4)
33
+
34
+ > Patrones arquitectónicos, **tácticas** (sentido Bass), componentes externos o arquitecturas de
35
+ > referencia evaluados y elegidos para satisfacer los drivers. Registra las alternativas descartadas:
36
+ > ese es el valor del ADR.
37
+
38
+ | Driver | Concepto / Táctica | Alternativas descartadas | Razón |
39
+ |--------|--------------------|--------------------------|-------|
40
+ | QA-… | … | … | … |
41
+
42
+ ## 3. Instanciación: responsabilidades e interfaces (Paso 5)
43
+
44
+ > Cómo se convierten los conceptos en estructuras reales: componentes/módulos, sus responsabilidades y
45
+ > los contratos (interfaces) por los que se comunican.
46
+
47
+ - **Elementos instanciados:** …
48
+ - **Responsabilidades:** …
49
+ - **Interfaces / contratos:** …
50
+
51
+ ## 4. Vistas y registro de la decisión (Paso 6)
52
+
53
+ > Boceto de vista(s) estructural(es) — de módulos, de componentes-y-conectores o de asignación física —
54
+ > y el rationale + trade-offs.
55
+
56
+ ```mermaid
57
+ %% vista estructural / de despliegue / de secuencia
58
+ ```
59
+
60
+ **Decisión:** …
61
+
62
+ **Trade-offs aceptados:** …
63
+
64
+ ## 5. Análisis del diseño (Paso 7)
65
+
66
+ > ¿La decisión satisface el objetivo de la iteración? Cada driver con veredicto y evidencia/medida.
67
+
68
+ | Driver | ¿Satisfecho? | Evidencia / medida | Riesgo residual |
69
+ |--------|--------------|--------------------|-----------------|
70
+ | QA-… | ✅/⚠️/❌ | … | … |
71
+
72
+ **Drivers no resueltos en esta iteración:** … (se devuelven al backlog arquitectónico).
73
+
74
+ ## 6. Consecuencias
75
+
76
+ - Positivas: …
77
+ - Negativas / riesgos: …
78
+ - Operacionales: …
79
+
80
+ ## 7. Trazabilidad
81
+
82
+ - Drivers: [0000-drivers-y-asrs.md](0000-drivers-y-asrs.md)
83
+ - PRD / HU / Flows: …
84
+ - Stack operacionalizado en: `.claude/config/stack-allowlist.json` (si esta ADR decide stack)
@@ -0,0 +1,53 @@
1
+ # Método ADD — iterar el diseño (Pasos 2–7) — referencia
2
+
3
+ ADD (Attribute-Driven Design, Len Bass) diseña por **rondas**. Cada ronda ejecuta 7 pasos sobre un
4
+ subconjunto priorizado de drivers del catálogo `0000`. Una ronda produce **un ADR** (a veces refactoriza
5
+ uno previo). Usa la plantilla `assets/adr-add.template.md` de esta skill —instalada junto a estas
6
+ references— (7 secciones = los 7 pasos, con su frontmatter `id/title/date/status/authors/tags/add`).
7
+
8
+ ## Los 7 pasos por iteración
9
+
10
+ 1. **Review inputs** — ya está en `0000-drivers-y-asrs.md`.
11
+ 2. **Establecer el objetivo de la iteración** — elige la fase/release y el subconjunto de drivers
12
+ (empieza por los ASRs críticos, cuadrante (A,A) de la matriz). → §1 del ADR.
13
+ 3. **Elegir el elemento a refinar** — sistema completo (primera ronda, top-down) o un módulo/servicio
14
+ interno (rondas posteriores). → §1 del ADR.
15
+ 4. **Elegir conceptos de diseño** — **tácticas** (Bass), **patrones**/estilos, componentes externos o
16
+ arquitecturas de referencia. Registra las **alternativas descartadas** y por qué. → §2 del ADR.
17
+ 5. **Instanciar** — convierte los conceptos en componentes/módulos reales con responsabilidades e
18
+ **interfaces/contratos**. → §3 del ADR.
19
+ 6. **Bocetar vistas y registrar la decisión** — al menos una vista (módulos, C&C o despliegue) en
20
+ `mermaid`, con la **decisión** y sus **trade-offs**. → §4 del ADR.
21
+ 7. **Analizar** (ATAM-lite) — cada driver con veredicto y evidencia; drivers no resueltos vuelven al
22
+ backlog. → §5 del ADR (delegado a `architecture-evaluator`; ver `atam-lite.md`).
23
+
24
+ ## Tácticas ↔ atributos (guía rápida, no exhaustiva)
25
+
26
+ | Atributo (QA) | Tácticas típicas (Bass) | Estilos/patrones que las agrupan |
27
+ |---|---|---|
28
+ | Disponibilidad | redundancia, detección (heartbeat/ping), recuperación (rollback, reintento con backoff) | activo-pasivo, health-check, circuit breaker |
29
+ | Rendimiento | gestión de recursos (índices, caché), gestión de demanda (paginación, rate-limit) | CQRS de lectura, caché-aside |
30
+ | Seguridad | resistir (authN/authZ, secretos fuera de código), detectar (auditoría), recuperar | RBAC central, gateway de seguridad, WORM/SIEM |
31
+ | Modificabilidad | encapsular, intermediario, restringir dependencias | capas, hexagonal/puertos-adaptadores, contrato OpenAPI como fuente |
32
+ | Integrabilidad | adaptador, orquestación, límite (bulkhead) | adaptadores por integración, anti-corruption layer |
33
+ | Escalabilidad | replicación, particionamiento, trabajo asíncrono | workers, colas, outbox |
34
+ | Integridad transaccional | transacción, compensación (saga), idempotencia | saga orquestada + outbox |
35
+
36
+ ## Estrategia de iteración
37
+
38
+ - **Ancho antes que profundo**: primera ronda decide el estilo estructural y el stack del **sistema
39
+ completo**; rondas posteriores refinan piezas (worker, motor de notificaciones, servicio de RBAC…).
40
+ - **Cimiento primero**: las decisiones fundacionales (identidad/authN, acceso a datos, arquitectura base,
41
+ design-system) van en las primeras iteraciones — son las que el DoR exigirá antes de abrir épicas de
42
+ negocio (`layer: foundational`).
43
+ - **Un ADR por decisión coherente**, no por archivo tocado. Si una decisión supersede a otra, marca la
44
+ vieja `superseded` y enlaza; no borres.
45
+ - **Stack como decisión trazada**: las elecciones de lenguaje/framework/BD/infra son ADRs con su §2
46
+ (alternativas descartadas). En la fase 5 se consolidan en `stack-allowlist.json`. Si el stack elegido
47
+ **diverge** del PRD §técnica, regístralo explícitamente como riesgo/restricción (no lo escondas).
48
+
49
+ ## Salida por ronda
50
+
51
+ 1. Escribe `docs/adr/000N-<slug>.md` desde la plantilla, con §1–§4 completas.
52
+ 2. Corre `architecture-evaluator` sobre el ADR → completa §5 y §6.
53
+ 3. Actualiza `_backlog-arquitectonico.md`: estado de cada driver, riesgos nuevos, fila de bitácora.
@@ -0,0 +1,44 @@
1
+ # ATAM-lite — evaluación de la arquitectura en papel (ADD Paso 7) — referencia
2
+
3
+ Análisis de cada ADR **antes de programar**, para descubrir riesgos y trade-offs. Es una versión ligera
4
+ de ATAM (Architecture Tradeoff Analysis Method): no se hace un taller formal con stakeholders, sino un
5
+ barrido adversarial delegado en el agente `architecture-evaluator` (read-only). Alimenta §5/§6 del ADR y
6
+ la sección de riesgos del backlog (estructura completa del backlog — tablero por driver, riesgos
7
+ abiertos, bitácora — en `assets/_backlog-arquitectonico.template.md` de esta skill).
8
+
9
+ ## Qué produce el evaluador, por ADR
10
+
11
+ - **Veredicto por driver**: para cada driver que el ADR dice satisfacer, ✅/⚠️/❌ con la **evidencia o
12
+ medida** que lo respalda (o la que falta). Un ⚠️/❌ es un riesgo, no un rechazo.
13
+ - **Puntos de sensibilidad**: propiedades del diseño donde una decisión afecta fuertemente a un atributo
14
+ (p.ej. "el tamaño del pool de conexiones determina QA-1 rendimiento de lectura").
15
+ - **Trade-offs**: puntos donde una decisión mejora un atributo y empeora otro (p.ej. "el backoff
16
+ 1s/3s/9s da robustez pero puede exceder el P99 ≤ 10 s de la integración externa").
17
+ - **Riesgos**: decisiones sin evidencia, drivers no cubiertos, supuestos sin validar. Cada uno con
18
+ driver, mitigación planificada e iteración.
19
+ - **Drivers no resueltos**: se devuelven explícitamente al backlog (estado `PENDIENTE`/`EN DISEÑO`).
20
+
21
+ ## Conceptos ATAM que se usan
22
+
23
+ - **Sensitivity point** — una decisión de la que depende crítica­mente una respuesta de calidad.
24
+ - **Tradeoff point** — un sensitivity point que afecta a más de un atributo en direcciones opuestas.
25
+ - **Risk** — una decisión (o su ausencia) que puede impedir alcanzar la medida de respuesta.
26
+ - **Non-risk** — una decisión que, analizada, se confirma segura para los drivers en juego.
27
+
28
+ ## Reglas del análisis
29
+
30
+ - **Adversarial y honesto**: el evaluador busca **refutar** que el ADR satisface sus drivers. Ante la
31
+ duda, marca riesgo, no lo omitas. Es más barato un riesgo en papel que un rediseño en código.
32
+ - **Medida, no opinión**: un driver solo se marca ✅ si hay una medida verificable o un plan de
33
+ verificación (k6, prueba de carga, matriz de RBAC, etc.). "Parece suficiente" es ⚠️.
34
+ - **No decide negocio**: si el riesgo se resuelve con una decisión de negocio (exponer o no un dato,
35
+ fijar o aplazar un objetivo de DR), lo marca como **trade-off de negocio** → sube a la revisión única
36
+ (fase 5), no lo resuelve el modelo.
37
+ - **Cierre trazable**: al mitigar un riesgo en una iteración posterior, se marca ✅ CERRADO en el backlog
38
+ con el ADR que lo cerró; no se borra la fila.
39
+
40
+ ## Cobertura (invariante del backlog)
41
+
42
+ Al cerrar la capa, **todo driver del 0000 debe tener estado ≥ ABORDADO** o un riesgo abierto explícito
43
+ que explique por qué no. Un driver crítico (A,A) en `PENDIENTE` sin riesgo declarado es un fallo de la
44
+ capa: no está lista para habilitar el build.
@@ -0,0 +1,39 @@
1
+ # Extracción de drivers / ASRs (ADD Paso 1) — referencia
2
+
3
+ Objetivo de la fase: producir `docs/adr/0000-drivers-y-asrs.md` **leyendo `docs/`** (solo lectura),
4
+ sobre la plantilla `assets/0000-drivers-y-asrs.template.md` de esta skill (frontmatter + §1–§7). Se
5
+ delega el barrido a `asr-extractor` (fan-out) y la sesión principal consolida. Un **ASR**
6
+ (Architecturally Significant Requirement) es un requisito que, si cambia, cambia la arquitectura.
7
+
8
+ ## De dónde sale cada bloque del 0000
9
+
10
+ | Bloque del 0000 | Fuente en `docs/` | Cómo derivarlo |
11
+ |---|---|---|
12
+ | **OE** (objetivos de negocio) | `01-prd/` §objetivos, `02-user-story-map/` | Copiar los objetivos específicos + su métrica/meta. Si el PRD no da métrica, proponerla y marcarla como *a validar*. |
13
+ | **UC** (funcionales significativos) | `03-backlog/epicas.md`, `04-historias/HU-*.md` | **Solo** los casos que moldean la arquitectura (integraciones externas, transaccionalidad, RBAC, asincronía, auditoría). No es el backlog completo. |
14
+ | **QA** (escenarios de calidad) | PRD §requisitos no funcionales, AC de las HUs, §técnica | Un escenario de **6 partes** por atributo (rendimiento, disponibilidad, seguridad, integrabilidad, modificabilidad, observabilidad, escalabilidad…). La **medida** debe ser cuantificable. |
15
+ | **CON** (restricciones) | PRD §técnica/§7, política de datos, identidad | Lo que **no** es negociable (stack impuesto, prohibiciones, headers, gates de CI). |
16
+ | **CRN** (concerns) | PRD riesgos, capacidades del equipo, costos | Preocupaciones que condicionan el diseño aunque no sean requisitos formales. |
17
+ | **Prioridad** | juicio + importancia del PRD | Par `(Importancia de negocio, Impacto arquitectónico)` en {A,M,B}. El cuadrante (A,A) son los **ASRs críticos**. |
18
+ | **Plan de iteraciones** | fases del PRD / líneas de release del story map | Una iteración por fase; lista los drivers que ataca cada una. |
19
+
20
+ ## Escenario QA de 6 partes (formato Bass)
21
+
22
+ Cada QA-N se escribe con exactamente estas seis partes:
23
+
24
+ - **Fuente** del estímulo (quién/qué lo genera)
25
+ - **Estímulo** (el evento)
26
+ - **Artefacto** (qué parte del sistema recibe el estímulo)
27
+ - **Entorno** (condiciones: normal, pico, degradado)
28
+ - **Respuesta** (qué hace el sistema)
29
+ - **Medida de respuesta** (cuantificable: P95 ≤ X ms, uptime ≥ X%, 0 incidentes…)
30
+
31
+ Sin medida cuantificable no es un ASR: es un deseo. Si el PRD no la da, **propón** una razonable y déjala
32
+ marcada para validación en la revisión (fase 5), no bloquees.
33
+
34
+ ## Reglas
35
+
36
+ - **Traza siempre**: cada UC/QA cita las HU/OE/§PRD de las que sale (columna Trazabilidad).
37
+ - **No inventes dominio**: si un atributo no tiene sustento en `docs/`, no lo agregues; si es un hueco
38
+ real (p.ej. el PRD no fija disponibilidad), decláralo como CRN o riesgo, no como QA fabricado.
39
+ - **Documento vivo**: en re-corridas, añade drivers nuevos de HUs/épicas nuevas; no borres los previos.
@@ -1,42 +0,0 @@
1
- # Cómo trabaja el arnés — flujo funcional
2
-
3
- Vista única y sencilla del flujo de trabajo, para explicar a los devs **qué pasa con cada cambio**.
4
- (Versión detallada/técnica en [flujo-harness.md](./flujo-harness.md).)
5
-
6
- ```mermaid
7
- flowchart TD
8
- A([Llega un trabajo]) --> B{"¿Qué tipo de cambio es?"}
9
-
10
- B -->|"Arreglo pequeño<br/>(typo, copy, config)"| C["Carril rápido:<br/>rama → cambio → PR"]
11
- C --> Z([PR listo para mergear])
12
-
13
- B -->|"Funcionalidad nueva<br/>(una épica)"| D{"¿Está lista para construir?<br/>historias claras, criterios definidos,<br/>base ya construida"}
14
- D -->|"No"| E["Vuelve a discovery<br/>a completar la historia"]
15
- D -->|"Sí"| F["Construir con pruebas<br/>(escribo el test, luego el código)"]
16
-
17
- F --> G{"¿La app funciona<br/>de punta a punta?"}
18
- G -->|"No"| F
19
- G -->|"Sí"| H["Revisión final del cambio<br/>+ pantallas iguales al diseño (si hay UI)"]
20
-
21
- H --> I["Abrir PR y dejar todo enlazado<br/>(historia ↔ cambio ↔ código)"]
22
- I --> J{"¿Esta épica cierra<br/>una entrega/release?"}
23
-
24
- J -->|"No, sigue otra épica"| A
25
- J -->|"Sí"| K["Revisión profunda de la entrega:<br/>seguridad · calidad · UX ·<br/>coherencia · arquitectura"]
26
-
27
- K --> L{"¿Todo el journey completo<br/>funciona con dependencias reales?"}
28
- L -->|"No, hay hallazgos"| M["Corregir como un cambio normal"]
29
- M --> K
30
- L -->|"Sí"| N([Release lista ✅])
31
-
32
- classDef q fill:#fff3cd,stroke:#d39e00,color:#000;
33
- classDef ok fill:#d4edda,stroke:#155724,color:#000;
34
- class B,D,G,J,L q;
35
- class N,Z ok;
36
- ```
37
-
38
- ## La idea en una frase
39
-
40
- - **Cambios chicos** van por un carril rápido.
41
- - **Cada funcionalidad nueva** se construye completa, con pruebas, verificando que la app **funcione de punta a punta** antes de cerrarla.
42
- - **De vez en cuando** (al cerrar una entrega) se hace una **revisión profunda** de todo lo acumulado antes de liberar.
@@ -1,192 +0,0 @@
1
- # Flujo del arnés de construcción — `@trycore/spec-build-harness`
2
-
3
- Diagrama de flujo end-to-end del harness, modelado al estilo BPMN:
4
-
5
- - **◆ XOR** (rombo) = compuerta **exclusiva** (un solo camino).
6
- - **⬡ AND** (hexágono) = compuerta **paralela** (fork: todos los caminos; join: convergencia/barrera).
7
- - **▭ Tarea** con su **gate** entre `[ ]`.
8
- - Aristas punteadas `-.->` = retroceso (gate monótono que vuelve a `false`).
9
-
10
- Fuente de verdad: [METODOLOGIA.md](../METODOLOGIA.md). Si algo contradice ese documento, gana la metodología.
11
-
12
- ---
13
-
14
- ## 1. Vista global (router → inner loop → outer loop)
15
-
16
- ```mermaid
17
- flowchart TD
18
- START([Trabajo entrante]) --> PRE{{"⬡ Preflight<br/>¿instalado?"}}
19
- PRE -->|NOT_INSTALLED| INIT[trycore-build init] --> ROUTER
20
- PRE -->|ok| ROUTER
21
-
22
- ROUTER[/"/build:work — Router (classify-and-act)<br/>solo ruteo: no toca estado ni ramas"/]
23
- ROUTER --> GW1{"◆ XOR — Decision gate<br/>¿qué carril?"}
24
-
25
- %% --- Rama 1: micro-change ---
26
- GW1 -->|"mantenimiento<br/>sin capacidad nueva"| HARD{"◆ XOR — ¿cruza límite duro?<br/>dep nueva / API nueva / dominio·datos"}
27
- HARD -->|"sí → escala"| INNER
28
- HARD -->|no| MICRO["building-a-micro-change<br/>fix/* | chore/* → cambio → PR<br/>(sin abrir active_slice)"]
29
- MICRO --> ENDM([PR mergeado])
30
-
31
- %% --- Rama 2: épica / producto nuevo ---
32
- GW1 -->|"capacidad nueva<br/>o límite duro"| INNER[["INNER LOOP<br/>building-a-slice<br/>(ver §2)"]]
33
-
34
- %% --- Rama 3: release gate ---
35
- GW1 -->|"cierra línea de release<br/>o ≥2 épicas archivadas"| OUTER[["OUTER LOOP<br/>releasing-a-version<br/>(ver §3)"]]
36
-
37
- INNER --> DEC{"◆ XOR — fase 8<br/>¿correr Release Gate ahora?<br/>(default computado, decide humano)"}
38
- DEC -->|"sí (cierra release<br/>o nudge ≥2)"| OUTER
39
- DEC -->|no| NEXT([Siguiente épica]) -.-> INNER
40
-
41
- OUTER --> OUTGW{"◆ XOR — ¿todos los gates ✓?"}
42
- OUTGW -->|"passed"| REL([Release lista])
43
- OUTGW -->|"failed (hallazgos)"| FIX["Fix como slice normal<br/>(building-a-slice)"] -.->|re-corre| OUTER
44
-
45
- classDef xor fill:#fff3cd,stroke:#d39e00,color:#000;
46
- classDef andg fill:#d1ecf1,stroke:#0c5460,color:#000;
47
- classDef loop fill:#e2e3f3,stroke:#383d6b,color:#000;
48
- class GW1,HARD,DEC,OUTGW xor;
49
- class PRE andg;
50
- class INNER,OUTER loop;
51
- ```
52
-
53
- ---
54
-
55
- ## 2. Inner loop — `building-a-slice` (pipeline secuencial por épica)
56
-
57
- Precondición dura: **scaffold confirmado** (`scaffold.confirmed`) antes de abrir cualquier slice.
58
- Secuencial (un `active_slice` a la vez), divulgación progresiva, ningún gate se salta.
59
-
60
- ```mermaid
61
- flowchart TD
62
- S0([Épica EP-XXX entrante]) --> SCAF{"◆ XOR — gate proyecto<br/>scaffold.confirmed?"}
63
- SCAF -->|"false"| STOPS["STOP — exige scaffold runnable<br/>(scaffold-guard.sh)"]
64
- SCAF -->|"true"| F1
65
-
66
- %% Fase 1: DoR
67
- F1["F1 · dor — Definition of Ready<br/>delega: dor-dod-gatekeeper"]
68
- F1 --> DORGW{"◆ XOR — ¿DoR ✓?<br/>épica+HU, AC G/W/T, INVEST,<br/>cimiento, tamaño, stack, fixtures"}
69
- DORGW -->|"✗"| BACKDISC["Vuelve a discovery<br/>(/trycore:*) — no se abre slice"]
70
- DORGW -->|"✓ [gate: dor]"| SIZE{"◆ XOR — gate tamaño<br/>>3 HU ó ≥3 capas?"}
71
-
72
- SIZE -->|"sí"| SUB["Descompone en sub_slices[]<br/>se construyen de a uno<br/>(journey_smoke verde entre cada uno)"]
73
- SIZE -->|"no (atómica)"| F2
74
- SUB --> F2
75
-
76
- %% Fase 2: change
77
- F2["F2 · change — opsx:new + ## Trazabilidad<br/>delega: change-epic-coherence"]
78
- F2 --> F2GW{"◆ XOR — ¿enlace change↔épica ✓?"}
79
- F2GW -->|"✓ [gate: coherence_link]"| F3
80
- F2GW -.->|"✗ retroceso"| F2
81
-
82
- %% Fase 3: TDD
83
- F3["F3 · red→green→refactor<br/>TDD por cada escenario AC de cada HU<br/>delega: superpowers:test-driven-development"]
84
- F3 --> F3GW{"◆ XOR — ¿suite verde?"}
85
- F3GW -.->|"✗ retroceso"| F3
86
- F3GW -->|"✓ [gate: tdd]"| F4
87
-
88
- %% Fase 4: smoke + fidelity (UI)
89
- F4["F4 · smoke — journey-hasta-aquí end-to-end<br/>runner determinista fuera-de-chat (sesión virgen)"]
90
- F4 --> UIGW{"◆ XOR — ¿la épica toca UI?"}
91
- UIGW -->|"no"| F4OUT["fidelity = null"]
92
- UIGW -->|"sí"| FID["Verificación visual real (MCP chrome-devtools)<br/>screenshot app vs prototipo<br/>delega: ux-fidelity-reviewer"]
93
- FID --> FIDGW{"◆ XOR — ¿fidelidad ESTRICTA ✓?<br/>INCONCLUSO = false"}
94
- FIDGW -.->|"✗ → false"| FID
95
- FIDGW -->|"✓ [gate: fidelity]"| F4OUT
96
- F4OUT -->|"[gate: journey_smoke]"| F5FORK
97
-
98
- %% Fase 5: api / data en paralelo (condicional/null)
99
- F5FORK{{"⬡ AND — fork (fase api/data)"}}
100
- F5FORK --> APIB["api — contratos endpoints<br/>Newman 100% (delega: api-contract-tester)<br/>null si no hay endpoints"]
101
- F5FORK --> DATAB["data — invariantes de datos<br/>(delega: data-consistency-checker)<br/>N/A si no toca datos"]
102
- APIB --> F5JOIN
103
- DATAB --> F5JOIN
104
- F5JOIN{{"⬡ AND — join (convergencia)<br/>[gates: api, data]"}}
105
-
106
- %% Fase 6: dod — adversarial THEN dod
107
- F5JOIN --> WIRE["F6a · Verificación ADVERSARIAL independiente<br/>(subagente contexto virgen)<br/>asume slice incompleto e intenta refutarlo<br/>delega: wiring-adversarial-verifier"]
108
- WIRE --> WIREGW{"◆ XOR — ¿wiring_checklist[] sin items failing?"}
109
- WIREGW -.->|"✗ huecos (stub/ruta/AC sin test)"| F3
110
- WIREGW -->|"✓ [gate: wiring_verified]"| DOD["F6b · DoD reducido<br/>delega: dor-dod-gatekeeper<br/>(piso declarativo, no el arreglo)"]
111
- DOD --> DODGW{"◆ XOR — ¿DoD ✓?<br/>tdd·journey_smoke·coherence_link·<br/>data·api·fidelity·wiring_verified·hooks"}
112
- DODGW -.->|"✗ retroceso"| F3
113
- DODGW -->|"✓ [gate: dod]"| F7
114
-
115
- %% Fase 7: PR + archive
116
- F7["F7 · pr — abrir PR + archivar change EN EL MISMO PR<br/>opsx:archive + opsx:sync<br/>back-reference en épica y HU"]
117
- F7 --> ARCH["active_slice → history[] (phase: archived)<br/>active_slice = null"]
118
- ARCH --> F8([F8 · decisión Release Gate → §1])
119
-
120
- classDef xor fill:#fff3cd,stroke:#d39e00,color:#000;
121
- classDef andg fill:#d1ecf1,stroke:#0c5460,color:#000;
122
- classDef stop fill:#f8d7da,stroke:#842029,color:#000;
123
- class SCAF,DORGW,SIZE,F2GW,F3GW,UIGW,FIDGW,WIREGW,DODGW xor;
124
- class F5FORK,F5JOIN andg;
125
- class STOPS,BACKDISC stop;
126
- ```
127
-
128
- > **Disciplina de horizonte largo:** cada iteración nace headless / contexto virgen y reconstruye estado
129
- > desde disco (`build-state.json` + git + logs). `wiring_checklist[]` (1 item por escenario AC y por punto
130
- > de integración entre capas) nace `failing` y solo pasa a `passing` **tras prueba real ejecutada**.
131
- > Mientras quede un item `failing`, el cableado NO está hecho.
132
-
133
- ---
134
-
135
- ## 3. Outer loop — `releasing-a-version` (Release Gate)
136
-
137
- Alcance = **diff acumulado** de todas las épicas de la release (merge anterior → `main`).
138
- Los reviewers se disparan **en paralelo** y devuelven síntesis (protegen el contexto).
139
-
140
- ```mermaid
141
- flowchart TD
142
- R0([Línea de release identificada]) --> R1["Crear/actualizar releases[] (status: pending)<br/>cruzar con docs/02-user-story-map/"]
143
- R1 --> FORK{{"⬡ AND — fork (reviewers en paralelo<br/>sobre el diff acumulado)"}}
144
-
145
- FORK --> SEC["security — sin CRÍTICO/ALTO;<br/>claves server-side; PII no cruda;<br/>salida IA = input no confiable<br/>(security-reviewer)"]
146
- FORK --> SME["smell — 4 reglas de Beck<br/>+ code smells sin bloqueantes<br/>(simple-design-reviewer)"]
147
- FORK --> UX["ux — Krug + Lighthouse<br/>(null si sin UI)<br/>(ux-krug-reviewer)"]
148
- FORK --> COH["coherence — trazabilidad triple<br/>AC↔change↔código, sin huérfanos<br/>(coherence-three-way · opus)"]
149
- FORK --> ARCH["stack_arch — arquitectura PRD:<br/>capa IA en frontera server-side;<br/>decisión determinista sin IA<br/>(stack-guardian)"]
150
-
151
- SEC --> JOIN
152
- SME --> JOIN
153
- UX --> JOIN
154
- COH --> JOIN
155
- ARCH --> JOIN
156
-
157
- JOIN{{"⬡ AND — join (convergencia de reviewers)"}}
158
- JOIN --> INTEG["integration — journey COMPLETO end-to-end<br/>con DEPENDENCIAS REALES (no stubs)<br/>skill verify/run + MCP chrome-devtools"]
159
-
160
- INTEG --> RGW{"◆ XOR — ¿todos los gates ✓ (o null N/A)?"}
161
- RGW -->|"✓"| PASS["status: passed<br/>escribir gates + updated_by: releasing-a-version"]
162
- RGW -->|"✗ hallazgos bloqueantes"| FAIL["status: failed"]
163
- PASS --> RELOK([Release ✅])
164
- FAIL --> FIXLOOP["Humano corrige como slice normal<br/>(building-a-slice)"]
165
- FIXLOOP -.->|"re-corre Release Gate"| R1
166
-
167
- classDef xor fill:#fff3cd,stroke:#d39e00,color:#000;
168
- classDef andg fill:#d1ecf1,stroke:#0c5460,color:#000;
169
- classDef gate fill:#d4edda,stroke:#155724,color:#000;
170
- class RGW xor;
171
- class FORK,JOIN andg;
172
- class INTEG gate;
173
- ```
174
-
175
- > **`integration` es el gate no negociable.** Sin journey completo con dependencias reales **no hay release**.
176
- > No se acepta con todo stubbeado.
177
-
178
- ---
179
-
180
- ## 4. Leyenda de loops y gates
181
-
182
- | | Inner loop | Outer loop |
183
- |---|---|---|
184
- | Skill | `building-a-slice` | `releasing-a-version` |
185
- | Unidad | una épica `EP-XXX` | una línea de release |
186
- | Cadencia | muchas (1 por épica) | pocas (1 por release) |
187
- | Costo | barato (≤ ~20 min/épica) | pesado (subagentes profundos) |
188
- | Gates | dor · coherence_link · tdd · journey_smoke · fidelity · api · data · wiring_verified · dod | security · smell · ux · coherence · stack_arch · integration |
189
- | Estado | `active_slice` + `history[]` | `releases[]` |
190
-
191
- **Regla de no duplicación:** cada gate vive en exactamente un loop. El outer no hace TDD ni gates por slice;
192
- el inner no dispara reviewers pesados.