@trycore/spec-build-harness 0.2.0 → 0.5.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 (40) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/GOVERNANCE.md +24 -5
  3. package/INSTALL.md +11 -6
  4. package/METODOLOGIA.md +18 -4
  5. package/README.md +12 -7
  6. package/VERSION +1 -1
  7. package/agents/build/build-orchestrator.md +6 -1
  8. package/agents/build/dor-dod-gatekeeper.md +13 -6
  9. package/agents/build/ux-fidelity-reviewer.md +61 -0
  10. package/commands/build/onboard.md +20 -4
  11. package/commands/build/reflect.md +163 -0
  12. package/dist/commands/doctor.js +35 -0
  13. package/dist/commands/init.js +32 -9
  14. package/dist/commands/status.js +4 -0
  15. package/dist/commands/uninstall.js +4 -1
  16. package/dist/lib/settings-merge.js +2 -2
  17. package/dist/lib/state-seed.js +1 -0
  18. package/docs/agents.md +2 -1
  19. package/docs/commands.md +10 -4
  20. package/docs/customization/lsp-extensions.md +90 -0
  21. package/docs/customization/mcp-extensions.md +3 -0
  22. package/docs/getting-started.md +14 -5
  23. package/docs/hooks.md +30 -8
  24. package/hooks/build/design-source-guard.sh +52 -0
  25. package/hooks/build/lint-typecheck.sh +21 -1
  26. package/hooks/build/reflect-nudge.sh +29 -0
  27. package/hooks/build-harness.json +8 -0
  28. package/package.json +2 -1
  29. package/skills/building-a-micro-change/SKILL.md +78 -0
  30. package/skills/building-a-slice/SKILL.md +26 -1
  31. package/skills/building-a-slice/references/dod.md +4 -0
  32. package/skills/building-a-slice/references/dor.md +5 -2
  33. package/skills/building-a-slice/references/gitflow.md +3 -1
  34. package/skills/building-a-slice/references/mcp-map.md +1 -0
  35. package/state/README.md +21 -0
  36. package/state/build-state.schema.json +19 -1
  37. package/state/build-state.template.json +8 -0
  38. package/templates/CLAUDE.md.template +8 -1
  39. package/templates/settings-hooks.template.json +1 -1
  40. package/docs/superpowers/specs/2026-06-02-scaffold-gate-design.md +0 -87
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "trycore-spec-build-harness",
4
4
  "displayName": "Trycore — Spec & Build Harness",
5
- "version": "0.2.0",
5
+ "version": "0.5.0",
6
6
  "description": "Arnés de construcción de dos loops (slice por épica + release gate) para Claude Code, con gates de calidad, estado compartido y OpenSpec. Compañero de @trycore/spec-product-flow. Agnóstico al proyecto.",
