@trycore/spec-build-harness 0.5.0 → 0.6.0

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.
@@ -2,16 +2,19 @@
2
2
 
3
3
  > Guía de personalización para **consumidores** de `@trycore/spec-build-harness`. Explica cómo
4
4
  > conectar servidores **MCP** (Model Context Protocol) y **LSP** (Language Server Protocol) para
5
- > apoyar los gates del arnés. **Todo lo de aquí es opcional.** El core es 100 % agnóstico: ningún
6
- > gate, skill ni agente **depende** de un MCP concreto. Si tu entorno no expone ningún MCP, el arnés
7
- > funciona igual cubriendo cada fase con sus alternativas CLI/test.
5
+ > apoyar los gates del arnés. **Casi todo lo de aquí es opcional** y el core es agnóstico: ningún
6
+ > gate **depende de un MCP concreto** (cualquier equivalente sirve). **Única excepción:** el gate
7
+ > `fidelity` en slices con UI **requiere** un MCP de devtools de navegador (verificación visual real),
8
+ > porque la fidelidad no puede acreditarse sin observar la salida real. Para todo lo demás, si tu
9
+ > entorno no expone ningún MCP, el arnés funciona igual cubriendo cada fase con sus alternativas CLI/test.
8
10
 
9
11
  > **LSP tiene guía dedicada.** Este documento cubre sobre todo **MCP**. Para **LSP** (precisión de
10
12
  > símbolo en stacks tipados: por qué, cuándo y cómo), ver **`lsp-extensions.md`**.
11
13
 
12
14
  ## TL;DR
13
15
 
14
- - Los gates **pueden apoyarse** en MCP/LSP como **aceleradores**, nunca como dependencia dura.
16
+ - Los gates **pueden apoyarse** en MCP/LSP como **aceleradores**, nunca como dependencia dura — con
17
+ la **única excepción** del gate `fidelity` en slices con UI, que sí exige un MCP de navegador.
15
18
  - **Tú** declaras qué MCP habilitas en **tu** `settings` (el arnés no instala ninguno).
16
19
  - La skill `building-a-slice` consulta un mapa por gate en
17
20
  `skills/building-a-slice/references/mcp-map.md`: ahí está la lista de **ejemplos representativos**.
@@ -32,7 +35,8 @@ disponible:
32
35
  | El agente/skill lo usa bajo demanda para obtener evidencia más rica (UI corriendo, BD, carga). | El mismo gate se cierra con la alternativa CLI/test indicada en `mcp-map.md`. |
33
36
 
34
37
  Por eso ningún `command` de hook, ningún agente y ninguna skill **exigen** un MCP: lo **sugieren**
35
- cuando aplica. El consumidor decide.
38
+ cuando aplica. El consumidor decide. **Salvedad documentada:** el gate `fidelity` de UI sí requiere un
39
+ MCP de navegador (categoría, no un proveedor concreto) — ver la fila `fidelity` y su nota más abajo.
36
40
 
37
41
  ## Cómo lo declara el consumidor (en TU settings)
38
42
 
@@ -70,6 +74,7 @@ cada uno por el que aplique a **tu** stack declarado en el PRD; ninguno es oblig
70
74
  | Fase / gate | Agente | Ejemplo de MCP/LSP (opt-in) | Para qué | Alternativa sin MCP |
71
75
  |---|---|---|---|---|
72
76
  | `journey_smoke` (inner) / `integration` (release) | skill `verify` / `run` | Navegador headless vía MCP (p. ej. un MCP de devtools de navegador) | Recorrer el journey con la UI **corriendo**: snapshot del árbol accesible, screenshot, consola. | Smoke por test e2e/CLI del propio proyecto. |
77
+ | `fidelity` (inner, **slices con UI**) | `ux-fidelity-reviewer` | **MCP de devtools de navegador REQUERIDO** (p. ej. chrome-devtools): `take_screenshot` + `take_snapshot` | Acreditar fidelidad visual observando la **salida real** (app vs prototipo). | **No hay alternativa para UI**: sin verificación visual real el gate queda `false` (corre el slice donde el MCP esté disponible). El estático solo complementa. |
73
78
  | `ux` (release) | `ux-krug-reviewer` | Navegador headless con auditoría tipo Lighthouse | Accesibilidad / Best-Practices y snapshots de la UI ensamblada de la release. | Revisión heurística Krug sobre el código + capturas manuales. |
74
79
  | `api` (inner) | `api-contract-tester` | **Newman corre por CLI, no es MCP** | Contratos de endpoints sobre una colección de pruebas. | Es la vía por defecto: se ejecuta vía Bash, sin MCP. |
75
80
  | `data` (inner) | `data-consistency-checker` | MCP de base de datos (solo si tu slice usa esa BD) | Consultas de lectura / describe de tablas para validar invariantes y consistencia. | Validación por tests contra un almacén embebido o cliente del stack. |
@@ -83,6 +88,12 @@ Notas de coherencia con el arnés:
83
88
  release** en `releasing-a-version`. Habilita los MCP de esas fases pensando en el outer loop.
84
89
  - El gate `api` usa **Newman por CLI**: es un ejemplo de que la herramienta de un gate **no tiene por
85
90
  qué ser un MCP**. Lo importante es la evidencia (los contratos responden), no el canal.
91
+ - **Excepción única — `fidelity` en slices con UI.** Es el **único** gate donde un MCP es **requerido**,
92
+ no opt-in: la fidelidad visual no puede acreditarse sin **observar la salida real** (cargar la página,
93
+ comparar contra el prototipo, leer la consola). Se mantiene la agnosticidad a nivel de **categoría**
94
+ (cualquier MCP de devtools de navegador sirve; chrome-devtools es el ejemplo), pero **alguno** debe
95
+ estar disponible: sin él, `fidelity` queda `false` y el `dod` no cierra. La evidencia aquí **es** la
96
+ observación de la UI corriendo; no hay alternativa CLI que la sustituya.
86
97
 
87
98
  ## Reglas de uso (no negociables)
88
99
 
@@ -1,269 +1,124 @@
1
- # Getting Started Tu primer ciclo end-to-end en ~15 min
1
+ # Quickstartde 0 a tu primer slice
2
2
 
3
- Esta guía te lleva, de forma secuencial y práctica, desde cero hasta cerrar tu primer **slice**
4
- (una épica `EP-XXX`) con el arnés de construcción de Trycore (`@trycore/spec-build-harness`).
3
+ Guía pragmática para empezar a construir con `@trycore/spec-build-harness` (el compañero de construcción de `@trycore/spec-product-flow`). Instalación detallada y troubleshooting [`INSTALL.md`](../INSTALL.md). Metodología (fuente de verdad) → [`METODOLOGIA.md`](../METODOLOGIA.md).
5
4
 
