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