@trycore/spec-build-harness 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/GOVERNANCE.md +3 -3
  3. package/INSTALL.md +7 -7
  4. package/METODOLOGIA.md +44 -0
  5. package/README.md +63 -5
  6. package/VERSION +1 -1
  7. package/agents/build/build-orchestrator.md +6 -0
  8. package/commands/build/front.md +15 -0
  9. package/commands/build/resume.md +29 -0
  10. package/config/build-config.template.json +8 -0
  11. package/dist/commands/init.js +15 -5
  12. package/dist/commands/status.js +1 -0
  13. package/dist/commands/uninstall.js +2 -1
  14. package/dist/lib/paths.js +7 -0
  15. package/dist/lib/settings-merge.js +29 -2
  16. package/dist/lib/state-seed.js +14 -0
  17. package/docs/agents.md +20 -13
  18. package/docs/commands.md +34 -4
  19. package/docs/customization/mcp-extensions.md +5 -4
  20. package/docs/decisiones/2026-07-03-gsd-vs-openspec-fork-vs-rama.md +157 -0
  21. package/docs/flujo-harness-funcional.md +42 -0
  22. package/docs/flujo-harness.md +192 -0
  23. package/docs/getting-started.md +6 -5
  24. package/docs/hooks.md +31 -8
  25. package/hooks/build/build-gate-check.sh +1 -1
  26. package/hooks/build/context-monitor.sh +74 -0
  27. package/hooks/build/design-source-guard.sh +1 -1
  28. package/hooks/build/lib/state-io.sh +55 -0
  29. package/hooks/build/lint-typecheck.sh +1 -1
  30. package/hooks/build/load-build-state.sh +46 -2
  31. package/hooks/build/reconcile-build-state.py +70 -0
  32. package/hooks/build/reflect-nudge.sh +1 -1
  33. package/hooks/build/release-gate-nudge.sh +1 -1
  34. package/hooks/build/scaffold-guard.sh +1 -1
  35. package/hooks/build/stack-guard.sh +1 -1
  36. package/hooks/build/statusline-bridge.sh +32 -0
  37. package/hooks/build-harness.json +24 -0
  38. package/package.json +1 -1
  39. package/scripts/lib/front-plan.py +47 -0
  40. package/scripts/smoke-test.sh +12 -0
  41. package/scripts/tests/test-context-monitor.sh +70 -0
  42. package/scripts/tests/test-front-plan.sh +38 -0
  43. package/scripts/tests/test-install.sh +89 -0
  44. package/scripts/tests/test-reconciler.sh +54 -0
  45. package/scripts/tests/test-schema.sh +58 -0
  46. package/skills/building-a-slice/references/dor.md +2 -0
  47. package/skills/managing-parallel-front/SKILL.md +36 -0
  48. package/state/build-state.schema.json +50 -0
  49. package/templates/CLAUDE.md.template +6 -2
  50. package/templates/settings-hooks.template.json +1 -1
  51. package/docs/super-power-workflows.md +0 -281
package/docs/commands.md CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  Esta referencia cubre los **dos planos de operación** del arnés de construcción:
4
4
 
5
- 1. El **CLI `trycore-build`** (binario Node, paquete `@trycore/spec-build-harness` v0.3.0) — instala, actualiza, diagnostica y desinstala el arnés en el proyecto consumidor. Captura el **stack mecánico**.
6
- 2. Los **slash commands de Claude Code** (`/opsx:*` + `/build:onboard` + `/build:reflect`) — operan el pipeline de dos loops, resuelven la parametrización **semántica** del dominio y capturan el conocimiento aprendido por slice.
5
+ 1. El **CLI `trycore-build`** (binario Node, paquete `@trycore/spec-build-harness` v0.7.0) — instala, actualiza, diagnostica y desinstala el arnés en el proyecto consumidor. Captura el **stack mecánico**.
6
+ 2. Los **slash commands de Claude Code** (`/opsx:*` + los 7 `/build:*`: `onboard`, `reflect`, `slice`, `release`, `work`, `resume`, `front`) — operan el pipeline de dos loops, resuelven la parametrización **semántica** del dominio y capturan el conocimiento aprendido por slice.
7
7
 
8
8
  > **División de responsabilidades del onboarding (dos capas).** Un binario Node **no puede** escribir la auto-memory de Claude. Por eso `trycore-build init` siembra archivos y captura el stack mecánico (lenguaje/deps, package manager, runtime, ruta del PRD), y el slash command `/build:onboard` —ejecutado por Claude— lee el PRD, pregunta por PII / capa de servicios externos-IA / capa determinista / secretos / decisiones de alto impacto, resuelve los `{{placeholders}}` del bloque marcado de `CLAUDE.md` y escribe la auto-memory.
9
9
 
@@ -52,7 +52,7 @@ Solo `init` y `update` aceptan flags. `status`, `uninstall` y `doctor` toman ún
52
52
 
53
53
  ## 2. Slash commands de Claude Code
54
54
 
55
- El canal CLI namespacea por subcarpeta: `.claude/commands/opsx/` → `/opsx:*` y `.claude/commands/build/` → `/build:onboard` y `/build:reflect`.
55
+ El canal CLI namespacea por subcarpeta: `.claude/commands/opsx/` → `/opsx:*` y `.claude/commands/build/` → los 7 `/build:*` (`onboard`, `reflect`, `slice`, `release`, `work`, `resume`, `front`).
56
56
 
57
57
  ### `/opsx:*` — pipeline OpenSpec
58
58
 
@@ -69,6 +69,24 @@ El canal CLI namespacea por subcarpeta: `.claude/commands/opsx/` → `/opsx:*` y
69
69
  | `/opsx:onboard` | Onboarding guiado: recorre un ciclo completo del workflow OpenSpec con narración (tutorial de aprendizaje). |
70
70
  | `/opsx:sync` | Sincroniza los delta specs de un cambio hacia los specs principales. |
71
71
 
