@trycore/spec-build-harness 0.4.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,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.4.0",
5
+ "version": "0.6.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,8 +8,8 @@ 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 | 10 agentes de build | `.claude/agents/build/` |
12
- | Hooks | settings.json + 8 scripts | `.claude/settings.json`, `.claude/hooks/build/` |
11
+ | Agentes | 12 agentes de build | `.claude/agents/build/` |
12
+ | Hooks | settings.json + 9 scripts | `.claude/settings.json`, `.claude/hooks/build/` |
13
13
  | Skill | `building-a-slice` (+10 refs) · `building-a-micro-change` (carril ligero de mantenimiento) | `.claude/skills/` |
14
14
  | Config | allowlist de stack | `.claude/config/stack-allowlist.json` |
15
15
 
@@ -44,6 +44,31 @@ Editar `stack-allowlist.json` SOLO si la sección de requisitos técnicos del PR
44
44
  ## Bitácora de cambios de metodología
45
45
  Cambios a la política de construcción (unidad de trabajo, gates, DoR/DoD). Aprueba el DRI; van por PR.
46
46
 
47
+ - **2026-06-19 · v0.6.0** — **Calidad de cierre contra horizonte largo** (origen: feedback del equipo
48
+ exodocs tras varios releases, revisado por un experto de Anthropic; raíz: agotamiento de contexto +
49
+ cierre prematuro en épicas multicapa). Toca gates/DoR/DoD y el schema de estado → aprobado por el DRI
50
+ (Agent Manager). Cambios: (1) **handoff fino en disco** — nuevos campos por-slice `wiring_checklist[]`,
51
+ `progress_log[]`, `sub_slices[]` (refresh de contexto = estado por defecto); (2) **gate
52
+ `wiring_verified`** + nuevo agente **`wiring-adversarial-verifier`** (opus, contexto virgen): la
53
+ verificación es adversarial e independiente del generador, prerequisito duro de `dod` (el DoD
54
+ declarativo pasa a ser piso); (3) **cimiento pre-construido** — tag `layer: foundational|business` y
55
+ criterio de DoR que rechaza épicas de negocio que arrastran cimiento no construido (anula la cláusula
56
+ "no bloquean" para el cimiento); (4) **gate de tamaño** en el DoR (>3 HU ó ≥3 capas → descomposición
57
+ en sub-slices) + orquestación por fases con subagentes solo-lectura por área; (5) **runner fuera-de-chat
58
+ `integration-check`** que endurece `journey_smoke` (sin gate nuevo; el `integration` con deps reales
59
+ sigue en el outer loop); (6) **fidelidad estricta** — para UI, `fidelity` exige verificación visual
60
+ real vía MCP (INCONCLUSO ya no pasa). Convenciones anti-deriva (producto completo, no MVP) upstreadas
61
+ al bloque del arnés en `CLAUDE.md`. Se quitó la referencia colgante a `invest-validator` (agente
62
+ inexistente). Total: **12 agentes**.
63
+
64
+ - **2026-06-03 · v0.5.0** — Seguro de fuente de diseño + verificación de fidelidad. Nuevo gate de
65
+ proyecto `design_source` (espejo de scaffold, confirmado por humano; el arnés no genera el prototipo)
66
+ con hook `design-source-guard.sh`; criterio DoR "fuente de diseño identificada" para slices con UI;
67
+ gate vivo de inner loop `fidelity` computado en `smoke` por el nuevo agente `ux-fidelity-reviewer`
68
+ (agnóstico, estático-primero, degrada sin MCP); 7º extension point `DESIGN_SOURCE` en el onboard.
69
+ Toca gates/DoR/DoD y el schema de estado → aprobado por el DRI (Agent Manager). Origen: revisión de
70
+ la propuesta externa de visual fidelity.
71
+
47
72
  - **2026-06-02 · v0.4.0** — Carril `building-a-micro-change` + DoR proporcional. El mantenimiento que
48
73
  no es producto nuevo (typo, bump de dep permitida, copy/config/docs, fix de pocas líneas) deja de
49
74
  modelarse como épica y usa un carril ligero (`fix/*`|`chore/*` → PR, sin `active_slice`), con
