@trycore/spec-build-harness 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/GOVERNANCE.md +18 -1
- package/INSTALL.md +3 -1
- package/METODOLOGIA.md +68 -12
- package/README.md +8 -14
- package/VERSION +1 -1
- package/agents/build/build-orchestrator.md +38 -9
- package/agents/build/dor-dod-gatekeeper.md +26 -10
- package/agents/build/ux-fidelity-reviewer.md +22 -15
- package/agents/build/wiring-adversarial-verifier.md +59 -0
- package/commands/build/onboard.md +18 -0
- package/docs/agents.md +26 -3
- package/docs/customization/mcp-extensions.md +16 -5
- package/docs/getting-started.md +64 -209
- package/hooks/build/load-build-state.sh +17 -1
- package/package.json +1 -1
- package/skills/building-a-slice/SKILL.md +41 -6
- package/skills/building-a-slice/references/dod.md +13 -3
- package/skills/building-a-slice/references/dor.md +6 -3
- package/skills/building-a-slice/references/integration-check.md +27 -0
- package/skills/building-a-slice/references/mcp-map.md +1 -1
- package/skills/building-a-slice/references/state-protocol.md +21 -4
- package/state/README.md +23 -5
- package/state/build-state.schema.json +51 -4
- package/templates/CLAUDE.md.template +6 -2
- 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
|
+
"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,7 +8,7 @@ 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 | 12 agentes de build | `.claude/agents/build/` |
|
|
12
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` |
|
|
@@ -44,6 +44,23 @@ 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
|
+
|
|
47
64
|
- **2026-06-03 · v0.5.0** — Seguro de fuente de diseño + verificación de fidelidad. Nuevo gate de
|
|
48
65
|
proyecto `design_source` (espejo de scaffold, confirmado por humano; el arnés no genera el prototipo)
|
|
49
66
|
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/` —
|
|
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
|
@@ -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`
|
|
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` |
|
|
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
|
-
(`
|
|
140
|
-
qué falta y se
|
|
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
|
-
- `
|
|
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.** `
|
|
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`
|
|
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.
|
|
383
|
-
`
|
|
384
|
-
|
|
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
|
|
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`
|
|
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/ ←
|
|
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 **
|
|
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
|
|
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.
|
|
1
|
+
0.6.0
|
|
@@ -14,17 +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
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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).
|
|
26
46
|
5. api/data → api-contract-tester (si hay endpoints) · data-consistency-checker (si toca datos)
|
|
27
|
-
6. dod →
|
|
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)
|
|
28
49
|
7. pr → abre PR y archiva el change EN EL MISMO PR (opsx:archive + opsx:sync); back-ref en épica y HU
|
|
29
50
|
8. release? → tras archivar, devuelve a la skill building-a-slice para preguntar el Release Gate (default computado)
|
|
30
51
|
```
|
|
@@ -33,7 +54,10 @@ La **unidad de construcción es la épica** (`active_slice.epica`); las HU que c
|
|
|
33
54
|
`ux-krug-reviewer`, `coherence-three-way` y `stack-guardian` (arquitectura) corren **una vez por
|
|
34
55
|
release** en la skill `releasing-a-version`. Las deps las vigila el hook `stack-guard.sh`.
|
|
35
56
|
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`).
|
|
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.
|
|
37
61
|
|
|
38
62
|
## Reglas de orquestación
|
|
39
63
|
- **No saltes gates.** No avances de fase si el gate previo está en `false`. Reporta qué falta.
|
|
@@ -42,7 +66,12 @@ por-slice; no es la revisión pesada de UX/Krug (esa sigue en `releasing-a-versi
|
|
|
42
66
|
- **Una escritura por transición**: actualiza `phase`, el gate tocado, `updated_at` (ISO UTC),
|
|
43
67
|
`updated_by: build-orchestrator`. No toques otros campos.
|
|
44
68
|
- **Gate `api`** puede quedar en `null` si la épica no tiene endpoints (no bloquea DoD). `data` solo
|
|
45
|
-
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.
|
|
46
75
|
- Si `harness_phase` = `authoring` (no hay `package.json`), los gates de código (tdd, journey_smoke,
|
|
47
76
|
api, data) no pueden cerrarse: dilo y detente tras preparar lo que sí aplica.
|
|
48
77
|
- **Tras `archived`**, calcula el default del Release Gate y pásalo a la skill: (a) ¿esta épica
|
|
@@ -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** (
|
|
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.
|
|
32
|
-
|
|
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
|
|
40
|
-
`
|
|
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).
|
|
50
|
-
(
|
|
51
|
-
|
|
52
|
-
|
|
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.
|
|
@@ -24,17 +24,23 @@ igual que `ux-krug-reviewer`.
|
|
|
24
24
|
- Tokens de diseño del proyecto (los que declare el stack del PRD del consumidor: variables CSS, tema,
|
|
25
25
|
design tokens), si existen.
|
|
26
26
|
|
|
27
|
-
## Cómo revisar
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
- **
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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**.
|
|
38
44
|
|
|
39
45
|
## Qué comparar (estructura > píxeles) — ✅ fiel / ⚠️ parcial / ❌ desviación
|
|
40
46
|
- **Layout/composición**: nº y disposición de paneles/columnas, orden de secciones, jerarquía.
|
|
@@ -51,11 +57,12 @@ Veredicto **FIEL / DESVIACIONES / INCONCLUSO / N/A** + tabla región×veredicto
|
|
|
51
57
|
priorizada de diferencias con su fix (archivo/componente) + desviaciones intencionales aceptadas.
|
|
52
58
|
|
|
53
59
|
Mapeo que aplicará el `build-orchestrator` al escribir `gates.fidelity`:
|
|
54
|
-
- **FIEL** → `true`
|
|
55
|
-
- **DESVIACIONES** todas justificadas/documentadas → `true`
|
|
60
|
+
- **FIEL** (verificado vía MCP) → `true`
|
|
61
|
+
- **DESVIACIONES** todas justificadas/documentadas (verificado vía MCP) → `true`
|
|
56
62
|
- **DESVIACIONES** sin justificar → `false`
|
|
57
63
|
- **N/A** (sin UI) → `null`
|
|
58
|
-
- **INCONCLUSO** (MCP no disponible) →
|
|
59
|
-
|
|
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.
|
|
60
67
|
|
|
61
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.
|
|
@@ -45,6 +45,7 @@ Voy a leer tu PRD/openspec para proponer valores y confirmar contigo:
|
|
|
45
45
|
5. Secretos server-side
|
|
46
46
|
6. Decisiones de alto impacto que exigen explicabilidad en UX
|
|
47
47
|
7. Fuente de diseño / referencia visual (prototipo/export) y pantallas — o "N/A" si no hay UI
|
|
48
|
+
8. Capa de cada épica del backlog: **fundacional** (cimiento) vs **negocio**
|
|
48
49
|
```
|
|
49
50
|
|
|
50
51
|
---
|
|
@@ -69,6 +70,23 @@ Voy a leer tu PRD/openspec para proponer valores y confirmar contigo:
|
|
|
69
70
|
|
|
70
71
|
---
|
|
71
72
|
|
|
73
|
+
## Fase 2b: Clasificar la capa de las épicas (cimiento vs negocio)
|
|
74
|
+
|
|
75
|
+
El factor que más reduce el consumo de contexto por slice es que el **cimiento** ya esté construido y
|
|
76
|
+
abstraído antes de que el loop tome historias de negocio. Para habilitar el gate de DoR "Cimiento
|
|
77
|
+
construido":
|
|
78
|
+
1. Lee el backlog/Story Map del proyecto (`docs/03-backlog/epicas.md`, `docs/02-user-story-map/`).
|
|
79
|
+
2. Propón, vía **AskUserQuestion**, qué épicas son **`layer: foundational`** (autenticación, acceso a
|
|
80
|
+
datos, arquitectura base, design-system/componentes base del prototipo) y cuáles **`layer: business`**.
|
|
81
|
+
3. Escribe el tag en el **frontmatter de cada épica** en `docs/03-backlog/epicas.md` (artefacto de
|
|
82
|
+
discovery; coordina con `@trycore/spec-product-flow` si ese paquete ya lo gobierna — el build-harness
|
|
83
|
+
solo necesita poder **leer** `layer`). El DoR rechazará abrir una épica de negocio que arrastre
|
|
84
|
+
cimiento `foundational` aún no archivado.
|
|
85
|
+
|
|
86
|
+
No inventes la clasificación: derívala del PRD/Story Map y confírmala con el usuario.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
72
90
|
## Fase 3: Resolver el bloque de CLAUDE.md
|
|
73
91
|
|
|
74
92
|
Lee `CLAUDE.md`. Encuentra el bloque entre `<!-- BEGIN trycore-build-harness` y `<!-- END trycore-build-harness -->`.
|
package/docs/agents.md
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
# Agentes de construcción (`agents/build/`)
|
|
2
2
|
|
|
3
|
-
Los **
|
|
3
|
+
Los **12 agentes** de `@trycore/spec-build-harness` ejecutan los *gates* del arnés de
|
|
4
4
|
construcción de dos loops. Ninguno edita código de producto: son read-only sobre el
|
|
5
5
|
repositorio (algunos ejecutan tests o levantan la app), diagnostican y **devuelven el
|
|
6
6
|
veredicto al `build-orchestrator`**, que es quien propone la escritura del estado
|
|
7
7
|
(`.claude/state/build-state.json`).
|
|
8
8
|
|
|
9
9
|
> **Cadencia.** El `build-orchestrator` y `dor-dod-gatekeeper`, junto con
|
|
10
|
-
> `change-epic-coherence`, `api-contract-tester
|
|
10
|
+
> `change-epic-coherence`, `api-contract-tester`, `data-consistency-checker`,
|
|
11
|
+
> `ux-fidelity-reviewer` y `wiring-adversarial-verifier`, corren en el
|
|
11
12
|
> **inner loop** (skill `building-a-slice`, por épica `EP-XXX`). Los 5 revisores pesados de
|
|
12
13
|
> release (`security-reviewer`, `simple-design-reviewer`, `ux-krug-reviewer`,
|
|
13
14
|
> `coherence-three-way`, `stack-guardian`) corren **una vez por release** en el **outer loop**
|
|
@@ -27,7 +28,8 @@ veredicto al `build-orchestrator`**, que es quien propone la escritura del estad
|
|
|
27
28
|
| 8 | `api-contract-tester` | sonnet | Contrato / datos | Gate `api` — pruebas de contrato (Newman/Postman) |
|
|
28
29
|
| 9 | `data-consistency-checker` | sonnet | Contrato / datos | Gate `data` — invariantes y consistencia de datos |
|
|
29
30
|
| 10 | `change-epic-coherence` | sonnet | Trazabilidad | Gate `coherence_link` — enlace change↔épica↔HU |
|
|
30
|
-
| 11 | `ux-fidelity-reviewer` | sonnet | Inner loop · smoke | Gate `fidelity` — fidelidad visual a la fuente de diseño declarada |
|
|
31
|
+
| 11 | `ux-fidelity-reviewer` | sonnet | Inner loop · smoke | Gate `fidelity` — fidelidad visual a la fuente de diseño declarada (verificación visual real, MCP) |
|
|
32
|
+
| 12 | `wiring-adversarial-verifier` | **opus** | Inner loop · dod | Gate `wiring_verified` — verificación adversarial independiente del cableado (refuta antes de cerrar `dod`) |
|
|
31
33
|
|
|
32
34
|
---
|
|
33
35
|
|
|
@@ -132,3 +134,24 @@ exista en `docs/04-historias/` con `epica:` coincidente, la coherencia de alcanc
|
|
|
132
134
|
`openspec validate <name> --type change --strict` pase; sugiere back-references. COHERENTE →
|
|
133
135
|
`gates.coherence_link: true`. Complementa a `coherence-three-way` validando el **enlace**
|
|
134
136
|
(este último valida la implementación real).
|
|
137
|
+
|
|
138
|
+
## Inner loop · fidelidad y cableado
|
|
139
|
+
|
|
140
|
+
### `ux-fidelity-reviewer` · modelo `sonnet` · lee el dominio
|
|
141
|
+
**Revisor de fidelidad visual** (gate `fidelity`), en la fase `smoke`. Comprueba que la pantalla
|
|
142
|
+
construida reproduce **composición, layout, paleta y tipografía** de la fuente de diseño declarada
|
|
143
|
+
(`DESIGN_SOURCE`). **Verificación visual real, requerida para UI**: con la app corriendo usa un MCP de
|
|
144
|
+
devtools de navegador (chrome-devtools) — `take_screenshot` app vs prototipo + `take_snapshot` de
|
|
145
|
+
estructura. Sin MCP el veredicto es INCONCLUSO, que para UI mapea a `gates.fidelity: false` (bloquea el
|
|
146
|
+
`dod`): hay que correr el slice donde el MCP esté disponible. No juzga usabilidad (eso es
|
|
147
|
+
`ux-krug-reviewer`, en el outer loop).
|
|
148
|
+
|
|
149
|
+
### `wiring-adversarial-verifier` · modelo `opus` · contexto virgen
|
|
150
|
+
**Verificador adversarial del cableado** (gate `wiring_verified`), al inicio de la fase `dod`. Llega
|
|
151
|
+
con contexto virgen e **independiente** del que construyó: su sesgo por defecto es "está incompleto" y
|
|
152
|
+
su trabajo es **refutar** el slice — cazar stubs, rutas sin cablear (endpoint sin invocar, cola sin
|
|
153
|
+
consumidor, componente sin enrutar), AC sin test real, puntos de integración entre capas no recorridos,
|
|
154
|
+
e items de `wiring_checklist[]` aún `failing` o marcados `passing` sin `evidence`. CABLEADO COMPLETO →
|
|
155
|
+
`gates.wiring_verified: true` (habilita `dod`); HUECOS → `false` (retrocede `phase`). Rompe la
|
|
156
|
+
auto-confirmación del cierre prematuro: el DoD declarativo del `dor-dod-gatekeeper` es un piso, este
|
|
157
|
+
agente es el arreglo.
|