6
- El arnés es el **compañero de construcción** de `@trycore/spec-product-flow`: la vertical de
7
- discovery produce los artefactos (`PRD → User Story Map → Backlog → Historias → Priorización →
8
- Flows`); este arnés los lleva al **código** mediante un pipeline de **dos loops**.
5
+ ## TL;DR
9
6
 
10
- | Loop | Skill | Frecuencia | Qué hace |
11
- |---|---|---|---|
12
- | **Inner** (rápido) | `building-a-slice` | por épica `EP-XXX` | DoR → OpenSpec change → TDD → journey-smoke → api/data → DoD reducido → PR + archive |
13
- | **Outer** (pesado) | `releasing-a-version` | por release (línea del Story Map) | gates de seguridad, diseño, UX, coherencia triple, arquitectura e integración con deps reales — **una sola vez** |
14
-
15
- Ambas verticales coexisten en el mismo `.claude/` sin colisión (namespaces disjuntos:
16
- `trycore/` para discovery vs. `opsx/` + `build/` para construcción).
7
+ ```bash
8
+ # 1) Requisitos + CLI — una vez por máquina
9
+ npm i -g @fission-ai/openspec @trycore/spec-build-harness
17
10
 
18
- > **Regla de oro:** `METODOLOGIA.md` es la fuente de verdad. Si una skill la contradice, **gana la
19
- > metodología**.
11
+ # 2) En la raíz de tu proyecto
12
+ trycore-build init # siembra el arnés (idempotente)
13
+ trycore-build doctor # verifica requisitos y hooks
14
+ ```
20
15
 
21
- ---
16
+ ```text
17
+ # 3) En Claude Code (lo corre Claude, no la terminal)
18
+ /build:onboard # parametriza el dominio: lee tu PRD, resuelve los {{placeholders}}
19
+ skill building-a-slice # construye una épica: DoR → change → TDD → smoke → DoD → PR
20
+ /build:reflect # (opcional) captura aprendizajes del slice recién archivado
21
+ skill releasing-a-version # al cerrar una línea de release del Story Map
22
+ ```
22
23
 
23
- ## Mapa de los 15 minutos
24
-
25
- | Min | Paso | Quién lo corre |
26
- |---|---|---|
27
- | 0–2 | 1. Instalar el CLI + requisitos duros | terminal |
28
- | 2–5 | 2. `trycore-build init` en tu proyecto | terminal |
29
- | 5–6 | 3. `trycore-build doctor` (verificar) | terminal |
30
- | 6–9 | 4. `/build:onboard` (parametrizar dominio) | Claude Code |
31
- | 9–14 | 5. Abrir un slice con la skill `building-a-slice` | Claude Code |
32
- | 14+ | 6. ¿Cuándo correr `releasing-a-version`? | Claude Code |
24
+ Eso es el ciclo completo. Lo de abajo explica cada paso.
33
25
 
34
26
  ---
35
27
 
36
- ## Paso 1 · Instalar el CLI y los requisitos duros (~2 min)
28
+ ## Requisitos duros
37
29
 
38
- El CLI `trycore-build` siembra los archivos del arnés. Pero el arnés depende de **tres binarios
39
- externos** que el CLI **no puede instalar por ti**. `init` y `doctor` **fallan (exit 1)** si falta
40
- alguno:
30
+ `init` y `doctor` **fallan (exit 1)** si falta alguno:
41
31
 
42
- | Requisito | Para qué | Cómo instalarlo |
32
+ | Requisito | Para qué | Instalación |
43
33
  |---|---|---|
44
- | `openspec` | columna vertebral de `/opsx:*` y las skills `openspec-*` | `npm i -g @fission-ai/openspec` |
45
- | `python3` | los hooks parsean `build-state.json` con python3 | gestor del sistema (brew, apt, …) |
46
- | `git` | los hooks y `gitflow-guard` resuelven la raíz y bloquean commits directos | gestor del sistema |
47
-
48
- Instala el CLI y OpenSpec:
49
-
50
- ```bash
51
- npm install -g @trycore/spec-build-harness # CLI: bin `trycore-build`
52
- npm install -g @fission-ai/openspec # requisito duro
53
- ```
34
+ | `openspec` | base de `/opsx:*` y las skills `openspec-*` | `npm i -g @fission-ai/openspec` |
35
+ | `python3` | los hooks leen `build-state.json` | gestor del sistema (brew/apt) |
36
+ | `git` | ramas, PRs, archivado de changes | gestor del sistema |
54
37
 
55
- > **Canal CLI vs. plugin.** El canal **npm CLI es el canónico** y el recomendado para operar en un
56
- > proyecto: instala los comandos en `.claude/commands/{opsx,build}/`, namespaceados por subcarpeta
57
- > (`/opsx:*`, `/build:onboard`), y referencia los agentes por su nombre. El canal **plugin nativo**
58
- > (`/plugin marketplace add <repo> ; /plugin install trycore-spec-build-harness@trycore-build`) se
59
- > ofrece como conveniencia a nivel usuario, pero Claude Code namespacea sus componentes bajo el
60
- > nombre del plugin (`/trycore-spec-build-harness:*`); las cross-references internas (skills que
61
- > invocan `/opsx:*`, agentes por nombre) están escritas para el canal CLI. **Para construir en un
62
- > proyecto, usa el CLI.**
38
+ Runtime Node ≥18. **Usa el canal CLI** (npm), no el plugin, para operar dentro de un proyecto (ver el caveat de canales en [`INSTALL.md`](../INSTALL.md)).
63
39
 
64
40
  ---
65
41
 
66
- ## Paso 2 · `trycore-build init` en tu proyecto (~3 min)
67
-
68
- Sitúate en la raíz de tu proyecto y ejecuta:
42
+ ## 1 · Instalar (terminal)
69
43
 
70
44
  ```bash
71
- trycore-build init
45
+ npm i -g @fission-ai/openspec @trycore/spec-build-harness
72
46
  ```
73
47
 
