@trycore/spec-build-harness 0.5.0 → 0.7.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.
Files changed (52) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/GOVERNANCE.md +44 -4
  3. package/INSTALL.md +3 -1
  4. package/METODOLOGIA.md +89 -14
  5. package/README.md +8 -14
  6. package/VERSION +1 -1
  7. package/agents/build/api-contract-tester.md +8 -0
  8. package/agents/build/build-orchestrator.md +44 -9
  9. package/agents/build/change-epic-coherence.md +11 -2
  10. package/agents/build/coherence-three-way.md +12 -4
  11. package/agents/build/data-consistency-checker.md +7 -0
  12. package/agents/build/dor-dod-gatekeeper.md +26 -10
  13. package/agents/build/security-reviewer.md +11 -3
  14. package/agents/build/simple-design-reviewer.md +4 -3
  15. package/agents/build/stack-guardian.md +12 -4
  16. package/agents/build/ux-fidelity-reviewer.md +22 -15
  17. package/agents/build/ux-krug-reviewer.md +12 -3
  18. package/agents/build/wiring-adversarial-verifier.md +66 -0
  19. package/commands/build/onboard.md +36 -1
  20. package/commands/build/reflect.md +32 -8
  21. package/commands/build/release.md +84 -0
  22. package/commands/build/slice.md +93 -0
  23. package/commands/build/work.md +68 -0
  24. package/docs/agents.md +26 -3
  25. package/docs/customization/mcp-extensions.md +16 -5
  26. package/docs/getting-started.md +64 -209
  27. package/docs/super-power-workflows.md +281 -0
  28. package/hooks/build/build-gate-check.sh +3 -1
  29. package/hooks/build/load-build-state.sh +44 -6
  30. package/hooks/build/release-gate-nudge.sh +40 -0
  31. package/hooks/build/stack-guard.sh +30 -8
  32. package/hooks/build-harness.json +4 -0
  33. package/package.json +1 -1
  34. package/scripts/check-agnostic.sh +1 -1
  35. package/skills/building-a-slice/SKILL.md +62 -6
  36. package/skills/building-a-slice/references/dod.md +15 -3
  37. package/skills/building-a-slice/references/dor.md +6 -3
  38. package/skills/building-a-slice/references/exploration-fanout.md +36 -0
  39. package/skills/building-a-slice/references/integration-check.md +27 -0
  40. package/skills/building-a-slice/references/mcp-map.md +1 -1
  41. package/skills/building-a-slice/references/state-protocol.md +26 -4
  42. package/skills/building-a-slice/workflows/README.md +25 -0
  43. package/skills/building-a-slice/workflows/explore-fanout.workflow.js +77 -0
  44. package/skills/building-a-slice/workflows/wiring-verify.workflow.js +88 -0
  45. package/skills/releasing-a-version/SKILL.md +21 -0
  46. package/skills/releasing-a-version/references/release-dod.md +2 -1
  47. package/skills/releasing-a-version/workflows/README.md +19 -0
  48. package/skills/releasing-a-version/workflows/release-gate.workflow.js +104 -0
  49. package/state/README.md +23 -5
  50. package/state/build-state.schema.json +51 -4
  51. package/templates/CLAUDE.md.template +6 -2
  52. package/templates/integration-check.sh.template +65 -0
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "trycore-spec-build-harness",
4
4
  "displayName": "Trycore — Spec & Build Harness",
5
- "version": "0.5.0",
5
+ "version": "0.7.0",
6
6
  "description": "Arnés de construcción de dos loops (slice por épica + release gate) para Claude Code, con gates de calidad, estado compartido y OpenSpec. Compañero de @trycore/spec-product-flow. Agnóstico al proyecto.",
