@trycore/spec-build-harness 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: "BUILD: Onboard"
3
- description: Parametriza el dominio del build harness — capa de servicios externos/IA, lógica determinista, PII, secretos y decisiones de alto impacto. Rellena el bloque marcado de CLAUDE.md y escribe auto-memory. Complementa al CLI trycore-build init (que ya sembró los archivos y el stack mecánico).
3
+ description: Parametriza el dominio del build harness — capa de servicios externos/IA, lógica determinista, PII, secretos, decisiones de alto impacto y fuente de diseño (DESIGN_SOURCE). Rellena el bloque marcado de CLAUDE.md y escribe auto-memory. Complementa al CLI trycore-build init (que ya sembró los archivos y el stack mecánico).
4
4
  category: Workflow
5
5
  tags: [onboarding, parametrizacion, build-harness, trycore]
6
6
  ---
@@ -35,7 +35,7 @@ Stop aquí si no está instalado.
35
35
 
36
36
  El CLI ya instaló agentes, comandos /opsx:*, hooks y el estado. Ahora voy a parametrizar el
37
37
  DOMINIO del arnés (2-3 min) — los puntos de extensión que leen los agentes de calidad
38
- (security-reviewer, stack-guardian, data-consistency-checker, ux-krug-reviewer, simple-design-reviewer).
38
+ (security-reviewer, stack-guardian, data-consistency-checker, ux-krug-reviewer, simple-design-reviewer, ux-fidelity-reviewer).
39
39
 
40
40
  Voy a leer tu PRD/openspec para proponer valores y confirmar contigo:
41
41
  1. Ruta#ancla del PRD técnico (fuente del stack)
@@ -44,6 +44,8 @@ Voy a leer tu PRD/openspec para proponer valores y confirmar contigo:
44
44
  4. Categorías de datos sensibles / PII reguladas
45
45
  5. Secretos server-side