74
- `init` es **idempotente** (re-correrlo es seguro) y siembra:
75
-
76
- - **11 agentes** en `.claude/agents/build/` (build-orchestrator, dor-dod-gatekeeper,
77
- security-reviewer, simple-design-reviewer, ux-krug-reviewer, coherence-three-way, stack-guardian,
78
- api-contract-tester, data-consistency-checker, change-epic-coherence, ux-fidelity-reviewer).
79
- - **Comandos** `/opsx:*` (10) en `.claude/commands/opsx/` + `/build:onboard` y `/build:reflect` en `.claude/commands/build/`.
80
- - **12 skills** en `.claude/skills/` (`building-a-slice`, `releasing-a-version`, 10 `openspec-*`).
81
- - **9 hooks** bash en `.claude/hooks/build/` + permisos mínimos en `settings.json`.
82
- - **Estado**: `.claude/state/build-state.json` (sembrado **vacío** y **nunca** sobreescrito; va al
83
- `.gitignore`), más el schema y el README versionados.
84
- - **Config**: `.claude/config/stack-allowlist.json` (artefacto del consumidor; lo siembra el CLI y
85
- lo puebla `/build:onboard`).
86
- - **Bloque marcado en `CLAUDE.md`** entre `<!-- BEGIN trycore-build-harness ... -->` y
87
- `<!-- END trycore-build-harness -->`, con `{{placeholders}}` **sin resolver** (los resuelve
88
- `/build:onboard`).
89
-
90
- ### Onboarding en dos capas
91
-
92
- El onboarding tiene **dos capas** por una razón técnica: un binario Node **no puede escribir la
93
- auto-memory de Claude**.
94
-
95
- 1. **Capa mecánica (este CLI)** — captura el stack: lenguaje/deps, package manager, runtime y ruta
96
- del PRD. Por **prompt TTY** interactivo, o **CI-safe** con flags y `--yes`.
97
- 2. **Capa semántica (`/build:onboard`, lo corre Claude)** — lee el PRD, pregunta por PII, capa de
98
- servicios externos/IA, capa determinista, secretos y decisiones de alto impacto, resuelve los
99
- `{{placeholders}}` y escribe la auto-memory. (Paso 4.)
48
+ ## 2 · `trycore-build init` (terminal)
100
49
 
101
- #### Flags de `init` (modo no interactivo / CI)
102
-
103
- | Flag | Para qué |
104
- |---|---|
105
- | `--yes` | no interactivo: usa defaults para el stack |
106
- | `--stack <deps>` | dependencias permitidas, coma-separadas |
107
- | `--pkg-manager <pm>` | package manager (`npm` \| `pnpm` \| `yarn`) |
108
- | `--runtime <semver>` | semver del runtime (ej. `">=18.18"`) |
109
- | `--prd-path <path>` | ruta#ancla del PRD técnico (fuente del allowlist) |
110
- | `--copy` | copiar archivos en vez de symlinkear (Windows sin admin, sandboxes) |
111
- | `--force-init` | fuerza modo init aunque exista instalación previa |
112
- | `--skip-doctor` | omite la verificación de requisitos (no recomendado) |
113
-
114
- Ejemplo CI-safe:
50
+ Desde la raíz de tu proyecto. Es **idempotente** (re-correrlo es seguro) y siembra: **12 agentes**, **12 skills**, **10 comandos `/opsx:*`** + `/build:onboard` + `/build:reflect`, **9 hooks**, el estado vacío `.claude/state/build-state.json` (gitignored, nunca se sobreescribe) y el bloque `<!-- BEGIN trycore-build-harness -->` en tu `CLAUDE.md` con `{{placeholders}}` sin resolver.
115
51
 
116
52
  ```bash
117
- trycore-build init --yes \
118
- --stack "express,zod,pg" --pkg-manager pnpm \
119
- --runtime ">=18.18" --prd-path "docs/01-prd/prd.md#requisitos-tecnicos"
53
+ trycore-build init
120
54
  ```
121
55
 
122
- > Otros comandos del CLI: `trycore-build status` (estado de la instalación y fase del arnés),
123
- > `trycore-build update` (refresca assets/schema tras actualizar el paquete; **no** pisa estado ni
124
- > allowlist), `trycore-build uninstall` (quita el arnés **preservando** `state/` y `config/`).
125
-
126
- ---
127
-
128
- ## Paso 3 · `trycore-build doctor` (~1 min)
129
-
130
- Verifica que el entorno esté listo **antes** de construir:
56
+ CI / no interactivo:
131
57
 
132
58
  ```bash
133
- trycore-build doctor
59
+ trycore-build init --yes \
60
+ --stack "express,zod,pg" --pkg-manager pnpm \
61
+ --prd-path "docs/01-prd/prd.md#requisitos-tecnicos"
134
62
  ```
135
63
 
136
- Comprueba:
137
-
138
- - Los **3 requisitos duros** (`git`, `python3`, `openspec`) — **falla con exit 1** si falta alguno.
139
- - Que los **9 hooks** tengan bit ejecutable (si no, sugiere `trycore-build init --copy` o `chmod +x`).
140
- - **Doble canal**: si detecta hooks del arnés en `settings.json` (canal CLI) y además instalaste el
141
- plugin, te recuerda que la cadena de comando es idéntica en ambos canales y Claude Code
142
- **deduplica** → el hook dispara **una sola vez**. No requiere acción.
143
- - **Reflexión y LSP (informativo, no falla):** reporta cuántos slices archivados están **sin
144
- reflexionar** (sugiere `/build:reflect`) y, si detecta un stack tipado (`pom.xml`,
145
- `build.gradle`, `*.csproj`, `tsconfig.json`…), sugiere activar **LSP**
146
- (ver `docs/customization/lsp-extensions.md`).
147
-
148
- Si ves `✓ Requisitos satisfechos.`, continúa.
149
-
150
- ---
151
-
152
- ## Paso 4 · `/build:onboard` en Claude Code (~3 min)
153
-
154
- Abre Claude Code en el proyecto y ejecuta:
64
+ Otros: `trycore-build status` · `update` (refresca assets, no toca tu estado) · `uninstall` (preserva `state/` y `config/`). Flags completos en [`INSTALL.md`](../INSTALL.md).
155
65
 
156
- ```
157
- /build:onboard
158
- ```
66
+ ## 3 · `/build:onboard` (Claude Code)
159
67
 
160
- Este slash command (lo corre Claude, no el CLI) **parametriza el dominio**: lee tu PRD y/o
161
- `openspec/project.md` y confirma contigo, vía `AskUserQuestion`, **6 puntos** que luego leen los
162
- agentes de calidad:
68
+ Abre Claude Code en el proyecto y corre `/build:onboard`. Lee tu PRD y confirma contigo, vía `AskUserQuestion`, **7 puntos de dominio** que luego leen los agentes de calidad; al terminar resuelve los `{{placeholders}}` del `CLAUDE.md` y escribe la auto-memory.
163
69
 
164
70
  | Placeholder | Qué define |
165
71
  |---|---|
166
72
  | `PRD_TECH_PATH` | ruta#ancla del PRD técnico (fuente del stack) |