package/INSTALL.md CHANGED
@@ -11,7 +11,9 @@ Es el **compañero** de [`@trycore/spec-product-flow`](https://www.npmjs.com/pac
11
11
  | CLI (bin) | `trycore-build` |
12
12
  | Plugin | `trycore-spec-build-harness` |
13
13
  | Marketplace | `trycore-build` |
14
- | Versión | `0.3.0` |
14
+ | Versión | `0.5.0` |
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).
15
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
@@ -28,7 +30,7 @@ npm install -g @trycore/spec-build-harness
28
30
  Esto expone el binario `trycore-build`. Comprueba la versión:
29
31
 
30
32
  ```bash
31
- trycore-build --version # → 0.3.0
33
+ trycore-build --version # → 0.5.0
32
34
  trycore-build --help
33
35
  ```
34
36
 
@@ -84,10 +86,10 @@ 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/` — 10 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
- - `.claude/hooks/build/` — 8 hooks bash.
92
+ - `.claude/hooks/build/` — 9 hooks bash.
91
93
  3. **Siembra el estado**: `state/build-state.schema.json` y `state/README.md` se versionan;
92
94
  `state/build-state.json` se siembra **vacío y nunca se sobrescribe** (va al `.gitignore`).
93
95
  4. **Siembra `config/stack-allowlist.json`** (artefacto del consumidor; lo puebla `/build:onboard`).
package/METODOLOGIA.md CHANGED
@@ -63,6 +63,37 @@ 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.
84
+ 3. **Verificación adversarial independiente (no DoD declarativo).** Reusar el mismo agente como generador
85
+ y verificador produce **auto-confirmación**. Por eso el gate **`wiring_verified`** lo cierra un
86
+ subagente **independiente, de contexto virgen** (`wiring-adversarial-verifier`) cuyo trabajo es
87
+ **asumir que el slice está incompleto y refutarlo** (stubs, rutas sin cablear, AC sin test, items
88
+ `failing`) **antes** de permitir `dod`. El DoD declarativo del gatekeeper es un **piso, no el arreglo**.
89
+ 4. **Producto completo, no MVP (anti-deriva).** El alcance acordado se construye **entero**. **Recortar o
90
+ diferir es bloqueante explícito** que exige acuerdo del equipo — **nunca** una decisión del modelo. No
91
+ se "deja para después" ni se deriva en lo complejo. La verificación es **ejecutada, no por inspección**
92
+ (cargar la página, correr la suite, leer la consola). Estas convenciones viven también en el bloque
93
+ `trycore-build-harness` del `CLAUDE.md` del consumidor (duraderas, sobreviven a la reinstalación).
94
+
95
+ ---
96
+
66
97
  ## 2. La regla del "esqueleto que camina"
67
98
 
68
99
  > **Paso 1 fundamental — el scaffold (precondición, NO generada por el arnés).** Antes del primer
@@ -112,9 +143,9 @@ reference). Un gate no se salta.
112
143
  | 1 | `dor` | Validar Definition of Ready de la épica y sus HU | `dor-dod-gatekeeper` | `dor` | `dor.md` |
113
144
  | 2 | `change` | `opsx:new` + bloque `## Trazabilidad`; validar enlace (barato) | `opsx:new`, `change-epic-coherence` | `coherence_link` | `link-change-epic.md` |
114
145
  | 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` |
146
+ | 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
147
  | 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` |
148
+ | 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
149
  | 7 | `pr` | Abrir PR + **archivar el change en el mismo PR** | `opsx:archive`, `opsx:sync` | — | `gitflow.md` |
119
150
  | 8 | (decisión) | ¿Correr el Release Gate ahora? (default computado, decide el humano) | usuario | — | §4 |
120
151
 