46
46
  6. Decisiones de alto impacto que exigen explicabilidad en UX
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**
47
49
  ```
48
50
 
49
51
  ---
@@ -61,17 +63,37 @@ Voy a leer tu PRD/openspec para proponer valores y confirmar contigo:
61
63
  - **Datos sensibles / PII** (`SENSITIVE_DATA_CATEGORIES`): categorías reguladas del dominio.
62
64
  - **Secretos server-side** (`SERVER_SIDE_SECRETS`): claves/tokens que jamás van al cliente.
63
65
  - **Decisiones de alto impacto** (`HIGH_STAKES_DECISIONS`): decisiones que exigen explicabilidad/justificación en la UI.
66
+ - **Fuente de diseño** (`DESIGN_SOURCE`): ¿el producto tiene UI? Si sí, ruta/URL de la fuente
67
+ visual de verdad (prototipo, export de diseño o mockups) y cómo localizar cada pantalla; si no,
68
+ "N/A". (La escritura del estado `design_source` en `build-state.json` se hace en la Fase 3c.)
64
69
  3. Si un punto no aplica al proyecto, registra explícitamente "no aplica" (no lo dejes como `{{...}}`).
65
70
 
66
71
  ---
67
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
+
68
90
  ## Fase 3: Resolver el bloque de CLAUDE.md
69
91
 
70
92
  Lee `CLAUDE.md`. Encuentra el bloque entre `<!-- BEGIN trycore-build-harness` y `<!-- END trycore-build-harness -->`.
71
93
 
72
94
  Reemplaza dentro del bloque los placeholders `{{PRD_TECH_PATH}}`, `{{EXTERNAL_SERVICE_LAYER}}`,
73
95
  `{{DETERMINISTIC_LAYER}}`, `{{SENSITIVE_DATA_CATEGORIES}}`, `{{SERVER_SIDE_SECRETS}}`,
74
- `{{HIGH_STAKES_DECISIONS}}` por los valores confirmados.
96
+ `{{HIGH_STAKES_DECISIONS}}`, `{{DESIGN_SOURCE}}` por los valores confirmados.
75
97
 
76
98
  **NO toques nada fuera de los markers.**
77
99
 
@@ -87,6 +109,16 @@ Si el usuario lo desea y existe `package.json` en el proyecto:
87
109
 
88
110
  ---
89
111
 
112
+ ## Fase 3c: (Si hay UI) Confirmar la fuente de diseño en el estado
113
+
114
+ Espejo de la confirmación de scaffold, para `design_source` en `build-state.json`:
115
+ - Si el producto **tiene UI**: setea `design_source.applies=true`, `source` (el puntero confirmado) y
116
+ `confirmed=true` **solo si** el usuario confirma que la fuente de diseño existe (con `confirmed_by`,
117
+ `confirmed_at`). El arnés **no genera** el prototipo.
118
+ - Si **no hay UI**: setea `design_source.applies=false` (el mecanismo de fidelidad queda N/A).
119
+
120
+ ---
121
+
90
122
  ## Fase 4: Guardar en auto-memory
91
123
 
92
124
  Crear/actualizar memorias **tipo `project`** (los valores cambian por proyecto):
@@ -97,6 +129,7 @@ Crear/actualizar memorias **tipo `project`** (los valores cambian por proyecto):
97
129
  - `build_sensitive_data.md` → categorías PII/datos regulados
98
130
  - `build_server_side_secrets.md` → secretos server-side
99
131
  - `build_high_stakes_decisions.md` → decisiones de alto impacto
132
+ - `build_design_source.md` → fuente de diseño / referencia visual
100
133
 
101
134
  Cada memoria con frontmatter `type: project`. Agrega entradas a `MEMORY.md`.
102
135
 
@@ -113,6 +146,7 @@ Determinista: <...>
113
146
  PII/datos: <...>
114
147
  Secretos: <...>
115
148
  Decisiones clave: <...>
149
+ Fuente diseño: <...>
116
150
 
117
151
  CLAUDE.md actualizado. Auto-memory escrita. Los agentes de calidad ya leen tu dominio.
118
152
 
@@ -129,7 +163,7 @@ CLAUDE.md actualizado. Auto-memory escrita. Los agentes de calidad ya leen tu do
129
163
 
130
164
  ## Guardrails
131
165
 
132
- - No avances sin confirmar los 6 puntos. Si el usuario omite alguno, repregunta o marca "no aplica".
166
+ - No avances sin confirmar los 7 puntos. Si el usuario omite alguno, repregunta o marca "no aplica".
133
167
  - Si CLAUDE.md no tiene el bloque marcado (caso raro post-install), pide correr `trycore-build init` (o `update`) antes de seguir.
134
168
  - No inventes valores de dominio que no estén en el PRD ni confirmados por el usuario.
135
169
  - Si un valor ya existe en memory y cambió, sobrescríbelo (los proyectos evolucionan).
@@ -18,7 +18,7 @@ function cmd(script) {
18
18
  const HOOK_SPECS = [
19
19
  { event: 'SessionStart', matcher: 'startup|clear|compact', scripts: ['load-build-state.sh'] },
20
20
  { event: 'PreToolUse', matcher: 'Bash', scripts: ['gitflow-guard.sh'] },
21
- { event: 'PreToolUse', matcher: 'Write|Edit|MultiEdit', scripts: ['stack-guard.sh', 'scaffold-guard.sh'] },
21
+ { event: 'PreToolUse', matcher: 'Write|Edit|MultiEdit', scripts: ['stack-guard.sh', 'scaffold-guard.sh', 'design-source-guard.sh'] },
22
22
  { event: 'PostToolUse', matcher: 'Write|Edit|MultiEdit', scripts: ['lint-typecheck.sh', 'coherence-flag.sh'] },
23
23
  { event: 'Stop', matcher: '.*', scripts: ['build-gate-check.sh', 'reflect-nudge.sh'] },
24
24
  ];
@@ -11,6 +11,7 @@ const EMPTY_STATE = {
11
11
  version: '1.0',
12
12
  harness_phase: 'authoring',
13
13
  scaffold: { confirmed: false, confirmed_by: null, confirmed_at: null, notes: '' },
14
+ design_source: { applies: false, confirmed: false, confirmed_by: null, confirmed_at: null, source: '', notes: '' },
14
15
  active_slice: null,
15
16
  history: [],
16
17
  releases: [],
package/docs/agents.md CHANGED
@@ -1,13 +1,14 @@
1
1
  # Agentes de construcción (`agents/build/`)
2
2
 
3
- Los **10 agentes** de `@trycore/spec-build-harness` ejecutan los *gates* del arnés de
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` y `data-consistency-checker`, corren en el
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,6 +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 |
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`) |
30
33
 
31
34
  ---
32
35
 
@@ -131,3 +134,24 @@ exista en `docs/04-historias/` con `epica:` coincidente, la coherencia de alcanc
131
134
  `openspec validate <name> --type change --strict` pase; sugiere back-references. COHERENTE →
132
135
  `gates.coherence_link: true`. Complementa a `coherence-three-way` validando el **enlace**
133
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.
@@ -2,16 +2,19 @@
2
2
 
3
3
  > Guía de personalización para **consumidores** de `@trycore/spec-build-harness`. Explica cómo
4
4
  > conectar servidores **MCP** (Model Context Protocol) y **LSP** (Language Server Protocol) para
5
- > apoyar los gates del arnés. **Todo lo de aquí es opcional.** El core es 100 % agnóstico: ningún
6
- > gate, skill ni agente **depende** de un MCP concreto. Si tu entorno no expone ningún MCP, el arnés
7
- > funciona igual cubriendo cada fase con sus alternativas CLI/test.
5
+ > apoyar los gates del arnés. **Casi todo lo de aquí es opcional** y el core es agnóstico: ningún
6
+ > gate **depende de un MCP concreto** (cualquier equivalente sirve). **Única excepción:** el gate
7
+ > `fidelity` en slices con UI **requiere** un MCP de devtools de navegador (verificación visual real),
8
+ > porque la fidelidad no puede acreditarse sin observar la salida real. Para todo lo demás, si tu
9
+ > entorno no expone ningún MCP, el arnés funciona igual cubriendo cada fase con sus alternativas CLI/test.
8
10
 
9
11
  > **LSP tiene guía dedicada.** Este documento cubre sobre todo **MCP**. Para **LSP** (precisión de
10
12
  > símbolo en stacks tipados: por qué, cuándo y cómo), ver **`lsp-extensions.md`**.
11
13
 
12
14
  ## TL;DR
13
15
 
14
- - Los gates **pueden apoyarse** en MCP/LSP como **aceleradores**, nunca como dependencia dura.
16
+ - Los gates **pueden apoyarse** en MCP/LSP como **aceleradores**, nunca como dependencia dura — con
17
+ la **única excepción** del gate `fidelity` en slices con UI, que sí exige un MCP de navegador.
15
18
  - **Tú** declaras qué MCP habilitas en **tu** `settings` (el arnés no instala ninguno).
16
19
  - La skill `building-a-slice` consulta un mapa por gate en
17
20
  `skills/building-a-slice/references/mcp-map.md`: ahí está la lista de **ejemplos representativos**.
@@ -32,7 +35,8 @@ disponible:
32
35
  | El agente/skill lo usa bajo demanda para obtener evidencia más rica (UI corriendo, BD, carga). | El mismo gate se cierra con la alternativa CLI/test indicada en `mcp-map.md`. |
33
36
 
34
37
  Por eso ningún `command` de hook, ningún agente y ninguna skill **exigen** un MCP: lo **sugieren**
35
- cuando aplica. El consumidor decide.
38
+ cuando aplica. El consumidor decide. **Salvedad documentada:** el gate `fidelity` de UI sí requiere un
39
+ MCP de navegador (categoría, no un proveedor concreto) — ver la fila `fidelity` y su nota más abajo.
36
40
 
37
41
  ## Cómo lo declara el consumidor (en TU settings)
38
42
 
@@ -70,6 +74,7 @@ cada uno por el que aplique a **tu** stack declarado en el PRD; ninguno es oblig
70
74
  | Fase / gate | Agente | Ejemplo de MCP/LSP (opt-in) | Para qué | Alternativa sin MCP |
71
75
  |---|---|---|---|---|
72
76
  | `journey_smoke` (inner) / `integration` (release) | skill `verify` / `run` | Navegador headless vía MCP (p. ej. un MCP de devtools de navegador) | Recorrer el journey con la UI **corriendo**: snapshot del árbol accesible, screenshot, consola. | Smoke por test e2e/CLI del propio proyecto. |
77
+ | `fidelity` (inner, **slices con UI**) | `ux-fidelity-reviewer` | **MCP de devtools de navegador REQUERIDO** (p. ej. chrome-devtools): `take_screenshot` + `take_snapshot` | Acreditar fidelidad visual observando la **salida real** (app vs prototipo). | **No hay alternativa para UI**: sin verificación visual real el gate queda `false` (corre el slice donde el MCP esté disponible). El estático solo complementa. |
73
78
  | `ux` (release) | `ux-krug-reviewer` | Navegador headless con auditoría tipo Lighthouse | Accesibilidad / Best-Practices y snapshots de la UI ensamblada de la release. | Revisión heurística Krug sobre el código + capturas manuales. |
74
79
  | `api` (inner) | `api-contract-tester` | **Newman corre por CLI, no es MCP** | Contratos de endpoints sobre una colección de pruebas. | Es la vía por defecto: se ejecuta vía Bash, sin MCP. |
75
80
  | `data` (inner) | `data-consistency-checker` | MCP de base de datos (solo si tu slice usa esa BD) | Consultas de lectura / describe de tablas para validar invariantes y consistencia. | Validación por tests contra un almacén embebido o cliente del stack. |
@@ -83,6 +88,12 @@ Notas de coherencia con el arnés:
83
88
  release** en `releasing-a-version`. Habilita los MCP de esas fases pensando en el outer loop.
84
89
  - El gate `api` usa **Newman por CLI**: es un ejemplo de que la herramienta de un gate **no tiene por
85
90
  qué ser un MCP**. Lo importante es la evidencia (los contratos responden), no el canal.
91
+ - **Excepción única — `fidelity` en slices con UI.** Es el **único** gate donde un MCP es **requerido**,
92
+ no opt-in: la fidelidad visual no puede acreditarse sin **observar la salida real** (cargar la página,
93
+ comparar contra el prototipo, leer la consola). Se mantiene la agnosticidad a nivel de **categoría**
94
+ (cualquier MCP de devtools de navegador sirve; chrome-devtools es el ejemplo), pero **alguno** debe
95
+ estar disponible: sin él, `fidelity` queda `false` y el `dod` no cierra. La evidencia aquí **es** la
96
+ observación de la UI corriendo; no hay alternativa CLI que la sustituya.
86
97
 
87
98
  ## Reglas de uso (no negociables)
88
99
 
@@ -1,269 +1,124 @@
1
- # Getting Started Tu primer ciclo end-to-end en ~15 min
1
+ # Quickstartde 0 a tu primer slice
2
2
 
3
- Esta guía te lleva, de forma secuencial y práctica, desde cero hasta cerrar tu primer **slice**
4
- (una épica `EP-XXX`) con el arnés de construcción de Trycore (`@trycore/spec-build-harness`).
3
+ Guía pragmática para empezar a construir con `@trycore/spec-build-harness` (el compañero de construcción de `@trycore/spec-product-flow`). Instalación detallada y troubleshooting [`INSTALL.md`](../INSTALL.md). Metodología (fuente de verdad) → [`METODOLOGIA.md`](../METODOLOGIA.md).
5
4
 
6
- El arnés es el **compañero de construcción** de `@trycore/spec-product-flow`: la vertical de
7
- discovery produce los artefactos (`PRD → User Story Map → Backlog → Historias → Priorización →
8
- Flows`); este arnés los lleva al **código** mediante un pipeline de **dos loops**.
5
+ ## TL;DR
9
6
 
10
- | Loop | Skill | Frecuencia | Qué hace |
11
- |---|---|---|---|
12
- | **Inner** (rápido) | `building-a-slice` | por épica `EP-XXX` | DoR → OpenSpec change → TDD → journey-smoke → api/data → DoD reducido → PR + archive |
13
- | **Outer** (pesado) | `releasing-a-version` | por release (línea del Story Map) | gates de seguridad, diseño, UX, coherencia triple, arquitectura e integración con deps reales — **una sola vez** |
14
-
15
- Ambas verticales coexisten en el mismo `.claude/` sin colisión (namespaces disjuntos:
16
- `trycore/` para discovery vs. `opsx/` + `build/` para construcción).
7
+ ```bash
8
+ # 1) Requisitos + CLI — una vez por máquina
9
+ npm i -g @fission-ai/openspec @trycore/spec-build-harness
17
10
 