167
- | `EXTERNAL_SERVICE_LAYER` | capa de servicios externos / IA y su frontera/aislamiento |
73
+ | `EXTERNAL_SERVICE_LAYER` | capa de servicios externos / IA y su frontera |
168
74
  | `DETERMINISTIC_LAYER` | lógica que **no** puede delegarse a un servicio no determinista |
169
- | `SENSITIVE_DATA_CATEGORIES` | categorías reguladas de datos / PII del dominio |
170
- | `SERVER_SIDE_SECRETS` | claves/tokens que **jamás** van al cliente |
171
- | `HIGH_STAKES_DECISIONS` | decisiones que exigen explicabilidad/justificación en la UI |
172
-
173
- Al terminar, `/build:onboard` resuelve los `{{placeholders}}` del bloque marcado en `CLAUDE.md`,
174
- opcionalmente puebla el `stack-allowlist.json`, y escribe la auto-memory (memorias tipo `project`).
175
- Si un punto no aplica, se registra explícitamente como "no aplica" (no se deja como `{{...}}`).
75
+ | `SENSITIVE_DATA_CATEGORIES` | datos / PII regulados del dominio |
76
+ | `SERVER_SIDE_SECRETS` | secretos que **jamás** van al cliente |
77
+ | `HIGH_STAKES_DECISIONS` | decisiones que exigen explicabilidad en la UI |
78
+ | `DESIGN_SOURCE` | fuente de diseño / referencia visual (prototipo/export), o `N/A` si no hay UI |
176
79
 
177
- ---
80
+ Si un punto no aplica, se registra como "no aplica" (no se deja como `{{...}}`).
178
81
 
179
- ## Paso 5 · Abrir un slice con `building-a-slice` (~5 min)
82
+ ## 4 · Construir un slice (Claude Code)
180
83
 
181
- Esta es la unidad de trabajo del **inner loop**: **un slice = una épica = un OpenSpec change = una
182
- rama = un PR**. Las HU de la épica (las que tienen `epica: EP-XXX` en `docs/04-historias/`) son el
183
- **alcance interno** del change.
184
-
185
- En Claude Code, invoca la skill (o pídelo en lenguaje natural: *"construye la épica EP-001"*):
84
+ **Un slice = una épica `EP-XXX` = un OpenSpec change = una rama = un PR.** Las HU de la épica son su alcance interno. Invoca `skill building-a-slice` (o pídelo en lenguaje natural: *"construye EP-001"*). Pipeline del **inner loop**:
186
85
 
187
86
  ```
188
- skill building-a-slice
87
+ DoR → change (+ trazabilidad) → TDD → journey-smoke (+ fidelidad si hay UI) → api/data → DoD reducido → PR + archive
189
88
  ```
190
89
 
191
- La skill conduce el pipeline (delega en el `build-orchestrator`). Las fases del inner loop:
192
-
193
- | Fase | Acción | Delega en | Gate |
194
- |---|---|---|---|
195
- | 1 · dor | Validar Definition of Ready | `dor-dod-gatekeeper` | `dor` |
196
- | 2 · change | `/opsx:new` + bloque `## Trazabilidad` que enlaza el change a la épica | `/opsx:new`, `change-epic-coherence` | `coherence_link` |
197
- | 3 · tdd | red → green → refactor | `superpowers:test-driven-development` | `tdd` |
198
- | 4 · smoke | recorrer el journey-hasta-aquí end-to-end | skill `verify`/`run` (+ MCP) | `journey_smoke` |
199
- | 5 · api/data | contratos + consistencia (si aplican) | `api-contract-tester`, `data-consistency-checker` | `api`, `data` |
200
- | 6 · dod | Definition of Done reducido por slice | `dor-dod-gatekeeper` | `dod` |
201
- | 7 · pr | abrir PR + archivar el change en el mismo PR | `/opsx:archive`, `/opsx:sync` | — |
202
- | 8 · release? | preguntar si correr el Release Gate ahora | usuario (default computado) | — |
203
-
204
- Notas clave del inner loop:
205
-
206
- - **Esqueleto que camina.** El **primer** slice de una release construye el journey completo más
207
- delgado posible (aunque cada paso sea un stub). Cada épica posterior **engorda** un paso y mantiene
208
- el `journey_smoke` verde. Nunca se construyen capas horizontales aisladas que "se juntan al final".
209
- - **Estado = una sola fuente de verdad.** Todo se sincroniza en `.claude/state/build-state.json`
210
- (schema y protocolo en `.claude/state/README.md`). Lee antes de actuar; escribe una vez por
211
- transición. Un slice activo a la vez; un gate no se salta.
212
- - **Gates pesados NO se cierran aquí.** `stack`, `security`, `smell`, `ux` y la coherencia triple
213
- completa pertenecen al Release Gate. Lo que sí corre en tiempo real son los **hooks**:
214
- `stack-guard.sh` (vigila deps fuera del allowlist), `lint-typecheck.sh`, `gitflow-guard.sh`
215
- (bloquea commits/push directos a `main` — integras solo por **PR**).
216
- - **El enlace change↔épica** va en el bloque `## Trazabilidad` del `proposal.md`, **nunca** en
217
- frontmatter YAML (rompe `openspec validate`).
218
- - **Reflexión (ciclo autocorrectivo).** Tras archivar el slice, `/build:reflect` puede capturar las
219
- convenciones aprendidas / errores recurrentes en el bloque `trycore-build-learnings` de
220
- `CLAUDE.md` (con tu aprobación). Lo **sugiere** el hook `reflect-nudge.sh` al cerrar la sesión;
221
- es opcional y no bloquea.
222
- - Objetivo: **≤ ~20 min por épica**, y producto que **camina end-to-end en todo momento**.
223
-
224
- ---
90
+ Lo que importa:
225
91
 
226
- ## Paso 6 · ¿Cuándo correr `releasing-a-version`? (outer loop)
92
+ - **Esqueleto que camina.** El **primer** slice arma el journey completo más delgado posible; cada épica posterior engorda un paso y mantiene el `journey_smoke` verde. Nunca capas horizontales que "se juntan al final".
93
+ - **Precondiciones duras (el arnés las exige, no las genera):** un *scaffold runnable* confirmado y —si el slice tiene UI— una *fuente de diseño declarada* (`design_source`). Los hooks `scaffold-guard` y `design-source-guard` las respaldan.
94
+ - **Los gates pesados NO se cierran aquí** (seguridad, diseño, UX/Krug, coherencia triple, arquitectura): van al Release Gate. En el inner loop solo corre lo barato + los hooks en tiempo real (`gitflow-guard` bloquea commits/push directos a `main` → integras solo por **PR**; `stack-guard`, `lint-typecheck`).
95
+ - **El enlace change↔épica** va en el bloque `## Trazabilidad` del `proposal.md`, nunca en frontmatter YAML.
96
+ - **Una sola fuente de verdad:** `.claude/state/build-state.json`. Un slice activo a la vez; un gate no se salta. Objetivo: **≤ ~20 min por épica**.
227
97
 