@@ -132,12 +163,20 @@ Una épica **no entra a construcción** hasta cumplir todo (lo valida `dor-dod-g
132
163
  rama de error/edge, debe tener su escenario.
133
164
  - Cada HU pasa los 6 criterios **INVEST**.
134
165
  - Dependencias resueltas (las épicas/HU de las que depende están en `history[]` o no bloquean).
166
+ - **Cimiento construido (épicas `layer: business`)**: todo el cimiento que arrastra (autenticación,
167
+ acceso a datos, arquitectura base, design-system/componentes base) ya existe como épica(s)
168
+ `layer: foundational` **archivada(s)**. Si arrastra cimiento no construido → STOP: se extrae a una
169
+ épica fundacional previa. La cláusula "no bloquean" de dependencias **no aplica al cimiento**.
170
+ - **Tamaño acotado (gate de descomposición)**: si la épica supera el umbral —por defecto **> 3 HU** ó
171
+ **≥ 3 capas tocadas**, configurable— se descompone en `sub_slices[]` construidos de a uno
172
+ (`journey_smoke` verde entre cada uno). Umbral proporcional, no cuota rígida.
135
173
  - Cabe en el stack del PRD (no requiere tecnología fuera de `stack-allowlist.json`).
136
174
  - Datos de prueba disponibles o identificables (fixtures sintéticos del dominio).
137
175
 
138
176
  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.
177
+ —incluido **`wiring_verified: false`**— (`fidelity`/`api` en `null` si la épica no toca UI/endpoints;
178
+ `fidelity` arranca en `false` si toca UI). Si algo ✗ → no se abre el slice; se reporta qué falta y se
179
+ vuelve a discovery.
141
180
 
142
181
  ### 3.2 Definition of Done reducido (gate `dod`)
143
182
 
@@ -150,6 +189,12 @@ las revisiones pesadas **no** se piden aquí (van al Release Gate):
150
189
  la trazabilidad triple completa va al Release Gate).
151
190
  - `data` — invariantes de datos validadas (si el slice toca datos).
152
191
  - `api` — Newman 100% verde (o `null` si el slice no tiene endpoints).
192
+ - `fidelity` (slices con UI) — **ESTRICTO**: solo `true` con verificación visual real vía MCP
193
+ chrome-devtools (screenshot app vs prototipo); INCONCLUSO ya **no** pasa (queda `false`). `null` si
194
+ no toca UI.
195
+ - `wiring_verified` — el `wiring-adversarial-verifier` (subagente **independiente**, contexto virgen)
196
+ intentó refutar el slice y no halló huecos. **Prerequisito duro de `dod`**: el DoD declarativo del
197
+ gatekeeper es un **piso, no el arreglo** (ver §1-bis).
153
198
  - OpenSpec: todas las tasks `[x]`; el archive del change va **en el mismo PR**.
154
199
  - Back-reference del change añadida en la épica y en cada HU de `hus[]`.
155
200
  - Hooks verdes (automáticos, **no** son gates de agente): `lint-typecheck.sh`, `stack-guard.sh`,
@@ -161,8 +206,10 @@ vía el hook `stack-guard.sh` en tiempo real, no vía subagente.
161
206
 
162
207
  ### 3.3 Gates por slice y su naturaleza N/A
163
208
 
164
- - `ux` y `api` admiten `null` cuando el slice no tiene UI o endpoints. `null` ≠ abierto: **no
165
- bloquea** el DoD.
209
+ - `fidelity` y `api` admiten `null` cuando el slice no tiene UI o endpoints. `null` ≠ abierto: **no
210
+ bloquea** el DoD. Pero `fidelity` **no** puede quedar `null` si el slice toca UI (debe llegar a
211
+ `true` por verificación visual real). `wiring_verified` aplica **siempre** (sin `null`) y es
212
+ prerequisito de `dod`.
166
213
  - En `harness_phase: authoring` (sin `package.json`) se puede hacer la Fase 0 (crear/confirmar el
167
214
  scaffold) + `dor` + `change`, pero los gates de código (`tdd`, `journey_smoke`, `api`, `data`) **no
168
215
  se cierran** hasta tener el scaffold confirmado (gate de proyecto `scaffold.confirmed`, ver §2).
@@ -264,8 +311,9 @@ agente lo lee antes de actuar. Estructura: `version`, `harness_phase`, `active_s
264
311
  3. **Gates monótonos hacia adelante.** Un gate solo pasa de `false`→`true` cuando su agente lo
265
312
  aprueba. Si una revisión posterior falla, **se vuelve a `false` y `phase` retrocede** (el retroceso
266
313
  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.
314
+ 4. **`null` para N/A.** `fidelity`/`api` son `null` cuando el slice no tiene UI/endpoints; no cuentan
315
+ como abiertos para el DoD. `fidelity` **no** puede ser `null` si toca UI; `wiring_verified` aplica
316
+ siempre y es prerequisito de `dod`.
269
317
  5. **Archivar.** Al completar `opsx:archive`, mover `active_slice` a `history[]` con
270
318
  `phase: "archived"` y dejar `active_slice: null`.
271
319
  6. **Validar tras escribir** contra el schema (con `jsonschema`/`python3`).
@@ -277,9 +325,10 @@ agente lo lee antes de actuar. Estructura: `version`, `harness_phase`, `active_s
277
325
  | `active_slice` (alta) · `gates.dor` · `gates.dod` | `dor-dod-gatekeeper` | slice |
278
326
  | `gates.coherence_link` | `change-epic-coherence` | slice |
279
327
  | `gates.tdd` | flujo `superpowers:test-driven-development` (vía `build-orchestrator`) | slice |
280
- | `gates.journey_smoke` · `phase` (transiciones) · `history[]` | `build-orchestrator` | slice |
328
+ | `gates.journey_smoke` · `gates.fidelity` · `phase` · `history[]` · `wiring_checklist[]` · `progress_log[]` · `sub_slices[]` | `build-orchestrator` (fidelity desde `ux-fidelity-reviewer`) | slice |
281
329
  | `gates.api` | `api-contract-tester` | slice |
282
330
  | `gates.data` | `data-consistency-checker` | slice |
331
+ | `gates.wiring_verified` | `wiring-adversarial-verifier` (independiente, contexto virgen) | slice (antes de `dod`) |
283
332
  | `releases[]` (security, smell, ux, coherence, stack_arch, integration, status) | `releasing-a-version` (delega en los reviewers) | release |
284
333
  | `harness_phase` | `load-build-state.sh` (SessionStart) | — |
285
334
 
@@ -379,6 +428,13 @@ El arnés **no escribe** en `docs/`; cuando una HU no cumple DoR, devuelve el tr
379
428
  commits/push directos.
380
429
  7. **`integration` con dependencias reales es obligatorio** para cerrar una release; sin él no hay
381
430
  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**.
431
+ 8. **Disciplina de horizonte largo (§1-bis)**: refresh de contexto por defecto (estado en disco +
432
+ `wiring_checklist[]`); cimiento antes que negocio y descomposición por tamaño/topología; gate
433
+ `wiring_verified` por verificador **adversarial independiente** antes de `dod`; **producto completo,
434
+ no MVP** (recortar/diferir es bloqueante explícito, nunca decisión del modelo; verificación
435
+ ejecutada, no por inspección).
436
+ 9. **Fidelidad estricta**: para slices con UI, `fidelity` solo cierra con **verificación visual real**
437
+ (MCP chrome-devtools); INCONCLUSO no pasa.
438
+ 10. El core es **agnóstico**: lo específico del dominio se inyecta vía `/build:onboard` y
439
+ `stack-allowlist.json`; el ejemplo de referencia vive en `docs/examples/reference/`.
440
+ 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,12 +82,12 @@ 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/ ← 10 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
96
89
  ├── skills/ ← 12 skills (building-a-slice, releasing-a-version, 10 openspec-*)
97
- ├── hooks/build/ ← 8 hooks bash (gate-check, reflect-nudge, scaffold-guard, gitflow-guard, stack-guard, …)
90
+ ├── hooks/build/ ← 9 hooks bash (gate-check, reflect-nudge, scaffold-guard, gitflow-guard, stack-guard, …)
98
91
  ├── state/ ← máquina de estado: build-state.json + schema + README
99
92
  ├── config/ ← stack-allowlist.template.json (artefacto del consumidor)
100
93
  ├── src/ + dist/ ← CLI trycore-build (init/update/status/uninstall/doctor)
@@ -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 **10 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` y `change-epic-coherence`.
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
 
@@ -126,7 +119,10 @@ El core no menciona ningún dominio de cliente. Toda parametrización entra por
126
119
 
127
120
  - ✅ **v0.1.0** — arnés de dos loops (`building-a-slice` + `releasing-a-version`), 10 agentes, comandos `/opsx:*` + `/build:onboard`, 12 skills, 6 hooks, máquina de estado `build-state.json`, allowlist de stack, CLI `trycore-build` (init/update/status/uninstall/doctor) y plugin nativo. Compañero de `@trycore/spec-product-flow`.
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
- - ✅ **v0.3.0 (actual)** — **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`.
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`.
123
+ - ✅ **v0.4.0** — carril `building-a-micro-change` (mantenimiento ligero sin slice) + DoR proporcional a la complejidad.
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**.
130
126
 
131
127
  ## Licencia
132
128
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.6.0
@@ -14,14 +14,38 @@ 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.
28
+
29
+ **Refresh de contexto por defecto.** Mantén el handoff fino en disco. **Siémbralo al entrar a `change`/`tdd`**:
30
+ deriva de las HU de `hus[]` un item de `wiring_checklist[]` por **cada escenario AC** y uno por **cada
31
+ punto de integración entre capas** que el slice toca, todos en `status: failing`. Pásalos a `passing`
32
+ **solo tras prueba real ejecutada** (registrando `evidence`). Deja un hito en `progress_log[]` por sesión.
33
+ Una sesión fresca retoma desde el estado en disco, no desde la conversación. El `wiring-adversarial-verifier`
34
+ auditará después que cada `passing` tenga evidencia real y que no falte ningún item.
35
+
17
36
  ## Pipeline — inner loop (orden estricto, rápido, SIN subagentes pesados)
18
37
  ```
19
- 1. dor → delega en dor-dod-gatekeeper (abre el slice si pasa)
38
+ 1. dor → delega en dor-dod-gatekeeper (abre el slice si pasa; inicializa wiring_verified:false)
20
39
  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
40
+ 3. tdd → conduce superpowers:test-driven-development (red→green→refactor); marca items wiring_checklist passing al verde real
41
+ 4. smoke → recorre el journey-hasta-aquí end-to-end con el RUNNER fuera-de-chat integration-check
42
+ (suite+build+reporte) en sesión/contexto virgen → gate journey_smoke.
43
+ Slices con UI: con la app levantada, delega en ux-fidelity-reviewer (verificación VISUAL REAL
44
+ vía MCP chrome-devtools) y ESCRIBE gates.fidelity desde su veredicto (FIEL/DESVIACIONES
45
+ justificadas→true; DESVIACIONES→false; INCONCLUSO/sin MCP→FALSE, bloquea; sin UI→null).
23
46
  5. api/data → api-contract-tester (si hay endpoints) · data-consistency-checker (si toca datos)
24
- 6. dod → dor-dod-gatekeeper (cierre por slice, DoD reducido)
47
+ 6. dod → PRIMERO delega en wiring-adversarial-verifier (subagente INDEPENDIENTE, contexto virgen:
48
+ intenta refutar el slice; cierra gates.wiring_verified) → SOLO si true, dor-dod-gatekeeper (DoD reducido)
25
49
  7. pr → abre PR y archiva el change EN EL MISMO PR (opsx:archive + opsx:sync); back-ref en épica y HU
26
50
  8. release? → tras archivar, devuelve a la skill building-a-slice para preguntar el Release Gate (default computado)
27
51
  ```
@@ -29,6 +53,11 @@ La **unidad de construcción es la épica** (`active_slice.epica`); las HU que c
29
53
  **Los agentes pesados ya NO corren aquí.** `security-reviewer`, `simple-design-reviewer`,
30
54
  `ux-krug-reviewer`, `coherence-three-way` y `stack-guardian` (arquitectura) corren **una vez por
31
55
  release** en la skill `releasing-a-version`. Las deps las vigila el hook `stack-guard.sh`.
56
+ El `ux-fidelity-reviewer` **sí** corre aquí (en `smoke`): es barato (la app ya está levantada) y vivo
57
+ por-slice; no es la revisión pesada de UX/Krug (esa sigue en `releasing-a-version`). El
58
+ `wiring-adversarial-verifier` **también** corre aquí (al inicio de `dod`): es un verificador
59
+ **enfocado y corto** (solo refuta cableado/AC/stubs, no re-revisa diseño/seguridad), e **independiente**
60
+ del que generó el código — por eso evita la auto-confirmación del cierre prematuro.
32
61
 
33
62
  ## Reglas de orquestación
34
63
  - **No saltes gates.** No avances de fase si el gate previo está en `false`. Reporta qué falta.
@@ -37,7 +66,12 @@ release** en la skill `releasing-a-version`. Las deps las vigila el hook `stack-
37
66
  - **Una escritura por transición**: actualiza `phase`, el gate tocado, `updated_at` (ISO UTC),
38
67
  `updated_by: build-orchestrator`. No toques otros campos.
39
68
  - **Gate `api`** puede quedar en `null` si la épica no tiene endpoints (no bloquea DoD). `data` solo
40
- si el slice toca datos.
69
+ si el slice toca datos. **`fidelity`** no puede quedar `null` si el slice toca UI (debe ser `true`
70
+ por verificación visual real; INCONCLUSO → `false`).
71
+ - **`dod` exige `wiring_verified: true`.** No cierres `dod` sin que el `wiring-adversarial-verifier`
72
+ haya dado verde. El DoD del gatekeeper es declarativo (piso); el verificador independiente es el arreglo.
73
+ - **Producto completo, no MVP.** Construye el alcance acordado entero. **Recortar o diferir es
74
+ bloqueante explícito** que requiere acuerdo del equipo — nunca lo decides tú. No derives en lo complejo.
41
75
  - Si `harness_phase` = `authoring` (no hay `package.json`), los gates de código (tdd, journey_smoke,
42
76
  api, data) no pueden cerrarse: dilo y detente tras preparar lo que sí aplica.
43
77
  - **Tras `archived`**, calcula el default del Release Gate y pásalo a la skill: (a) ¿esta épica
@@ -26,15 +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).
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`
40
+ (fuente visual de verdad declarada para el proyecto) y la épica apunta a la(s) pantalla(s)
41
+ equivalente(s) del `DESIGN_SOURCE`. Si no toca UI, este criterio es N/A.
32
42
 
33
43
  Si DoR pasa: propón abrir `active_slice` con `epica`, `hus` (lista de las HU cubiertas),
34
44
  `openspec_change` (kebab del título de la épica), `branch: feature/ep-xxx-<slug>`, `phase: dor`,
35
- `gates: { dor: true, tdd: false, journey_smoke: false, coherence_link: false, data: false, dod: false }`
36
- (`api` en `null` si la épica no toca endpoints; añade `data: null`-equivalente omitiéndolo si no toca
37
- 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.
38
48
 
39
49
  ## Definition of Done (gate `dod`) — antes de archivar (DoD **reducido**, por slice)
40
50
  Pasa SOLO si **todos** estos gates del **inner loop** están en `true` (o `null` cuando N/A):
@@ -43,8 +53,19 @@ Pasa SOLO si **todos** estos gates del **inner loop** están en `true` (o `null`
43
53
  3. `coherence_link` — `change-epic-coherence` confirma el enlace change↔épica (`openspec validate` ok).
44
54
  4. `data` — `data-consistency-checker` verde (si el slice toca datos).
45
55
  5. `api` — `api-contract-tester` verde (o `null` si sin endpoints).
46
- 6. Documentación: change con tasks completas; back-ref añadido en la épica y en cada HU de `hus[]`.
47
- 7. 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`.
48
69
 
49
70
  **NO valides aquí** `security`, `smell`, `ux`, `coherence` (triple completa) ni `stack` (arquitectura):
50
71
  esos son del **Release Gate** (`releasing-a-version`, `release-dod.md`), cadencia por release.
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: ux-fidelity-reviewer
3
+ description: Verifica la FIDELIDAD VISUAL de una pantalla de la app corriendo contra la fuente de diseño declarada (el DESIGN_SOURCE del dominio del consumidor). Complementa al ux-krug-reviewer (que mide usabilidad, no fidelidad). Úsalo en slices con UI, en la fase smoke. Emite FIEL / DESVIACIONES / INCONCLUSO / N/A con diferencias concretas y fixes.
4
+ tools: Read, Grep, Glob, Bash
5
+ model: sonnet
6
+ ---
7
+
8
+ Eres el **revisor de fidelidad visual** del arnés de construcción. Read-only sobre el código. Compruebas
9
+ que una pantalla construida **se parece a la fuente de diseño declarada** por el consumidor (el
10
+ `DESIGN_SOURCE` del bloque de dominio de su CLAUDE.md / su PRD). NO juzgas usabilidad (eso es
11
+ `ux-krug-reviewer`): juzgas si **composición, layout, paleta y tipografía** reproducen el diseño.
12
+
13
+ > Existe porque un re-skin puede acertar los *tokens* (color/fuente) y aun así **ignorar la
14
+ > composición** (p.ej. una sola columna centrada cuando el diseño declara dos paneles).
15
+
16
+ ## Paso 0 — ¿aplica?
17
+ Si el slice **no tiene UI**, devuelve **N/A** y termina (para que el gate `fidelity` quede en `null`),
18
+ igual que `ux-krug-reviewer`.
19
+
20
+ ## Entradas (pídelas si faltan)
21
+ - La(s) pantalla(s) del slice (rutas de la app, p.ej. `<URL-local-del-dev-server>/<ruta>`).
22
+ - La fuente de diseño (`DESIGN_SOURCE`): archivo/URL del prototipo o export, y cómo localizar la
23
+ pantalla equivalente.
24
+ - Tokens de diseño del proyecto (los que declare el stack del PRD del consumidor: variables CSS, tema,
25
+ design tokens), si existen.
26
+
27
+ ## Cómo revisar — la verificación VISUAL REAL es REQUERIDA (no best-effort)
28
+ Una UI no mejora su fidelidad por el prompt, sino porque **cargas la página, observas la salida real y
29
+ lees la consola**. Para un slice con UI (`design_source.applies===true`) el estático **no basta**:
30
+ - **Estático (necesario pero insuficiente)**: lee el código de la pantalla (con la librería de UI del
31
+ stack declarado en el PRD) y contrástalo contra la descripción del `DESIGN_SOURCE` y los tokens.
32
+ - **Dinámico (REQUERIDO para UI)**: con la app corriendo, usa el MCP de inspección de UI
33
+ (**chrome-devtools**): `new_page`/`take_screenshot` de la app **y** del prototipo, y `take_snapshot`
34
+ (árbol accesible/DOM) para comparar **estructura**, no solo píxeles. **Esto es obligatorio**: la
35
+ fidelidad de UI solo se acredita observando la salida real.
36
+ - Si el MCP **no está disponible** (headless/CI): **NO inventes y NO degrades a "pasa"**. Veredicto
37
+ **INCONCLUSO**, que para UI **mapea a `false`** (bloquea el `dod`): hay que correr el slice donde
38
+ el MCP esté disponible. (Antes INCONCLUSO no bloqueaba; **ya no**.)
39
+ - **Bifurca por la fuente**: si la fuente es **renderizable** (prototipo HTML / URL navegable) compara
40
+ screenshot **app vs prototipo** + `take_snapshot` de ambos; si **no es navegable** (export/imagen/PDF),
41
+ compara el screenshot **real de la app** (vía MCP) contra el export (sin `take_snapshot` del diseño).
42
+ - **Cobertura**: ninguna pantalla del prototipo en alcance puede quedar sin construir; ninguna pantalla
43
+ de la app puede quedar sin HU/EP. El recorrido es **clic real como tenant no-admin**.
44
+
45
+ ## Qué comparar (estructura > píxeles) — ✅ fiel / ⚠️ parcial / ❌ desviación
46
+ - **Layout/composición**: nº y disposición de paneles/columnas, orden de secciones, jerarquía.
47
+ - **Componentes clave presentes**: cada bloque del diseño (barra, hero, tarjetas, footer, callouts) existe.
48
+ - **Paleta**: colores dominantes = tokens declarados; marca usos fuera de paleta.
49
+ - **Tipografía**: familias y escala/peso de titulares vs cuerpo.
50
+ - **Copy estructural**: titulares y CTAs clave coinciden en intención.
51
+ - **Estados**: los estados que el diseño muestra (error, vacío…) existen.
52
+ No penalices desviaciones **justificadas y documentadas** (datos ilustrativos estáticos, copy
53
+ reconciliado por una ADR); lístalas como "desviación intencional". **No pixel-diff** (frágil).
54
+
55
+ ## Salida + mapeo al gate
56
+ Veredicto **FIEL / DESVIACIONES / INCONCLUSO / N/A** + tabla región×veredicto con evidencia + lista
57
+ priorizada de diferencias con su fix (archivo/componente) + desviaciones intencionales aceptadas.
58
+
59
+ Mapeo que aplicará el `build-orchestrator` al escribir `gates.fidelity`:
60
+ - **FIEL** (verificado vía MCP) → `true`
61
+ - **DESVIACIONES** todas justificadas/documentadas (verificado vía MCP) → `true`
62
+ - **DESVIACIONES** sin justificar → `false`
63
+ - **N/A** (sin UI) → `null`
64
+ - **INCONCLUSO** (MCP no disponible / verificación visual no realizada) → **`false`** (bloquea el `dod`).
65
+ Registra la nota "INCONCLUSO: correr donde haya MCP chrome-devtools". **Ya NO mapea a `null` ni es
66
+ no-bloqueante**: para un slice con UI, sin verificación visual real no hay fidelidad acreditada.
67
+
68
+ Eres read-only: **no editas código ni el estado**. Devuelve el diagnóstico al `build-orchestrator`.
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: wiring-adversarial-verifier
3
+ description: Verificador ADVERSARIAL e INDEPENDIENTE del cableado de un slice, con contexto virgen. Su trabajo NO es confirmar que está hecho, sino REFUTARLO: asume que el slice está incompleto y caza el stub, la ruta sin cablear, el AC sin test, el punto de integración entre capas que no conecta. Cierra el gate wiring_verified (prerequisito duro de dod). Úsalo al inicio de la fase dod, antes del dor-dod-gatekeeper.
4
+ tools: Read, Grep, Glob, Bash
5
+ model: opus
6
+ ---
7
+
8
+ Eres el **verificador adversarial del cableado**. Read-only sobre el código y el estado: **no editas
9
+ código ni produces el slice**. Llegas con **contexto virgen** (no participaste en construirlo) — por eso
10
+ puedes ver lo que el constructor racionalizó como "hecho".
11
+
12
+ > **Por qué existes.** Reusar el mismo agente como generador y verificador produce *alucinaciones que se
13
+ > autoconfirman*: ante presupuesto de atención escaso, el modelo declara "terminado" lo que dejó a medias.
14
+ > Tu independencia rompe ese bucle. **Tu sesgo por defecto es "está incompleto"**: solo das verde si, tras
15
+ > intentar romperlo activamente, **no encuentras ningún hueco**.
16
+
17
+ ## Postura
18
+ **Intenta refutar el slice, no aprobarlo.** Por cada HU/AC en alcance y por cada punto de integración
19
+ entre capas, busca activamente la evidencia de que **NO** está cableado de punta a punta. La carga de la
20
+ prueba es del código: ante la duda, es `failing`.
21
+
22
+ ## Entradas (léelas del estado y del repo)
23
+ - `active_slice`: `epica`, `hus[]`, `wiring_checklist[]`, `sub_slices[]`, `gates`.
24
+ - El AC (Given/When/Then) de cada HU en `docs/04-historias/`.
25
+ - El código y los tests del change (Grep/Glob; LSP si está disponible).
26
+ - El reporte del runner `integration-check` (suite+build) si existe.
27
+
28
+ ## Qué cazar (huecos típicos del cierre prematuro)
29
+ 1. **Stubs / TODO / mocks dejados en producción**: funciones que devuelven valores fijos, `throw new
30
+ Error("not implemented")`, `return null`/`[]` de relleno, handlers vacíos, *feature flags* apagados.
31
+ 2. **Rutas sin cablear**: una capa llama a la siguiente solo "en teoría" — el endpoint existe pero nadie
32
+ lo invoca; el productor publica a la cola pero ningún consumidor la lee; el componente existe pero no
33
+ está enrutado/montado; el worker no está suscrito; el resultado del LLM no se persiste ni se usa.
34
+ 3. **AC sin test real**: un escenario G/W/T sin test que lo ejerza, o un test que **no** ejercita la ruta
35
+ (asserts triviales, mock que tapa justamente la integración que importa).
36
+ 4. **Items `wiring_checklist[]` aún `failing`** o marcados `passing` **sin `evidence`** de ejecución real.
37
+ 5. **Puntos de integración entre capas** (SPA↔gateway↔core↔cola↔worker↔IA↔persistencia) declarados pero
38
+ no recorridos end-to-end por ninguna prueba/journey.
39
+ 6. **Alcance recortado en silencio**: HU en `hus[]` parcialmente implementada, o funcionalidad "diferida"
40
+ sin acuerdo (anti-patrón "es un MVP").
41
+
42
+ ## Método
43
+ - Traza **cada** AC y **cada** integration_point hasta el código y un test que lo ejerza de verdad.
44
+ - Donde el `wiring_checklist[]` diga `passing`, **verifica la `evidence`** (corre/lee el test o el
45
+ comando citado). Si no reproduce, es `failing`.
46
+ - Corre la suite si hace falta (`Bash`) para confirmar que lo verde es verde de verdad.
47
+
48
+ ## Salida + mapeo al gate
49
+ Veredicto **CABLEADO COMPLETO** o **HUECOS** + lista priorizada de huecos con `archivo:línea`, la HU/AC o
50
+ el par de capas afectado, y el fix mínimo. Devuelve también qué items de `wiring_checklist[]` deberían
51
+ estar `failing`.
52
+
53
+ Mapeo que aplicará el `build-orchestrator` a `gates.wiring_verified`:
54
+ - **CABLEADO COMPLETO** (ningún hueco tras intentar refutar) → `true` → habilita la fase `dod`.
55
+ - **HUECOS** (≥1) → `false` → el `build-orchestrator` retrocede `phase`, marca los items afectados
56
+ `failing` y **NO** se cierra `dod`.
57
+
58
+ No editas el estado tú mismo: devuelves el diagnóstico al `build-orchestrator`. Si una regla aquí
59
+ contradice `METODOLOGIA.md` (§1-bis), gana la metodología.