@trycore/spec-build-harness 0.8.4 → 0.10.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 +43 -5
- package/INSTALL.md +28 -6
- package/METODOLOGIA.md +65 -10
- package/README.md +41 -7
- package/VERSION +1 -1
- package/agents/build/build-orchestrator.md +33 -7
- package/agents/build/dor-dod-gatekeeper.md +17 -6
- package/agents/build/ux-fidelity-reviewer.md +4 -1
- package/agents/build/wiring-adversarial-verifier.md +52 -5
- package/commands/build/architect.md +1 -1
- package/commands/build/claim.md +46 -0
- package/commands/build/escalate.md +36 -0
- package/commands/build/front.md +9 -3
- package/commands/build/onboard.md +63 -14
- package/commands/build/prototype.md +23 -0
- package/commands/build/reflect.md +60 -40
- package/commands/build/release.md +10 -7
- package/commands/build/resume.md +33 -13
- package/commands/build/slice.md +32 -27
- package/commands/build/status.md +35 -0
- package/commands/build/work.md +11 -8
- package/config/build-config.template.json +4 -0
- package/dist/cli.js +22 -0
- package/dist/commands/doctor.js +42 -0
- package/dist/commands/init.js +84 -1
- package/dist/commands/migrate.js +48 -0
- package/dist/commands/status.js +34 -0
- package/dist/lib/normalize.js +276 -0
- package/dist/lib/paths.js +6 -0
- package/dist/lib/runtime-client.js +196 -0
- package/dist/lib/settings-merge.js +3 -3
- package/dist/lib/state-bundle.js +46 -0
- package/docs/commands.md +32 -9
- package/docs/getting-started.md +2 -1
- package/docs/hooks.md +114 -27
- package/docs/runtime/guia-modo-dual-y-migracion.md +136 -0
- package/docs/runtime/plan-migracion-harness-v0.9.md +11 -0
- package/docs/runtime/protocolo-cliente-runtime.md +109 -34
- package/hooks/build/build-gate-check.sh +21 -0
- package/hooks/build/context-monitor.sh +82 -15
- package/hooks/build/context-sync.sh +192 -0
- package/hooks/build/design-source-guard.sh +31 -3
- package/hooks/build/dual-compare.sh +92 -0
- package/hooks/build/event-emitter.sh +75 -0
- package/hooks/build/gitflow-guard.sh +164 -14
- package/hooks/build/heartbeat.sh +259 -0
- package/hooks/build/lib/agent-context.sh +139 -0
- package/hooks/build/lib/config.sh +27 -0
- package/hooks/build/lib/projection.sh +71 -0
- package/hooks/build/lib/runtime-client.sh +465 -0
- package/hooks/build/lib/runtime-ops.sh +221 -0
- package/hooks/build/lib/state-io.sh +5 -18
- package/hooks/build/load-build-state.sh +64 -2
- package/hooks/build/reflect-nudge.sh +15 -0
- package/hooks/build/release-gate-nudge.sh +15 -0
- package/hooks/build/release-ops.sh +164 -0
- package/hooks/build/scaffold-guard.sh +29 -2
- package/hooks/build/session-start.sh +103 -0
- package/hooks/build/session-stop.sh +22 -0
- package/hooks/build/slice-ops.sh +877 -0
- package/hooks/build/stack-guard.sh +8 -0
- package/hooks/build/statusline-bridge.sh +24 -3
- package/hooks/build-harness.json +16 -0
- package/package.json +3 -3
- package/scripts/check-agnostic.sh +3 -1
- package/scripts/check-pack-clean.sh +31 -0
- package/scripts/check-runtime-purity.sh +43 -0
- package/scripts/lib/front-plan.py +4 -0
- package/scripts/lib/graph-bundle.py +133 -0
- package/scripts/runtime-purity-allow.txt +5 -0
- package/scripts/smoke-test.sh +1 -1
- package/scripts/tests/lib/http-stub.py +46 -0
- package/scripts/tests/test-baseline-verdict.sh +92 -0
- package/scripts/tests/test-config.sh +25 -0
- package/scripts/tests/test-hooks-runtime.sh +853 -0
- package/scripts/tests/test-install.sh +57 -0
- package/scripts/tests/test-runtime-client.sh +298 -0
- package/scripts/tests/test-schema.sh +29 -1
- package/scripts/tests/test-skill-ops.sh +847 -0
- package/skills/building-a-micro-change/SKILL.md +22 -4
- package/skills/building-a-slice/SKILL.md +58 -23
- package/skills/building-a-slice/assets/baseline-verdict.sh +172 -0
- package/skills/building-a-slice/references/dod.md +12 -3
- package/skills/building-a-slice/references/dor.md +7 -3
- package/skills/building-a-slice/references/evidence-budget.md +51 -0
- package/skills/building-a-slice/references/exploration-fanout.md +1 -1
- package/skills/building-a-slice/references/gitflow.md +1 -1
- package/skills/building-a-slice/references/regression-baseline.md +67 -0
- package/skills/building-a-slice/references/runtime-protocol.md +75 -0
- package/skills/building-a-slice/references/state-protocol.md +12 -1
- package/skills/building-a-slice/workflows/README.md +7 -3
- package/skills/building-a-slice/workflows/explore-fanout.workflow.js +3 -3
- package/skills/building-a-slice/workflows/wiring-verify.workflow.js +26 -4
- package/skills/managing-parallel-front/SKILL.md +32 -16
- package/skills/openspec-archive-change/SKILL.md +15 -0
- package/skills/prototyping-screens/SKILL.md +104 -0
- package/skills/prototyping-screens/assets/DESIGN.md.template +55 -0
- package/skills/prototyping-screens/assets/manifest.schema.json +70 -0
- package/skills/prototyping-screens/assets/screen.template.html +34 -0
- package/skills/prototyping-screens/references/aesthetic-directions.md +42 -0
- package/skills/prototyping-screens/references/extraction.md +57 -0
- package/skills/prototyping-screens/references/self-check.md +40 -0
- package/skills/releasing-a-version/SKILL.md +25 -16
- package/skills/releasing-a-version/references/release-dod.md +7 -5
- package/skills/releasing-a-version/workflows/README.md +2 -1
- package/skills/releasing-a-version/workflows/release-gate.workflow.js +6 -5
- package/skills/setup-architecture/SKILL.md +4 -2
- package/state/README.md +20 -3
- package/state/build-state.schema.json +3 -2
- package/templates/CLAUDE.md.template +17 -1
- package/templates/settings-hooks.template.json +8 -4
- package/internal/skills/auditar-arnes/SKILL.md +0 -29
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Extracción viva del UX/UI implementado (modo feature)
|
|
2
|
+
|
|
3
|
+
Protocolo para capturar el **contexto rico real** de la app implementada antes de generar
|
|
4
|
+
pantallas nuevas. La lección de fondo: la fidelidad no sale de "mirar un screenshot", sale de
|
|
5
|
+
**CSS computado real + capturas multi-viewport + estructura**. Todo esto exige la app corriendo
|
|
6
|
+
y un MCP de inspección de UI habilitado (p.ej. chrome-devtools para web); sin ellos, la skill
|
|
7
|
+
ya hizo STOP antes de llegar aquí.
|
|
8
|
+
|
|
9
|
+
## 1. Elegir pantallas representativas (2-3)
|
|
10
|
+
|
|
11
|
+
Criterio: cubrir los patrones que la pantalla nueva va a necesitar —
|
|
12
|
+
- la pantalla de **navegación/layout principal** (caparazón: menús, cabecera, panel central);
|
|
13
|
+
- una pantalla del **mismo tipo** que la que se va a generar (listado si va a haber listado,
|
|
14
|
+
formulario si va a haber formulario, detalle si detalle);
|
|
15
|
+
- si existe, una pantalla ya validada como fiel (`gates.fidelity: true` en `history[]`).
|
|
16
|
+
|
|
17
|
+
## 2. Capturar por cada pantalla
|
|
18
|
+
|
|
19
|
+
1. **Screenshots en 3 viewports** — desktop, tablet y mobile (redimensionar la página antes de
|
|
20
|
+
cada captura). Guardan la referencia de composición y densidad.
|
|
21
|
+
2. **CSS computado de elementos clave** — vía el MCP (evaluar `getComputedStyle` sobre):
|
|
22
|
+
- tipografía real: `font-family`, `font-size`, `font-weight`, `line-height` de titular
|
|
23
|
+
principal, titular secundario, cuerpo y etiquetas;
|
|
24
|
+
- color real: `color`, `background-color`, `border-color` de superficie, texto, acción
|
|
25
|
+
primaria, acción secundaria y estados de énfasis;
|
|
26
|
+
- espaciado real: `padding`/`margin`/`gap` de los contenedores estructurales y de los
|
|
27
|
+
componentes repetidos (tarjetas, filas, campos);
|
|
28
|
+
- `border-radius` y `box-shadow` de los componentes elevados.
|
|
29
|
+
3. **Árbol estructural** — snapshot del árbol accesible/DOM de la pantalla: número y disposición
|
|
30
|
+
de paneles, orden de secciones, jerarquía. Es la referencia de **composición** (estructura >
|
|
31
|
+
píxeles).
|
|
32
|
+
|
|
33
|
+
## 3. Destilar y reconciliar tokens
|
|
34
|
+
|
|
35
|
+
1. Consolida lo capturado en un conjunto de tokens (paleta, tipografía, spacing scale, radios,
|
|
36
|
+
sombras). Los valores repetidos entre pantallas son los tokens; los valores únicos son ruido.
|
|
37
|
+
2. **Si `docs/05-prototipo/tokens.css` ya existe → reconciliar**:
|
|
38
|
+
- **La app real gana** sobre lo declarado: si el token declarado dice un valor y el CSS
|
|
39
|
+
computado dice otro de forma consistente, actualiza el token al valor real.
|
|
40
|
+
- Cada divergencia se **reporta al humano como drift** (tabla token → declarado → real →
|
|
41
|
+
pantallas donde se observó). El drift es señal de que prototipo viejo y app se separaron:
|
|
42
|
+
el humano decide si además hay que corregir la app (fuera del alcance de esta skill).
|
|
43
|
+
3. Si no existe `tokens.css`, créalo desde lo extraído y genera/actualiza `DESIGN.md`
|
|
44
|
+
(`assets/DESIGN.md.template`) con **Procedencia: extracción viva** y la fecha.
|
|
45
|
+
|
|
46
|
+
## 4. Empaquetar el contexto para la generación
|
|
47
|
+
|
|
48
|
+
Antes de generar, deja explícito el paquete de referencia que usará la pantalla nueva:
|
|
49
|
+
- `tokens.css` reconciliado;
|
|
50
|
+
- screenshots de referencia (composición/densidad) de las pantallas capturadas;
|
|
51
|
+
- el árbol estructural del layout principal (dónde vive el contenido en el caparazón);
|
|
52
|
+
- las reglas de componentes observadas (densidad de tablas, anatomía de formularios, etc.),
|
|
53
|
+
anotadas en `DESIGN.md` si no estaban.
|
|
54
|
+
|
|
55
|
+
La generación no "interpreta" este paquete: **copia valores exactos**. Toda desviación deliberada
|
|
56
|
+
se anota como desviación intencional en `notas` del manifest para que `ux-fidelity-reviewer` no
|
|
57
|
+
la penalice después.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Auto-verificación visual del prototipo (ambos modos)
|
|
2
|
+
|
|
3
|
+
El prototipo no se da por bueno porque "se escribió bien": se **renderiza de verdad y se observa
|
|
4
|
+
la salida real** antes de presentarlo al humano. Misma filosofía que el gate `fidelity`
|
|
5
|
+
(verificación visual real, no best-effort), aplicada en dirección inversa: aquí lo verificado es
|
|
6
|
+
el prototipo recién generado.
|
|
7
|
+
|
|
8
|
+
## Protocolo por pantalla generada
|
|
9
|
+
|
|
10
|
+
1. **Renderizar**: abrir el HTML vía `file://` con el MCP de inspección de UI (nueva página).
|
|
11
|
+
Si el archivo no renderiza limpio (recursos rotos, consola con errores), corregir antes de
|
|
12
|
+
comparar nada.
|
|
13
|
+
2. **Capturar**: screenshot en **3 viewports** (desktop, tablet, mobile) + snapshot del árbol
|
|
14
|
+
accesible/DOM.
|
|
15
|
+
3. **Comparar** según el modo:
|
|
16
|
+
- **Feature** — contra el paquete de extracción (`extraction.md`): ¿la tipografía computada
|
|
17
|
+
coincide token a token? ¿la paleta usada es la reconciliada, sin colores fuera? ¿la densidad
|
|
18
|
+
(spacing computado) y el patrón de layout replican los de las pantallas capturadas? ¿la
|
|
19
|
+
pantalla "parece una más" de la app?
|
|
20
|
+
- **Greenfield** — contra `DESIGN.md`/`tokens.css`: **cero valores visuales fuera de tokens**
|
|
21
|
+
(inspeccionar computed styles de los elementos clave); y **consistencia del lote**: mismas
|
|
22
|
+
resoluciones de componente (el mismo tipo de elemento se ve igual) entre las pantallas
|
|
23
|
+
generadas en esta tanda.
|
|
24
|
+
4. **Corregir y re-renderizar** cada divergencia encontrada. **Máximo 3 iteraciones** por
|
|
25
|
+
pantalla; si a la tercera no converge, **parar y reportar al humano** el delta restante
|
|
26
|
+
(qué difiere, dónde, valor esperado vs observado) — nunca presentar como buena una pantalla
|
|
27
|
+
que no pasó su self-check.
|
|
28
|
+
5. **Registrar**: anotar en `manifest.json` los `viewports_verificados` de la pantalla. El
|
|
29
|
+
`estado` sigue siendo `borrador`: el self-check **no aprueba** — aprobar es del humano.
|
|
30
|
+
|
|
31
|
+
## Reglas
|
|
32
|
+
|
|
33
|
+
- **Sin pixel-diff**: la comparación es estructural/semántica (composición, tokens computados,
|
|
34
|
+
densidad, jerarquía), igual que `ux-fidelity-reviewer`. El pixel-diff es frágil y no discrimina
|
|
35
|
+
desviaciones que importan de ruido de render.
|
|
36
|
+
- **Estructura > píxeles**: una columna de más o un panel ausente pesa más que 2px de padding.
|
|
37
|
+
- Las **variantes de estado** (`<slug>--<estado>.html`) pasan el mismo protocolo (suelen ser más
|
|
38
|
+
baratas: heredan la composición de la base).
|
|
39
|
+
- El self-check corre **por lote** en greenfield (tras generar cada tanda) y **por pantalla** en
|
|
40
|
+
feature (pocas pantallas, más exigencia de encaje con la app).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: releasing-a-version
|
|
3
|
-
description: Use when closing a release of the product — runs the heavy review gates ONCE over the accumulated diff of a release line (security, design/smell, UX/Krug, three-way coherence, architecture, and full end-to-end integration with real deps), instead of per epic. This is the outer loop; the per-epic inner loop lives in building-a-slice. Trigger after archiving an epic when the user accepts the Release Gate, or when a Story Map release line is complete.
|
|
3
|
+
description: Use when closing a release of the product — runs the heavy review gates ONCE over the accumulated diff of a release line (security, design/smell, UX/Krug, three-way coherence, architecture, and full end-to-end integration with real deps), instead of per epic. This is the outer loop; the per-epic inner loop lives in building-a-slice. Trigger after archiving an epic when the user accepts the Release Gate, or when a Story Map release line is complete. Reports the six measured verdicts through the agent surface (release-ops.sh verdict); closing the release stays a human act in the hub console.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Release Gate (outer loop) — Build
|
|
@@ -20,8 +20,13 @@ de épicas de la release son las que vas a auditar en bloque.
|
|
|
20
20
|
- O explícitamente: "corre el Release Gate de R1".
|
|
21
21
|
|
|
22
22
|
## Principio de operación
|
|
23
|
-
- **Una sola fuente de verdad
|
|
24
|
-
|
|
23
|
+
- **Una sola fuente de verdad, según el modo** (`bash .claude/hooks/build/slice-ops.sh mode`): en
|
|
24
|
+
`dual`/`runtime` la release vive en el runtime y cada gate se reporta con
|
|
25
|
+
`bash .claude/hooks/build/release-ops.sh verdict <line> <gate> <pass|fail|na>`; en `legacy`, en el
|
|
26
|
+
array `releases[]` del fichero local (protocolo en `building-a-slice/references/state-protocol.md`).
|
|
27
|
+
- **Reportar es de agentes; cerrar es de humanos** (spec §2). El agente mide y reporta los seis
|
|
28
|
+
veredictos; **la release la cierra una persona en la consola del hub** — el token de agente no
|
|
29
|
+
puede hacerlo. `release-ops.sh close-hint <line>` imprime el recordatorio.
|
|
25
30
|
- **Sobre el diff acumulado**: el alcance es el rango de commits de todas las épicas de la release
|
|
26
31
|
(desde el merge anterior a la primera épica de la release hasta `main`).
|
|
27
32
|
- **Delega en subagentes** (devuelven síntesis, protegen el contexto).
|
|
@@ -32,9 +37,9 @@ Esta skill es el **hogar primario** de los workflows del arnés: el Release Gate
|
|
|
32
37
|
(`O(releases)`), fuera del camino caliente del inner loop, y **no** duplica el inner loop (ni TDD ni gates por
|
|
33
38
|
slice). Los `*.workflow.js` bajo `workflows/` son **plantillas de referencia** (no scripts a correr verbatim;
|
|
34
39
|
si contradicen `METODOLOGIA.md`, gana la metodología). Reglas duras:
|
|
35
|
-
- **Read-only sobre el estado.** La plantilla devuelve veredictos; **esta skill** es la única que
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
- **Read-only sobre el estado.** La plantilla devuelve veredictos; **esta skill** es la única que los
|
|
41
|
+
reporta (un `release-ops.sh verdict` por gate; en modo legacy, una entrada en `releases[]` del
|
|
42
|
+
fichero). El agregado lo hace el runtime: **parciales no promueven a `passed`**.
|
|
38
43
|
- **`integration` fuera del paralelo.** Los 5 reviewers pesados van en `parallel()`; el gate `integration`
|
|
39
44
|
(journey completo con **deps reales**) es **secuencial** vía `verify`/`run` y **no** delega en un reviewer.
|
|
40
45
|
|
|
@@ -54,14 +59,19 @@ Ver `workflows/README.md`. Hoy: `workflows/release-gate.workflow.js`.
|
|
|
54
59
|
Checklist de cierre: `references/release-dod.md`.
|
|
55
60
|
|
|
56
61
|
## Cómo proceder
|
|
57
|
-
1.
|
|
58
|
-
|
|
62
|
+
1. Identifica la release y sus épicas: `bash .claude/hooks/build/slice-ops.sh status` + el Story Map
|
|
63
|
+
(`docs/02-user-story-map/`).
|
|
64
|
+
2. No hay entrada que crear: la línea de release existe en el runtime; los veredictos la van poblando.
|
|
59
65
|
3. Dispara los subagentes **en paralelo** sobre el diff acumulado (devuelven síntesis).
|
|
60
66
|
4. Corre el gate de **integración** con la skill `verify`/`run`: el journey completo, deps reales.
|
|
61
|
-
5.
|
|
62
|
-
`
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
5. Reporta **cada** gate en cuanto lo tengas medido, con su evidencia:
|
|
68
|
+
`release-ops.sh verdict R1-mvp security pass --evidence-file informe.txt` (usa `na` cuando el gate
|
|
69
|
+
no aplique — p. ej. `ux` en una release sin UI). Un `rc 6` es el servidor rechazando: muestra su
|
|
70
|
+
razón, no reintentes. Sin red, el veredicto se encola (`rc 5`) y se entrega al reconectar.
|
|
71
|
+
6. Cuando los seis estén reportados, **avisa al humano para el cierre**
|
|
72
|
+
(`release-ops.sh close-hint R1-mvp`): el agente no cierra releases. Si algún gate quedó `fail`,
|
|
73
|
+
lista los hallazgos bloqueantes; el usuario los corrige como un slice normal (fix en
|
|
74
|
+
`building-a-slice`) y se re-corre el Release Gate.
|
|
65
75
|
|
|
66
76
|
> **Opcional — conducir con workflow (releases grandes).** El fan-out del paso 3 puede conducirse con la
|
|
67
77
|
> plantilla `workflows/release-gate.workflow.js` (referencia, no obligatoria): SOLO paraleliza los 5 reviewers
|
|
@@ -69,12 +79,11 @@ Checklist de cierre: `references/release-dod.md`.
|
|
|
69
79
|
> **fuera** del `parallel()`. Pasa por `args` lo que computes **read-only**: `diffRange`, `hasUI` y **`hus[]`**
|
|
70
80
|
> (los IDs de todas las HU de las épicas de la release) — con ≥ 3 HUs el carril `coherence` se shardea por HU
|
|
71
81
|
> (lossless, fail-closed) en vez de recorrerlas en un solo agente; con menos, corre monolítico como siempre.
|
|
72
|
-
> El resultado se
|
|
73
|
-
>
|
|
74
|
-
> promueven a `passed`.
|
|
82
|
+
> El resultado se reporta igual, gate a gate, con `release-ops.sh verdict`; esta skill sigue siendo la
|
|
83
|
+
> única que reporta veredictos de release. Parciales NO promueven a `passed` (lo agrega el runtime).
|
|
75
84
|
|
|
76
85
|
## Reglas duras
|
|
77
86
|
- **No dupliques el inner loop.** Aquí no se hace TDD ni se cierran gates por slice.
|
|
78
|
-
- **Integración con deps reales es obligatoria** para
|
|
87
|
+
- **Integración con deps reales es obligatoria** para que la release pueda cerrarse — es el gate que faltaba y
|
|
79
88
|
por el que el producto "no funcionaba al terminar". No se acepta con todo stubbeado.
|
|
80
89
|
- Si una regla aquí contradice la metodología Trycore (`METODOLOGIA.md`), **gana la metodología**.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Release Gate — checklist de salida (outer loop)
|
|
2
2
|
|
|
3
3
|
Una **release** (línea de release del Story Map) no se da por cerrada hasta cumplir TODO esto. Se
|
|
4
|
-
corre **una vez** sobre el diff acumulado de todas sus épicas. Resultado en `build-state.json` →
|
|
5
|
-
`releases[]
|
|
4
|
+
corre **una vez** sobre el diff acumulado de todas sus épicas. Resultado en el runtime (veredictos por `release-ops.sh verdict`; en modo legacy, en `build-state.json` →
|
|
5
|
+
`releases[]`). El **cierre** de la release lo hace una persona en la consola del hub, nunca el agente.
|
|
6
6
|
|
|
7
7
|
- [ ] **`security`** — `security-reviewer` sin hallazgos CRÍTICO/ALTO sobre el diff completo de la release; claves de servicios externos solo server-side; datos sensibles / PII regulados (según el PRD del consumidor) no persistidos crudos; salida de cualquier servicio externo/IA tratada como input no confiable y validada contra esquema antes de alimentar la capa de decisión.
|
|
8
8
|
- [ ] **`smell`** — `simple-design-reviewer` sin bloqueantes sobre el diff acumulado; 4 reglas de Beck respetadas.
|
|
@@ -12,9 +12,11 @@ corre **una vez** sobre el diff acumulado de todas sus épicas. Resultado en `bu
|
|
|
12
12
|
- [ ] **`integration`** — el **journey completo** de la release se recorre end-to-end con **dependencias reales** del proyecto (servicios externos/IA y capa de decisión reales, según el PRD del consumidor), no stubs. Verificado con la skill `verify`/`run` (+ MCP `chrome-devtools`). Se corre **fuera** del fan-out
|
|
13
13
|
paralelo de reviewers (es **secuencial**, con deps reales); ver `../workflows/release-gate.workflow.js`.
|
|
14
14
|
|
|
15
|
-
**Todo ✓ (o `
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
**Todo ✓ (o `na` cuando N/A)** → los seis veredictos quedan reportados con `release-ops.sh verdict`
|
|
16
|
+
(en modo legacy, `releases[].status: "passed"` en el fichero); el **cierre** lo hace una persona en la
|
|
17
|
+
consola del hub, nunca el agente. **Algo ✗** → se reporta `fail` con la evidencia y se lista el
|
|
18
|
+
hallazgo bloqueante; se corrige como un slice normal en `building-a-slice` y se re-corre el Release
|
|
19
|
+
Gate.
|
|
18
20
|
|
|
19
21
|
> El gate `integration` es el que faltaba en la era anterior: todos los gates por-slice estaban en
|
|
20
22
|
> verde y aun así el producto no caminaba de punta a punta. Sin `integration` con deps reales no hay
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
1. **Hogar primario de los workflows.** El Release Gate corre **una vez por release** (`O(releases)`), fuera
|
|
8
8
|
del camino caliente del inner loop. **No duplica** el inner loop (ni TDD ni gates por slice).
|
|
9
9
|
2. **Read-only sobre el estado.** La plantilla devuelve veredictos; la skill `releasing-a-version` es la
|
|
10
|
-
**única** que
|
|
10
|
+
**única** que reporta los veredictos de release (uno por gate vía `release-ops.sh verdict`; en modo
|
|
11
|
+
legacy, una entrada en `releases[]` validada contra el schema local,
|
|
11
12
|
`updated_by: releasing-a-version`). Parciales **no** promueven a `passed`.
|
|
12
13
|
3. **`integration` fuera del paralelo.** Los 5 reviewers pesados van en `parallel()`; el gate `integration`
|
|
13
14
|
(journey completo con **deps reales**) es **secuencial**, lo corre la skill `verify`/`run`, y **no** delega
|
|
@@ -8,9 +8,10 @@
|
|
|
8
8
|
// caliente del inner loop. NO duplica el inner loop (ni TDD ni gates por slice).
|
|
9
9
|
//
|
|
10
10
|
// READ-ONLY sobre el estado: esta plantilla devuelve un diagnóstico; la skill
|
|
11
|
-
// releasing-a-version es la ÚNICA que
|
|
12
|
-
//
|
|
13
|
-
// Parciales NO promueven a passed. Si METODOLOGIA.md (§5) contradice algo aquí,
|
|
11
|
+
// releasing-a-version es la ÚNICA que reporta los veredictos (release-ops.sh verdict por gate;
|
|
12
|
+
// en modo legacy, una entrada en releases[] del fichero). El agregado y el cierre son del
|
|
13
|
+
// runtime/humano. Parciales NO promueven a passed. Si METODOLOGIA.md (§5) contradice algo aquí,
|
|
14
|
+
// gana la metodología.
|
|
14
15
|
//
|
|
15
16
|
// RUNTIME: corre en el runtime de Workflow de Claude Code, que provee los globals
|
|
16
17
|
// agent()/parallel()/pipeline()/phase()/log()/args y envuelve el cuerpo en un contexto async
|
|
@@ -149,11 +150,11 @@ const reviewersGreen = reviews.filter(Boolean).every((r) => r.na || r.value ===
|
|
|
149
150
|
const status = (reviewersGreen && gates.integration === true) ? 'passed' : 'failed'
|
|
150
151
|
|
|
151
152
|
return {
|
|
152
|
-
status, // releasing-a-version
|
|
153
|
+
status, // reportado por releasing-a-version vía release-ops.sh verdict (agregado y cierre son del runtime/humano).
|
|
153
154
|
gates, // {security, smell, ux, coherence, stack_arch, integration}
|
|
154
155
|
blocking: [
|
|
155
156
|
...reviews.filter((r) => r && r.value === false).map((r) => ({ gate: r.gate, error: r.error || null, findings: r.findings || [] })),
|
|
156
157
|
...(gates.integration === true ? [] : [{ gate: 'integration', findings: (integration && integration.findings) || [] }]),
|
|
157
158
|
],
|
|
158
|
-
note: 'Read-only. releasing-a-version
|
|
159
|
+
note: 'Read-only. releasing-a-version reporta un veredicto por gate (release-ops.sh verdict). El runtime agrega y un humano cierra la release en la consola. Parciales NO promueven a passed.',
|
|
159
160
|
}
|
|
@@ -27,14 +27,16 @@ Negocio → ASRs → Tácticas → Estilos → Vistas → Evaluación (ATAM) →
|
|
|
27
27
|
subárbol **`docs/adr/`** (propiedad de construcción; carve-out declarado en `METODOLOGIA.md`).
|
|
28
28
|
- **Propone, no publica.** Genera los `.md` con estado `proposed` / `living-document`. La promoción a
|
|
29
29
|
`accepted` la hace un humano en la revisión única (fase 5). Forward-compat v0.9: los tipos viven en
|
|
30
|
-
`asset-types.json`;
|
|
30
|
+
`asset-types.json`; con el runtime disponible, la instancia se **propone** por la superficie de
|
|
31
|
+
agente: `bash .claude/hooks/build/slice-ops.sh propose-asset --type-key <k> --path <p> --content-file <f>`
|
|
32
|
+
(la publica un ADMIN; un agente jamás publica contexto).
|
|
31
33
|
- **Autónoma y de propuesta máxima.** La IA rellena todo el catálogo y todos los ADRs de una pasada;
|
|
32
34
|
**no** pregunta campo por campo. Solo se detiene ante **trade-offs de negocio** genuinos (ver fase 5).
|
|
33
35
|
- **Delega la exploración pesada en subagentes** (`asr-extractor`, `architecture-evaluator`): devuelven
|
|
34
36
|
síntesis condensada y protegen el presupuesto de atención de la sesión principal.
|
|
35
37
|
- **Divulgación progresiva:** carga el `references/<tema>.md` solo cuando la fase lo necesita.
|
|
36
38
|
- **El estado es el archivo.** `docs/adr/_backlog-arquitectonico.md` es el estado auto-descriptivo de la
|
|
37
|
-
capa (no
|
|
39
|
+
capa (no transiciona el estado del slice). Re-correr = **incremental**: añade iteraciones, no regenera.
|
|
38
40
|
|
|
39
41
|
## Fases (carga la referencia indicada en cada paso)
|
|
40
42
|
|
package/state/README.md
CHANGED
|
@@ -5,6 +5,15 @@ el que los agentes se sincronizan en modo **secuencial**. La unidad de construcc
|
|
|
5
5
|
(`EP-XXX`)**; las HU que cubre el change se listan en `hus[]` (trazabilidad al alcance interno).
|
|
6
6
|
Cada gate del pipeline transiciona el estado; el siguiente agente lo lee antes de actuar.
|
|
7
7
|
|
|
8
|
+
> **Todo lo anterior describe el modo `legacy` (default).** Si el proyecto corre en modo `dual` o
|
|
9
|
+
> `runtime` (`config/build-config.json#runtime.mode`, opt-in — EP-OR-08, beta), este mismo
|
|
10
|
+
> protocolo lo conducen `hooks/build/slice-ops.sh`/`release-ops.sh` contra el Agent Orchestrator
|
|
11
|
+
> Runtime en vez de (o además de) este fichero: mismas reglas, mismo "quién escribe qué", otro
|
|
12
|
+
> medio. Ver `skills/building-a-slice/references/runtime-protocol.md`,
|
|
13
|
+
> `docs/runtime/protocolo-cliente-runtime.md` y, para migrar un proyecto,
|
|
14
|
+
> `docs/runtime/guia-modo-dual-y-migracion.md`. `legacy` sigue siendo el camino con soporte
|
|
15
|
+
> completo hasta que un piloto real confirme el corte (`docs/runtime/plan-migracion-harness-v0.9.md` §2).
|
|
16
|
+
|
|
8
17
|
- **Esquema**: `build-state.schema.json` (versionado, draft 2020-12). Valida con:
|
|
9
18
|
```bash
|
|
10
19
|
# Recomendado (funciona sin plugins de formato):
|
|
@@ -56,8 +65,9 @@ slice (fases `red…data`) mientras `confirmed` no sea `true`. El arnés **no ge
|
|
|
56
65
|
### `design_source` (gate de proyecto, slices con UI)
|
|
57
66
|
|
|
58
67
|
Espejo de `scaffold` para la UI: `applies` (¿el proyecto tiene UI?), `confirmed` (humano confirmó que
|
|
59
|
-
existe una fuente de diseño declarada), `source` (puntero al prototipo/export). El
|
|
60
|
-
|
|
68
|
+
existe una fuente de diseño declarada), `source` (puntero al prototipo/export). El prototipo puede
|
|
69
|
+
**generarse** con `/build:prototype` (skill `prototyping-screens`, salida en `docs/05-prototipo/`);
|
|
70
|
+
`confirmed` sigue siendo exclusivamente humano. Lo respalda `design-source-guard.sh`.
|
|
61
71
|
|
|
62
72
|
### `foundation` (gate de proyecto, solo greenfield) + `project_kind`
|
|
63
73
|
|
|
@@ -90,7 +100,12 @@ INCONCLUSO ya **no** pasa (queda `false` → el `dod` no cierra hasta correrlo d
|
|
|
90
100
|
Campos por-slice que hacen el **refresh de contexto el estado por defecto** (una sesión fresca retoma
|
|
91
101
|
desde disco, no desde la conversación):
|
|
92
102
|
- **`wiring_checklist[]`** — un item por escenario AC y por punto de integración entre capas; nace
|
|
93
|
-
`failing`, pasa a `passing` **solo tras prueba real ejecutada** (con `evidence`).
|
|
103
|
+
`failing`, pasa a `passing` **solo tras prueba real ejecutada** (con `evidence`). Cada item puede
|
|
104
|
+
llevar además **`verified_at_sha`** (opcional): el sha del commit en que su evidencia fue
|
|
105
|
+
reproducida por última vez. Lo estampa el `build-orchestrator` al aplicar un veredicto del
|
|
106
|
+
`wiring-adversarial-verifier`, y habilita la **re-verificación incremental**: en pasadas
|
|
107
|
+
posteriores solo se re-ejecuta la evidencia de los items cuyo código cambió desde su sha
|
|
108
|
+
(`git diff <sha>..HEAD -- <rutas del item>`); el resto conserva veredicto.
|
|
94
109
|
- **`progress_log[]`** — bitácora append-only (`{at, by, note}`) que sobrevive al reset.
|
|
95
110
|
- **`sub_slices[]`** — descomposición de una épica que superó el gate de tamaño (>3 HU ó ≥3 capas).
|
|
96
111
|
- **gate `wiring_verified`** — lo cierra el `wiring-adversarial-verifier` (subagente **independiente**,
|
|
@@ -114,6 +129,7 @@ El razonamiento vive en el modelo; el hook solo es un recordatorio determinista.
|
|
|
114
129
|
| `gates.coherence_link` | `change-epic-coherence` | slice |
|
|
115
130
|
| `gates.tdd` | flujo `superpowers:test-driven-development` (vía `build-orchestrator`) | slice |
|
|
116
131
|
| `gates.journey_smoke` · `gates.fidelity` · `phase` (transiciones) · `history[]` (archivado) · `wiring_checklist[]` · `progress_log[]` · `sub_slices[]` | `build-orchestrator` (fidelity desde `ux-fidelity-reviewer`) | slice |
|
|
132
|
+
| `wiring_checklist[].verified_at_sha` | `build-orchestrator` (al aplicar un veredicto del `wiring-adversarial-verifier`: estampa el sha en los items cuya evidencia fue reproducida en esa pasada) | por pasada de verificación |
|
|
117
133
|
| `gates.api` | `api-contract-tester` | slice |
|
|
118
134
|
| `gates.data` | `data-consistency-checker` | slice |
|
|
119
135
|
| `gates.wiring_verified` | `wiring-adversarial-verifier` (independiente, contexto virgen) | slice (antes de `dod`) |
|
|
@@ -124,3 +140,4 @@ El razonamiento vive en el modelo; el hook solo es un recordatorio determinista.
|
|
|
124
140
|
| `foundation` (`required`, `checklist[]`, `epic`) | `/build:onboard` Fase 2c | una vez (greenfield) |
|
|
125
141
|
| `foundation.checklist[].evidence` | `build-orchestrator` (durante la construcción de la caparazón) | al construir la caparazón |
|
|
126
142
|
| `foundation.completed_at` | `dor-dod-gatekeeper` (al cerrar el DoD de la épica caparazón) | al archivar la caparazón |
|
|
143
|
+
| `design_source` (`source`, `confirmed`, `confirmed_by/at`, `notes`) | `building-a-slice` Fase 0-bis · `/build:onboard` Fase 3c · `prototyping-screens` (greenfield, solo tras aprobación humana de ≥1 pantalla; `confirmed` humano siempre) | una vez (proyecto) |
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"design_source": {
|
|
65
65
|
"type": "object",
|
|
66
66
|
"additionalProperties": false,
|
|
67
|
-
"description": "Gate de PROYECTO para slices con UI: existe una fuente de diseño declarada (prototipo/export). Espejo de scaffold: confirmed pasa a true SOLO por confirmación humana, nunca por auto-detección. El
|
|
67
|
+
"description": "Gate de PROYECTO para slices con UI: existe una fuente de diseño declarada (prototipo/export). Espejo de scaffold: confirmed pasa a true SOLO por confirmación humana, nunca por auto-detección. El prototipo puede generarse con /build:prototype (skill prototyping-screens); confirmed sigue siendo exclusivamente humano. applies=false apaga todo el mecanismo (proyecto sin UI).",
|
|
68
68
|
"required": ["applies", "confirmed"],
|
|
69
69
|
"properties": {
|
|
70
70
|
"applies": { "type": "boolean", "description": "¿el proyecto tiene UI / hay diseño que respetar? false → mecanismo N/A." },
|
|
@@ -162,7 +162,8 @@
|
|
|
162
162
|
"kind": { "type": "string", "enum": ["hu_ac", "integration_point"], "description": "hu_ac = escenario Given/When/Then de una HU; integration_point = cableado entre dos capas." },
|
|
163
163
|
"ref": { "type": "string", "description": "A qué apunta: el AC (HU-XXX#escenario) o el par de capas (capaA→capaB)." },
|
|
164
164
|
"status": { "type": "string", "enum": ["failing", "passing"], "description": "failing al nacer; passing SOLO tras prueba real ejecutada." },
|
|
165
|
-
"evidence": { "type": "string", "description": "Evidencia de ejecución que justificó passing (test, comando, salida). Vacío mientras failing." }
|
|
165
|
+
"evidence": { "type": "string", "description": "Evidencia de ejecución que justificó passing (test, comando, salida). Vacío mientras failing." },
|
|
166
|
+
"verified_at_sha": { "type": "string", "description": "OPCIONAL. Sha del commit en que la evidence de este item fue reproducida por última vez. Lo estampa el build-orchestrator al aplicar un veredicto del wiring-adversarial-verifier. Habilita la re-verificación incremental: en pasadas posteriores el verificador solo re-ejecuta la evidencia de items cuyo código cambió desde este sha (git diff <sha>..HEAD -- <rutas del item>); los demás conservan veredicto. Ausente = el item nunca fue verificado por el verificador (se re-ejecuta siempre)." }
|
|
166
167
|
}
|
|
167
168
|
}
|
|
168
169
|
},
|
|
@@ -40,6 +40,22 @@ Outer loop (por release): Release Gate (seguridad · diseño · UX · cohe
|
|
|
40
40
|
8. **Cimiento antes que negocio y unidades pequeñas.** Las épicas de cimiento (auth, datos, arquitectura base, design-system) se construyen antes que las de negocio; una épica grande (>3 HU ó ≥3 capas) se descompone en sub-slices construidos de a uno. En proyectos **nuevos** (`project_kind: greenfield`), la **épica caparazón** (app shell: navegación, layout, homepage, login, redirecciones — gate de proyecto `foundation`) se construye y archiva **con evidencia** antes que cualquier épica de negocio; en brownfield el mecanismo es N/A.
|
|
41
41
|
9. Si una regla del arnés contradice la metodología Trycore (`METODOLOGIA.md`), **gana la metodología**.
|
|
42
42
|
|
|
43
|
+
### Ámbito de las reglas de evidencia
|
|
44
|
+
|
|
45
|
+
- Las reglas pesadas — **mutación obligatoria, evidencia anclada a sha, regresión con
|
|
46
|
+
worktree/baseline** — aplican al **inner loop de slices** (fase tdd→dod de `building-a-slice`),
|
|
47
|
+
**no** al carril `building-a-micro-change`: un micro-cambio exige 1 test de regresión si cambia
|
|
48
|
+
comportamiento + la suite del módulo tocado en verde, y cierra en **< 30 min** (mutación opcional;
|
|
49
|
+
los límites duros de escalada a slice quedan intactos).
|
|
50
|
+
- **Presupuesto de mutación**: obligatoria solo para los tests que sostienen un item de
|
|
51
|
+
`wiring_checklist[]` (AC de HU, puntos de integración); opcional para tests auxiliares.
|
|
52
|
+
Alternativa al ciclo manual: mutación automatizada acotada a los ficheros cambiados, con el
|
|
53
|
+
reporte como evidencia.
|
|
54
|
+
- **Dos clases de evidencia**: la **determinista** (runners sin LLM) se re-ancla a HEAD; la **viva**
|
|
55
|
+
(corridas contra el LLM real del proyecto) se ancla al último commit que tocó el módulo medido
|
|
56
|
+
(`anchored_at.sha`; `head_at_run` informativo) y solo se regenera cuando cambió el código que mide.
|
|
57
|
+
Detalle operativo: `.claude/skills/building-a-slice/references/evidence-budget.md`.
|
|
58
|
+
|
|
43
59
|
### Bloque de dominio (lo resuelve `/build:onboard`)
|
|
44
60
|
|
|
45
61
|
Estos puntos de extensión los leen los agentes `security-reviewer`, `stack-guardian`,
|
|
@@ -51,7 +67,7 @@ Estos puntos de extensión los leen los agentes `security-reviewer`, `stack-guar
|
|
|
51
67
|
- **Categorías de datos sensibles / PII reguladas**: {{SENSITIVE_DATA_CATEGORIES}}
|
|
52
68
|
- **Secretos server-side**: {{SERVER_SIDE_SECRETS}}
|
|
53
69
|
- **Decisiones de alto impacto que exigen explicabilidad UX**: {{HIGH_STAKES_DECISIONS}}
|
|
54
|
-
- **Fuente de diseño / referencia visual**: {{DESIGN_SOURCE}}
|
|
70
|
+
- **Fuente de diseño / referencia visual**: {{DESIGN_SOURCE}} (si no existe fuente aún, `/build:prototype` puede generarla en `docs/05-prototipo/`; la confirmación sigue siendo humana)
|
|
55
71
|
|
|
56
72
|
(Si aparecen como `{{...}}`, ejecuta `/build:onboard` para parametrizarlos.)
|
|
57
73
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_comment": "ESPEJO DOCUMENTAL del bloque que `trycore-build init` mergea en el settings.json del consumidor (canal CLI). La fuente de verdad es src/lib/settings-merge.ts. Misma cadena de comando que hooks/build-harness.json (canal plugin) → si se instalan ambos canales, Claude Code deduplica y el hook dispara UNA vez. Permisos MÍNIMOS y enumerados (sin mcp__* ni rutas absolutas).",
|
|
2
|
+
"_comment": "ESPEJO DOCUMENTAL del bloque que `trycore-build init` mergea en el settings.json del consumidor (canal CLI). La fuente de verdad es src/lib/settings-merge.ts. Misma cadena de comando que hooks/build-harness.json (canal plugin) → si se instalan ambos canales, Claude Code deduplica y el hook dispara UNA vez. Permisos MÍNIMOS y enumerados (sin mcp__* ni rutas absolutas). Sincronizado con v0.9 (EP-OR-08-B): session-start.sh, event-emitter.sh y session-stop.sh nuevos; context-sync.sh y heartbeat.sh NO se registran (los invocan otros hooks).",
|
|
3
3
|
"permissions": {
|
|
4
4
|
"allow": [
|
|
5
5
|
"Bash(openspec validate *)",
|
|
@@ -9,17 +9,21 @@
|
|
|
9
9
|
},
|
|
10
10
|
"hooks": {
|
|
11
11
|
"SessionStart": [
|
|
12
|
-
{ "matcher": "startup|clear|compact", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/load-build-state.sh\"" } ] }
|
|
12
|
+
{ "matcher": "startup|clear|compact", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/session-start.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/load-build-state.sh\"" } ] }
|
|
13
13
|
],
|
|
14
14
|
"PreToolUse": [
|
|
15
15
|
{ "matcher": "Bash", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/gitflow-guard.sh\"" } ] },
|
|
16
16
|
{ "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/stack-guard.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/scaffold-guard.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/design-source-guard.sh\"" } ] }
|
|
17
17
|
],
|
|
18
18
|
"PostToolUse": [
|
|
19
|
-
{ "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/lint-typecheck.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/coherence-flag.sh\"" } ] }
|
|
19
|
+
{ "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/lint-typecheck.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/coherence-flag.sh\"" } ] },
|
|
20
|
+
{ "matcher": "Bash|Edit|Write|MultiEdit|Task", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/context-monitor.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/event-emitter.sh\"" } ] }
|
|
21
|
+
],
|
|
22
|
+
"PreCompact": [
|
|
23
|
+
{ "matcher": ".*", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/context-monitor.sh\"" } ] }
|
|
20
24
|
],
|
|
21
25
|
"Stop": [
|
|
22
|
-
{ "matcher": ".*", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/build-gate-check.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/reflect-nudge.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/release-gate-nudge.sh\"" } ] }
|
|
26
|
+
{ "matcher": ".*", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/build-gate-check.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/reflect-nudge.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/release-gate-nudge.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/dual-compare.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/context-monitor.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/session-stop.sh\"" } ] }
|
|
23
27
|
]
|
|
24
28
|
}
|
|
25
29
|
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: auditar-arnes
|
|
3
|
-
description: Skill INTERNA (no se distribuye al consumidor). Audita el propio paquete del arnés cada 3-6 meses — poda de instrucciones obsoletas, validación de herramientas nativas que vuelvan redundante un hook/agente, re-sincronización de convenciones (schema ↔ agentes ↔ skills), y verificación de agnosticismo. Equivale a la cadencia de GOVERNANCE.md.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Auditar el arnés de construcción (mantenimiento del paquete)
|
|
7
|
-
|
|
8
|
-
Skill de **mantenedor**, no de consumidor. Vive en `internal/skills/` y se incluye en el
|
|
9
|
-
paquete npm (`files[]`) pero **NO** la instala el CLI ni la expone el plugin — solo se usa
|
|
10
|
-
trabajando sobre el repo del propio paquete.
|
|
11
|
-
|
|
12
|
-
## Cadencia (cada 3-6 meses)
|
|
13
|
-
|
|
14
|
-
1. **Poda de instrucciones**: borrar reglas que el modelo nuevo ya maneja nativamente
|
|
15
|
-
(las instrucciones obsoletas limitan a modelos más capaces). Revisar agentes y references.
|
|
16
|
-
2. **Validación de herramientas**: ¿hay modos nativos (LSP, MCP nuevos) que vuelvan redundante
|
|
17
|
-
un hook o un agente? Si sí, retirarlo.
|
|
18
|
-
3. **Coherencia de convenciones**: que `state/build-state.schema.json`, los agentes y las skills
|
|
19
|
-
sigan alineados (mismos nombres de gate/fase).
|
|
20
|
-
4. **Agnosticismo**: correr `bash scripts/check-agnostic.sh` y `bash scripts/check-state-clean.sh`;
|
|
21
|
-
confirmar que `docs/examples/` sigue siendo el único lugar con vocabulario de dominio.
|
|
22
|
-
5. **Sincronía de versión**: `bash scripts/check-version-sync.sh` (VERSION / package.json / plugin.json).
|
|
23
|
-
|
|
24
|
-
## Procedimiento
|
|
25
|
-
|
|
26
|
-
- Trabaja en rama (`chore/auditoria-arnes-YYYY-MM`), PR al cierre (el arnés se gobierna a sí mismo).
|
|
27
|
-
- Registra decisiones de poda/cambio en `GOVERNANCE.md` (bitácora).
|
|
28
|
-
- Si cambias el schema de estado, los nombres de gate/fase o la política de hooks, actualiza
|
|
29
|
-
en bloque agentes + skills + schema para no fragmentar convenciones.
|