228
- Tras archivar la épica (fase 8), la skill te **pregunta** si correr el Release Gate, con un
229
- **default computado** desde las líneas de release del Story Map (`docs/02-user-story-map/`):
98
+ > ¿Mantenimiento que no es producto nuevo (typo, bump de dep ya permitida, copy/config)? Usa `skill building-a-micro-change` (carril ligero `fix/*`/`chore/*`), no una épica.
230
99
 
231
- - Si la épica **cierra una línea de release** (todas sus épicas ya están archivadas) → default
232
- **"Sí, correr `releasing-a-version`"**.
233
- - Si no la cierra → default **"Continuar a la siguiente épica"**. Excepción (*nudge*): si hay
234
- **≥ 2 épicas** archivadas desde el último Release Gate, lo recomienda igual.
100
+ ## 5 · Release Gate (Claude Code, por release)
235
101
 
236
- El humano siempre decide. El Release Gate corre las **revisiones pesadas una sola vez**, sobre el
237
- **diff acumulado** de toda la release:
102
+ Al archivar una épica, la skill te **pregunta** si correr el Release Gate (default computado desde las líneas de release del Story Map). `skill releasing-a-version` corre las **revisiones pesadas una sola vez** sobre el diff acumulado:
238
103
 
239
104
  | Gate | Delega en |
240
105
  |---|---|
241
106
  | `security` | `security-reviewer` |
242
- | `smell` (4 reglas de Beck + code smells) | `simple-design-reviewer` |
107
+ | `smell` (Beck + code smells) | `simple-design-reviewer` |
243
108
  | `ux` (Krug + lighthouse; `null` si sin UI) | `ux-krug-reviewer` |
244
109
  | `coherence` (trazabilidad triple AC↔change↔código) | `coherence-three-way` |
245
110
  | `stack_arch` (arquitectura del PRD) | `stack-guardian` |
246
- | `integration` (journey completo con **deps reales**, no stubs) | skill `verify`/`run` |
111
+ | `integration` (journey completo con **deps reales**) | skill `verify`/`run` |
247
112
 
248
- Los resultados se registran en `build-state.json → releases[]`. **La integración con deps reales es
249
- obligatoria** para `status: passed`: es el gate que garantiza que el producto realmente funciona al
250
- terminar. Si algo falla, lo corriges como un slice normal en `building-a-slice` y re-corres el gate.
113
+ `integration` con deps reales es obligatoria para `status: passed`. Se registra en `build-state.json → releases[]`. Si algo falla, lo corriges como un slice normal y re-corres el gate.
251
114
 
252
115
  ---
253
116
 
254
- ## Resumen del primer ciclo
117
+ ## Siguiente
255
118
 
256
- ```
257
- npm i -g @trycore/spec-build-harness @fission-ai/openspec # paso 1
258
- trycore-build init # paso 2
259
- trycore-build doctor # paso 3
260
- # en Claude Code:
261
- /build:onboard # paso 4
262
- skill building-a-slice # EP-XXX: DoR → /opsx:new → TDD → smoke → DoD → PR # paso 5
263
- /build:reflect # opcional: captura aprendizajes del slice recién archivado
264
- # y cuando cierres una línea de release del Story Map:
265
- skill releasing-a-version # paso 6
266
- ```
119
+ - **Instalación detallada / flags / plugin / troubleshooting** → [`INSTALL.md`](../INSTALL.md)
120
+ - **Agentes** [`docs/agents.md`](agents.md) · **Hooks** → [`docs/hooks.md`](hooks.md) · **Comandos** → [`docs/commands.md`](commands.md)
121
+ - **Metodología** (manda ante cualquier skill) → [`METODOLOGIA.md`](../METODOLOGIA.md)
122
+ - **Extender con MCP/LSP** (opt-in) → [`docs/customization/`](customization/)
267
123
 
268
- > El core del arnés es **100% agnóstico** al proyecto. El ejemplo de referencia completo vive
269
- > aparte, en `docs/examples/reference/` (no forma parte del core).
124
+ > El core es **100% agnóstico** al proyecto. El ejemplo de referencia completo vive aparte en `docs/examples/reference/` (no forma parte del core).
@@ -39,8 +39,24 @@ if not s:
39
39
  else:
40
40
  g=s.get("gates",{})
41
41
  abiertos=[k for k,v in g.items() if v is False]
42
- print(f" Slice activo: {s.get('hu')} ({s.get('epica')}) · change={s.get('openspec_change')} · fase={s.get('phase')}")
42
+ hus=", ".join(s.get("hus") or []) or "—"
43
+ print(f" Slice activo: {s.get('epica')} [{hus}] · change={s.get('openspec_change')} · fase={s.get('phase')}")
43
44
  print(f" Gates pendientes: {', '.join(abiertos) if abiertos else 'ninguno ✅'}")
45
+ # Handoff fino en disco (A1): items de cableado aún FAILING + última bitácora.
46
+ # Una sesión fresca arranca de aquí; mientras queden failing, el cableado NO está hecho.
47
+ failing=[w for w in (s.get("wiring_checklist") or []) if w.get("status")=="failing"]
48
+ if failing:
49
+ muestra="; ".join(f"{w.get('id')}({w.get('kind')})" for w in failing[:8])
50
+ extra=f" (+{len(failing)-8} más)" if len(failing)>8 else ""
51
+ print(f" ⚠️ Cableado pendiente ({len(failing)} item/s failing): {muestra}{extra}")
52
+ print(" NO declares el slice terminado mientras queden items failing (verifica con prueba real).")
53
+ pend=[ss for ss in (s.get("sub_slices") or []) if ss.get("status")!="done"]
54
+ if pend:
55
+ print(f" ⚠️ Sub-slices pendientes: {', '.join(ss.get('id') for ss in pend)}")
56
+ log=s.get("progress_log") or []
57
+ if log:
58
+ last=log[-1]
59
+ print(f" Última bitácora: [{last.get('by')}] {last.get('note')}")
44
60
  PY
45
61
  fi
46
62
  exit 0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trycore/spec-build-harness",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Arnés agéntico de construcción de Trycore para Claude Code: pipeline de dos loops (slice por épica + release gate) con gates de calidad, estado compartido y OpenSpec. Compañero de @trycore/spec-product-flow. Agnóstico al proyecto.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -25,7 +25,14 @@ el avance en el estado.
25
25
  `.claude/state/README.md`). Lee antes de actuar; escribe una vez por transición.