18
- > **Regla de oro:** `METODOLOGIA.md` es la fuente de verdad. Si una skill la contradice, **gana la
19
- > metodología**.
11
+ # 2) En la raíz de tu proyecto
12
+ trycore-build init # siembra el arnés (idempotente)
13
+ trycore-build doctor # verifica requisitos y hooks
14
+ ```
20
15
 
21
- ---
16
+ ```text
17
+ # 3) En Claude Code (lo corre Claude, no la terminal)
18
+ /build:onboard # parametriza el dominio: lee tu PRD, resuelve los {{placeholders}}
19
+ skill building-a-slice # construye una épica: DoR → change → TDD → smoke → DoD → PR
20
+ /build:reflect # (opcional) captura aprendizajes del slice recién archivado
21
+ skill releasing-a-version # al cerrar una línea de release del Story Map
22
+ ```
22
23
 
23
- ## Mapa de los 15 minutos
24
-
25
- | Min | Paso | Quién lo corre |
26
- |---|---|---|
27
- | 0–2 | 1. Instalar el CLI + requisitos duros | terminal |
28
- | 2–5 | 2. `trycore-build init` en tu proyecto | terminal |
29
- | 5–6 | 3. `trycore-build doctor` (verificar) | terminal |
30
- | 6–9 | 4. `/build:onboard` (parametrizar dominio) | Claude Code |
31
- | 9–14 | 5. Abrir un slice con la skill `building-a-slice` | Claude Code |
32
- | 14+ | 6. ¿Cuándo correr `releasing-a-version`? | Claude Code |
24
+ Eso es el ciclo completo. Lo de abajo explica cada paso.
33
25
 
34
26
  ---
35
27
 
36
- ## Paso 1 · Instalar el CLI y los requisitos duros (~2 min)
28
+ ## Requisitos duros
37
29
 
38
- El CLI `trycore-build` siembra los archivos del arnés. Pero el arnés depende de **tres binarios
39
- externos** que el CLI **no puede instalar por ti**. `init` y `doctor` **fallan (exit 1)** si falta
40
- alguno:
30
+ `init` y `doctor` **fallan (exit 1)** si falta alguno:
41
31
 
42
- | Requisito | Para qué | Cómo instalarlo |
32
+ | Requisito | Para qué | Instalación |
43
33
  |---|---|---|
44
- | `openspec` | columna vertebral de `/opsx:*` y las skills `openspec-*` | `npm i -g @fission-ai/openspec` |
45
- | `python3` | los hooks parsean `build-state.json` con python3 | gestor del sistema (brew, apt, …) |
46
- | `git` | los hooks y `gitflow-guard` resuelven la raíz y bloquean commits directos | gestor del sistema |
47
-
48
- Instala el CLI y OpenSpec:
49
-
50
- ```bash
51
- npm install -g @trycore/spec-build-harness # CLI: bin `trycore-build`
52
- npm install -g @fission-ai/openspec # requisito duro
53
- ```
34
+ | `openspec` | base de `/opsx:*` y las skills `openspec-*` | `npm i -g @fission-ai/openspec` |
35
+ | `python3` | los hooks leen `build-state.json` | gestor del sistema (brew/apt) |
36
+ | `git` | ramas, PRs, archivado de changes | gestor del sistema |
54
37
 
55
- > **Canal CLI vs. plugin.** El canal **npm CLI es el canónico** y el recomendado para operar en un
56
- > proyecto: instala los comandos en `.claude/commands/{opsx,build}/`, namespaceados por subcarpeta
57
- > (`/opsx:*`, `/build:onboard`), y referencia los agentes por su nombre. El canal **plugin nativo**
58
- > (`/plugin marketplace add <repo> ; /plugin install trycore-spec-build-harness@trycore-build`) se
59
- > ofrece como conveniencia a nivel usuario, pero Claude Code namespacea sus componentes bajo el
60
- > nombre del plugin (`/trycore-spec-build-harness:*`); las cross-references internas (skills que
61
- > invocan `/opsx:*`, agentes por nombre) están escritas para el canal CLI. **Para construir en un
62
- > proyecto, usa el CLI.**
38
+ Runtime Node ≥18. **Usa el canal CLI** (npm), no el plugin, para operar dentro de un proyecto (ver el caveat de canales en [`INSTALL.md`](../INSTALL.md)).
63
39
 
64
40
  ---
65
41
 
66
- ## Paso 2 · `trycore-build init` en tu proyecto (~3 min)
67
-
68
- Sitúate en la raíz de tu proyecto y ejecuta:
42
+ ## 1 · Instalar (terminal)
69
43
 
70
44
  ```bash