7
7
  "author": {
8
8
  "name": "Trycore",
package/GOVERNANCE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Gobernanza del arnés de construcción `.claude`
2
2
 
3
- Versión: ver `.claude/.build-harness-version` (`1.0.0`). El arnés es **soporte cognitivo vivo**:
3
+ Versión del paquete: ver `.claude/.build-harness-version`. El arnés es **soporte cognitivo vivo**:
4
4
  evoluciona con el modelo y el proyecto. No es "instalar y olvidar".
5
5
 
6
6
  ## Componentes y dueño
@@ -8,15 +8,16 @@ evoluciona con el modelo y el proyecto. No es "instalar y olvidar".
8
8
  |---|---|---|
9
9
  | Contexto | sección Construcción de CLAUDE.md, `openspec/project.md` | raíz / `openspec/` |
10
10
  | Estado | `build-state.json` (+schema, README) | `.claude/state/` |
11
- | Agentes | 10 agentes de build | `.claude/agents/build/` |
12
- | Hooks | settings.json + 6 scripts | `.claude/settings.json`, `.claude/hooks/build/` |
13
- | Skill | `building-a-slice` + 10 references | `.claude/skills/building-a-slice/` |
11
+ | Agentes | 11 agentes de build | `.claude/agents/build/` |
12
+ | Hooks | settings.json + 9 scripts | `.claude/settings.json`, `.claude/hooks/build/` |
13
+ | Skill | `building-a-slice` (+10 refs) · `building-a-micro-change` (carril ligero de mantenimiento) | `.claude/skills/` |
14
14
  | Config | allowlist de stack | `.claude/config/stack-allowlist.json` |
15
15
 
16
16
  ## Fases de activación (`harness_phase`)
17
17
  - **authoring** (actual): aún no hay `package.json`. Activos: `gitflow-guard`, `load-build-state`,
18
18
  `coherence-flag`; agentes de coherencia/stack/DoR/DoD operan sobre texto. Los hooks de
19
- lint/typecheck/stack(package.json)/tests están **armados** pero inertes (`[ -f package.json ] || exit 0`).
19
+ lint/typecheck/stack(package.json)/tests están **armados** pero inertes (`[ -f package.json ] || exit 0`);
20
+ `scaffold-guard` permite (sin slice en fases de código que bloquear) y `reflect-nudge` calla (sin historial que reflexionar).
20
21
  - **active**: al aparecer `package.json`, `load-build-state.sh` cambia la fase y los hooks armados
21
22
  empiezan a disparar solos. Sin intervención manual.
22
23
 
@@ -40,6 +41,24 @@ Editar `stack-allowlist.json` SOLO si la sección de requisitos técnicos del PR
40
41
  ### Bitácora de excepciones de stack
41
42
  - _(vacío)_ — registrar fecha, dependencia, justificación y aprobador.
42
43
 
44
+ ## Bitácora de cambios de metodología
45
+ Cambios a la política de construcción (unidad de trabajo, gates, DoR/DoD). Aprueba el DRI; van por PR.
46
+
47
+ - **2026-06-03 · v0.5.0** — Seguro de fuente de diseño + verificación de fidelidad. Nuevo gate de
48
+ proyecto `design_source` (espejo de scaffold, confirmado por humano; el arnés no genera el prototipo)
49
+ con hook `design-source-guard.sh`; criterio DoR "fuente de diseño identificada" para slices con UI;
50
+ gate vivo de inner loop `fidelity` computado en `smoke` por el nuevo agente `ux-fidelity-reviewer`
51
+ (agnóstico, estático-primero, degrada sin MCP); 7º extension point `DESIGN_SOURCE` en el onboard.
52
+ Toca gates/DoR/DoD y el schema de estado → aprobado por el DRI (Agent Manager). Origen: revisión de
53
+ la propuesta externa de visual fidelity.
54
+
55
+ - **2026-06-02 · v0.4.0** — Carril `building-a-micro-change` + DoR proporcional. El mantenimiento que
56
+ no es producto nuevo (typo, bump de dep permitida, copy/config/docs, fix de pocas líneas) deja de
57
+ modelarse como épica y usa un carril ligero (`fix/*`|`chore/*` → PR, sin `active_slice`), con
58
+ límites duros que lo escalan a épica (dep nueva, API nueva, lógica de dominio/datos). El DoR escala
59
+ el nº de escenarios G/W/T con `complejidad` en vez de exigir 3–5 fijos. La regla "épica = unidad"
60
+ se mantiene intacta para producto. Origen: auditoría del arnés vs. crítica de sobre-configuración.
61
+
43
62
  ## Extensiones futuras (no implementadas)
44
63
  - **Construcción en paralelo** de slices con `superpowers:using-git-worktrees` + orquestación
45
64
  multi-worktree (hoy el modelo es **secuencial** por decisión de proyecto). El `build-state.json`
package/INSTALL.md CHANGED
@@ -11,7 +11,7 @@ Es el **compañero** de [`@trycore/spec-product-flow`](https://www.npmjs.com/pac
11
11
  | CLI (bin) | `trycore-build` |
12
12
  | Plugin | `trycore-spec-build-harness` |
13
13
  | Marketplace | `trycore-build` |
14
- | Versión | `0.1.0` |
14
+ | Versión | `0.5.0` |
15
15
 
16
16
  Hay **dos canales** de instalación: el **CLI npm** (canónico, recomendado para operar en un
17
17
  proyecto) y el **plugin nativo** de Claude Code (conveniencia a nivel usuario). Lee el
@@ -28,7 +28,7 @@ npm install -g @trycore/spec-build-harness
28
28
  Esto expone el binario `trycore-build`. Comprueba la versión:
29
29
 
30
30
  ```bash
31
- trycore-build --version # → 0.1.0
31
+ trycore-build --version # → 0.5.0
32
32
  trycore-build --help
33
33
  ```
34
34
 
@@ -84,10 +84,10 @@ Qué hace `init`:
84
84
 
85
85
  1. **Verifica requisitos duros** (a menos que uses `--skip-doctor`).
86
86
  2. **Siembra los assets** en rutas nativas de Claude Code:
87
- - `.claude/agents/build/` — 10 agentes.
88
- - `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (`/build:onboard`).
87
+ - `.claude/agents/build/` — 11 agentes.
88
+ - `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (`/build:onboard`, `/build:reflect`).
89
89
  - `.claude/skills/` — 12 skills (`building-a-slice`, `releasing-a-version`, `openspec-*`).
90
- - `.claude/hooks/build/` — 6 hooks bash.
90
+ - `.claude/hooks/build/` — 9 hooks bash.
91
91
  3. **Siembra el estado**: `state/build-state.schema.json` y `state/README.md` se versionan;
92
92
  `state/build-state.json` se siembra **vacío y nunca se sobrescribe** (va al `.gitignore`).
93
93
  4. **Siembra `config/stack-allowlist.json`** (artefacto del consumidor; lo puebla `/build:onboard`).
@@ -184,6 +184,11 @@ Qué resuelve:
184
184
 
185
185
  Si un punto no aplica, se registra explícitamente "no aplica" (no se deja como `{{...}}`).
186
186
 
187
+ > **Durante la construcción** (no en la instalación), el comando `/build:reflect` captura las
188
+ > convenciones aprendidas de cada slice cerrado en el bloque `trycore-build-learnings` de
189
+ > `CLAUDE.md` —con tu aprobación— y lo **sugiere** el hook `reflect-nudge.sh` al cerrar sesión.
190
+ > Detalle en `docs/commands.md`.
191
+
187
192
  ---
188
193
 
189
194
  ## 5. Alternativa: plugin nativo (con caveat de canales)
@@ -228,7 +233,7 @@ Ambos paquetes coexisten en el mismo `.claude/` **sin colisión**, porque usan *
228
233
 
229
234
  | | Discovery — `spec-product-flow` | Construcción — `spec-build-harness` |
230
235
  |---|---|---|
231
- | Comandos | `/trycore:*` | `/opsx:*` + `/build:onboard` |
236
+ | Comandos | `/trycore:*` | `/opsx:*` + `/build:onboard` + `/build:reflect` |
232
237
  | Marca de versión | `.trycore-version` | `.build-harness-version` |
233
238
  | Bloque en `CLAUDE.md` | `<!-- BEGIN trycore-vertical -->` | `<!-- BEGIN trycore-build-harness -->` |
234
239
 
package/METODOLOGIA.md CHANGED
@@ -28,7 +28,7 @@ Ambos paquetes **coexisten en el mismo `.claude/` sin colisión**, con namespace
28
28
 
29
29
  | Eje | Discovery (`spec-product-flow`) | Construcción (`spec-build-harness`) |
30
30
  |---|---|---|
31
- | Comandos | `trycore/` (`/trycore:*`) | `opsx/` + `build/` (`/opsx:*`, `/build:onboard`) |
31
+ | Comandos | `trycore/` (`/trycore:*`) | `opsx/` + `build/` (`/opsx:*`, `/build:onboard`, `/build:reflect`) |
32
32
  | Sentinela de versión | `.trycore-version` | `.build-harness-version` |
33
33
  | Bloque en `CLAUDE.md` | `<!-- BEGIN trycore-vertical -->` | `<!-- BEGIN trycore-build-harness -->` |
34
34
 
@@ -90,6 +90,15 @@ Consecuencia operativa: **la unidad de construcción es la épica, no la HU suel
90
90
  épica = un OpenSpec change = una rama = un PR. Las HU que cubre la épica son su *alcance interno* y
91
91
  se listan en `active_slice.hus[]`. Construir por HU individual es sobre-ingeniería.
92
92
 
93
+ > **Carril micro-change (mantenimiento).** Esta regla rige la **construcción de producto**. El
94
+ > **mantenimiento** que no es capacidad nueva —un typo, un ajuste de copy/config/docs, un bump de
95
+ > dependencia ya permitida, o un fix de pocas líneas sin nueva capacidad— **no se modela como
96
+ > épica**: usa el carril ligero de la skill `building-a-micro-change` (`fix/*`|`chore/*` → cambio →
97
+ > PR, sin abrir `active_slice`). No es una excepción a la regla, sino mantenimiento fuera de su
98
+ > alcance. **Límites duros:** si el cambio añade una dependencia nueva, crea un endpoint/API nuevo, o
99
+ > toca lógica de dominio o el modelo/invariantes de datos, **deja de ser micro-change** y se escala a
100
+ > épica. Ante la duda, es una épica.
101
+
93
102
  ---
94
103
 
95
104
  ## 3. Pipeline del inner loop, fase por fase (con sus gates)
@@ -117,7 +126,10 @@ Una épica **no entra a construcción** hasta cumplir todo (lo valida `dor-dod-g
117
126
  - La épica tiene ≥1 HU; todas las que entran se listan en `hus[]`.
118
127
  - Frontmatter completo en cada `docs/04-historias/HU-XXX.md` (`id, titulo, epica, prioridad,
119
128
  complejidad, estado`) con `estado: lista`.
120
- - AC en Given/When/Then por HU: 3–5 escenarios con happy + error + edge.
129
+ - AC en Given/When/Then por HU, **proporcional a `complejidad`** (cubre los modos de fallo que
130
+ *realmente existen*, no una cuota fija): `trivial`/baja → **1–2** (happy + error/edge crítico si
131
+ existe); `media` → **3** (happy + error + edge); `alta` → **3–5** (cobertura completa). Si existe
132
+ rama de error/edge, debe tener su escenario.
121
133
  - Cada HU pasa los 6 criterios **INVEST**.
122
134
  - Dependencias resueltas (las épicas/HU de las que depende están en `history[]` o no bloquean).
123
135
  - Cabe en el stack del PRD (no requiere tecnología fuera de `stack-allowlist.json`).
@@ -351,8 +363,10 @@ El arnés **no escribe** en `docs/`; cuando una HU no cumple DoR, devuelve el tr
351
363
 
352
364
  ## 10. Reglas duras (resumen)
353
365
 
354
- 1. La **épica** es la unidad de construcción: un slice = una épica = un change = una rama = un PR.
355
- Las HU son alcance interno (`hus[]`).
366
+ 1. La **épica** es la unidad de construcción de **producto**: un slice = una épica = un change = una
367
+ rama = un PR. Las HU son alcance interno (`hus[]`). El **mantenimiento** que no es producto nuevo
368
+ (typo, bump, copy, infra/docs, fix de pocas líneas) usa el carril `building-a-micro-change`, fuera
369
+ de esta regla; cruzar un límite duro (dep nueva, API nueva, dominio/datos) lo escala a épica.
356
370
  2. El **esqueleto que camina** nunca deja de caminar: nada de capas horizontales que se juntan al
357
371
  final; `journey_smoke` verde en cada épica.
358
372
  3. **Dos loops sin duplicación**: gates baratos por épica (inner), gates pesados una vez por release
package/README.md CHANGED
@@ -45,7 +45,7 @@ trycore-build init
45
45
  | `trycore-build update` | Refresca assets y schema tras `npm update -g`. No pisa estado ni allowlist. |
46
46
  | `trycore-build status` | Muestra el estado de la instalación y la fase activa del arnés. |
47
47
  | `trycore-build uninstall` | Quita el arnés. **Preserva** `.claude/state/` y `.claude/config/`. |
48
- | `trycore-build doctor` | Verifica requisitos externos (`openspec`/`python3`/`git`), hooks ejecutables y canales. |
48
+ | `trycore-build doctor` | Verifica requisitos externos (`openspec`/`python3`/`git`), hooks ejecutables y canales; reporta slices sin reflexionar y sugiere **LSP** en stacks tipados. |
49
49
 
50
50
  Flags de `init`: `--copy` (copiar en vez de symlinkear), `--yes` (no interactivo), `--skip-doctor`, `--force-init`, `--stack <deps>`, `--pkg-manager <pm>`, `--runtime <semver>`, `--prd-path <path>`.
51
51
 
@@ -59,7 +59,7 @@ El arnés modela la construcción como dos ciclos anidados, cada uno con su skil
59
59
  DoR → OpenSpec change → TDD → journey-smoke → api/data → DoD → PR + archive
60
60
  ```
61
61
 
62
- Por cada épica del backlog: se valida el **Definition of Ready**, se abre un *change* en OpenSpec, se desarrolla con **TDD**, se corre el smoke del journey, se verifican contratos de API y consistencia de datos, se valida el **Definition of Done** y se cierra con PR + archivado del change.
62
+ Por cada épica del backlog: se valida el **Definition of Ready**, se abre un *change* en OpenSpec, se desarrolla con **TDD**, se corre el smoke del journey, se verifican contratos de API y consistencia de datos, se valida el **Definition of Done** y se cierra con PR + archivado del change. Tras archivar, `/build:reflect` puede capturar las convenciones aprendidas del slice (**ciclo autocorrectivo**, opcional; lo sugiere el hook `reflect-nudge.sh`).
63
63
 
64
64
  ### Outer loop — `releasing-a-version` (una vez por release)
65
65
 
@@ -70,6 +70,7 @@ Gate de release que corre **una sola vez por versión** sobre el conjunto de sli
70
70
  | Command | Propósito |
71
71
  |---|---|
72
72
  | `/build:onboard` | Onboarding capa 2: lee el PRD, pregunta por PII/IA/determinismo/secretos, resuelve `{{placeholders}}` y escribe la auto-memory. |
73
+ | `/build:reflect` | Reflexión post-slice: tras archivar, propone convenciones aprendidas / errores recurrentes al bloque `trycore-build-learnings` de `CLAUDE.md` (tras tu aprobación) y marca el slice como reflexionado. |
73
74
  | `/opsx:explore` | Explora el dominio / specs antes de abrir un change. |
74
75
  | `/opsx:new` | Crea un nuevo OpenSpec change. |
75
76
  | `/opsx:continue` | Retoma un change en curso. |
@@ -88,12 +89,12 @@ trycore-spec-build-harness/
88
89
  ├── METODOLOGIA.md ← fuente de verdad metodológica (gana ante cualquier skill)
89
90
  ├── GOVERNANCE.md ← gobernanza del paquete + cadencia de auditoría
90
91
  ├── .claude-plugin/ ← manifiesto del plugin nativo (canal de conveniencia)
91
- ├── agents/build/ ← 10 agentes revisores (segunda opinión, contexto limpio)
92
+ ├── agents/build/ ← 11 agentes revisores (segunda opinión, contexto limpio)
92
93
  ├── commands/
93
94
  │ ├── opsx/ ← 10 comandos /opsx:* (ciclo OpenSpec)
94
- │ └── build/ ← /build:onboard
95
+ │ └── build/ ← /build:onboard, /build:reflect
95
96
  ├── skills/ ← 12 skills (building-a-slice, releasing-a-version, 10 openspec-*)
96
- ├── hooks/build/ ← 6 hooks bash (gate-check, gitflow-guard, stack-guard, …)
97
+ ├── hooks/build/ ← 9 hooks bash (gate-check, reflect-nudge, scaffold-guard, gitflow-guard, stack-guard, …)
97
98
  ├── state/ ← máquina de estado: build-state.json + schema + README
98
99
  ├── config/ ← stack-allowlist.template.json (artefacto del consumidor)
99
100
  ├── src/ + dist/ ← CLI trycore-build (init/update/status/uninstall/doctor)
@@ -101,7 +102,7 @@ trycore-spec-build-harness/
101
102
  └── docs/examples/reference/ ← ejemplo de referencia (fuera del core, excluido de check-agnostic)
102
103
  ```
103
104
 
104
- Los **10 agentes** en `agents/build/` son: `build-orchestrator`, `dor-dod-gatekeeper`, `security-reviewer`, `simple-design-reviewer`, `ux-krug-reviewer`, `coherence-three-way` (opus), `stack-guardian`, `api-contract-tester`, `data-consistency-checker` y `change-epic-coherence`.
105
+ Los **11 agentes** en `agents/build/` son: `build-orchestrator`, `dor-dod-gatekeeper`, `security-reviewer`, `simple-design-reviewer`, `ux-krug-reviewer`, `coherence-three-way` (opus), `stack-guardian`, `api-contract-tester`, `data-consistency-checker`, `change-epic-coherence` y `ux-fidelity-reviewer`.
105
106
 
106
107
  **Estado.** `state/build-state.json` se siembra **vacío** y nunca se sobreescribe (va al `.gitignore`); el schema y el README sí se versionan. `config/stack-allowlist.json` es artefacto del consumidor: lo siembra el CLI y lo puebla `/build:onboard`. `uninstall` preserva `state/` y `config/`.
107
108
 
@@ -123,7 +124,11 @@ El core no menciona ningún dominio de cliente. Toda parametrización entra por
123
124
 
124
125
  ## Roadmap
125
126
 
126
- - ✅ **v0.1.0 (actual)** — arnés de dos loops (`building-a-slice` + `releasing-a-version`), 10 agentes, comandos `/opsx:*` + `/build:onboard`, 12 skills, 6 hooks, máquina de estado `build-state.json`, allowlist de stack, CLI `trycore-build` (init/update/status/uninstall/doctor) y plugin nativo. Compañero de `@trycore/spec-product-flow`.
127
+ - ✅ **v0.1.0** — arnés de dos loops (`building-a-slice` + `releasing-a-version`), 10 agentes, comandos `/opsx:*` + `/build:onboard`, 12 skills, 6 hooks, máquina de estado `build-state.json`, allowlist de stack, CLI `trycore-build` (init/update/status/uninstall/doctor) y plugin nativo. Compañero de `@trycore/spec-product-flow`.
128
+ - ✅ **v0.2.0** — scaffold como "Paso 1 fundamental": gate de proyecto `scaffold.confirmed` (confirmación **explícita**, no auto), Fase 0 en `building-a-slice`, criterio duro de DoR y hook `scaffold-guard.sh`. El arnés **exige** el scaffold pero **no lo genera**.
129
+ - ✅ **v0.3.0** — **ciclo autocorrectivo** (hook `reflect-nudge.sh` + comando `/build:reflect`: propone convenciones aprendidas al bloque `trycore-build-learnings` de `CLAUDE.md` tras tu aprobación; campos `reflected`/`reflected_at`) y **LSP opt-in** (`docs/customization/lsp-extensions.md` + sugerencia en `doctor` para stacks tipados). Total: **8 hooks**; comandos `/opsx:*` + `/build:onboard` + `/build:reflect`.
130
+ - ✅ **v0.4.0** — carril `building-a-micro-change` (mantenimiento ligero sin slice) + DoR proporcional a la complejidad.
131
+ - ✅ **v0.5.0 (actual)** — seguro de fuente de diseño (`design_source` + `design-source-guard.sh`) + agente `ux-fidelity-reviewer` (gate `fidelity`, inner loop). Total: **11 agentes**, **9 hooks**.
127
132
 
128
133
  ## Licencia
129
134
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.5.0
@@ -19,7 +19,10 @@ La **unidad de construcción es la épica** (`active_slice.epica`); las HU que c
19
19
  1. dor → delega en dor-dod-gatekeeper (abre el slice si pasa)
20
20
  2. change → opsx:new + bloque ## Trazabilidad → delega en change-epic-coherence (gate coherence_link, barato)
21
21
  3. tdd → conduce superpowers:test-driven-development (red→green→refactor)
22
- 4. smoke → recorre el journey-hasta-aquí end-to-end con la skill verify/run (+ chrome-devtools) → gate journey_smoke
22
+ 4. smoke → recorre el journey-hasta-aquí end-to-end con la skill verify/run (+ chrome-devtools) → gate journey_smoke.
23
+ Slices con UI: con la app levantada, delega en ux-fidelity-reviewer (compara la(s) pantalla(s)
24
+ contra el DESIGN_SOURCE) y ESCRIBE gates.fidelity desde su veredicto (FIEL/DESVIACIONES
25
+ justificadas→true; DESVIACIONES→false; INCONCLUSO (MCP no disponible)→deja con nota; sin UI→null).
23
26
  5. api/data → api-contract-tester (si hay endpoints) · data-consistency-checker (si toca datos)
24
27
  6. dod → dor-dod-gatekeeper (cierre por slice, DoD reducido)
25
28
  7. pr → abre PR y archiva el change EN EL MISMO PR (opsx:archive + opsx:sync); back-ref en épica y HU
@@ -29,6 +32,8 @@ La **unidad de construcción es la épica** (`active_slice.epica`); las HU que c
29
32
  **Los agentes pesados ya NO corren aquí.** `security-reviewer`, `simple-design-reviewer`,
30
33
  `ux-krug-reviewer`, `coherence-three-way` y `stack-guardian` (arquitectura) corren **una vez por
31
34
  release** en la skill `releasing-a-version`. Las deps las vigila el hook `stack-guard.sh`.
35
+ El `ux-fidelity-reviewer` **sí** corre aquí (en `smoke`): es barato (la app ya está levantada) y vivo
36
+ por-slice; no es la revisión pesada de UX/Krug (esa sigue en `releasing-a-version`).
32
37
 
33
38
  ## Reglas de orquestación
34
39
  - **No saltes gates.** No avances de fase si el gate previo está en `false`. Reporta qué falta.
@@ -23,16 +23,21 @@ cumplen; lista cada una con ✓/✗:
23
23
  2. Tiene **al menos una HU** asociada y todas se enumeran en `hus[]`.
24
24
  3. **Cada HU** de la épica: frontmatter YAML completo (`id, titulo, epica, prioridad, complejidad,
25
25
  estado`) y `estado: lista`.
26
- 4. **Cada HU**: AC en formato **Given/When/Then**, 3–5 escenarios con happy + error + edge.
26
+ 4. **Cada HU**: AC en formato **Given/When/Then**, **proporcional a `complejidad`** (`trivial`/baja
27
+ 1–2; `media` → 3; `alta` → 3–5), cubriendo los modos de fallo que existen (happy + error/edge
28
+ reales). No exijas 3–5 a una HU trivial; sí exige el escenario de toda rama de error/edge que exista.
27
29
  5. **Cada HU** pasa los 6 criterios **INVEST** (si dudas, invoca al agente `invest-validator`).
28
30
  6. Dependencias declaradas (otras épicas/HU) están en `history[]` del estado o marcadas done.
29
31
  7. El alcance de la épica cabe en el stack declarado del PRD (allowlist) (no exige tecnología fuera de la allowlist).
32
+ 8. **Fuente de diseño (solo slices con UI)**: si la épica toca UI, `design_source.confirmed===true`
33
+ (fuente visual de verdad declarada para el proyecto) y la épica apunta a la(s) pantalla(s)
34
+ equivalente(s) del `DESIGN_SOURCE`. Si no toca UI, este criterio es N/A.
30
35
 
31
36
  Si DoR pasa: propón abrir `active_slice` con `epica`, `hus` (lista de las HU cubiertas),
32
37
  `openspec_change` (kebab del título de la épica), `branch: feature/ep-xxx-<slug>`, `phase: dor`,
33
- `gates: { dor: true, tdd: false, journey_smoke: false, coherence_link: false, data: false, dod: false }`
34
- (`api` en `null` si la épica no toca endpoints; añade `data: null`-equivalente omitiéndolo si no toca
35
- datos). Si falla: reporta ✗ y NO abras el slice.
38
+ `gates: { dor: true, tdd: false, journey_smoke: false, coherence_link: false, data: false, fidelity: false, dod: false }`
39
+ (`api` en `null` si la épica no toca endpoints; **`fidelity` en `null` si la épica NO toca UI**; añade
40
+ `data: null`-equivalente omitiéndolo si no toca datos). Si falla: reporta ✗ y NO abras el slice.
36
41
 
37
42
  ## Definition of Done (gate `dod`) — antes de archivar (DoD **reducido**, por slice)
38
43
  Pasa SOLO si **todos** estos gates del **inner loop** están en `true` (o `null` cuando N/A):
@@ -41,8 +46,10 @@ Pasa SOLO si **todos** estos gates del **inner loop** están en `true` (o `null`
41
46
  3. `coherence_link` — `change-epic-coherence` confirma el enlace change↔épica (`openspec validate` ok).
42
47
  4. `data` — `data-consistency-checker` verde (si el slice toca datos).
43
48
  5. `api` — `api-contract-tester` verde (o `null` si sin endpoints).
44
- 6. Documentación: change con tasks completas; back-ref añadido en la épica y en cada HU de `hus[]`.
45
- 7. Hooks verdes (automáticos): `lint-typecheck.sh`, `stack-guard.sh`, `gitflow-guard.sh`.
49
+ 6. `fidelity` `true` (FIEL o DESVIACIONES justificadas) o `null` (slice sin UI). INCONCLUSO
50
+ (MCP no disponible) se registra en `notes`, no bloquea. Es gate **vivo** de inner loop, no la revisión Krug.
51
+ 7. Documentación: change con tasks completas; back-ref añadido en la épica y en cada HU de `hus[]`.
52
+ 8. Hooks verdes (automáticos): `lint-typecheck.sh`, `stack-guard.sh`, `gitflow-guard.sh`.
46
53
 
47
54
  **NO valides aquí** `security`, `smell`, `ux`, `coherence` (triple completa) ni `stack` (arquitectura):
48
55
  esos son del **Release Gate** (`releasing-a-version`, `release-dod.md`), cadencia por release.
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: ux-fidelity-reviewer
3
+ description: Verifica la FIDELIDAD VISUAL de una pantalla de la app corriendo contra la fuente de diseño declarada (el DESIGN_SOURCE del dominio del consumidor). Complementa al ux-krug-reviewer (que mide usabilidad, no fidelidad). Úsalo en slices con UI, en la fase smoke. Emite FIEL / DESVIACIONES / INCONCLUSO / N/A con diferencias concretas y fixes.
4
+ tools: Read, Grep, Glob, Bash
5
+ model: sonnet
6
+ ---
7
+
8
+ Eres el **revisor de fidelidad visual** del arnés de construcción. Read-only sobre el código. Compruebas
9
+ que una pantalla construida **se parece a la fuente de diseño declarada** por el consumidor (el
10
+ `DESIGN_SOURCE` del bloque de dominio de su CLAUDE.md / su PRD). NO juzgas usabilidad (eso es
11
+ `ux-krug-reviewer`): juzgas si **composición, layout, paleta y tipografía** reproducen el diseño.
12
+
13
+ > Existe porque un re-skin puede acertar los *tokens* (color/fuente) y aun así **ignorar la
14
+ > composición** (p.ej. una sola columna centrada cuando el diseño declara dos paneles).
15
+
16
+ ## Paso 0 — ¿aplica?
17
+ Si el slice **no tiene UI**, devuelve **N/A** y termina (para que el gate `fidelity` quede en `null`),
18
+ igual que `ux-krug-reviewer`.
19
+
20
+ ## Entradas (pídelas si faltan)
21
+ - La(s) pantalla(s) del slice (rutas de la app, p.ej. `<URL-local-del-dev-server>/<ruta>`).
22
+ - La fuente de diseño (`DESIGN_SOURCE`): archivo/URL del prototipo o export, y cómo localizar la
23
+ pantalla equivalente.
24
+ - Tokens de diseño del proyecto (los que declare el stack del PRD del consumidor: variables CSS, tema,
25
+ design tokens), si existen.
26
+
27
+ ## Cómo revisar (estático primero, como ux-krug-reviewer)
28
+ - **Estático (primario)**: lee el código de la pantalla (con la librería de UI del stack declarado en
29
+ el PRD del consumidor) y contrástalo contra la descripción del `DESIGN_SOURCE` y los tokens.
30
+ - **Dinámico (apoyo, si la app corre y hay MCP de inspección de UI habilitado)**: sugiere usar un MCP
31
+ de inspección de UI (p.ej. **chrome-devtools** para web): `new_page`/`take_screenshot` del prototipo
32
+ y de la app, y `take_snapshot` (árbol accesible/DOM) para comparar **estructura**, no solo píxeles.
33
+ Si el MCP **no está disponible** (headless/CI), NO inventes: veredicto **INCONCLUSO (MCP no
34
+ disponible)** + lo que sí se verifique en estático.
35
+ - **Bifurca por la fuente**: si la fuente de diseño es **renderizable** (prototipo HTML / URL
36
+ navegable) usa screenshot + snapshot; si **no es navegable** (export de diseño / imagen / PDF),
37
+ compara contra el export sin `take_snapshot` (no hay DOM que comparar).
38
+
39
+ ## Qué comparar (estructura > píxeles) — ✅ fiel / ⚠️ parcial / ❌ desviación
40
+ - **Layout/composición**: nº y disposición de paneles/columnas, orden de secciones, jerarquía.
41
+ - **Componentes clave presentes**: cada bloque del diseño (barra, hero, tarjetas, footer, callouts) existe.
42
+ - **Paleta**: colores dominantes = tokens declarados; marca usos fuera de paleta.
43
+ - **Tipografía**: familias y escala/peso de titulares vs cuerpo.
44
+ - **Copy estructural**: titulares y CTAs clave coinciden en intención.
45
+ - **Estados**: los estados que el diseño muestra (error, vacío…) existen.
46
+ No penalices desviaciones **justificadas y documentadas** (datos ilustrativos estáticos, copy
47
+ reconciliado por una ADR); lístalas como "desviación intencional". **No pixel-diff** (frágil).
48
+
49
+ ## Salida + mapeo al gate
50
+ Veredicto **FIEL / DESVIACIONES / INCONCLUSO / N/A** + tabla región×veredicto con evidencia + lista
51
+ priorizada de diferencias con su fix (archivo/componente) + desviaciones intencionales aceptadas.
52
+
53
+ Mapeo que aplicará el `build-orchestrator` al escribir `gates.fidelity`:
54
+ - **FIEL** → `true`
55
+ - **DESVIACIONES** todas justificadas/documentadas → `true`
56
+ - **DESVIACIONES** sin justificar → `false`
57
+ - **N/A** (sin UI) → `null`
58
+ - **INCONCLUSO** (MCP no disponible) → el orquestador deja `gates.fidelity: null` con nota
59
+ (INCONCLUSO, MCP no disponible) — **no bloquea** el DoD.
60
+
61
+ Eres read-only: **no editas código ni el estado**. Devuelve el diagnóstico al `build-orchestrator`.
@@ -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,7 @@ 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
47
48
  ```
48
49
 
49
50
  ---
@@ -61,6 +62,9 @@ Voy a leer tu PRD/openspec para proponer valores y confirmar contigo:
61
62
  - **Datos sensibles / PII** (`SENSITIVE_DATA_CATEGORIES`): categorías reguladas del dominio.
62
63
  - **Secretos server-side** (`SERVER_SIDE_SECRETS`): claves/tokens que jamás van al cliente.
63
64
  - **Decisiones de alto impacto** (`HIGH_STAKES_DECISIONS`): decisiones que exigen explicabilidad/justificación en la UI.
65
+ - **Fuente de diseño** (`DESIGN_SOURCE`): ¿el producto tiene UI? Si sí, ruta/URL de la fuente
66
+ visual de verdad (prototipo, export de diseño o mockups) y cómo localizar cada pantalla; si no,
67
+ "N/A". (La escritura del estado `design_source` en `build-state.json` se hace en la Fase 3c.)
64
68
  3. Si un punto no aplica al proyecto, registra explícitamente "no aplica" (no lo dejes como `{{...}}`).
65
69
 
66
70
  ---
@@ -71,7 +75,7 @@ Lee `CLAUDE.md`. Encuentra el bloque entre `<!-- BEGIN trycore-build-harness` y
71
75
 
72
76
  Reemplaza dentro del bloque los placeholders `{{PRD_TECH_PATH}}`, `{{EXTERNAL_SERVICE_LAYER}}`,
73
77
  `{{DETERMINISTIC_LAYER}}`, `{{SENSITIVE_DATA_CATEGORIES}}`, `{{SERVER_SIDE_SECRETS}}`,
74
- `{{HIGH_STAKES_DECISIONS}}` por los valores confirmados.
78
+ `{{HIGH_STAKES_DECISIONS}}`, `{{DESIGN_SOURCE}}` por los valores confirmados.
75
79
 
76
80
  **NO toques nada fuera de los markers.**
77
81
 
@@ -87,6 +91,16 @@ Si el usuario lo desea y existe `package.json` en el proyecto:
87
91
 
88
92
  ---
89
93
 
94
+ ## Fase 3c: (Si hay UI) Confirmar la fuente de diseño en el estado
95
+
96
+ Espejo de la confirmación de scaffold, para `design_source` en `build-state.json`:
97
+ - Si el producto **tiene UI**: setea `design_source.applies=true`, `source` (el puntero confirmado) y
98
+ `confirmed=true` **solo si** el usuario confirma que la fuente de diseño existe (con `confirmed_by`,
99
+ `confirmed_at`). El arnés **no genera** el prototipo.
100
+ - Si **no hay UI**: setea `design_source.applies=false` (el mecanismo de fidelidad queda N/A).
101
+
102
+ ---
103
+
90
104
  ## Fase 4: Guardar en auto-memory
91
105
 
92
106
  Crear/actualizar memorias **tipo `project`** (los valores cambian por proyecto):
@@ -97,6 +111,7 @@ Crear/actualizar memorias **tipo `project`** (los valores cambian por proyecto):
97
111
  - `build_sensitive_data.md` → categorías PII/datos regulados
98
112
  - `build_server_side_secrets.md` → secretos server-side
99
113
  - `build_high_stakes_decisions.md` → decisiones de alto impacto
114
+ - `build_design_source.md` → fuente de diseño / referencia visual
100
115
 
101
116
  Cada memoria con frontmatter `type: project`. Agrega entradas a `MEMORY.md`.
102
117
 
@@ -113,6 +128,7 @@ Determinista: <...>
113
128
  PII/datos: <...>
114
129
  Secretos: <...>
115
130
  Decisiones clave: <...>
131
+ Fuente diseño: <...>
116
132
 
117
133
  CLAUDE.md actualizado. Auto-memory escrita. Los agentes de calidad ya leen tu dominio.
118
134
 
@@ -129,7 +145,7 @@ CLAUDE.md actualizado. Auto-memory escrita. Los agentes de calidad ya leen tu do
129
145
 
130
146
  ## Guardrails
131
147
 
132
- - No avances sin confirmar los 6 puntos. Si el usuario omite alguno, repregunta o marca "no aplica".
148
+ - No avances sin confirmar los 7 puntos. Si el usuario omite alguno, repregunta o marca "no aplica".
133
149
  - Si CLAUDE.md no tiene el bloque marcado (caso raro post-install), pide correr `trycore-build init` (o `update`) antes de seguir.
134
150
  - No inventes valores de dominio que no estén en el PRD ni confirmados por el usuario.
135
151
  - Si un valor ya existe en memory y cambió, sobrescríbelo (los proyectos evolucionan).
@@ -0,0 +1,163 @@
1
+ ---
2
+ name: "BUILD: Reflect"
3
+ description: Reflexión post-slice (ciclo autocorrectivo). Tras cerrar/archivar un slice, detecta convenciones aprendidas y errores recurrentes, PROPONE viñetas para el bloque de aprendizajes de CLAUDE.md (se aplican SOLO con tu aprobación) y estampa el slice como reflexionado. Lo dispara el hook reflect-nudge.sh, pero puedes invocarlo cuando quieras.
4
+ category: Workflow
5
+ tags: [reflexion, conocimiento, ciclo-autocorrectivo, build-harness, trycore]
6
+ ---
7
+
8
+ Captura el **conocimiento tribal** de un slice recién cerrado antes de que se pierda. Un hook bash no
9
+ puede razonar qué se aprendió; **tú (el modelo) sí**. Tu trabajo: detectar convención nueva o error
10
+ recurrente, **proponérselo al usuario**, y —solo con su aprobación— escribirlo al bloque
11
+ `trycore-build-learnings` de `CLAUDE.md`. Nunca escribes sin confirmación.
12
+
13
+ Esta es la mejora del **pilar "ciclo autocorrectivo"**: el hook `reflect-nudge.sh` (evento `Stop`)
14
+ solo **sugiere** ejecutar esto cuando hay slices archivados sin reflexionar; el razonamiento vive
15
+ aquí, en el modelo.
16
+
17
+ ---
18
+
19
+ ## Preflight
20
+
21
+ ```bash
22
+ test -f .claude/.build-harness-version || echo "NOT_INSTALLED"
23
+ command -v python3 >/dev/null 2>&1 || echo "NO_PYTHON3"
24
+ ```
25
+
26
+ **Si `NOT_INSTALLED`:**
27
+
28
+ > Este proyecto no tiene el arnés de construcción instalado. Ejecuta primero `trycore-build init`.
29
+
30
+ Stop aquí si no está instalado o si falta `python3`.
31
+
32
+ ---
33
+
34
+ ## Fase 1: Identificar slices sin reflexionar
35
+
36
+ Lee `.claude/state/build-state.json` y filtra las entradas de `history[]` con `reflected != true`:
37
+
38
+ ```bash
39
+ python3 - <<'PY'
40
+ import json
41
+ d = json.load(open(".claude/state/build-state.json"))
42
+ pend = [h for h in (d.get("history") or []) if h.get("reflected") is not True]
43
+ for h in pend:
44
+ print(h.get("epica"), "·", h.get("openspec_change"), "·", h.get("branch"), "·", ",".join(h.get("hus") or []))
45
+ print("TOTAL", len(pend))
46
+ PY
47
+ ```
48
+
49
+ **Si `TOTAL 0`:** informa "No hay slices pendientes de reflexión ✅" y termina. No inventes trabajo.
50
+
51
+ Si hay varios, procésalos **de uno en uno** (el más reciente primero), o pregunta al usuario cuál.
52
+
53
+ ---
54
+
55
+ ## Fase 2: Recolectar señal del slice
56
+
57
+ Para el slice elegido, reúne evidencia **real** (no especules):
58
+
59
+ 1. **El change OpenSpec**: `openspec show <openspec_change>` y/o los archivos del change
60
+ (proposal/tasks). ¿Qué se decidió y qué tasks costaron más?
61
+ 2. **El diff de la rama**: `git log --oneline <branch>` y `git diff main...<branch> --stat` (si la
62
+ rama o sus commits existen). ¿Qué patrón de código se repitió? ¿Qué se reescribió varias veces?
63
+ 3. **La sesión actual**: qué hooks se dispararon más de una vez (p.ej. `stack-guard.sh`,
64
+ `gitflow-guard.sh`, `lint-typecheck.sh`), qué gates retrocedieron, qué correcciones se repitieron.
65
+
66
+ Con esa evidencia, detecta **0–3** aprendizajes candidatos, de estas categorías:
67
+
68
+ - **Convención nueva**: un patrón de código/estructura/nombrado que se repitió y conviene fijar para
69
+ el equipo (ej. "los handlers validan en el borde con el esquema X antes de tocar el dominio").
70
+ - **Error recurrente**: algo que un gate o hook atrapó >1 vez y vale la pena prevenir
71
+ (ej. "recordar correr migraciones antes del journey-smoke").
72
+ - **Fricción del propio arnés**: si el aprendizaje es sobre el arnés (un gate confuso, un paso que
73
+ sobra), NO lo escribas a CLAUDE.md — anótalo como candidato para `internal/skills/auditar-arnes`
74
+ y dilo al usuario.
75
+
76
+ Si no hay nada que valga la pena fijar, es válido **no proponer aprendizajes** (solo estampar, Fase 5).
77
+
78
+ ---
79
+
80
+ ## Fase 3: Proponer (con aprobación explícita)
81
+
82
+ Por **cada** aprendizaje candidato, usa **AskUserQuestion** para que el usuario lo apruebe, edite o
83
+ descarte. Presenta cada uno como una **viñeta concreta y accionable**, lista para CLAUDE.md. Ejemplo
84
+ de opciones: "Agregar tal cual" (Recomendado) · "Editar" · "Descartar".
85
+
86
+ **Reglas:**
87
+ - Una viñeta = una convención. Concreta, verificable, en presente imperativo. Nada vago.
88
+ - No propongas conocimiento que ya está en el bloque (léelo antes). No dupliques.
89
+ - Si un aprendizaje es **personal/cross-proyecto** (no de equipo), ofrécelo para **auto-memory**
90
+ (`type: project`/`user`) en vez de CLAUDE.md — pregunta cuál destino.
91
+
92
+ ---
93
+
94
+ ## Fase 4: Aplicar SOLO lo aprobado al bloque de aprendizajes
95
+
96
+ Para las viñetas aprobadas, **inserta** (no reemplaces) dentro del bloque marcado de `CLAUDE.md`,
97
+ **justo antes** de `<!-- END trycore-build-learnings -->`:
98
+
99
+ ```markdown
100
+ - (EP-XXX) <viñeta aprobada>
101
+ ```
102
+
103
+ - Prefija cada viñeta con la épica del slice `(EP-XXX)` para trazabilidad.
104
+ - **NO toques nada fuera del bloque** `trycore-build-learnings`. En particular, NO modifiques el
105
+ bloque `trycore-build-harness` ni sus `{{placeholders}}` de dominio (eso es de `/build:onboard`).
106
+ - Si el bloque `trycore-build-learnings` no existe (instalación vieja), pide correr
107
+ `trycore-build update` antes de continuar.
108
+ - Las viñetas son cambio de equipo: se revisan en PR como cualquier otra línea de `CLAUDE.md`.
109
+
110
+ ---
111
+
112
+ ## Fase 5: Estampar el slice como reflexionado
113
+
114
+ Marca el/los slice(s) procesado(s) en `history[]` para que el nudge calle. Usa la hora UTC real:
115
+
116
+ ```bash
117
+ NOW="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
118
+ python3 - "$NOW" "<openspec_change>" <<'PY'
119
+ import json, sys
120
+ now, change = sys.argv[1], sys.argv[2]
121
+ p = ".claude/state/build-state.json"
122
+ d = json.load(open(p))
123
+ for h in d.get("history") or []:
124
+ if h.get("openspec_change") == change:
125
+ h["reflected"] = True
126
+ h["reflected_at"] = now
127
+ json.dump(d, open(p, "w"), indent=2, ensure_ascii=False)
128
+ print("estampado:", change)
129
+ PY
130
+ ```
131
+
132
+ Estampa **aunque no haya habido aprendizajes** (reflexionar y no encontrar nada también cierra el
133
+ ciclo). Repite por cada slice procesado.
134
+
135
+ ---
136
+
137
+ ## Fase 6: Confirmación
138
+
139
+ ```
140
+ ## ✓ Reflexión completada
141
+
142
+ Slice: <EP-XXX> (<openspec_change>)
143
+ Aprendizajes: <N agregados a CLAUDE.md> · <M a auto-memory> · <0 si solo se estampó>
144
+ Estampado: reflected=true
145
+
146
+ Pendientes de reflexión restantes: <K>
147
+ ```
148
+
149
+ Si quedan slices pendientes (`K > 0`), ofrece continuar con el siguiente.
150
+
151
+ ---
152
+
153
+ ## Guardrails
154
+
155
+ - **Aprobación explícita siempre.** Nunca escribes a CLAUDE.md sin que el usuario apruebe cada
156
+ viñeta. Espeja la regla del scaffold: el arnés propone, el humano confirma.
157
+ - **Evidencia, no invención.** Cada aprendizaje sale del change/diff/sesión reales. Si no hay
158
+ evidencia, no propongas.
159
+ - **No reescribas.** Inserta viñetas; jamás borres ni reemplaces aprendizajes previos del equipo.
160
+ - **No toques el paquete.** No modifiques agentes/skills/hooks del arnés (eso es mantenimiento, ver
161
+ `internal/skills/auditar-arnes`).
162
+ - **Estampa siempre** al terminar, para no re-molestar con el mismo slice.
163
+ - Si algo aquí contradice `METODOLOGIA.md`, **gana la metodología**.