26
26
  - **Secuencial**: un slice activo a la vez. Un gate no se salta.
27
27
  - **Divulgación progresiva**: carga el `references/<tema>.md` solo cuando la fase lo necesita.
28
- - **Delega en subagentes** para revisión pesada (devuelven síntesis, protegen el contexto).
28
+ - **Delega en subagentes** para revisión pesada y para **explorar** (devuelven síntesis condensada,
29
+ protegen el presupuesto de atención de la sesión principal para **cablear**, no para descubrir).
30
+ - **Refresh de contexto = estado por defecto**: cada iteración nace **headless / contexto virgen** y
31
+ reconstruye el estado **desde disco** (git + `build-state.json` + logs), no desde la conversación
32
+ viva. Mantén el **`wiring_checklist[]`** (un item por escenario AC y por punto de integración entre
33
+ capas): nace `failing`, pasa a `passing` **solo tras prueba real ejecutada**. Deja una nota en
34
+ `progress_log[]` por hito. **Mientras quede un item `failing`, el slice NO está terminado.** Ver
35
+ `references/state-protocol.md`.
29
36
 
30
37
  ## Dos loops
31
38
 
@@ -39,6 +46,21 @@ inner loop: **≤ ~20 min por épica** y producto que **camina end-to-end en tod
39
46
  > cada paso sea un stub. Cada épica posterior **engorda** un paso de ese esqueleto y mantiene el
40
47
  > `journey_smoke` verde. Nunca se construyen capas horizontales aisladas que "se juntan al final".
41
48
 
49
+ > **Cimiento antes que negocio (épicas fundacionales).** Las épicas marcadas `layer: foundational`
50
+ > (autenticación, acceso a datos, arquitectura base, design-system/componentes base) se construyen
51
+ > **antes** que las `layer: business`. El DoR **rechaza** abrir una épica de negocio que arrastra
52
+ > cimiento no construido y lo extrae a una épica fundacional previa (ver `dor.md`). Así cada slice de
53
+ > negocio **solo toca lógica aplicable** y no quema contexto creando infra.
54
+
55
+ > **Descomposición por tamaño (no one-shot).** Una épica que supera el **gate de tamaño**
56
+ > (heurística por defecto: **> 3 HU** ó **≥ 3 capas tocadas**; configurable por proyecto) es
57
+ > demasiado grande para una pasada: el DoR obliga a trocearla en **sub-slices verificables**
58
+ > (`sub_slices[]`) construidos **de a uno**, con `journey_smoke` verde entre cada uno antes de pasar
59
+ > al siguiente. El orquestador trabaja por **fases encadenadas** (mapear → generar → revisar →
60
+ > fix-loop → optimizar) y reparte la exploración **"ancho antes que profundo"** con subagentes
61
+ > **solo-lectura por área** (frontend/backend/datos); el **cableado** lo hace la sesión, no
62
+ > subagentes que escriben en paralelo. Trocear acota además el tamaño del `wiring_checklist[]`.
63
+
42
64
  ## Fase 0 · Scaffold (Paso 1 fundamental — precondición restrictiva)
43
65
 
44
66
  Antes de abrir **cualquier** slice, el scaffold runnable del proyecto debe **existir y estar
@@ -78,9 +100,9 @@ Espejo de la Fase 0, para proyectos **con UI**. Antes de abrir el primer slice c
78
100
  | 1 · dor | Validar Definition of Ready | `dor-dod-gatekeeper` | `dor` | `dor.md` |
79
101
  | 2 · change | `opsx:new` + bloque `## Trazabilidad`; validar enlace (barato) | `opsx:new`, `change-epic-coherence` | `coherence_link` | `link-change-epic.md` |
80
102
  | 3 · tdd | red → green → refactor | `superpowers:test-driven-development` | `tdd` | — |
81
- | 4 · smoke | Recorrer el journey-hasta-aquí end-to-end; **slices con UI:** verificar fidelidad a la fuente de diseño | skill `verify` / `run` (+ MCP chrome-devtools), `ux-fidelity-reviewer` | `journey_smoke`,`fidelity` | `mcp-map.md` |
103
+ | 4 · smoke | Recorrer el journey-hasta-aquí end-to-end con el **runner determinista fuera-de-chat** (`integration-check`: suite+build+reporte) en **sesión/contexto virgen**; **slices con UI:** fidelidad por **verificación visual REAL** (MCP chrome-devtools, screenshot app vs prototipo) | runner `integration-check`, skill `verify`/`run` + MCP chrome-devtools, `ux-fidelity-reviewer` | `journey_smoke`,`fidelity` | `integration-check.md`, `mcp-map.md` |
82
104
  | 5 · api/data | contratos + consistencia (si aplican al slice) | `api-contract-tester`, `data-consistency-checker` | `api`,`data` | `newman-tests.md`, `data-consistency.md` |
83
- | 6 · dod | Definition of Done (por slice, reducido) | `dor-dod-gatekeeper` | `dod` | `dod.md` |
105
+ | 6 · dod | **Primero** verificación adversarial INDEPENDIENTE del cableado (contexto virgen: refuta stubs/rutas sin cablear/AC sin test/items `failing`) → `wiring_verified`; **solo entonces** Definition of Done | `wiring-adversarial-verifier`, `dor-dod-gatekeeper` | `wiring_verified`,`dod` | `dod.md`, `integration-check.md` |
84
106
  | 7 · pr | Abrir PR + archivar change en el mismo PR | `opsx:archive`, `opsx:sync` | — | `gitflow.md` |
85
107
  | 8 · release? | Preguntar si correr el Release Gate ahora | usuario (default computado) | — | abajo |
86
108
 
@@ -88,9 +110,15 @@ Los gates `stack`, `security`, `smell`, `ux` y la coherencia triple completa **y
88
110
  aquí**: pertenecen al Release Gate. Las **deps** siguen vigiladas en tiempo real por el hook
89
111
  `stack-guard.sh`; lint/tsc/gitflow por sus hooks.
90
112
 
91
- El gate `fidelity` (fidelidad a la fuente de diseño) **sí** es de inner loop: es barato (se computa
92
- en `smoke`, con la app ya levantada) y vivo por-slice; complementa al `ux-krug-reviewer` (usabilidad),
93
- que sigue en el Release Gate.
113
+ El gate `fidelity` (fidelidad a la fuente de diseño) **sí** es de inner loop: se computa en `smoke`,
114
+ con la app ya levantada, y es vivo por-slice; complementa al `ux-krug-reviewer` (usabilidad), que
115
+ sigue en el Release Gate. **Estricto para UI:** una UI no mejora su fidelidad por el prompt sino
116
+ porque el agente **carga la página, observa la salida real y lee la consola**. Para slices con UI
117
+ (`design_source.applies===true`), `fidelity` **solo cierra con verificación visual real vía MCP
118
+ chrome-devtools** (screenshot app vs prototipo). Sin MCP, `fidelity` queda `false` (INCONCLUSO ya
119
+ **no** pasa) → el `dod` no cierra: corre el slice donde haya MCP. Mantén **cobertura** (ninguna
120
+ pantalla del prototipo en alcance sin construir; ninguna pantalla de la app sin HU/EP) y el
121
+ **journey-smoke de clic real como tenant no-admin**.
94
122
 