71
- trycore-build init
45
+ npm i -g @fission-ai/openspec @trycore/spec-build-harness
72
46
  ```
73
47
 
74
- `init` es **idempotente** (re-correrlo es seguro) y siembra:
75
-
76
- - **10 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).
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
- - **8 hooks** bash en `.claude/hooks/build/` + permisos mínimos en `settings.json`.
82
- - **Estado**: `.claude/state/build-state.json` (sembrado **vacío** y **nunca** sobreescrito; va al
83
- `.gitignore`), más el schema y el README versionados.
84
- - **Config**: `.claude/config/stack-allowlist.json` (artefacto del consumidor; lo siembra el CLI y
85
- lo puebla `/build:onboard`).
86
- - **Bloque marcado en `CLAUDE.md`** entre `<!-- BEGIN trycore-build-harness ... -->` y
87
- `<!-- END trycore-build-harness -->`, con `{{placeholders}}` **sin resolver** (los resuelve
88
- `/build:onboard`).
89
-
90
- ### Onboarding en dos capas
91
-
92
- El onboarding tiene **dos capas** por una razón técnica: un binario Node **no puede escribir la
93
- auto-memory de Claude**.
94
-
95
- 1. **Capa mecánica (este CLI)** — captura el stack: lenguaje/deps, package manager, runtime y ruta
96
- del PRD. Por **prompt TTY** interactivo, o **CI-safe** con flags y `--yes`.
97
- 2. **Capa semántica (`/build:onboard`, lo corre Claude)** — lee el PRD, pregunta por PII, capa de
98
- servicios externos/IA, capa determinista, secretos y decisiones de alto impacto, resuelve los
99
- `{{placeholders}}` y escribe la auto-memory. (Paso 4.)
48
+ ## 2 · `trycore-build init` (terminal)
100
49
 
101
- #### Flags de `init` (modo no interactivo / CI)
102
-
103
- | Flag | Para qué |
104
- |---|---|
105
- | `--yes` | no interactivo: usa defaults para el stack |
106
- | `--stack <deps>` | dependencias permitidas, coma-separadas |
107
- | `--pkg-manager <pm>` | package manager (`npm` \| `pnpm` \| `yarn`) |
108
- | `--runtime <semver>` | semver del runtime (ej. `">=18.18"`) |
109
- | `--prd-path <path>` | ruta#ancla del PRD técnico (fuente del allowlist) |
110
- | `--copy` | copiar archivos en vez de symlinkear (Windows sin admin, sandboxes) |
111
- | `--force-init` | fuerza modo init aunque exista instalación previa |
112
- | `--skip-doctor` | omite la verificación de requisitos (no recomendado) |
113
-
114
- Ejemplo CI-safe:
50
+ Desde la raíz de tu proyecto. Es **idempotente** (re-correrlo es seguro) y siembra: **12 agentes**, **12 skills**, **10 comandos `/opsx:*`** + `/build:onboard` + `/build:reflect`, **9 hooks**, el estado vacío `.claude/state/build-state.json` (gitignored, nunca se sobreescribe) y el bloque `<!-- BEGIN trycore-build-harness -->` en tu `CLAUDE.md` con `{{placeholders}}` sin resolver.
115
51
 
116
52
  ```bash
