@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.
- package/.claude-plugin/plugin.json +1 -1
- package/GOVERNANCE.md +24 -5
- package/INSTALL.md +11 -6
- package/METODOLOGIA.md +18 -4
- package/README.md +12 -7
- package/VERSION +1 -1
- package/agents/build/build-orchestrator.md +6 -1
- package/agents/build/dor-dod-gatekeeper.md +13 -6
- package/agents/build/ux-fidelity-reviewer.md +61 -0
- package/commands/build/onboard.md +20 -4
- package/commands/build/reflect.md +163 -0
- package/dist/commands/doctor.js +35 -0
- package/dist/commands/init.js +32 -9
- package/dist/commands/status.js +4 -0
- package/dist/commands/uninstall.js +4 -1
- package/dist/lib/settings-merge.js +2 -2
- package/dist/lib/state-seed.js +1 -0
- package/docs/agents.md +2 -1
- package/docs/commands.md +10 -4
- package/docs/customization/lsp-extensions.md +90 -0
- package/docs/customization/mcp-extensions.md +3 -0
- package/docs/getting-started.md +14 -5
- package/docs/hooks.md +30 -8
- package/hooks/build/design-source-guard.sh +52 -0
- package/hooks/build/lint-typecheck.sh +21 -1
- package/hooks/build/reflect-nudge.sh +29 -0
- package/hooks/build-harness.json +8 -0
- package/package.json +2 -1
- package/skills/building-a-micro-change/SKILL.md +78 -0
- package/skills/building-a-slice/SKILL.md +26 -1
- package/skills/building-a-slice/references/dod.md +4 -0
- package/skills/building-a-slice/references/dor.md +5 -2
- package/skills/building-a-slice/references/gitflow.md +3 -1
- package/skills/building-a-slice/references/mcp-map.md +1 -0
- package/state/README.md +21 -0
- package/state/build-state.schema.json +19 -1
- package/state/build-state.template.json +8 -0
- package/templates/CLAUDE.md.template +8 -1
- package/templates/settings-hooks.template.json +1 -1
- 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.
|
|
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
|
|
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 |
|
|
12
|
-
| Hooks | settings.json +
|
|
13
|
-
| Skill | `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.
|
|
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.
|
|
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/` —
|
|
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/` —
|
|
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
|
|
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
|
|
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/ ←
|
|
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/ ←
|
|
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 **
|
|
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
|
|
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.
|
|
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**,
|
|
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;
|
|
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.
|
|
45
|
-
|
|
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
|
|
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
|
|
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**.
|