72
+ ### `/build:slice` — entrada del inner loop
73
+
74
+ | Slash command | Propósito |
75
+ |---|---|
76
+ | `/build:slice` | Punto de entrada del **inner loop** sobre una épica (`EP-XXX`). Adaptador delgado: **delega** en la skill `building-a-slice` (o en el agente `build-orchestrator` para épicas multicapa) y conduce el pipeline `DoR → change → TDD → smoke → api/data → DoD → PR + archive` respetando el **orden estricto de gates**. Exige `scaffold.confirmed: true` (y `design_source.confirmed: true` si hay UI) como precondición; el arnés **lo exige pero no lo genera**. **Un solo slice activo** (secuencial). No dispara los reviewers pesados (eso es del Release Gate). |
77
+
78
+ ### `/build:release` — entrada del outer loop (Release Gate)
79
+
80
+ | Slash command | Propósito |
81
+ |---|---|
82
+ | `/build:release` | Punto de entrada del **outer loop**: corre el **Release Gate UNA vez** sobre el diff acumulado de una release (no por épica). Dispara **en paralelo** los 5 reviewers pesados (`security` → `security-reviewer`, `smell` → `simple-design-reviewer`, `ux` → `ux-krug-reviewer`, `coherence` → `coherence-three-way`, `stack_arch` → `stack-guardian`) y luego el gate `integration` **secuencial** con dependencias reales (no stubs). Escribe `releases[].gates.{security,smell,ux,coherence,stack_arch}` y `status` vía la skill `releasing-a-version` (única escritora de `releases[]`). Lo **sugiere** el hook `release-gate-nudge.sh` al cerrar sesión. No duplica el inner loop (ni TDD ni gates por slice). |
83
+
84
+ ### `/build:work` — router classify-and-act
85
+
86
+ | Slash command | Propósito |
87
+ |---|---|
88
+ | `/build:work` | **Router puro** (classify-and-act): clasifica el trabajo entrante y **delega** en la skill correcta — `building-a-micro-change` (mantenimiento), `building-a-slice` (épica / capacidad nueva) o `releasing-a-version` (Release Gate) — codificando el *decision gate* del micro-change y el default del Release Gate. Es **ruteo, no política**: no ejecuta el pipeline, no escribe `build-state.json` ni crea ramas. Aplica los **límites duros** del micro-change (dependencia nueva, endpoint/API nuevo, o tocar lógica de dominio / invariantes de datos → escala a épica) y, **ante la duda, SIEMPRE épica**. |
89
+
72
90
  ### `/build:onboard` — parametrización del dominio
73
91
 
74
92
  | Slash command | Propósito |
@@ -81,6 +99,18 @@ El canal CLI namespacea por subcarpeta: `.claude/commands/opsx/` → `/opsx:*` y
81
99
  |---|---|
82
100
  | `/build:reflect` | Tras archivar un slice, detecta **convenciones aprendidas** / errores recurrentes (a partir del change, el diff y la sesión) y **propone** viñetas para el bloque `trycore-build-learnings` de `CLAUDE.md`; las aplica **solo tras tu aprobación** y estampa el slice como reflexionado (`reflected: true`). Lo **sugiere** el hook `reflect-nudge.sh` al cerrar sesión, pero puedes invocarlo cuando quieras. No toca el bloque de dominio ni sus `{{placeholders}}` (eso es de `/build:onboard`). |
83
101
 
102
+ ### `/build:resume` — rehidratación sin pérdida de contexto
103
+
104
+ | Slash command | Propósito |
105
+ |---|---|
106
+ | `/build:resume` | Reconstruye el contexto de construcción **desde disco**, no desde la conversación: corre `reconcile-build-state.py`, lee `active_slice` (`gates`, `wiring_checklist`, `progress_log`, `session_continuity`, `parallel_front`) y determina la siguiente acción por prioridad (`resume_hint` → item `failing` de wiring → `sub_slices` pendiente → fase del pipeline). Es el punto de entrada tras un handoff automático del hook `context-monitor.sh` o tras cualquier reinicio de contexto. |
107
+
108
+ ### `/build:front` — front paralelo inter-épica
109
+
110
+ | Slash command | Propósito |
111
+ |---|---|
112
+ | `/build:front` | Abre y coordina un **front paralelo** de épicas NO fundacionales y disjuntas en archivos, cada una en su propio worktree/rama/PR. Delega en la skill `managing-parallel-front`: verifica precondiciones (scaffold confirmado, sin épica foundational abierta), selecciona el conjunto disjunto (`scripts/lib/front-plan.py`) y mergea en orden con re-smoke. Úsalo solo con ≥2 épicas no fundacionales disjuntas listas; para una sola épica, usa `/build:slice`. |
113
+
84
114
  ---
85
115
 
86
116
  ## 3. Caveat de canales (CLI vs. plugin)
@@ -90,7 +120,7 @@ El arnés se distribuye por **dos canales** que coexisten, pero **namespacean di
90
120
  | Aspecto | Canal **CLI** (canónico) | Canal **Plugin** nativo |
91
121
  |---|---|---|
92
122
  | Instalación | `npm i -g @trycore/spec-build-harness` → `trycore-build init` | `/plugin marketplace add <repo-github>` → `/plugin install trycore-spec-build-harness@trycore-build` |
93
- | Namespace de comandos | Por subcarpeta: `/opsx:*`, `/build:onboard` y `/build:reflect` | Por nombre del plugin: `/trycore-spec-build-harness:*` (por diseño de Claude Code) |
123
+ | Namespace de comandos | Por subcarpeta: `/opsx:*` y los 7 `/build:*` (`onboard`, `reflect`, `slice`, `release`, `work`, `resume`, `front`) | Por nombre del plugin: `/trycore-spec-build-harness:*` (por diseño de Claude Code) |
94
124
  | Referencia a agentes | Por su nombre (p. ej. `build-orchestrator`) | Bajo el nombre del plugin |
95
125
  | Cross-references internas | ✔ Escritas para este canal (skills invocan `/opsx:*`, agentes por nombre) | Pueden no resolver según están escritas |
96
126
  | Recomendación | **Usar este canal para operar un proyecto** | Conveniencia a nivel usuario |
@@ -78,14 +78,15 @@ cada uno por el que aplique a **tu** stack declarado en el PRD; ninguno es oblig
78
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. |
79
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. |
80
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. |
81
- | `coherence` / diseño | `coherence-three-way`, `simple-design-reviewer`, `stack-guardian` | **LSP del lenguaje** (p. ej. LSP de TypeScript en stacks TS tipados) | Seguir definiciones/referencias con precisión de compilador: trazar símbolo→test, detectar duplicación y uso real. Mejor ROI que `grep` en código tipado. | Navegación con `grep`/`glob` + lectura dirigida. |
81
+ | `coherence` / `smell` / `stack_arch` (release) | `coherence-three-way`, `simple-design-reviewer`, `stack-guardian` | **LSP del lenguaje** (p. ej. LSP de TypeScript en stacks TS tipados) | Seguir definiciones/referencias con precisión de compilador: trazar símbolo→test, detectar duplicación y uso real. Mejor ROI que `grep` en código tipado. | Navegación con `grep`/`glob` + lectura dirigida. |
82
82
  | perf (opcional, **fuera del DoD**) | — | MCP de pruebas de carga (p. ej. un MCP de k6) | Carga/latencia si una HU de la épica lo exige explícitamente. | Omitir; no es un gate del arnés. |