117
- trycore-build init --yes \
118
- --stack "express,zod,pg" --pkg-manager pnpm \
119
- --runtime ">=18.18" --prd-path "docs/01-prd/prd.md#requisitos-tecnicos"
53
+ trycore-build init
120
54
  ```
121
55
 
122
- > Otros comandos del CLI: `trycore-build status` (estado de la instalación y fase del arnés),
123
- > `trycore-build update` (refresca assets/schema tras actualizar el paquete; **no** pisa estado ni
124
- > allowlist), `trycore-build uninstall` (quita el arnés **preservando** `state/` y `config/`).
125
-
126
- ---
127
-
128
- ## Paso 3 · `trycore-build doctor` (~1 min)
129
-
130
- Verifica que el entorno esté listo **antes** de construir:
56
+ CI / no interactivo:
131
57
 
132
58
  ```bash
133
- trycore-build doctor
59
+ trycore-build init --yes \
60
+ --stack "express,zod,pg" --pkg-manager pnpm \
61
+ --prd-path "docs/01-prd/prd.md#requisitos-tecnicos"
134
62
  ```
135
63
 
136
- Comprueba:
137
-
138
- - Los **3 requisitos duros** (`git`, `python3`, `openspec`) — **falla con exit 1** si falta alguno.
139
- - Que los **8 hooks** tengan bit ejecutable (si no, sugiere `trycore-build init --copy` o `chmod +x`).
140
- - **Doble canal**: si detecta hooks del arnés en `settings.json` (canal CLI) y además instalaste el
141
- plugin, te recuerda que la cadena de comando es idéntica en ambos canales y Claude Code
142
- **deduplica** → el hook dispara **una sola vez**. No requiere acción.
143
- - **Reflexión y LSP (informativo, no falla):** reporta cuántos slices archivados están **sin
144
- reflexionar** (sugiere `/build:reflect`) y, si detecta un stack tipado (`pom.xml`,
145
- `build.gradle`, `*.csproj`, `tsconfig.json`…), sugiere activar **LSP**
146
- (ver `docs/customization/lsp-extensions.md`).
147
-
148
- Si ves `✓ Requisitos satisfechos.`, continúa.
149
-
150
- ---
151
-
152
- ## Paso 4 · `/build:onboard` en Claude Code (~3 min)
153
-
154
- Abre Claude Code en el proyecto y ejecuta:
64
+ Otros: `trycore-build status` · `update` (refresca assets, no toca tu estado) · `uninstall` (preserva `state/` y `config/`). Flags completos en [`INSTALL.md`](../INSTALL.md).
155
65
 
156
- ```
157
- /build:onboard
158
- ```
66
+ ## 3 · `/build:onboard` (Claude Code)
159
67
 
160
- Este slash command (lo corre Claude, no el CLI) **parametriza el dominio**: lee tu PRD y/o
161
- `openspec/project.md` y confirma contigo, vía `AskUserQuestion`, **6 puntos** que luego leen los
162
- agentes de calidad:
68
+ Abre Claude Code en el proyecto y corre `/build:onboard`. Lee tu PRD y confirma contigo, vía `AskUserQuestion`, **7 puntos de dominio** que luego leen los agentes de calidad; al terminar resuelve los `{{placeholders}}` del `CLAUDE.md` y escribe la auto-memory.
163
69
 
164
70
  | Placeholder | Qué define |
165
71
  |---|---|
166
72
  | `PRD_TECH_PATH` | ruta#ancla del PRD técnico (fuente del stack) |
167
- | `EXTERNAL_SERVICE_LAYER` | capa de servicios externos / IA y su frontera/aislamiento |
73
+ | `EXTERNAL_SERVICE_LAYER` | capa de servicios externos / IA y su frontera |
168
74
  | `DETERMINISTIC_LAYER` | lógica que **no** puede delegarse a un servicio no determinista |
169
- | `SENSITIVE_DATA_CATEGORIES` | categorías reguladas de datos / PII del dominio |
170
- | `SERVER_SIDE_SECRETS` | claves/tokens que **jamás** van al cliente |
171
- | `HIGH_STAKES_DECISIONS` | decisiones que exigen explicabilidad/justificación en la UI |
172
-
173
- Al terminar, `/build:onboard` resuelve los `{{placeholders}}` del bloque marcado en `CLAUDE.md`,
174
- opcionalmente puebla el `stack-allowlist.json`, y escribe la auto-memory (memorias tipo `project`).
175
- Si un punto no aplica, se registra explícitamente como "no aplica" (no se deja como `{{...}}`).
75
+ | `SENSITIVE_DATA_CATEGORIES` | datos / PII regulados del dominio |
76
+ | `SERVER_SIDE_SECRETS` | secretos que **jamás** van al cliente |
77
+ | `HIGH_STAKES_DECISIONS` | decisiones que exigen explicabilidad en la UI |
78
+ | `DESIGN_SOURCE` | fuente de diseño / referencia visual (prototipo/export), o `N/A` si no hay UI |
176
79
 
177
- ---
80
+ Si un punto no aplica, se registra como "no aplica" (no se deja como `{{...}}`).
178
81
 
179
- ## Paso 5 · Abrir un slice con `building-a-slice` (~5 min)
82
+ ## 4 · Construir un slice (Claude Code)
180
83
 
181
- Esta es la unidad de trabajo del **inner loop**: **un slice = una épica = un OpenSpec change = una
182
- rama = un PR**. Las HU de la épica (las que tienen `epica: EP-XXX` en `docs/04-historias/`) son el
183
- **alcance interno** del change.
184
-
185
- En Claude Code, invoca la skill (o pídelo en lenguaje natural: *"construye la épica EP-001"*):
84
+ **Un slice = una épica `EP-XXX` = un OpenSpec change = una rama = un PR.** Las HU de la épica son su alcance interno. Invoca `skill building-a-slice` (o pídelo en lenguaje natural: *"construye EP-001"*). Pipeline del **inner loop**:
186
85
 
187
86
  ```