7
7
  "author": {
8
8
  "name": "Trycore",
package/GOVERNANCE.md CHANGED
@@ -8,9 +8,10 @@ evoluciona con el modelo y el proyecto. No es "instalar y olvidar".
8
8
  |---|---|---|
9
9
  | Contexto | sección Construcción de CLAUDE.md, `openspec/project.md` | raíz / `openspec/` |
10
10
  | Estado | `build-state.json` (+schema, README) | `.claude/state/` |
11
- | Agentes | 11 agentes de build | `.claude/agents/build/` |
12
- | Hooks | settings.json + 9 scripts | `.claude/settings.json`, `.claude/hooks/build/` |
13
- | Skill | `building-a-slice` (+10 refs) · `building-a-micro-change` (carril ligero de mantenimiento) | `.claude/skills/` |
11
+ | Agentes | 12 agentes de build | `.claude/agents/build/` |
12
+ | Hooks | settings.json + 10 scripts | `.claude/settings.json`, `.claude/hooks/build/` |
13
+ | Skill | `building-a-slice` (+11 refs · `workflows/`) · `releasing-a-version` (`workflows/`) · `building-a-micro-change` (carril ligero de mantenimiento) | `.claude/skills/` |
14
+ | Comandos | `/opsx:*` · `/build:onboard` · `/build:reflect` · `/build:slice` · `/build:release` · `/build:work` | `.claude/commands/` |
14
15
  | Config | allowlist de stack | `.claude/config/stack-allowlist.json` |
15
16
 
16
17
  ## Fases de activación (`harness_phase`)
@@ -28,7 +29,8 @@ evoluciona con el modelo y el proyecto. No es "instalar y olvidar".
28
29
  hook o un agente? Si sí, retirarlo.
29
30
  3. **Allowlist vs PRD**: re-sincronizar `stack-allowlist.json` con la sección de requisitos técnicos del PRD del consumidor (ruta declarada en `stack-allowlist.json#source`) si el stack cambió.
30
31
  4. **Coherencia de convenciones**: que `build-state.schema.json`, los agentes y la skill sigan
31
- alineados (mismos nombres de gate/fase).
32
+ alineados (mismos nombres de gate/fase). Las plantillas `*.workflow.js` de `skills/*/workflows/`
33
+ entran al **mismo barrido agnóstico** que `agents/` y `skills/` (`check-agnostic.sh` incluye `*.js`).
32
34
 
33
35
  ## DRI (Directly Responsible Individual)
34
36
  Un **Agent Manager** (rol híbrido PM + DevEx) centraliza qué funciona y evita la fragmentación de
@@ -44,6 +46,44 @@ Editar `stack-allowlist.json` SOLO si la sección de requisitos técnicos del PR
44
46
  ## Bitácora de cambios de metodología
45
47
  Cambios a la política de construcción (unidad de trabajo, gates, DoR/DoD). Aprueba el DRI; van por PR.
46
48
 
49
+ - **2026-06-24 · v0.7.0** — **Workflows dinámicos en el flujo build-a-slice** (origen:
50
+ evaluación adversarial del arnés con workflows dinámicos; 18 mejoras aprobadas contra una rúbrica de
51
+ hardness). **Aprobado por el DRI (Agent Manager); fusionado en PR #7.** No cambia la unidad de trabajo, los gates,
52
+ el DoR ni el DoD — introduce **mecanismos de ejecución** opcionales y endurece componentes existentes.
53
+ Cambios que tocan la metodología: (1) **§1-bis.2** — la exploración solo-lectura puede conducirse con un
54
+ **workflow fan-out** opcional, gated por el size-gate (`sub_slices[]`); read-only, no escribe estado.
55
+ (2) **§1-bis.3** — **plantilla de conducción** opcional del verificador adversarial del gate
56
+ `wiring_verified`; no es gate nuevo y no escribe estado (`build-orchestrator` sigue siendo single-writer).
57
+ (3) **§4** — el nudge "≥2 épicas archivadas desde el último `releases[]`" también lo emite un **hook Stop
58
+ determinista** (`release-gate-nudge.sh`) por aritmética de conjuntos sobre `epicas[]`. (4) **§0** — nuevo
59
+ router de entrada `/build:work` (classify-and-act) que codifica el ruteo micro-change/slice/release (ruteo,
60
+ no política nueva). Hardening sin cambio de política: corrección de la **deriva de nombres de gate** de los 5
61
+ reviewers pesados (`releases[].gates.{security,smell,ux,coherence,stack_arch}`; `stack`→`stack_arch`) y del
62
+ gate de inner loop `coherence_link`; **contrato de degradación segura** de reviewers (fallo de herramienta →
63
+ bloqueante, nunca PASS); refuerzo del `wiring-adversarial-verifier` (evidencia ejecutada, no por inspección);
64
+ **escritura atómica** del estado en `load-build-state.sh`; cierre del **bypass de specs no-semver** en
65
+ `stack-guard.sh`; `check-agnostic.sh` ahora barre `*.js`/`*.mjs`. Artefactos nuevos: **3 comandos**
66
+ (`/build:slice`, `/build:release`, `/build:work`), **1 hook** (`release-gate-nudge.sh`, total **10**),
67
+ **3 plantillas `*.workflow.js`** (read-only) + 1 reference. Empaquetado en el **release 0.7.0** (bump
68
+ simultáneo de `VERSION`, `package.json` y `plugin.json`, por la regla de version-sync).
69
+
70
+ - **2026-06-19 · v0.6.0** — **Calidad de cierre contra horizonte largo** (origen: feedback del equipo
71
+ exodocs tras varios releases, revisado por un experto de Anthropic; raíz: agotamiento de contexto +
72
+ cierre prematuro en épicas multicapa). Toca gates/DoR/DoD y el schema de estado → aprobado por el DRI
73
+ (Agent Manager). Cambios: (1) **handoff fino en disco** — nuevos campos por-slice `wiring_checklist[]`,
74
+ `progress_log[]`, `sub_slices[]` (refresh de contexto = estado por defecto); (2) **gate
75
+ `wiring_verified`** + nuevo agente **`wiring-adversarial-verifier`** (opus, contexto virgen): la
76
+ verificación es adversarial e independiente del generador, prerequisito duro de `dod` (el DoD
77
+ declarativo pasa a ser piso); (3) **cimiento pre-construido** — tag `layer: foundational|business` y
78
+ criterio de DoR que rechaza épicas de negocio que arrastran cimiento no construido (anula la cláusula
79
+ "no bloquean" para el cimiento); (4) **gate de tamaño** en el DoR (>3 HU ó ≥3 capas → descomposición
80
+ en sub-slices) + orquestación por fases con subagentes solo-lectura por área; (5) **runner fuera-de-chat
81
+ `integration-check`** que endurece `journey_smoke` (sin gate nuevo; el `integration` con deps reales
82
+ sigue en el outer loop); (6) **fidelidad estricta** — para UI, `fidelity` exige verificación visual
83
+ real vía MCP (INCONCLUSO ya no pasa). Convenciones anti-deriva (producto completo, no MVP) upstreadas
84
+ al bloque del arnés en `CLAUDE.md`. Se quitó la referencia colgante a `invest-validator` (agente
85
+ inexistente). Total: **12 agentes**.
86
+
47
87
  - **2026-06-03 · v0.5.0** — Seguro de fuente de diseño + verificación de fidelidad. Nuevo gate de
48
88
  proyecto `design_source` (espejo de scaffold, confirmado por humano; el arnés no genera el prototipo)
49
89
  con hook `design-source-guard.sh`; criterio DoR "fuente de diseño identificada" para slices con UI;
package/INSTALL.md CHANGED
@@ -13,6 +13,8 @@ Es el **compañero** de [`@trycore/spec-product-flow`](https://www.npmjs.com/pac
13
13
  | Marketplace | `trycore-build` |
14
14
  | Versión | `0.5.0` |
15
15
 
16
+ > **¿Solo quieres empezar ya?** El [Quickstart](docs/getting-started.md) te lleva de 0 a tu primer slice en pocos comandos. Esta guía es la **referencia detallada** (flags, CI, plugin, troubleshooting).
17
+
16
18
  Hay **dos canales** de instalación: el **CLI npm** (canónico, recomendado para operar en un
17
19
  proyecto) y el **plugin nativo** de Claude Code (conveniencia a nivel usuario). Lee el
18
20
  [caveat de canales](#5-alternativa-plugin-nativo-con-caveat-de-canales) antes de elegir.
@@ -84,7 +86,7 @@ Qué hace `init`:
84
86
 
85
87
  1. **Verifica requisitos duros** (a menos que uses `--skip-doctor`).
86
88
  2. **Siembra los assets** en rutas nativas de Claude Code:
87
- - `.claude/agents/build/` — 11 agentes.
89
+ - `.claude/agents/build/` — 12 agentes.
88
90
  - `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (`/build:onboard`, `/build:reflect`).
89
91
  - `.claude/skills/` — 12 skills (`building-a-slice`, `releasing-a-version`, `openspec-*`).
90
92
  - `.claude/hooks/build/` — 9 hooks bash.
package/METODOLOGIA.md CHANGED
@@ -28,7 +28,7 @@ Ambos paquetes **coexisten en el mismo `.claude/` sin colisión**, con namespace
28
28
 
29
29
  | Eje | Discovery (`spec-product-flow`) | Construcción (`spec-build-harness`) |
30
30
  |---|---|---|
31
- | Comandos | `trycore/` (`/trycore:*`) | `opsx/` + `build/` (`/opsx:*`, `/build:onboard`, `/build:reflect`) |
31
+ | Comandos | `trycore/` (`/trycore:*`) | `opsx/` + `build/` (`/opsx:*`, `/build:work`, `/build:slice`, `/build:release`, `/build:onboard`, `/build:reflect`) |
32
32
  | Sentinela de versión | `.trycore-version` | `.build-harness-version` |
33
33
  | Bloque en `CLAUDE.md` | `<!-- BEGIN trycore-vertical -->` | `<!-- BEGIN trycore-build-harness -->` |
34
34
 
@@ -63,6 +63,48 @@ por slice. Y el inner loop **no** dispara reviewers pesados. Cada gate vive en e
63
63
 
64
64
  ---
65
65
 
66
+ ## 1-bis. Disciplina de horizonte largo (cómo NO dejar cableado a medias)
67
+
68
+ Una épica multicapa (SPA → gateway → core → cola → worker → IA → persistencia) es **demasiado para una
69
+ sola pasada**: a medida que crece el contexto, la atención se degrada ("context rot") y el modelo
70
+ **recorta, difiere o se declara terminado**. Cuatro disciplinas, todas obligatorias, lo previenen:
71
+
72
+ 1. **Refresh de contexto = estado por defecto (no un fallback).** Cada iteración nace **headless /
73
+ contexto virgen** y reconstruye el estado desde **disco** (git history + `build-state.json` + logs),
74
+ **no** desde la conversación viva. El handoff fino vive en el estado: **`wiring_checklist[]`** (un item
75
+ por escenario AC y por **punto de integración entre capas**) nace `failing` y pasa a `passing`
76
+ **solo tras prueba real ejecutada**; **`progress_log[]`** deja un hito por sesión. **Mientras quede un
77
+ item `failing`, el cableado NO está hecho** — una sesión fresca no puede "creer que ya está".
78
+ 2. **Unidades pequeñas, de a una (descomposición).** El cimiento se construye antes que el negocio
79
+ (épicas `layer: foundational` archivadas antes de las `layer: business`, ver §3.1). Una épica que
80
+ supera el **gate de tamaño** (>3 HU ó ≥3 capas) se trocea en `sub_slices[]` construidos de a uno. El
81
+ orquestador trabaja por **fases encadenadas** (mapear → generar → revisar → fix-loop → optimizar) y
82
+ reparte la **exploración** "ancho antes que profundo" con subagentes **solo-lectura** por área
83
+ (devuelven síntesis condensada); el **cableado** lo hace la sesión, no subagentes en paralelo. Ese
84
+ reparto de exploración solo-lectura **puede** conducirse, de forma OPCIONAL, con un **workflow fan-out**
85
+ (`parallel()`) **SOLO** para épicas que superaron el gate de tamaño (con `sub_slices[]`); en épicas
86
+ atómicas se hace secuencial en sesión. El workflow es **solo-lectura**: no escribe código de producto ni
87
+ `build-state.json` (plantilla en `skills/building-a-slice/workflows/explore-fanout.workflow.js`).
88
+ 3. **Verificación adversarial independiente (no DoD declarativo).** Reusar el mismo agente como generador
89
+ y verificador produce **auto-confirmación**. Por eso el gate **`wiring_verified`** lo cierra un
90
+ subagente **independiente, de contexto virgen** (`wiring-adversarial-verifier`) cuyo trabajo es
91
+ **asumir que el slice está incompleto y refutarlo** (stubs, rutas sin cablear, AC sin test, items
92
+ `failing`) **antes** de permitir `dod`. El DoD declarativo del gatekeeper es un **piso, no el arreglo**.
93
+ Esta verificación adversarial **puede** conducirse, de forma OPCIONAL, con una **plantilla de conducción**
94
+ (`skills/building-a-slice/workflows/wiring-verify.workflow.js`) que envuelve al verificador ya existente: (a)
95
+ **NO** es un gate nuevo ni cambia política; (b) **NO** escribe estado — el verificador sigue read-only y
96
+ `build-orchestrator` sigue siendo el **único** escritor de `gates.wiring_verified`; (c) equivale a la prosa
97
+ actual, solo la hace reproducible. Los workflows quedan **acotados a tres hogares** (fan-out de exploración,
98
+ conducción del verificador adversarial, y el Release Gate del §5) y **prohibidos** en el camino caliente de
99
+ las fases del inner loop.
100
+ 4. **Producto completo, no MVP (anti-deriva).** El alcance acordado se construye **entero**. **Recortar o
101
+ diferir es bloqueante explícito** que exige acuerdo del equipo — **nunca** una decisión del modelo. No
102
+ se "deja para después" ni se deriva en lo complejo. La verificación es **ejecutada, no por inspección**
103
+ (cargar la página, correr la suite, leer la consola). Estas convenciones viven también en el bloque
104
+ `trycore-build-harness` del `CLAUDE.md` del consumidor (duraderas, sobreviven a la reinstalación).
105
+
106
+ ---
107
+
66
108
  ## 2. La regla del "esqueleto que camina"
67
109
 
68
110
  > **Paso 1 fundamental — el scaffold (precondición, NO generada por el arnés).** Antes del primer
@@ -97,7 +139,9 @@ se listan en `active_slice.hus[]`. Construir por HU individual es sobre-ingenier
97
139
  > PR, sin abrir `active_slice`). No es una excepción a la regla, sino mantenimiento fuera de su
98
140
  > alcance. **Límites duros:** si el cambio añade una dependencia nueva, crea un endpoint/API nuevo, o
99
141
  > toca lógica de dominio o el modelo/invariantes de datos, **deja de ser micro-change** y se escala a
100
- > épica. Ante la duda, es una épica.
142
+ > épica. Ante la duda, es una épica. El comando `/build:work` codifica este *decision gate* (y el default
143
+ > del Release Gate del §4) como **ruteo** —no política nueva—: enruta a `building-a-micro-change`,
144
+ > `building-a-slice` o `releasing-a-version` según el cambio; ante ambigüedad, escala a épica.
101
145
 
102
146
  ---
103
147
 
@@ -112,9 +156,9 @@ reference). Un gate no se salta.
112
156
  | 1 | `dor` | Validar Definition of Ready de la épica y sus HU | `dor-dod-gatekeeper` | `dor` | `dor.md` |
113
157
  | 2 | `change` | `opsx:new` + bloque `## Trazabilidad`; validar enlace (barato) | `opsx:new`, `change-epic-coherence` | `coherence_link` | `link-change-epic.md` |
114
158
  | 3 | `red`→`green`→`refactor` | TDD por cada escenario AC (G/W/T) de cada HU | `superpowers:test-driven-development` | `tdd` | — |
115
- | 4 | `smoke` | Recorrer el journey-hasta-aquí end-to-end | skill `verify`/`run` (+ MCP chrome-devtools) | `journey_smoke` | `mcp-map.md` |
159
+ | 4 | `smoke` | Recorrer el journey-hasta-aquí end-to-end con el **runner determinista fuera-de-chat** en sesión virgen; **UI:** fidelidad por **verificación visual real** (MCP) | runner `integration-check`, skill `verify`/`run` + MCP chrome-devtools, `ux-fidelity-reviewer` | `journey_smoke`, `fidelity` | `mcp-map.md` |
116
160
  | 5 | `api`/`data` | Contratos de endpoints + invariantes de datos (si aplican) | `api-contract-tester`, `data-consistency-checker` | `api`, `data` | `newman-tests.md`, `data-consistency.md` |
117
- | 6 | `dod` | Definition of Done reducido (lee los gates del estado) | `dor-dod-gatekeeper` | `dod` | `dod.md` |
161
+ | 6 | `dod` | **Primero** verificación adversarial independiente del cableado (contexto virgen) `wiring_verified`; **luego** Definition of Done reducido | `wiring-adversarial-verifier`, `dor-dod-gatekeeper` | `wiring_verified`, `dod` | `dod.md` |
118
162
  | 7 | `pr` | Abrir PR + **archivar el change en el mismo PR** | `opsx:archive`, `opsx:sync` | — | `gitflow.md` |
119
163
  | 8 | (decisión) | ¿Correr el Release Gate ahora? (default computado, decide el humano) | usuario | — | §4 |
120
164
 
@@ -132,12 +176,20 @@ Una épica **no entra a construcción** hasta cumplir todo (lo valida `dor-dod-g
132
176
  rama de error/edge, debe tener su escenario.
133
177
  - Cada HU pasa los 6 criterios **INVEST**.
134
178
  - Dependencias resueltas (las épicas/HU de las que depende están en `history[]` o no bloquean).
179
+ - **Cimiento construido (épicas `layer: business`)**: todo el cimiento que arrastra (autenticación,
180
+ acceso a datos, arquitectura base, design-system/componentes base) ya existe como épica(s)
181
+ `layer: foundational` **archivada(s)**. Si arrastra cimiento no construido → STOP: se extrae a una
182
+ épica fundacional previa. La cláusula "no bloquean" de dependencias **no aplica al cimiento**.
183
+ - **Tamaño acotado (gate de descomposición)**: si la épica supera el umbral —por defecto **> 3 HU** ó
184
+ **≥ 3 capas tocadas**, configurable— se descompone en `sub_slices[]` construidos de a uno
185
+ (`journey_smoke` verde entre cada uno). Umbral proporcional, no cuota rígida.
135
186
  - Cabe en el stack del PRD (no requiere tecnología fuera de `stack-allowlist.json`).
136
187
  - Datos de prueba disponibles o identificables (fixtures sintéticos del dominio).
137
188
 
138
189
  Si todo ✓ → se abre `active_slice` con `phase: dor`, `gates.dor: true` y el resto en `false`
139
- (`ux`/`api` en `null` si la épica no toca UI/endpoints). Si algo ✗ → no se abre el slice; se reporta
140
- qué falta y se vuelve a discovery.
190
+ —incluido **`wiring_verified: false`**— (`fidelity`/`api` en `null` si la épica no toca UI/endpoints;
191
+ `fidelity` arranca en `false` si toca UI). Si algo ✗ → no se abre el slice; se reporta qué falta y se
192
+ vuelve a discovery.
141
193
 
142
194
  ### 3.2 Definition of Done reducido (gate `dod`)
143
195
 
@@ -150,6 +202,12 @@ las revisiones pesadas **no** se piden aquí (van al Release Gate):
150
202
  la trazabilidad triple completa va al Release Gate).
151
203
  - `data` — invariantes de datos validadas (si el slice toca datos).
152
204
  - `api` — Newman 100% verde (o `null` si el slice no tiene endpoints).
205
+ - `fidelity` (slices con UI) — **ESTRICTO**: solo `true` con verificación visual real vía MCP
206
+ chrome-devtools (screenshot app vs prototipo); INCONCLUSO ya **no** pasa (queda `false`). `null` si
207
+ no toca UI.
208
+ - `wiring_verified` — el `wiring-adversarial-verifier` (subagente **independiente**, contexto virgen)
209
+ intentó refutar el slice y no halló huecos. **Prerequisito duro de `dod`**: el DoD declarativo del
210
+ gatekeeper es un **piso, no el arreglo** (ver §1-bis).
153
211
  - OpenSpec: todas las tasks `[x]`; el archive del change va **en el mismo PR**.
154
212
  - Back-reference del change añadida en la épica y en cada HU de `hus[]`.
155
213
  - Hooks verdes (automáticos, **no** son gates de agente): `lint-typecheck.sh`, `stack-guard.sh`,
@@ -161,8 +219,10 @@ vía el hook `stack-guard.sh` en tiempo real, no vía subagente.
161
219
 
162
220
  ### 3.3 Gates por slice y su naturaleza N/A
163
221
 
164
- - `ux` y `api` admiten `null` cuando el slice no tiene UI o endpoints. `null` ≠ abierto: **no
165
- bloquea** el DoD.
222
+ - `fidelity` y `api` admiten `null` cuando el slice no tiene UI o endpoints. `null` ≠ abierto: **no
223
+ bloquea** el DoD. Pero `fidelity` **no** puede quedar `null` si el slice toca UI (debe llegar a
224
+ `true` por verificación visual real). `wiring_verified` aplica **siempre** (sin `null`) y es
225
+ prerequisito de `dod`.
166
226
  - En `harness_phase: authoring` (sin `package.json`) se puede hacer la Fase 0 (crear/confirmar el
167
227
  scaffold) + `dor` + `change`, pero los gates de código (`tdd`, `journey_smoke`, `api`, `data`) **no
168
228
  se cierran** hasta tener el scaffold confirmado (gate de proyecto `scaffold.confirmed`, ver §2).
@@ -182,6 +242,12 @@ Tras archivar la épica, `building-a-slice` **pregunta al humano** si correr el
182
242
  El humano siempre puede sobreescribir el default. Si acepta, se invoca `releasing-a-version` sobre la
183
243
  release correspondiente.
184
244
 
245
+ > El *nudge* "≥ 2 épicas archivadas desde el último entry de `releases[]`" también lo emite un **hook
246
+ > `Stop` determinista** (`release-gate-nudge.sh`), computado por **aritmética de conjuntos** sobre
247
+ > `epicas[]` (archivadas − cubiertas), independiente de timestamps; **solo sugiere** (no ejecuta nada, no
248
+ > llama al modelo, no escribe estado). El criterio "cierra una línea de release" requiere
249
+ > `docs/02-user-story-map/` y por eso **no** lo cubre el hook: lo computa la skill `building-a-slice`.
250
+
185
251
  ---
186
252
 
187
253
  ## 5. Los gates del Release Gate (outer loop)
@@ -264,8 +330,9 @@ agente lo lee antes de actuar. Estructura: `version`, `harness_phase`, `active_s
264
330
  3. **Gates monótonos hacia adelante.** Un gate solo pasa de `false`→`true` cuando su agente lo
265
331
  aprueba. Si una revisión posterior falla, **se vuelve a `false` y `phase` retrocede** (el retroceso
266
332
  está permitido y es la forma de manejar fallos tardíos).
267
- 4. **`null` para N/A.** `ux`/`api` son `null` cuando el slice no tiene UI/endpoints; no cuentan como
268
- abiertos para el DoD.
333
+ 4. **`null` para N/A.** `fidelity`/`api` son `null` cuando el slice no tiene UI/endpoints; no cuentan
334
+ como abiertos para el DoD. `fidelity` **no** puede ser `null` si toca UI; `wiring_verified` aplica
335
+ siempre y es prerequisito de `dod`.
269
336
  5. **Archivar.** Al completar `opsx:archive`, mover `active_slice` a `history[]` con
270
337
  `phase: "archived"` y dejar `active_slice: null`.
271
338
  6. **Validar tras escribir** contra el schema (con `jsonschema`/`python3`).
@@ -277,9 +344,10 @@ agente lo lee antes de actuar. Estructura: `version`, `harness_phase`, `active_s
277
344
  | `active_slice` (alta) · `gates.dor` · `gates.dod` | `dor-dod-gatekeeper` | slice |
278
345
  | `gates.coherence_link` | `change-epic-coherence` | slice |
279
346
  | `gates.tdd` | flujo `superpowers:test-driven-development` (vía `build-orchestrator`) | slice |
280
- | `gates.journey_smoke` · `phase` (transiciones) · `history[]` | `build-orchestrator` | slice |
347
+ | `gates.journey_smoke` · `gates.fidelity` · `phase` · `history[]` · `wiring_checklist[]` · `progress_log[]` · `sub_slices[]` | `build-orchestrator` (fidelity desde `ux-fidelity-reviewer`) | slice |
281
348
  | `gates.api` | `api-contract-tester` | slice |
282
349
  | `gates.data` | `data-consistency-checker` | slice |
350
+ | `gates.wiring_verified` | `wiring-adversarial-verifier` (independiente, contexto virgen) | slice (antes de `dod`) |
283
351
  | `releases[]` (security, smell, ux, coherence, stack_arch, integration, status) | `releasing-a-version` (delega en los reviewers) | release |
284
352
  | `harness_phase` | `load-build-state.sh` (SessionStart) | — |
285
353
 
@@ -379,6 +447,13 @@ El arnés **no escribe** en `docs/`; cuando una HU no cumple DoR, devuelve el tr
379
447
  commits/push directos.
380
448
  7. **`integration` con dependencias reales es obligatorio** para cerrar una release; sin él no hay
381
449
  release.
382
- 8. El core es **agnóstico**: lo específico del dominio se inyecta vía `/build:onboard` y
383
- `stack-allowlist.json`; el ejemplo de referencia vive en `docs/examples/reference/`.
384
- 9. Si una skill, agente o reference contradice este documento, **gana la metodología**.
450
+ 8. **Disciplina de horizonte largo (§1-bis)**: refresh de contexto por defecto (estado en disco +
451
+ `wiring_checklist[]`); cimiento antes que negocio y descomposición por tamaño/topología; gate
452
+ `wiring_verified` por verificador **adversarial independiente** antes de `dod`; **producto completo,
453
+ no MVP** (recortar/diferir es bloqueante explícito, nunca decisión del modelo; verificación
454
+ ejecutada, no por inspección).
455
+ 9. **Fidelidad estricta**: para slices con UI, `fidelity` solo cierra con **verificación visual real**
456
+ (MCP chrome-devtools); INCONCLUSO no pasa.
457
+ 10. El core es **agnóstico**: lo específico del dominio se inyecta vía `/build:onboard` y
458
+ `stack-allowlist.json`; el ejemplo de referencia vive en `docs/examples/reference/`.
459
+ 11. Si una skill, agente o reference contradice este documento, **gana la metodología**.
package/README.md CHANGED
@@ -11,6 +11,8 @@ Ambos paquetes coexisten en el mismo `.claude/` sin colisión: namespaces disjun
11
11
 
12
12
  ## Cómo se usa (rápido)
13
13
 
14
+ > **Guía paso a paso:** [`docs/getting-started.md`](docs/getting-started.md) — Quickstart de 0 a tu primer slice.
15
+
14
16
  ```bash
15
17
  # 0) Requisito: OpenSpec (lo usan los comandos /opsx:* y las skills openspec-*)
16
18
  npm install -g @fission-ai/openspec
@@ -35,7 +37,7 @@ trycore-build init
35
37
  /plugin install trycore-spec-build-harness@trycore-build
36
38
  ```
37
39
 
38
- > **Caveat de canales (importante).** El canal **npm CLI es el canónico**: instala los comandos en `.claude/commands/{opsx,build}/`, que namespacean por subcarpeta `/opsx:*` y `/build:onboard`, y referencia los agentes por su nombre. El canal **plugin** namespacea los componentes bajo el **nombre del plugin** (`/trycore-spec-build-harness:*`) por diseño de Claude Code; se ofrece como conveniencia a nivel usuario, pero las cross-references internas (skills que invocan `/opsx:*`, agentes por nombre) están escritas para el canal CLI. **Para operar dentro de un proyecto, usa el CLI.** Los hooks son una única cadena autorresolutiva idéntica en ambos canales (`"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/<script>.sh"`); si se instalan los dos, Claude Code deduplica y el hook dispara una sola vez.
40
+ > **Caveat de canales.** Para operar dentro de un proyecto, **usa el canal CLI** (canónico): comandos namespaceados por subcarpeta (`/opsx:*`, `/build:*`) y agentes por nombre. El plugin los namespacea bajo su propio nombre (`/trycore-spec-build-harness:*`) y las cross-references internas asumen el canal CLI. Los hooks son idénticos en ambos canales (se deduplican si coexisten). Detalle [`INSTALL.md`](INSTALL.md).
39
41
 
40
42
  ### Comandos del CLI `trycore-build`
41
43
 
@@ -71,16 +73,7 @@ Gate de release que corre **una sola vez por versión** sobre el conjunto de sli
71
73
  |---|---|
72
74
  | `/build:onboard` | Onboarding capa 2: lee el PRD, pregunta por PII/IA/determinismo/secretos, resuelve `{{placeholders}}` y escribe la auto-memory. |
73
75
  | `/build:reflect` | Reflexión post-slice: tras archivar, propone convenciones aprendidas / errores recurrentes al bloque `trycore-build-learnings` de `CLAUDE.md` (tras tu aprobación) y marca el slice como reflexionado. |
74
- | `/opsx:explore` | Explora el dominio / specs antes de abrir un change. |
75
- | `/opsx:new` | Crea un nuevo OpenSpec change. |
76
- | `/opsx:continue` | Retoma un change en curso. |
77
- | `/opsx:apply` | Aplica los cambios propuestos del change. |
78
- | `/opsx:verify` | Verifica el change contra sus specs. |
79
- | `/opsx:archive` | Archiva un change completado. |
80
- | `/opsx:bulk-archive` | Archiva varios changes en lote. |
81
- | `/opsx:ff` | Fast-forward de un change. |
82
- | `/opsx:onboard` | Onboarding de OpenSpec en el repo. |
83
- | `/opsx:sync` | Sincroniza specs ↔ estado del proyecto. |
76
+ | `/opsx:*` (10) | Ciclo OpenSpec: `explore` · `new` · `continue` · `apply` · `verify` · `archive` · `bulk-archive` · `ff` · `onboard` · `sync`. Detalle → [`docs/commands.md`](docs/commands.md). |
84
77
 
85
78
  ## Arquitectura
86
79
 
@@ -89,7 +82,7 @@ trycore-spec-build-harness/
89
82
  ├── METODOLOGIA.md ← fuente de verdad metodológica (gana ante cualquier skill)
90
83
  ├── GOVERNANCE.md ← gobernanza del paquete + cadencia de auditoría
91
84
  ├── .claude-plugin/ ← manifiesto del plugin nativo (canal de conveniencia)
92
- ├── agents/build/ ← 11 agentes revisores (segunda opinión, contexto limpio)
85
+ ├── agents/build/ ← 12 agentes revisores (segunda opinión, contexto limpio)
93
86
  ├── commands/
94
87
  │ ├── opsx/ ← 10 comandos /opsx:* (ciclo OpenSpec)
95
88
  │ └── build/ ← /build:onboard, /build:reflect
@@ -102,7 +95,7 @@ trycore-spec-build-harness/
102
95
  └── docs/examples/reference/ ← ejemplo de referencia (fuera del core, excluido de check-agnostic)
103
96
  ```
104
97
 
105
- Los **11 agentes** en `agents/build/` son: `build-orchestrator`, `dor-dod-gatekeeper`, `security-reviewer`, `simple-design-reviewer`, `ux-krug-reviewer`, `coherence-three-way` (opus), `stack-guardian`, `api-contract-tester`, `data-consistency-checker`, `change-epic-coherence` y `ux-fidelity-reviewer`.
98
+ Los **12 agentes** en `agents/build/` son: `build-orchestrator`, `dor-dod-gatekeeper`, `security-reviewer`, `simple-design-reviewer`, `ux-krug-reviewer`, `coherence-three-way` (opus), `stack-guardian`, `api-contract-tester`, `data-consistency-checker`, `change-epic-coherence`, `ux-fidelity-reviewer` y `wiring-adversarial-verifier` (opus).
106
99
 
107
100
  **Estado.** `state/build-state.json` se siembra **vacío** y nunca se sobreescribe (va al `.gitignore`); el schema y el README sí se versionan. `config/stack-allowlist.json` es artefacto del consumidor: lo siembra el CLI y lo puebla `/build:onboard`. `uninstall` preserva `state/` y `config/`.
108
101
 
@@ -128,7 +121,8 @@ El core no menciona ningún dominio de cliente. Toda parametrización entra por
128
121
  - ✅ **v0.2.0** — scaffold como "Paso 1 fundamental": gate de proyecto `scaffold.confirmed` (confirmación **explícita**, no auto), Fase 0 en `building-a-slice`, criterio duro de DoR y hook `scaffold-guard.sh`. El arnés **exige** el scaffold pero **no lo genera**.
129
122
  - ✅ **v0.3.0** — **ciclo autocorrectivo** (hook `reflect-nudge.sh` + comando `/build:reflect`: propone convenciones aprendidas al bloque `trycore-build-learnings` de `CLAUDE.md` tras tu aprobación; campos `reflected`/`reflected_at`) y **LSP opt-in** (`docs/customization/lsp-extensions.md` + sugerencia en `doctor` para stacks tipados). Total: **8 hooks**; comandos `/opsx:*` + `/build:onboard` + `/build:reflect`.
130
123
  - ✅ **v0.4.0** — carril `building-a-micro-change` (mantenimiento ligero sin slice) + DoR proporcional a la complejidad.
131
- - ✅ **v0.5.0 (actual)** — seguro de fuente de diseño (`design_source` + `design-source-guard.sh`) + agente `ux-fidelity-reviewer` (gate `fidelity`, inner loop). Total: **11 agentes**, **9 hooks**.
124
+ - ✅ **v0.5.0** — seguro de fuente de diseño (`design_source` + `design-source-guard.sh`) + agente `ux-fidelity-reviewer` (gate `fidelity`, inner loop). Total: **11 agentes**, **9 hooks**.
125
+ - ✅ **v0.6.0 (actual)** — **calidad de cierre contra horizonte largo** (feedback exodocs): handoff fino en disco (`wiring_checklist[]` + `progress_log[]` + `sub_slices[]`), gate `wiring_verified` por nuevo agente **`wiring-adversarial-verifier`** (verificación adversarial independiente, contexto virgen), cimiento pre-construido + tag `layer` y gate de tamaño en el DoR, runner fuera-de-chat `integration-check`, y **fidelidad estricta por verificación visual real** (MCP requerido para UI). Convenciones anti-deriva (producto completo, no MVP) upstreadas al bloque del arnés. Total: **12 agentes**, **9 hooks**.
132
126
 
133
127
  ## Licencia
134
128
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.0
1
+ 0.7.0
@@ -29,4 +29,12 @@ Eres el **tester de contratos de API** del arnés de construcción. Si el slice
29
29
  - Resumen de ejecución (totales, fallos con request + aserción).
30
30
  - Veredicto: 100% verde → propón `gates.api: true`; fallos → `false` con el detalle; sin endpoints → `null`.
31
31
 
32
+ ## Degradación segura
33
+ Si **no puedes completar tu verificación** (la app no levanta, `newman`/`npx` ausente, la colección no se puede
34
+ crear, readiness no llega), **NO devuelvas PASS ni inventes**: devuelve veredicto **BLOQUEANTE / INCONCLUSO** con
35
+ el motivo y qué falta para correr. *La ausencia de evidencia no es evidencia de ausencia de problemas.* Distingue
36
+ —como `ux-fidelity-reviewer` (INCONCLUSO ≠ N/A)— el **N/A legítimo** (slice **sin endpoints** → `gates.api: null`)
37
+ de **"no pude verificar"** (fallo de herramienta → `false`). Reserva el `null` SOLO para el N/A genuino (sin
38
+ endpoints), nunca para un fallo de herramienta.
39
+
32
40
  No edites código de producto: si faltan casos, propón los requests a añadir. Devuelve al `build-orchestrator`.
@@ -14,17 +14,41 @@ Protocolo en `.claude/state/README.md`. **Sólo un slice activo a la vez** (mode
14
14
  La **unidad de construcción es la épica** (`active_slice.epica`); las HU que cubre el change van en
15
15
  `active_slice.hus[]`. Un slice = una épica = un change = una rama = un PR.
16
16
 
17
+ ## Trabajo por fases encadenadas (NO one-shot)
18
+ Una épica multicapa es demasiado para una pasada. Trabaja por **fases encadenadas** —**mapear →
19
+ generar → revisar → fix-loop → optimizar**— nunca todo de golpe. Reparte la **exploración** "ancho
20
+ antes que profundo": lanza **subagentes SOLO-LECTURA por área** (frontend/backend/datos) que devuelven
21
+ **síntesis condensada** (~1–2K tokens) para que la sesión gaste su presupuesto en **cablear**, no en
22
+ descubrir. El **cableado lo hace la sesión** (o la sesión de integración), **no** subagentes que
23
+ escriben en paralelo.
24
+
25
+ **Descomposición (gate de tamaño).** Si la épica supera el umbral (>3 HU ó ≥3 capas; configurable),
26
+ el DoR la trocea en `sub_slices[]`: constrúyelos **de a uno**, con `journey_smoke` verde entre cada
27
+ uno, marcando `sub_slices[].status: done` al cerrar cada uno. Para épicas troceadas, la exploración
28
+ solo-lectura por área **puede** conducirse con la plantilla (opcional) `skills/building-a-slice/workflows/
29
+ explore-fanout.workflow.js` (gated por la guarda del propio workflow: `sub_slices[]` no vacío). **No** la uses
30
+ en épicas atómicas: inflaría el inner loop barato. Es read-only; el cableado sigue siendo de la sesión.
31
+
32
+ **Refresh de contexto por defecto.** Mantén el handoff fino en disco. **Siémbralo al entrar a `change`/`tdd`**:
33
+ deriva de las HU de `hus[]` un item de `wiring_checklist[]` por **cada escenario AC** y uno por **cada
34
+ punto de integración entre capas** que el slice toca, todos en `status: failing`. Pásalos a `passing`
35
+ **solo tras prueba real ejecutada** (registrando `evidence`). Deja un hito en `progress_log[]` por sesión.
36
+ Una sesión fresca retoma desde el estado en disco, no desde la conversación. El `wiring-adversarial-verifier`
37
+ auditará después que cada `passing` tenga evidencia real y que no falte ningún item.
38
+
17
39
  ## Pipeline — inner loop (orden estricto, rápido, SIN subagentes pesados)
18
40
  ```
19
- 1. dor → delega en dor-dod-gatekeeper (abre el slice si pasa)
41
+ 1. dor → delega en dor-dod-gatekeeper (abre el slice si pasa; inicializa wiring_verified:false)
20
42
  2. change → opsx:new + bloque ## Trazabilidad → delega en change-epic-coherence (gate coherence_link, barato)
21
- 3. tdd → conduce superpowers:test-driven-development (red→green→refactor)
22
- 4. smoke → recorre el journey-hasta-aquí end-to-end con la skill verify/run (+ chrome-devtools) → gate journey_smoke.
23
- Slices con UI: con la app levantada, delega en ux-fidelity-reviewer (compara la(s) pantalla(s)
24
- contra el DESIGN_SOURCE) y ESCRIBE gates.fidelity desde su veredicto (FIEL/DESVIACIONES
25
- justificadas→true; DESVIACIONES→false; INCONCLUSO (MCP no disponible)→deja con nota; sin UI→null).
43
+ 3. tdd → conduce superpowers:test-driven-development (red→green→refactor); marca items wiring_checklist passing al verde real
44
+ 4. smoke → recorre el journey-hasta-aquí end-to-end con el RUNNER fuera-de-chat integration-check
45
+ (suite+build+reporte) en sesión/contexto virgen gate journey_smoke.
46
+ Slices con UI: con la app levantada, delega en ux-fidelity-reviewer (verificación VISUAL REAL
47
+ vía MCP chrome-devtools) y ESCRIBE gates.fidelity desde su veredicto (FIEL/DESVIACIONES
48
+ justificadas→true; DESVIACIONES→false; INCONCLUSO/sin MCP→FALSE, bloquea; sin UI→null).
26
49
  5. api/data → api-contract-tester (si hay endpoints) · data-consistency-checker (si toca datos)
27
- 6. dod → dor-dod-gatekeeper (cierre por slice, DoD reducido)
50
+ 6. dod → PRIMERO delega en wiring-adversarial-verifier (subagente INDEPENDIENTE, contexto virgen:
51
+ intenta refutar el slice; cierra gates.wiring_verified) → SOLO si true, dor-dod-gatekeeper (DoD reducido)
28
52
  7. pr → abre PR y archiva el change EN EL MISMO PR (opsx:archive + opsx:sync); back-ref en épica y HU
29
53
  8. release? → tras archivar, devuelve a la skill building-a-slice para preguntar el Release Gate (default computado)
30
54
  ```
@@ -33,7 +57,13 @@ La **unidad de construcción es la épica** (`active_slice.epica`); las HU que c
33
57
  `ux-krug-reviewer`, `coherence-three-way` y `stack-guardian` (arquitectura) corren **una vez por
34
58
  release** en la skill `releasing-a-version`. Las deps las vigila el hook `stack-guard.sh`.
35
59
  El `ux-fidelity-reviewer` **sí** corre aquí (en `smoke`): es barato (la app ya está levantada) y vivo
36
- por-slice; no es la revisión pesada de UX/Krug (esa sigue en `releasing-a-version`).
60
+ por-slice; no es la revisión pesada de UX/Krug (esa sigue en `releasing-a-version`). El
61
+ `wiring-adversarial-verifier` **también** corre aquí (al inicio de `dod`): es un verificador
62
+ **enfocado y corto** (solo refuta cableado/AC/stubs, no re-revisa diseño/seguridad), e **independiente**
63
+ del que generó el código — por eso evita la auto-confirmación del cierre prematuro. Opcionalmente esa
64
+ verificación se conduce con la plantilla read-only `skills/building-a-slice/workflows/wiring-verify.workflow.js`
65
+ (envuelve al verificador); **tú** —`build-orchestrator`— sigues siendo quien escribe `gates.wiring_verified`
66
+ a partir del veredicto que la plantilla devuelve (la plantilla no toca el estado).
37
67
 
38
68
  ## Reglas de orquestación
39
69
  - **No saltes gates.** No avances de fase si el gate previo está en `false`. Reporta qué falta.
@@ -42,7 +72,12 @@ por-slice; no es la revisión pesada de UX/Krug (esa sigue en `releasing-a-versi
42
72
  - **Una escritura por transición**: actualiza `phase`, el gate tocado, `updated_at` (ISO UTC),
43
73
  `updated_by: build-orchestrator`. No toques otros campos.
44
74
  - **Gate `api`** puede quedar en `null` si la épica no tiene endpoints (no bloquea DoD). `data` solo
45
- si el slice toca datos.
75
+ si el slice toca datos. **`fidelity`** no puede quedar `null` si el slice toca UI (debe ser `true`
76
+ por verificación visual real; INCONCLUSO → `false`).
77
+ - **`dod` exige `wiring_verified: true`.** No cierres `dod` sin que el `wiring-adversarial-verifier`
78
+ haya dado verde. El DoD del gatekeeper es declarativo (piso); el verificador independiente es el arreglo.
79
+ - **Producto completo, no MVP.** Construye el alcance acordado entero. **Recortar o diferir es
80
+ bloqueante explícito** que requiere acuerdo del equipo — nunca lo decides tú. No derives en lo complejo.
46
81
  - Si `harness_phase` = `authoring` (no hay `package.json`), los gates de código (tdd, journey_smoke,
47
82
  api, data) no pueden cerrarse: dilo y detente tras preparar lo que sí aplica.
48
83
  - **Tras `archived`**, calcula el default del Release Gate y pásalo a la skill: (a) ¿esta épica
@@ -35,7 +35,16 @@ que aparezca un OpenSpec change "huérfano" desconectado de la discovery de Tryc
35
35
 
36
36
  ## Salida
37
37
  - Veredicto: **COHERENTE** / **INCOHERENTE**, con lista ✓/✗ y citas textuales (archivo:línea).
38
- - Si COHERENTE: indica que se puede marcar `gates.coherence: true` para la fase `change`.
38
+ - Si COHERENTE: indica que se puede marcar `gates.coherence_link: true` (gate del **inner loop**, fase
39
+ `change`). NO es el `coherence` pesado del outer loop (ese lo cierra `coherence-three-way` en
40
+ `releasing-a-version` sobre la implementación real): son gates distintos del schema — `coherence_link`
41
+ (inner, barato, enlace change↔épica) vs `coherence` (release, trazabilidad triple completa).
39
42
  - Si INCOHERENTE: por cada ✗, propone el fix concreto (texto exacto a añadir/corregir).
40
43
 
41
- No edites archivos: devuelve el diagnóstico al `build-orchestrator`.
44
+ ## Degradación segura
45
+ Si **no puedes completar tu verificación** (`openspec validate` no corre, no puedes leer el `proposal.md`/las
46
+ HU/la épica), **NO devuelvas COHERENTE ni inventes**: devuelve **INCOHERENTE / INCONCLUSO** con el motivo y qué
47
+ falta para correr. *La ausencia de evidencia no es evidencia de ausencia de problemas.* Un fallo de herramienta
48
+ **no es N/A**: nunca devuelvas `null` por no poder verificar — devuelve bloqueante/`false`.
49
+
50
+ No edites archivos: devuelve el diagnóstico al `build-orchestrator` (gate de inner loop `coherence_link`).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: coherence-three-way
3
- description: Verifica la coherencia triple AC de las HU de la épica (Given/When/Then) ↔ OpenSpec change(specs/tasks) ↔ código/tests implementados. Detecta AC sin test, tasks sin AC, y código que no traza a ninguna HU. Úsalo en la fase verify, antes del DoD.
3
+ description: Verifica la coherencia triple AC de las HU de la épica (Given/When/Then) ↔ OpenSpec change(specs/tasks) ↔ código/tests implementados. Detecta AC sin test, tasks sin AC, y código que no traza a ninguna HU. Úsalo en el Release Gate (releasing-a-version), sobre el diff acumulado de la release.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: opus
6
6
  ---
@@ -29,7 +29,15 @@ construcción: nada implementado sin razón, nada especificado sin implementar.
29
29
  ## Salida
30
30
  - Matriz de trazabilidad AC ↔ escenario ↔ task ↔ test/código (tabla compacta).
31
31
  - Huérfanos top-down (AC de alguna HU sin test) y bottom-up (código sin HU), con `archivo:línea`.
32
- - Veredicto: **COHERENTE** → propone `gates.coherence: true`; o **INCOHERENTE** con fixes.
32
+ - Veredicto: **COHERENTE** → propone `releases[].gates.coherence: true`; o **INCOHERENTE** con fixes.
33
33
 
34
- Complementa a `change-epic-coherence` (que valida el enlace) verificando la **implementación real**.
35
- No edites: devuelve el diagnóstico al `build-orchestrator`.
34
+ ## Degradación segura
35
+ Si **no puedes completar tu verificación** (no puedes leer las HU/specs/código, `openspec`/LSP ausente, `diff`
36
+ vacío inesperado), **NO devuelvas COHERENTE ni inventes**: devuelve **INCOHERENTE / INCONCLUSO** con el motivo y
37
+ qué falta para correr. *La ausencia de evidencia no es evidencia de ausencia de problemas.* Un fallo de
38
+ herramienta **no es N/A**: nunca devuelvas `null` por no poder verificar — devuelve bloqueante/`false`.
39
+
40
+ Complementa a `change-epic-coherence` (que valida el enlace, gate de inner loop `coherence_link`) verificando la
41
+ **implementación real** (gate de release `coherence`). No edites: devuelve el diagnóstico a la skill
42
+ `releasing-a-version` (Release Gate, **outer loop**), que escribe `releases[].gates`. Cadencia: **una vez por
43
+ RELEASE**, no por slice.
@@ -45,4 +45,11 @@ bloque de dominio del CLAUDE.md del consumidor / del PRD del consumidor. Este ag
45
45
  - Invariantes ✓/✗ con evidencia (`archivo:línea` o salida de test).
46
46
  - Veredicto: todas ✓ → propón `gates.data: true`; alguna ✗ → `false` con el fix/test faltante.
47
47
 
48
+ ## Degradación segura
49
+ Si **no puedes completar tu verificación** (los tests no corren, runner `vitest`/`jest` ausente, no puedes leer
50
+ la capa de decisión), **NO devuelvas PASS ni inventes**: devuelve veredicto **BLOQUEANTE / INCONCLUSO** con el
51
+ motivo y qué falta para correr. *La ausencia de evidencia no es evidencia de ausencia de problemas.* Un fallo de
52
+ herramienta **no es N/A**: nunca devuelvas `null` por no poder verificar — devuelve bloqueante/`false` (el caso
53
+ N/A de `data` lo decide el `build-orchestrator` por aplicabilidad del slice, no tú por un fallo de herramienta).
54
+
48
55
  No edites: devuelve el diagnóstico al `build-orchestrator`.
@@ -26,18 +26,25 @@ cumplen; lista cada una con ✓/✗:
26
26
  4. **Cada HU**: AC en formato **Given/When/Then**, **proporcional a `complejidad`** (`trivial`/baja →
27
27
  1–2; `media` → 3; `alta` → 3–5), cubriendo los modos de fallo que existen (happy + error/edge
28
28
  reales). No exijas 3–5 a una HU trivial; sí exige el escenario de toda rama de error/edge que exista.
29
- 5. **Cada HU** pasa los 6 criterios **INVEST** (si dudas, invoca al agente `invest-validator`).
29
+ 5. **Cada HU** pasa los 6 criterios **INVEST** (Independent, Negotiable, Valuable, Estimable, Small, Testable); evalúalos tú mismo.
30
30
  6. Dependencias declaradas (otras épicas/HU) están en `history[]` del estado o marcadas done.
31
- 7. El alcance de la épica cabe en el stack declarado del PRD (allowlist) (no exige tecnología fuera de la allowlist).
32
- 8. **Fuente de diseño (solo slices con UI)**: si la épica toca UI, `design_source.confirmed===true`
31
+ 7. **Cimiento construido (épicas `layer: business`)**: si la épica es de negocio, todo el cimiento que
32
+ arrastra (autenticación, acceso a datos, arquitectura base, design-system/componentes base) ya existe
33
+ como épica(s) `layer: foundational` **archivada(s)** en `history[]`. Si arrastra cimiento no construido,
34
+ **NO abras el slice**: instruye extraerlo a una épica fundacional previa y construirla primero. Aquí la
35
+ cláusula "explícitamente no bloquean" del criterio 6 **NO aplica**: el cimiento bloquea siempre.
36
+ 8. **Tamaño acotado**: si la épica supera el umbral del gate de descomposición —heurística por defecto
37
+ **> 3 HU** ó **≥ 3 capas tocadas** (configurable por proyecto)— **no la abras como slice único**:
38
+ instruye descomponerla en `sub_slices[]` construidos de a uno (`journey_smoke` verde entre cada uno).
39
+ 9. **Fuente de diseño (solo slices con UI)**: si la épica toca UI, `design_source.confirmed===true`
33
40
  (fuente visual de verdad declarada para el proyecto) y la épica apunta a la(s) pantalla(s)
34
41
  equivalente(s) del `DESIGN_SOURCE`. Si no toca UI, este criterio es N/A.
35
42
 
36
43
  Si DoR pasa: propón abrir `active_slice` con `epica`, `hus` (lista de las HU cubiertas),
37
44
  `openspec_change` (kebab del título de la épica), `branch: feature/ep-xxx-<slug>`, `phase: dor`,
38
- `gates: { dor: true, tdd: false, journey_smoke: false, coherence_link: false, data: false, fidelity: false, dod: false }`
39
- (`api` en `null` si la épica no toca endpoints; **`fidelity` en `null` si la épica NO toca UI**; añade
40
- `data: null`-equivalente omitiéndolo si no toca datos). Si falla: reporta ✗ y NO abras el slice.
45
+ `gates: { dor: true, tdd: false, journey_smoke: false, coherence_link: false, data: false, fidelity: false, wiring_verified: false, dod: false }`
46
+ (`api` en `null` si la épica no toca endpoints; **`fidelity` en `null` si la épica NO toca UI** —si toca UI
47
+ arranca en `false`—; `wiring_verified` **siempre** arranca en `false`). Si falla: reporta ✗ y NO abras el slice.
41
48
 
42
49
  ## Definition of Done (gate `dod`) — antes de archivar (DoD **reducido**, por slice)
43
50
  Pasa SOLO si **todos** estos gates del **inner loop** están en `true` (o `null` cuando N/A):
@@ -46,10 +53,19 @@ Pasa SOLO si **todos** estos gates del **inner loop** están en `true` (o `null`
46
53
  3. `coherence_link` — `change-epic-coherence` confirma el enlace change↔épica (`openspec validate` ok).
47
54
  4. `data` — `data-consistency-checker` verde (si el slice toca datos).
48
55
  5. `api` — `api-contract-tester` verde (o `null` si sin endpoints).
49
- 6. `fidelity` — `true` (FIEL o DESVIACIONES justificadas) o `null` (slice sin UI). INCONCLUSO
50
- (MCP no disponible) se registra en `notes`, no bloquea. Es gate **vivo** de inner loop, no la revisión Krug.
51
- 7. Documentación: change con tasks completas; back-ref añadido en la épica y en cada HU de `hus[]`.
52
- 8. Hooks verdes (automáticos): `lint-typecheck.sh`, `stack-guard.sh`, `gitflow-guard.sh`.
56
+ 6. `fidelity` — `true` (FIEL o DESVIACIONES justificadas) o `null` (slice sin UI). **ESTRICTO para UI**
57
+ (`design_source.applies===true`): solo `true` si hubo **verificación visual real** vía MCP
58
+ chrome-devtools (screenshot app vs prototipo). **INCONCLUSO ya NO pasa**: sin MCP queda `false` y el
59
+ `dod` no cierra (correr donde haya MCP). Es gate **vivo** de inner loop, no la revisión Krug.
60
+ 6-bis. **Sub-slices completos**: si `active_slice.sub_slices[]` no está vacío, **todos** deben estar en
61
+ `status: done` (cada uno con su `journey_smoke` verde). Una épica descompuesta no cierra `dod` con
62
+ sub-slices pendientes (sería cierre prematuro de alcance).
63
+ 7. **`wiring_verified`** — `true`. Prerequisito **duro** de `dod`: lo cierra el `wiring-adversarial-verifier`
64
+ (subagente **independiente**, contexto virgen) tras intentar refutar el slice (stubs, rutas sin cablear,
65
+ AC sin test, items de `wiring_checklist[]` aún `failing`) y no hallar huecos. **Tu DoD declarativo es un
66
+ piso, no el arreglo**: no marques `dod` sin `wiring_verified: true`.
67
+ 8. Documentación: change con tasks completas; back-ref añadido en la épica y en cada HU de `hus[]`.
68
+ 9. Hooks verdes (automáticos): `lint-typecheck.sh`, `stack-guard.sh`, `gitflow-guard.sh`.
53
69
 
54
70
  **NO valides aquí** `security`, `smell`, `ux`, `coherence` (triple completa) ni `stack` (arquitectura):
55
71
  esos son del **Release Gate** (`releasing-a-version`, `release-dod.md`), cadencia por release.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: security-reviewer
3
- description: Revisión de seguridad del slice con foco en el dominio declarado por el consumidor (PII/datos regulados, claves de servicios externos, validación de entrada). Envuelve la lógica de /security-review y la especializa para este proyecto. Úsalo en la fase review. Requiere código.
3
+ description: Revisión de seguridad del slice con foco en el dominio declarado por el consumidor (PII/datos regulados, claves de servicios externos, validación de entrada). Envuelve la lógica de /security-review y la especializa para este proyecto. Úsalo en el Release Gate (releasing-a-version), sobre el diff acumulado de la release. Requiere código.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: sonnet
6
6
  ---
@@ -41,6 +41,14 @@ consumidor o de su PRD (la sección de requisitos técnicos del PRD, en la ruta
41
41
 
42
42
  ## Salida
43
43
  - Hallazgos por severidad **CRÍTICO / ALTO / MEDIO / BAJO** con `archivo:línea` y remediación.
44
- - Veredicto: sin CRÍTICO/ALTO abiertos → propón `gates.security: true`; si los hay → `false`.
44
+ - Veredicto: sin CRÍTICO/ALTO abiertos → propón `releases[].gates.security: true`; si los hay → `false`.
45
45
 
46
- No edites: devuelve el diagnóstico al `build-orchestrator`.
46
+ ## Degradación segura
47
+ Si **no puedes completar tu verificación** (herramienta/comando indisponible, app no levantable, `diff`
48
+ vacío inesperado, runner/`npm audit` ausente), **NO devuelvas PASS ni inventes**: devuelve veredicto
49
+ **BLOQUEANTE / INCONCLUSO** con el motivo y qué falta para correr. *La ausencia de evidencia no es evidencia
50
+ de ausencia de problemas.* Un fallo de herramienta **no es N/A**: nunca devuelvas `null` por no poder
51
+ verificar — devuelve bloqueante/`false`.
52
+
53
+ No edites: devuelve el diagnóstico a la skill `releasing-a-version` (Release Gate, **outer loop**), que
54
+ escribe `releases[].gates`. Cadencia: **una vez por RELEASE**, no por slice.