95
123
  MCP/LSP por gate: ver `references/mcp-map.md`. Protocolo de estado: `references/state-protocol.md`.
96
124
 
@@ -126,4 +154,11 @@ El usuario siempre puede sobreescribir el default. Si acepta, invoca la skill
126
154
  - El enlace change↔épica va en `## Trazabilidad` del `proposal.md`, **nunca** en frontmatter YAML
127
155
  (rompe `openspec validate`). Ver `link-change-epic.md`.
128
156
  - Integración solo por **PR** a `main` (el hook `gitflow-guard.sh` bloquea commits/push directos).
157
+ - **`dod` exige `wiring_verified: true`** (verificación adversarial independiente, contexto virgen).
158
+ El DoD declarativo del gatekeeper es un **piso, no el arreglo**: reusar el mismo agente como
159
+ generador y verificador produce auto-confirmación. La generación y la verificación van separadas.
160
+ - **Producto completo, no MVP.** El alcance acordado se construye entero. **Recortar o diferir es
161
+ bloqueante explícito** que requiere acuerdo del equipo — nunca una decisión del modelo. No derives
162
+ en lo complejo. La verificación es **ejecutada, no por inspección** (ver `METODOLOGIA.md` y el
163
+ bloque del arnés en `CLAUDE.md`).
129
164
  - Si una regla aquí contradice la metodología Trycore (`METODOLOGIA.md`), **gana la metodología**.
@@ -12,9 +12,19 @@ pesadas (seguridad, diseño, UX, coherencia triple, arquitectura, integración)
12
12
  - [ ] **`data`** — `data-consistency-checker` valida invariantes de datos (salida de servicios externos validada contra esquema antes de alimentar la capa de decisión determinista del dominio) (si el slice toca datos).
13
13
  - [ ] **`api`** — `api-contract-tester` (Newman) 100% verde (o `null` si el slice no tiene endpoints).
14
14
  - [ ] **`fidelity` (slices con UI)** — `ux-fidelity-reviewer` devuelve **FIEL** (o DESVIACIONES todas
15
- justificadas/documentadas) → `gates.fidelity: true`; `null` si el slice no tiene UI. INCONCLUSO
16
- (MCP no disponible) se registra, **no bloquea**. Es gate **vivo** de inner loop (no la revisión Krug,
17
- que sigue en el Release Gate).
15
+ justificadas/documentadas) → `gates.fidelity: true`; `null` si el slice no tiene UI. **ESTRICTO para
16
+ UI** (`design_source.applies===true`): solo `true` con **verificación visual real** vía MCP
17
+ chrome-devtools (screenshot app vs prototipo). **INCONCLUSO ya NO pasa**: sin MCP queda `false` y el
18
+ `dod` no cierra (corre el slice donde haya MCP). Mantén **cobertura** (ninguna pantalla del prototipo
19
+ en alcance sin construir; ninguna pantalla de la app sin HU/EP). Es gate **vivo** de inner loop (no la
20
+ revisión Krug, que sigue en el Release Gate).
21
+ - [ ] **Sub-slices completos** — si la épica se descompuso (`sub_slices[]` no vacío), **todos** en
22
+ `status: done` con su `journey_smoke` verde. No se cierra `dod` con sub-slices pendientes.
23
+ - [ ] **`wiring_verified`** — el `wiring-adversarial-verifier` (subagente **independiente**, contexto
24
+ virgen) intentó **refutar** el slice (stubs, rutas sin cablear, AC sin test, items de
25
+ `wiring_checklist[]` aún `failing`) y no halló huecos → `gates.wiring_verified: true`. **Prerequisito
26
+ duro de `dod`**: el DoD declarativo de este checklist es un **piso, no el arreglo** (la auto-confirmación
27
+ surge de reusar el mismo agente como generador y verificador).
18
28
  - [ ] **OpenSpec**: todas las tasks `[x]`; el archive del change va **en el mismo PR** (no PR aparte).
19
29
  - [ ] **Docs/trazabilidad**: back-ref del change añadida en la épica y en cada HU de `hus[]`.
20
30
  - [ ] **Hooks verdes (automáticos, no son gates de agente)**: `lint-typecheck.sh` (lint + chequeo de tipos del stack declarado), `stack-guard.sh` (deps en allowlist según la sección de requisitos técnicos del PRD del consumidor, ruta declarada en `stack-allowlist.json#source`), `gitflow-guard.sh` (rama `feature/*`, sin commits directos a `main`).
@@ -7,8 +7,10 @@ la épica; lo de abajo aplica a la épica y a **cada HU** que cubre (`hus[]`). L
7
7
  - [ ] **HU enumeradas**: la épica tiene ≥1 HU; todas las que entran se listan en `hus[]`.
8
8
  - [ ] **Frontmatter completo** en cada `docs/04-historias/HU-XXX.md`: `id, titulo, epica, prioridad, complejidad, estado` y `estado: lista`.
9
9
  - [ ] **AC en Given/When/Then** por HU, **proporcional a `complejidad`** (cubre los modos de fallo que *realmente existen*, no una cuota fija): `trivial`/baja → **1–2** (happy + el error/edge crítico si existe); `media` → **3** (happy + error + edge); `alta` → **3–5** (cobertura completa). Regla dura Trycore: si existe una rama de error/edge, **debe** tener su escenario (lo que se elimina es fabricar 3–5 para una HU trivial).