188
- skill building-a-slice
87
+ DoR → change (+ trazabilidad) → TDD → journey-smoke (+ fidelidad si hay UI) → api/data → DoD reducido → PR + archive
189
88
  ```
190
89
 
191
- La skill conduce el pipeline (delega en el `build-orchestrator`). Las fases del inner loop:
192
-
193
- | Fase | Acción | Delega en | Gate |
194
- |---|---|---|---|
195
- | 1 · dor | Validar Definition of Ready | `dor-dod-gatekeeper` | `dor` |
196
- | 2 · change | `/opsx:new` + bloque `## Trazabilidad` que enlaza el change a la épica | `/opsx:new`, `change-epic-coherence` | `coherence_link` |
197
- | 3 · tdd | red → green → refactor | `superpowers:test-driven-development` | `tdd` |
198
- | 4 · smoke | recorrer el journey-hasta-aquí end-to-end | skill `verify`/`run` (+ MCP) | `journey_smoke` |
199
- | 5 · api/data | contratos + consistencia (si aplican) | `api-contract-tester`, `data-consistency-checker` | `api`, `data` |
200
- | 6 · dod | Definition of Done reducido por slice | `dor-dod-gatekeeper` | `dod` |
201
- | 7 · pr | abrir PR + archivar el change en el mismo PR | `/opsx:archive`, `/opsx:sync` | — |
202
- | 8 · release? | preguntar si correr el Release Gate ahora | usuario (default computado) | — |
203
-
204
- Notas clave del inner loop:
205
-
206
- - **Esqueleto que camina.** El **primer** slice de una release construye el journey completo más
207
- delgado posible (aunque cada paso sea un stub). Cada épica posterior **engorda** un paso y mantiene
208
- el `journey_smoke` verde. Nunca se construyen capas horizontales aisladas que "se juntan al final".
209
- - **Estado = una sola fuente de verdad.** Todo se sincroniza en `.claude/state/build-state.json`
210
- (schema y protocolo en `.claude/state/README.md`). Lee antes de actuar; escribe una vez por
211
- transición. Un slice activo a la vez; un gate no se salta.
212
- - **Gates pesados NO se cierran aquí.** `stack`, `security`, `smell`, `ux` y la coherencia triple
213
- completa pertenecen al Release Gate. Lo que sí corre en tiempo real son los **hooks**:
214
- `stack-guard.sh` (vigila deps fuera del allowlist), `lint-typecheck.sh`, `gitflow-guard.sh`
215
- (bloquea commits/push directos a `main` — integras solo por **PR**).
216
- - **El enlace change↔épica** va en el bloque `## Trazabilidad` del `proposal.md`, **nunca** en
217
- frontmatter YAML (rompe `openspec validate`).
218
- - **Reflexión (ciclo autocorrectivo).** Tras archivar el slice, `/build:reflect` puede capturar las
219
- convenciones aprendidas / errores recurrentes en el bloque `trycore-build-learnings` de
220
- `CLAUDE.md` (con tu aprobación). Lo **sugiere** el hook `reflect-nudge.sh` al cerrar la sesión;
221
- es opcional y no bloquea.
222
- - Objetivo: **≤ ~20 min por épica**, y producto que **camina end-to-end en todo momento**.
223
-
224
- ---
90
+ Lo que importa:
225
91
 