83
83
 
84
84
  Notas de coherencia con el arnés:
85
85
 
86
- - En el **inner loop** los gates pesados (`security`, `smell`, `ux`, coherencia triple completa,
87
- arquitectura, integración con deps reales) **no** se cierran por épica: corren **una vez por
88
- release** en `releasing-a-version`. Habilita los MCP de esas fases pensando en el outer loop.
86
+ - En el **inner loop** los gates pesados (`security`, `smell`, `ux`, `coherence` —coherencia triple
87
+ completa, distinta del `coherence_link` barato del inner—, `stack_arch` —arquitectura— e
88
+ `integration` con deps reales) **no** se cierran por épica: corren **una vez por release** en
89
+ `releasing-a-version`. Habilita los MCP de esas fases pensando en el outer loop.
89
90
  - El gate `api` usa **Newman por CLI**: es un ejemplo de que la herramienta de un gate **no tiene por
90
91
  qué ser un MCP**. Lo importante es la evidencia (los contratos responden), no el canal.
91
92
  - **Excepción única — `fidelity` en slices con UI.** Es el **único** gate donde un MCP es **requerido**,
@@ -0,0 +1,157 @@
1
+ # Evaluación: ¿reemplazar el harness OpenSpec por GSD? ¿fork o rama?
2
+
3
+ - **Fecha:** 2026-07-03
4
+ - **Estado:** Decidido — ver **Actualización post-análisis de código** al final. Diseño en [`docs/superpowers/specs/2026-07-03-harness-context-engine-design.md`](../superpowers/specs/2026-07-03-harness-context-engine-design.md)
5
+ - **Autor:** Jhonata.segura (asistido)
6
+ - **Repo evaluado:** `@trycore/spec-build-harness` v0.7.1
7
+ - **Candidato:** `open-gsd/gsd-core` (GSD — "Git. Ship. Done"), MIT
8
+ - **Insumo relacionado:** `gsd-template.md` (PRD "Orquestador Semántico Determinista", análisis de 4 agentes)
9
+
10
+ ---
11
+
12
+ ## 1. Pregunta a resolver
13
+
14
+ Dos preguntas, una depende de la otra:
15
+
16
+ 1. **¿Debemos reemplazar OpenSpec por GSD** como base del harness de construcción, motivado por que "los foros dicen que GSD es más nativo con Claude Code, usa mejor el contexto y es más eficiente"?
17
+ 2. **Si avanzamos, ¿fork de gsd-core o rama en este repo?**
18
+
19
+ Este documento responde ambas con evidencia y deja una recomendación. No modifica arquitectura.
20
+
21
+ ---
22
+
23
+ ## 2. Punto de partida: qué es hoy el harness y qué papel juega OpenSpec
24
+
25
+ `@trycore/spec-build-harness` no *es* OpenSpec: es un **arnés propio** que orquesta a Claude Code con arquitectura de **dos loops** (slice por épica con TDD + gates → release gate), **12 agentes de build** (coherence three-way, security-reviewer, wiring-adversarial-verifier, ux-krug, dor-dod-gatekeeper, stack-guardian, etc.), estado compartido, hooks y una **metodología documentada en español** (`METODOLOGIA.md`, `GOVERNANCE.md`). Es el compañero de `@trycore/spec-product-flow` (Discovery → Construcción).
26
+
27
+ OpenSpec (`@fission-ai/openspec`) es **una pieza dentro**, no el todo. Aporta el **modelo de spec basado en cambios**: `changes/` (propuesta) → implementación → `archive` hacia `specs/`. Se expresa como:
28
+
29
+ - **55 referencias** en el repo (`grep -ril openspec`).
30
+ - Namespace `/opsx:*` — 10 comandos (`new`, `apply`, `archive`, `bulk-archive`, `continue`, `explore`, `ff`, `onboard`, `sync`, `verify`).
31
+ - 8 skills `openspec-*` (todas con `Requires openspec CLI` y licencia MIT — son wrappers del CLI de OpenSpec).
32
+ - Dependencia externa: `npm install -g @fission-ai/openspec`.
33
+
34
+ **Conclusión de esta sección:** "reemplazar OpenSpec" ≠ "reemplazar el harness". OpenSpec es la **capa de gobernanza de spec** (propuesta de cambio → archivo). El valor diferencial de Trycore (dos loops, gates, agentes, metodología, coexistencia con product-flow) **no vive en OpenSpec**.
35
+
36
+ ---
37
+
38
+ ## 3. Qué es realmente GSD (verificado, no de oídas)
39
+
40
+ GSD es un framework de **context-engineering + spec-driven** mucho **más grande y ambicioso** que nuestra capa OpenSpec:
41
+
42
+ - **Loop de 5 fases:** Discuss → Plan → Execute → Verify → Ship, repetido por *milestones*.
43
+ - **~55+ comandos** (`/gsd-*`): incluye planificación con convergencia cross-AI, ejecución en *waves* paralelas, *workstreams*, knowledge graph (`/gsd-graphify`), memory palace temporal (`/gsd-mempalace-*`), auditorías de milestone/UAT/seguridad, code-review, audit-fix, spikes, forensics, etc.
44
+ - **Estado en archivos planos:** `STATE.md`, `CONTEXT.md`, `ROADMAP.md`, `.planning/` — con comandos de validación (`state validate`, `roadmap validate`).
45
+ - **Multi-runtime:** Claude Code, Codex, Gemini CLI, Kimi, Copilot, Cursor, Windsurf… vía instalador (`npx @opengsd/gsd-core@latest`). **No se copian `agents/`/`commands/` a mano.**
46
+ - **Licencia MIT.** Fork legalmente trivial.
47
+ - **Escala/actividad:** ~48K estrellas; v1.34.2 el 2026-04-06; **1.693 commits en 47 releases** desde dic-2025. Es un proyecto que se mueve rápido.
48
+
49
+ ### 3.1 ¿Son ciertas las afirmaciones de los foros?
50
+
51
+ | Afirmación de foro | Veredicto | Matiz |
52
+ |---|---|---|
53
+ | "Más nativo con Claude Code" | **Parcialmente cierto** | Nació Claude-Code-first y es lo más maduro ahí, pero hoy se posiciona **multi-runtime**. "Nativo" real = su patrón de *fresh-context subagents* encaja muy bien con el modelo de subagentes de Claude Code. |
54
+ | "Usa mejor el contexto" | **Cierto en el patrón** | El núcleo — ejecutar research/plan/execute en **subagentes de contexto fresco (~200k)** manteniendo la sesión principal ligera — es una respuesta genuinamente buena al *context rot*. Es la idea que la comunidad realmente elogia. |
55
+ | "Más eficiente" | **No demostrado como número** | El README no publica benchmarks de tokens. La eficiencia proviene del patrón, no de una métrica auditada. Ojo: fresh-context tiene su propio **"impuesto de arranque"** (reinyección) — es exactamente lo que critica tu PRD §2.2. |
56
+
57
+ **Lo importante:** lo que los foros elogian de GSD es un **patrón de ejecución** (subagentes de contexto fresco + estado externalizado), *no* un motor de spec que haga a OpenSpec obsoleto. Ese patrón es **adoptable sin reemplazar OpenSpec**.
58
+
59
+ ---
60
+
61
+ ## 4. Solapamiento, brechas y choque de modelos
62
+
63
+ | Capacidad | Harness actual | GSD | Lectura |
64
+ |---|---|---|---|
65
+ | Gobernanza de spec | OpenSpec `changes/ → specs/` (brownfield, delta por cambio) | `ROADMAP.md` + fases/milestones (`.planning/`) | **Modelos distintos.** OpenSpec = delta de cambio archivable; GSD = roadmap de fases. Migrar es re-conceptualizar, no un swap. |
66
+ | Ejecución / context rot | Slices + orquestador propio | **Waves paralelas en subagentes frescos** | GSD es **más fuerte** aquí. Es la joya a mirar. |
67
+ | Gates de calidad | 12 agentes Trycore + release gate | code-review, audit-fix, secure-phase, verify | **Solapan.** Adoptar GSD nos obliga a re-hospedar o botar nuestros agentes. |
68
+ | TDD / Gitflow / release gate | **Explícito** (nuestro valor) | Ship/PR + verify; TDD/gitflow **no formalizados** | Perdemos rigor si migramos crudo. |
69
+ | Metodología en español + product-flow | **Sí** (diferencial Trycore) | No existe | Se re-implementa igual, migremos o no. |
70
+ | Extensibilidad | Nuestra, total | Vía instalador/capabilities/overlays; **no copiar archivos a mano** | Forkear = pelear contra su modelo de instalación. |
71
+
72
+ **Choque clave:** OpenSpec gobierna **el cambio** (delta propuesto y archivado); GSD gobierna **el plan** (fases de un roadmap). No son intercambiables 1:1; "reemplazar" implicaría rehacer cómo pensamos la unidad de trabajo.
73
+
74
+ ---
75
+
76
+ ## 5. Riesgos de adoptar/forkear GSD
77
+
78
+ 1. **Gobernanza inestable (riesgo alto).** El proyecto original tuvo un incidente (meme-coin) y **el autor original ya no participa**. Hoy conviven `open-gsd/gsd-core`, `open-gsd/get-shit-done-redux` y otros forks. Atarnos a un upstream en plena reorganización de gobernanza es riesgo de cadena de suministro y de dirección.
79
+ 2. **Velocidad de upstream (riesgo de mantenimiento).** 47 releases / 1.693 commits en ~4 meses. Un **fork** nos obliga a un *sync* costoso y perpetuo, o a divergir y perder el motivo de forkear.
80
+ 3. **Superficie enorme.** ~55 comandos y subsistemas (knowledge graph, memory palace, cross-AI). Adoptarlo entero es asumir complejidad que **no pediste** (YAGNI) y que solapa lo nuestro.
81
+ 4. **Modelo de instalación cerrado.** "No copies `agents/`/`commands/`" → un fork/patch integrado con nuestro CLI (`trycore-build init`) va a contracorriente de su diseño.
82
+ 5. **Contradice tu propio PRD.** El consenso de los 4 agentes en `gsd-template.md` es explícito: *"El Orquestador… no reemplaza a GSD ni a Claude Code — se inserta entre ellos"*. Es decir, tu análisis ya descartó "reemplazar".
83
+
84
+ ---
85
+
86
+ ## 6. Opciones de estrategia de repositorio
87
+
88
+ ### Opción A — Rama en este repo (evolución in-place) ✅ recomendada para empezar
89
+ Crear `spike/gsd-eval` (y luego `feature/…`) **en este mismo repo**. Adoptar **el patrón que sí vale de GSD** (ejecución en subagentes de contexto fresco / waves) dentro de nuestra arquitectura, **conservando** OpenSpec como gobernanza de cambio y nuestros gates.
90
+ - **Pro:** control total, mantiene identidad Trycore y coexistencia con product-flow; reversible; publicable como v0.8/v1.0; cero riesgo de gobernanza externa.
91
+ - **Contra:** reimplementamos el patrón (no heredamos el código de GSD).
92
+
93
+ ### Opción B — Fork de `gsd-core`
94
+ Partir de su base MIT y montar gates/metodología encima.
95
+ - **Pro:** heredamos madurez (waves, graph, memory palace).
96
+ - **Contra:** **el más caro y arriesgado** — sync perpetuo con upstream velocísimo, gobernanza inestable, superficie que no queremos, choque con nuestro CLI e instalación. Botamos o duplicamos nuestros 12 agentes y los dos loops.
97
+
98
+ ### Opción C — GSD como dependencia (wrap, igual que hoy con OpenSpec)
99
+ No forkear: invocar el CLI de GSD desde nuestro harness, como orquestamos OpenSpec hoy.
100
+ - **Pro:** bajo mantenimiento; nos beneficiamos de upstream sin cargarlo.
101
+ - **Contra:** dependemos de su CLI/estado; dos modelos de spec conviviendo (OpenSpec + GSD) puede confundir; seguimos expuestos a su gobernanza en runtime.
102
+
103
+ ### Opción D — Greenfield: el "Orquestador" del PRD (visión larga)
104
+ Construir el plano de control determinista + datos semánticos (MCP a nivel símbolo + estado tipado) que describe `gsd-template.md`. GSD queda como capa metodológica, no como reemplazo.
105
+ - **Pro:** ataca la métrica real (tokens/rework/first-time-pass) según tu propio análisis.
106
+ - **Contra:** mayor esfuerzo; fuera del alcance de "una versión nueva del harness" ahora.
107
+
108
+ ---
109
+
110
+ ## 7. Recomendación
111
+
112
+ **No forkear gsd-core y no arrancar OpenSpec a ciegas.** En concreto:
113
+
114
+ 1. **Reencuadrar el objetivo.** Lo que la comunidad elogia de GSD y lo que tú buscas ("mejor uso de contexto, más eficiente") es un **patrón de ejecución** (subagentes de contexto fresco + estado externalizado), **no** un motor de spec que reemplace a OpenSpec. Perseguir ese patrón ≠ reemplazar OpenSpec.
115
+ 2. **Opción A (rama en este repo) para un spike acotado.** Validar el patrón de contexto fresco dentro de nuestra arquitectura, midiendo contra un baseline. Reversible y publicable.
116
+ 3. **Descartar la Opción B (fork)** salvo que decidamos, con datos del spike, comprometer GSD como *motor* y aceptar el costo de mantenimiento/gobernanza. Hoy el riesgo de gobernanza (autor fuera, forks múltiples) lo hace desaconsejable.
117
+ 4. **Mantener la Opción D (orquestador del PRD) como norte de largo plazo**, no como esta release. Coincide con el consenso de tu propio PRD: *insertar entre*, no reemplazar.
118
+
119
+ En una frase: **la próxima versión del harness debería robarle a GSD la *idea* (ejecución en contexto fresco), no el *repositorio*.**
120
+
121
+ ---
122
+
123
+ ## 8. Spike de validación propuesto (si se aprueba avanzar)
124
+
125
+ Rama `spike/gsd-eval`, alcance de días, criterios de éxito medibles:
126
+
127
+ 1. **Baseline.** Correr un slice representativo con el harness actual; registrar tokens de entrada, nº de llamadas a herramientas, rework y first-time-pass.
128
+ 2. **Variante A (patrón GSD, sin GSD).** Reimplementar la ejecución del slice en **subagentes de contexto fresco** (ya tenemos `Agent`/waves nativos de Claude Code) manteniendo OpenSpec + gates. Medir lo mismo.
129
+ 3. **Variante B (GSD como dependencia, opcional).** Instalar `gsd-core` en un proyecto de prueba y comparar su Execute-phase contra nuestro slice, para calibrar cuánto valor real añade su motor vs. reimplementarlo.
130
+ 4. **Decisión.** Con las tres mediciones, elegir entre: (a) adoptar solo el patrón (Opción A), (b) wrap de GSD (Opción C), o (c) invertir en el orquestador (Opción D). Sólo entonces se justificaría —o no— un fork.
131
+
132
+ **Criterio de descarte de fork:** si el spike no muestra ≥30% de mejora de tokens/rework atribuible al *código* de GSD (y no solo al patrón), no forkear.
133
+
134
+ ---
135
+
136
+ ## 9. Fuentes
137
+
138
+ - [open-gsd/gsd-core (GitHub)](https://github.com/open-gsd/gsd-core)
139
+ - [GSD hits 48K stars — Augment Code](https://www.augmentcode.com/learn/gsd-stars-spec-driven-dev-claude-code)
140
+ - [The Anatomy of Claude Code Workflows (GSD deep dive) — codecentric](https://www.codecentric.de/en/knowledge-hub/blog/the-anatomy-of-claude-code-workflows-turning-slash-commands-into-an-ai-development-system)
141
+ - [Superpowers, GSD, and gstack: what each constrains — Ewan Mak (Medium)](https://medium.com/@tentenco/superpowers-gsd-and-gstack-what-each-claude-code-framework-actually-constrains-12a1560960ad)
142
+ - [GSD vs Spec Kit vs OpenSpec vs Taskmaster — Rick Hightower (Medium)](https://medium.com/@richardhightower/agentic-coding-gsd-vs-spec-kit-vs-openspec-vs-taskmaster-ai-where-sdd-tools-diverge-0414dcb97e46)
143
+ - Interno: `gsd-template.md` (PRD "Orquestador Semántico Determinista"), `README.md`, `METODOLOGIA.md`, skills `openspec-*`.
144
+
145
+ ---
146
+
147
+ ## 10. Actualización post-análisis de código (2026-07-03)
148
+
149
+ Se clonó `gsd-core` y se leyó su ingeniería real (5 exploradores, evidencia `file:line`). Confirma y **cierra** las decisiones:
150
+
151
+ 1. **NO forkear — confirmado con datos.** `git log --since=30d` = **861 commits**; sin campo `exports` (no es librería); artefactos compilados en `.gitignore`; instalador monolítico de **11.740 líneas**; 3 sistemas de toggles entrelazados. No hay costura estable para depender. Los patrones valiosos son portables (MIT) sin el motor.
152
+ 2. **El dolor real (reinicio manual) NO lo resuelve GSD tampoco:** GSD deja el `/clear` manual (filosofía #884). Su valor = **aviso temprano (hook a 35%/25%) + handoff sin pérdida**. Eso es lo adoptable, y es pequeño/portable.
153
+ 3. **Nuestro estado tipado ≥ el de GSD** (JSON schema vs Markdown+regex); GSD compensa con **derivación desde disco** — esa *idea* sí vale robarla.
154
+ 4. **Worktrees:** GSD paraleliza solo lo disjunto en archivos + seguro en el DAG, con serializador de solapes. Adoptamos el patrón a nivel **inter-épica** (no fundacionales, disjuntas).
155
+ 5. Lo *hypeado* (memory-palace, knowledge graph) es lo *menos* propio de GSD (MCP/Python externos). Descartado por ahora.
156
+
157
+ **Veredicto final:** rama en este repo (`feature/gsd-context-engine`), robar patrones de contexto + estado-en-disco + worktrees inter-épica. Diseño detallado en el spec enlazado arriba.
@@ -0,0 +1,42 @@
1
+ # Cómo trabaja el arnés — flujo funcional
2
+
3
+ Vista única y sencilla del flujo de trabajo, para explicar a los devs **qué pasa con cada cambio**.
4
+ (Versión detallada/técnica en [flujo-harness.md](./flujo-harness.md).)
5
+
6
+ ```mermaid
7
+ flowchart TD
8
+ A([Llega un trabajo]) --> B{"¿Qué tipo de cambio es?"}
9
+
10
+ B -->|"Arreglo pequeño<br/>(typo, copy, config)"| C["Carril rápido:<br/>rama → cambio → PR"]
11
+ C --> Z([PR listo para mergear])
12
+
13
+ B -->|"Funcionalidad nueva<br/>(una épica)"| D{"¿Está lista para construir?<br/>historias claras, criterios definidos,<br/>base ya construida"}
14
+ D -->|"No"| E["Vuelve a discovery<br/>a completar la historia"]
15
+ D -->|"Sí"| F["Construir con pruebas<br/>(escribo el test, luego el código)"]
16
+
17
+ F --> G{"¿La app funciona<br/>de punta a punta?"}
18
+ G -->|"No"| F
19
+ G -->|"Sí"| H["Revisión final del cambio<br/>+ pantallas iguales al diseño (si hay UI)"]
20
+
21
+ H --> I["Abrir PR y dejar todo enlazado<br/>(historia ↔ cambio ↔ código)"]
22
+ I --> J{"¿Esta épica cierra<br/>una entrega/release?"}
23
+
24
+ J -->|"No, sigue otra épica"| A
25
+ J -->|"Sí"| K["Revisión profunda de la entrega:<br/>seguridad · calidad · UX ·<br/>coherencia · arquitectura"]
26
+
27
+ K --> L{"¿Todo el journey completo<br/>funciona con dependencias reales?"}
28
+ L -->|"No, hay hallazgos"| M["Corregir como un cambio normal"]
29
+ M --> K
30
+ L -->|"Sí"| N([Release lista ✅])
31
+
32
+ classDef q fill:#fff3cd,stroke:#d39e00,color:#000;
33
+ classDef ok fill:#d4edda,stroke:#155724,color:#000;
34
+ class B,D,G,J,L q;
35
+ class N,Z ok;
36
+ ```
37
+
38
+ ## La idea en una frase
39
+
40
+ - **Cambios chicos** van por un carril rápido.
41
+ - **Cada funcionalidad nueva** se construye completa, con pruebas, verificando que la app **funcione de punta a punta** antes de cerrarla.
42
+ - **De vez en cuando** (al cerrar una entrega) se hace una **revisión profunda** de todo lo acumulado antes de liberar.
@@ -0,0 +1,192 @@
1
+ # Flujo del arnés de construcción — `@trycore/spec-build-harness`
2
+
3
+ Diagrama de flujo end-to-end del harness, modelado al estilo BPMN:
4
+
5
+ - **◆ XOR** (rombo) = compuerta **exclusiva** (un solo camino).
6
+ - **⬡ AND** (hexágono) = compuerta **paralela** (fork: todos los caminos; join: convergencia/barrera).
7
+ - **▭ Tarea** con su **gate** entre `[ ]`.
8
+ - Aristas punteadas `-.->` = retroceso (gate monótono que vuelve a `false`).
9
+
10
+ Fuente de verdad: [METODOLOGIA.md](../METODOLOGIA.md). Si algo contradice ese documento, gana la metodología.
11
+
12
+ ---
13
+
14
+ ## 1. Vista global (router → inner loop → outer loop)
15
+
16
+ ```mermaid
17
+ flowchart TD
18
+ START([Trabajo entrante]) --> PRE{{"⬡ Preflight<br/>¿instalado?"}}
19
+ PRE -->|NOT_INSTALLED| INIT[trycore-build init] --> ROUTER
20
+ PRE -->|ok| ROUTER
21
+
22
+ ROUTER[/"/build:work — Router (classify-and-act)<br/>solo ruteo: no toca estado ni ramas"/]
23
+ ROUTER --> GW1{"◆ XOR — Decision gate<br/>¿qué carril?"}
24
+
25
+ %% --- Rama 1: micro-change ---
26
+ GW1 -->|"mantenimiento<br/>sin capacidad nueva"| HARD{"◆ XOR — ¿cruza límite duro?<br/>dep nueva / API nueva / dominio·datos"}
27
+ HARD -->|"sí → escala"| INNER
28
+ HARD -->|no| MICRO["building-a-micro-change<br/>fix/* | chore/* → cambio → PR<br/>(sin abrir active_slice)"]
29
+ MICRO --> ENDM([PR mergeado])
30
+
31
+ %% --- Rama 2: épica / producto nuevo ---
32
+ GW1 -->|"capacidad nueva<br/>o límite duro"| INNER[["INNER LOOP<br/>building-a-slice<br/>(ver §2)"]]
33
+
34
+ %% --- Rama 3: release gate ---
35
+ GW1 -->|"cierra línea de release<br/>o ≥2 épicas archivadas"| OUTER[["OUTER LOOP<br/>releasing-a-version<br/>(ver §3)"]]
36
+
37
+ INNER --> DEC{"◆ XOR — fase 8<br/>¿correr Release Gate ahora?<br/>(default computado, decide humano)"}
38
+ DEC -->|"sí (cierra release<br/>o nudge ≥2)"| OUTER
39
+ DEC -->|no| NEXT([Siguiente épica]) -.-> INNER
40
+
41
+ OUTER --> OUTGW{"◆ XOR — ¿todos los gates ✓?"}
42
+ OUTGW -->|"passed"| REL([Release lista])
43
+ OUTGW -->|"failed (hallazgos)"| FIX["Fix como slice normal<br/>(building-a-slice)"] -.->|re-corre| OUTER
44
+
45
+ classDef xor fill:#fff3cd,stroke:#d39e00,color:#000;
46
+ classDef andg fill:#d1ecf1,stroke:#0c5460,color:#000;
47
+ classDef loop fill:#e2e3f3,stroke:#383d6b,color:#000;
48
+ class GW1,HARD,DEC,OUTGW xor;
49
+ class PRE andg;
50
+ class INNER,OUTER loop;
51
+ ```
52
+
53
+ ---
54
+
55
+ ## 2. Inner loop — `building-a-slice` (pipeline secuencial por épica)
56
+
57
+ Precondición dura: **scaffold confirmado** (`scaffold.confirmed`) antes de abrir cualquier slice.
58
+ Secuencial (un `active_slice` a la vez), divulgación progresiva, ningún gate se salta.
59
+
60
+ ```mermaid
61
+ flowchart TD
62
+ S0([Épica EP-XXX entrante]) --> SCAF{"◆ XOR — gate proyecto<br/>scaffold.confirmed?"}
63
+ SCAF -->|"false"| STOPS["STOP — exige scaffold runnable<br/>(scaffold-guard.sh)"]
64
+ SCAF -->|"true"| F1
65
+
66
+ %% Fase 1: DoR
67
+ F1["F1 · dor — Definition of Ready<br/>delega: dor-dod-gatekeeper"]
68
+ F1 --> DORGW{"◆ XOR — ¿DoR ✓?<br/>épica+HU, AC G/W/T, INVEST,<br/>cimiento, tamaño, stack, fixtures"}
69
+ DORGW -->|"✗"| BACKDISC["Vuelve a discovery<br/>(/trycore:*) — no se abre slice"]
70
+ DORGW -->|"✓ [gate: dor]"| SIZE{"◆ XOR — gate tamaño<br/>>3 HU ó ≥3 capas?"}
71
+
72
+ SIZE -->|"sí"| SUB["Descompone en sub_slices[]<br/>se construyen de a uno<br/>(journey_smoke verde entre cada uno)"]
73
+ SIZE -->|"no (atómica)"| F2
74
+ SUB --> F2
75
+
76
+ %% Fase 2: change
77
+ F2["F2 · change — opsx:new + ## Trazabilidad<br/>delega: change-epic-coherence"]
78
+ F2 --> F2GW{"◆ XOR — ¿enlace change↔épica ✓?"}
79
+ F2GW -->|"✓ [gate: coherence_link]"| F3
80
+ F2GW -.->|"✗ retroceso"| F2
81
+
82
+ %% Fase 3: TDD
83
+ F3["F3 · red→green→refactor<br/>TDD por cada escenario AC de cada HU<br/>delega: superpowers:test-driven-development"]
84
+ F3 --> F3GW{"◆ XOR — ¿suite verde?"}
85
+ F3GW -.->|"✗ retroceso"| F3
86
+ F3GW -->|"✓ [gate: tdd]"| F4
87
+
88
+ %% Fase 4: smoke + fidelity (UI)
89
+ F4["F4 · smoke — journey-hasta-aquí end-to-end<br/>runner determinista fuera-de-chat (sesión virgen)"]
90
+ F4 --> UIGW{"◆ XOR — ¿la épica toca UI?"}
91
+ UIGW -->|"no"| F4OUT["fidelity = null"]
92
+ UIGW -->|"sí"| FID["Verificación visual real (MCP chrome-devtools)<br/>screenshot app vs prototipo<br/>delega: ux-fidelity-reviewer"]
93
+ FID --> FIDGW{"◆ XOR — ¿fidelidad ESTRICTA ✓?<br/>INCONCLUSO = false"}
94
+ FIDGW -.->|"✗ → false"| FID
95
+ FIDGW -->|"✓ [gate: fidelity]"| F4OUT
96
+ F4OUT -->|"[gate: journey_smoke]"| F5FORK
97
+
98
+ %% Fase 5: api / data en paralelo (condicional/null)
99
+ F5FORK{{"⬡ AND — fork (fase api/data)"}}
100
+ F5FORK --> APIB["api — contratos endpoints<br/>Newman 100% (delega: api-contract-tester)<br/>null si no hay endpoints"]
101
+ F5FORK --> DATAB["data — invariantes de datos<br/>(delega: data-consistency-checker)<br/>N/A si no toca datos"]
102
+ APIB --> F5JOIN
103
+ DATAB --> F5JOIN
104
+ F5JOIN{{"⬡ AND — join (convergencia)<br/>[gates: api, data]"}}
105
+
106
+ %% Fase 6: dod — adversarial THEN dod
107
+ F5JOIN --> WIRE["F6a · Verificación ADVERSARIAL independiente<br/>(subagente contexto virgen)<br/>asume slice incompleto e intenta refutarlo<br/>delega: wiring-adversarial-verifier"]
108
+ WIRE --> WIREGW{"◆ XOR — ¿wiring_checklist[] sin items failing?"}
109
+ WIREGW -.->|"✗ huecos (stub/ruta/AC sin test)"| F3
110
+ WIREGW -->|"✓ [gate: wiring_verified]"| DOD["F6b · DoD reducido<br/>delega: dor-dod-gatekeeper<br/>(piso declarativo, no el arreglo)"]
111
+ DOD --> DODGW{"◆ XOR — ¿DoD ✓?<br/>tdd·journey_smoke·coherence_link·<br/>data·api·fidelity·wiring_verified·hooks"}
112
+ DODGW -.->|"✗ retroceso"| F3
113
+ DODGW -->|"✓ [gate: dod]"| F7
114
+
115
+ %% Fase 7: PR + archive
116
+ F7["F7 · pr — abrir PR + archivar change EN EL MISMO PR<br/>opsx:archive + opsx:sync<br/>back-reference en épica y HU"]
117
+ F7 --> ARCH["active_slice → history[] (phase: archived)<br/>active_slice = null"]
118
+ ARCH --> F8([F8 · decisión Release Gate → §1])
119
+
120
+ classDef xor fill:#fff3cd,stroke:#d39e00,color:#000;
121
+ classDef andg fill:#d1ecf1,stroke:#0c5460,color:#000;
122
+ classDef stop fill:#f8d7da,stroke:#842029,color:#000;
123
+ class SCAF,DORGW,SIZE,F2GW,F3GW,UIGW,FIDGW,WIREGW,DODGW xor;
124
+ class F5FORK,F5JOIN andg;
125
+ class STOPS,BACKDISC stop;
126
+ ```
127
+
128
+ > **Disciplina de horizonte largo:** cada iteración nace headless / contexto virgen y reconstruye estado
129
+ > desde disco (`build-state.json` + git + logs). `wiring_checklist[]` (1 item por escenario AC y por punto
130
+ > de integración entre capas) nace `failing` y solo pasa a `passing` **tras prueba real ejecutada**.
131
+ > Mientras quede un item `failing`, el cableado NO está hecho.
132
+
133
+ ---
134
+
135
+ ## 3. Outer loop — `releasing-a-version` (Release Gate)
136
+
137
+ Alcance = **diff acumulado** de todas las épicas de la release (merge anterior → `main`).
138
+ Los reviewers se disparan **en paralelo** y devuelven síntesis (protegen el contexto).
139
+
140
+ ```mermaid
141
+ flowchart TD
142
+ R0([Línea de release identificada]) --> R1["Crear/actualizar releases[] (status: pending)<br/>cruzar con docs/02-user-story-map/"]
143
+ R1 --> FORK{{"⬡ AND — fork (reviewers en paralelo<br/>sobre el diff acumulado)"}}
144
+
145
+ FORK --> SEC["security — sin CRÍTICO/ALTO;<br/>claves server-side; PII no cruda;<br/>salida IA = input no confiable<br/>(security-reviewer)"]
146
+ FORK --> SME["smell — 4 reglas de Beck<br/>+ code smells sin bloqueantes<br/>(simple-design-reviewer)"]
147
+ FORK --> UX["ux — Krug + Lighthouse<br/>(null si sin UI)<br/>(ux-krug-reviewer)"]
148
+ FORK --> COH["coherence — trazabilidad triple<br/>AC↔change↔código, sin huérfanos<br/>(coherence-three-way · opus)"]
149
+ FORK --> ARCH["stack_arch — arquitectura PRD:<br/>capa IA en frontera server-side;<br/>decisión determinista sin IA<br/>(stack-guardian)"]
150
+
151
+ SEC --> JOIN
152
+ SME --> JOIN
153
+ UX --> JOIN
154
+ COH --> JOIN
155
+ ARCH --> JOIN
156
+
157
+ JOIN{{"⬡ AND — join (convergencia de reviewers)"}}
158
+ JOIN --> INTEG["integration — journey COMPLETO end-to-end<br/>con DEPENDENCIAS REALES (no stubs)<br/>skill verify/run + MCP chrome-devtools"]
159
+
160
+ INTEG --> RGW{"◆ XOR — ¿todos los gates ✓ (o null N/A)?"}
161
+ RGW -->|"✓"| PASS["status: passed<br/>escribir gates + updated_by: releasing-a-version"]
162
+ RGW -->|"✗ hallazgos bloqueantes"| FAIL["status: failed"]
163
+ PASS --> RELOK([Release ✅])
164
+ FAIL --> FIXLOOP["Humano corrige como slice normal<br/>(building-a-slice)"]
165
+ FIXLOOP -.->|"re-corre Release Gate"| R1
166
+
167
+ classDef xor fill:#fff3cd,stroke:#d39e00,color:#000;
168
+ classDef andg fill:#d1ecf1,stroke:#0c5460,color:#000;
169
+ classDef gate fill:#d4edda,stroke:#155724,color:#000;
170
+ class RGW xor;
171
+ class FORK,JOIN andg;
172
+ class INTEG gate;
173
+ ```
174
+
175
+ > **`integration` es el gate no negociable.** Sin journey completo con dependencias reales **no hay release**.
176
+ > No se acepta con todo stubbeado.
177
+
178
+ ---
179
+
180
+ ## 4. Leyenda de loops y gates
181
+
182
+ | | Inner loop | Outer loop |
183
+ |---|---|---|
184
+ | Skill | `building-a-slice` | `releasing-a-version` |
185
+ | Unidad | una épica `EP-XXX` | una línea de release |
186
+ | Cadencia | muchas (1 por épica) | pocas (1 por release) |
187
+ | Costo | barato (≤ ~20 min/épica) | pesado (subagentes profundos) |
188
+ | Gates | dor · coherence_link · tdd · journey_smoke · fidelity · api · data · wiring_verified · dod | security · smell · ux · coherence · stack_arch · integration |
189
+ | Estado | `active_slice` + `history[]` | `releases[]` |
190
+
191
+ **Regla de no duplicación:** cada gate vive en exactamente un loop. El outer no hace TDD ni gates por slice;
192
+ el inner no dispara reviewers pesados.
@@ -16,9 +16,10 @@ trycore-build doctor # verifica requisitos y hooks
16
16
  ```text
17
17
  # 3) En Claude Code (lo corre Claude, no la terminal)
18
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
19
+ /build:slice # construye una épica: DoR → change → TDD → smoke → DoD → PR
20
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
21
+ /build:release # al cerrar una línea de release del Story Map
22
+ # /build:work # (opcional) router: clasifica la tarea y la enruta (micro-change/slice/release)
22
23
  ```
23
24
 
24
25
  Eso es el ciclo completo. Lo de abajo explica cada paso.
@@ -47,7 +48,7 @@ npm i -g @fission-ai/openspec @trycore/spec-build-harness
47
48
 
48
49
  ## 2 · `trycore-build init` (terminal)
49
50
 
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.
51
+ Desde la raíz de tu proyecto. Es **idempotente** (re-correrlo es seguro) y siembra: **12 agentes**, **13 skills** (`building-a-slice`, `building-a-micro-change`, `releasing-a-version` + 10 `openspec-*`), **10 comandos `/opsx:*`** + **5 comandos `/build:*`** (`onboard`, `slice`, `release`, `reflect`, `work`), **10 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.
51
52
 
52
53
  ```bash
53
54
  trycore-build init
@@ -81,7 +82,7 @@ Si un punto no aplica, se registra como "no aplica" (no se deja como `{{...}}`).
81
82
 
82
83
  ## 4 · Construir un slice (Claude Code)
83
84
 
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**:
85
+ **Un slice = una épica `EP-XXX` = un OpenSpec change = una rama = un PR.** Las HU de la épica son su alcance interno. Invoca `/build:slice` —la entrada del **inner loop**— (o pídelo en lenguaje natural: *"construye EP-001"*; o deja que `/build:work` clasifique y enrute la tarea). Pipeline del **inner loop**:
85
86
 
86
87
  ```
87
88
  DoR → change (+ trazabilidad) → TDD → journey-smoke (+ fidelidad si hay UI) → api/data → DoD reducido → PR + archive
@@ -99,7 +100,7 @@ Lo que importa:
99
100
 
100
101
  ## 5 · Release Gate (Claude Code, por release)
101
102
 
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:
103
+ Al archivar una épica, la skill te **pregunta** si correr el Release Gate (default computado desde las líneas de release del Story Map; lo respalda el hook `release-gate-nudge`, que solo **sugiere** y nunca ejecuta trabajo pesado). `/build:release` (outer loop) corre las **revisiones pesadas una sola vez** sobre el diff acumulado:
103
104
 
104
105
  | Gate | Delega en |
105
106
  |---|---|