10
- - [ ] **INVEST** por HU: pasa los 6 criterios (Independent, Negotiable, Valuable, Estimable, Small, Testable). Ante duda, invocar `invest-validator`.
11
- - [ ] **Dependencias resueltas**: las épicas/HU de las que depende están archivadas (`history[]`) o explícitamente no bloquean.
10
+ - [ ] **INVEST** por HU: pasa los 6 criterios (Independent, Negotiable, Valuable, Estimable, Small, Testable).
11
+ - [ ] **Dependencias resueltas**: las épicas/HU de las que depende están archivadas (`history[]`) o explícitamente no bloquean. **Excepción dura — cimiento:** si la dependencia es **infraestructura fundacional** (autenticación, acceso a datos, arquitectura base, design-system/componentes base), la cláusula "explícitamente no bloquean" **NO aplica**: debe estar **construida y archivada** antes (ver criterio "Cimiento construido").
12
+ - [ ] **Cimiento construido (épicas de negocio)**: si esta épica es `layer: business`, todo el cimiento que arrastra (auth, acceso a datos, arquitectura base, design-system/componentes base) ya existe como épica(s) `layer: foundational` **archivada(s)** en `history[]`. Si arrastra cimiento no construido → **STOP**: extráelo a una épica fundacional previa y constrúyela primero. Las épicas fundacionales se priorizan **antes** que las de negocio.
13
+ - [ ] **Tamaño acotado (gate de descomposición)**: si la épica supera el umbral —heurística por defecto **> 3 HU** ó **≥ 3 capas tocadas** (configurable por proyecto)— **no entra como slice único**: se descompone en `sub_slices[]` verificables construidos de a uno, con `journey_smoke` verde entre cada uno. El umbral es proporcional (no cuota rígida): una épica de 1 capa y pocas HU entra directa.
12
14
  - [ ] **Cabe en el stack** del PRD §7 (no requiere tecnología fuera de `stack-allowlist.json`).
13
15
  - [ ] **Datos de prueba disponibles** o identificables (p.ej. los datos de ejemplo / fixtures sintéticos del dominio del consumidor).
14
16
  - [ ] **Fuente de diseño identificada (slices con UI)**: la fuente visual de verdad del slice
@@ -16,5 +18,6 @@ la épica; lo de abajo aplica a la épica y a **cada HU** que cubre (`hus[]`). L
16
18
  slice apunta a la(s) pantalla(s) equivalente(s). No se construye UI fuera de la fuente declarada.
17
19
 
18
20
  **Si todo ✓** → `dor-dod-gatekeeper` abre `active_slice` en `build-state.json` con `epica`, `hus[]`,
19
- `phase: dor`, `gates.dor: true` y el resto en `false` (`fidelity`/`api` en `null` si la épica no toca UI/endpoints).
21
+ `phase: dor`, `gates.dor: true` y el resto en `false` —incluido **`wiring_verified: false`**—
22
+ (`fidelity`/`api` en `null` si la épica no toca UI/endpoints; `fidelity` arranca en `false` si toca UI).
20
23
  **Si algo ✗** → no se abre el slice; se reporta qué falta y se vuelve a discovery (Trycore).
@@ -0,0 +1,27 @@
1
+ # Runner de integración fuera-de-chat (`integration-check`)
2
+
3
+ Gate determinista que cierra `journey_smoke` **ejecutando**, no por inspección. Lleva el patrón del
4
+ gate fuera-de-chat (como `tools/loop/gateway-check.sh` de un consumidor) al **inner-loop manual**, no
5
+ solo al autónomo. **No crea ningún gate nuevo**: alimenta el `journey_smoke` existente del slice. El
6
+ gate `integration` con dependencias reales sigue siendo del **Release Gate** (outer loop).
7
+
8
+ ## Por qué fuera de chat y en contexto virgen
9
+ - El cableado end-to-end **se ejecuta** (build + suite + journey), no se "razona". Un script lo hace
10
+ reproducible y barato en contexto.
11
+ - Quien escribió el código **no es buen juez** de su propio cableado: corre el runner en una
12
+ **sesión/contexto virgen** (o como paso de CI) y entra al **fix-loop** (corre → lee el reporte →
13
+ arregla → repite) hasta verde.
14
+
15
+ ## Cómo adoptarlo
16
+ 1. Copia `templates/integration-check.sh.template` a tu repo (p.ej. `tools/loop/integration-check.sh`)
17
+ y hazlo ejecutable (`chmod +x`).
18
+ 2. **Adapta** los comandos marcados `# ADAPTA` a tu stack (build, suite, e2e). El arnés es agnóstico:
19
+ el template trae defaults de Node como punto de partida.
20
+ 3. Córrelo en la fase `smoke`. Salida **0 = verde** (puedes marcar `journey_smoke: true`), **≠0 = rojo**.
21
+ El reporte queda en `.claude/state/integration-report.txt`.
22
+ 4. Mientras la suite no esté verde y el journey no camine end-to-end, `journey_smoke` queda `false`.
23
+
24
+ ## Relación con el cableado fino
25
+ Cada paso verde del runner es la **evidence** que permite pasar items de `wiring_checklist[]` de
26
+ `failing` a `passing` (ver `state-protocol.md`). El `wiring-adversarial-verifier` (fase `dod`) revisará
27
+ después que esa evidencia sea real.
@@ -15,7 +15,7 @@ los expone, el gate se cubre con las alternativas CLI/test indicadas.
15
15
  | Fase / agente | MCP (ejemplo, si habilitado) | Para qué |
16
16
  |---|---|---|
17
17
  | `review` · `ux-krug-reviewer` | **chrome-devtools** | `take_snapshot` (árbol accesible), `lighthouse_audit` (Accessibility/Best-Practices), `take_screenshot`, `list_console_messages` para verificar la UI **corriendo**. |
18
- | `smoke` · `ux-fidelity-reviewer` | **chrome-devtools** *(ejemplo opt-in)* | `new_page`/`navigate_page`, `take_screenshot`, `take_snapshot` para comparar **composición/paleta/tipografía** del diseño vs la app corriendo. Requiere la app levantada; úsalo en fase `active`. Si no hay MCP, el agente degrada a comparación estática (INCONCLUSO). |
18
+ | `smoke` · `ux-fidelity-reviewer` | **chrome-devtools** *(REQUERIDO para slices con UI)* | `new_page`/`navigate_page`, `take_screenshot`, `take_snapshot` para comparar **composición/paleta/tipografía** del diseño vs la app corriendo. Requiere la app levantada; úsalo en fase `active`. **Excepción a la regla opt-in**: para UI la verificación visual real es obligatoria; sin MCP, `fidelity` queda `false` (INCONCLUSO bloquea) y el `dod` no cierra. Cualquier MCP de devtools de navegador sirve (chrome-devtools es el ejemplo). |
19
19
  | `api` · `api-contract-tester` | — (Newman CLI) | Contratos de endpoints. Newman no es MCP; corre vía Bash. |
20
20
  | `data` · `data-consistency-checker` | **postgresql** *(solo si el slice usa Postgres)* | `read_query`/`describe_table` para validar consistencia en BD. Con un almacén embebido/cliente (según el stack declarado en el PRD del consumidor) se valida por tests, sin MCP. |
21
21
  | perf (opcional, fuera del DoD) | **k6** | `execute_k6_test` para carga/latencia si una HU de la épica lo exige. |