226
- ## Paso 6 · ¿Cuándo correr `releasing-a-version`? (outer loop)
92
+ - **Esqueleto que camina.** El **primer** slice arma el journey completo más delgado posible; cada épica posterior engorda un paso y mantiene el `journey_smoke` verde. Nunca capas horizontales que "se juntan al final".
93
+ - **Precondiciones duras (el arnés las exige, no las genera):** un *scaffold runnable* confirmado y —si el slice tiene UI— una *fuente de diseño declarada* (`design_source`). Los hooks `scaffold-guard` y `design-source-guard` las respaldan.
94
+ - **Los gates pesados NO se cierran aquí** (seguridad, diseño, UX/Krug, coherencia triple, arquitectura): van al Release Gate. En el inner loop solo corre lo barato + los hooks en tiempo real (`gitflow-guard` bloquea commits/push directos a `main` → integras solo por **PR**; `stack-guard`, `lint-typecheck`).
95
+ - **El enlace change↔épica** va en el bloque `## Trazabilidad` del `proposal.md`, nunca en frontmatter YAML.
96
+ - **Una sola fuente de verdad:** `.claude/state/build-state.json`. Un slice activo a la vez; un gate no se salta. Objetivo: **≤ ~20 min por épica**.
227
97
 
228
- Tras archivar la épica (fase 8), la skill te **pregunta** si correr el Release Gate, con un
229
- **default computado** desde las líneas de release del Story Map (`docs/02-user-story-map/`):
98
+ > ¿Mantenimiento que no es producto nuevo (typo, bump de dep ya permitida, copy/config)? Usa `skill building-a-micro-change` (carril ligero `fix/*`/`chore/*`), no una épica.
230
99
 
231
- - Si la épica **cierra una línea de release** (todas sus épicas ya están archivadas) → default
232
- **"Sí, correr `releasing-a-version`"**.
233
- - Si no la cierra → default **"Continuar a la siguiente épica"**. Excepción (*nudge*): si hay
234
- **≥ 2 épicas** archivadas desde el último Release Gate, lo recomienda igual.
100
+ ## 5 · Release Gate (Claude Code, por release)
235
101
 
236
- El humano siempre decide. El Release Gate corre las **revisiones pesadas una sola vez**, sobre el
237
- **diff acumulado** de toda la release:
102
+ Al archivar una épica, la skill te **pregunta** si correr el Release Gate (default computado desde las líneas de release del Story Map). `skill releasing-a-version` corre las **revisiones pesadas una sola vez** sobre el diff acumulado:
238
103
 
239
104
  | Gate | Delega en |
240
105
  |---|---|
241
106
  | `security` | `security-reviewer` |
242
- | `smell` (4 reglas de Beck + code smells) | `simple-design-reviewer` |
107
+ | `smell` (Beck + code smells) | `simple-design-reviewer` |
243
108
  | `ux` (Krug + lighthouse; `null` si sin UI) | `ux-krug-reviewer` |
244
109
  | `coherence` (trazabilidad triple AC↔change↔código) | `coherence-three-way` |
245
110
  | `stack_arch` (arquitectura del PRD) | `stack-guardian` |
246
- | `integration` (journey completo con **deps reales**, no stubs) | skill `verify`/`run` |
111
+ | `integration` (journey completo con **deps reales**) | skill `verify`/`run` |
247
112
 
248
- Los resultados se registran en `build-state.json → releases[]`. **La integración con deps reales es
249
- obligatoria** para `status: passed`: es el gate que garantiza que el producto realmente funciona al
250
- terminar. Si algo falla, lo corriges como un slice normal en `building-a-slice` y re-corres el gate.
113
+ `integration` con deps reales es obligatoria para `status: passed`. Se registra en `build-state.json → releases[]`. Si algo falla, lo corriges como un slice normal y re-corres el gate.
251
114
 
252
115
  ---
253
116
 
254
- ## Resumen del primer ciclo
117
+ ## Siguiente
255
118
 
256
- ```
257
- npm i -g @trycore/spec-build-harness @fission-ai/openspec # paso 1
258
- trycore-build init # paso 2
259
- trycore-build doctor # paso 3
260
- # en Claude Code:
261
- /build:onboard # paso 4
262
- skill building-a-slice # EP-XXX: DoR → /opsx:new → TDD → smoke → DoD → PR # paso 5
263
- /build:reflect # opcional: captura aprendizajes del slice recién archivado
264
- # y cuando cierres una línea de release del Story Map:
265
- skill releasing-a-version # paso 6
266
- ```
119
+ - **Instalación detallada / flags / plugin / troubleshooting** → [`INSTALL.md`](../INSTALL.md)
120
+ - **Agentes** [`docs/agents.md`](agents.md) · **Hooks** → [`docs/hooks.md`](hooks.md) · **Comandos** → [`docs/commands.md`](commands.md)
121
+ - **Metodología** (manda ante cualquier skill) → [`METODOLOGIA.md`](../METODOLOGIA.md)
122
+ - **Extender con MCP/LSP** (opt-in) → [`docs/customization/`](customization/)
267
123
 
268
- > El core del arnés es **100% agnóstico** al proyecto. El ejemplo de referencia completo vive
269
- > aparte, en `docs/examples/reference/` (no forma parte del core).
124
+ > El core es **100% agnóstico** al proyecto. El ejemplo de referencia completo vive aparte en `docs/examples/reference/` (no forma parte del core).