@trycore/spec-build-harness 0.5.0 → 0.7.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 +44 -4
- package/INSTALL.md +3 -1
- package/METODOLOGIA.md +89 -14
- package/README.md +8 -14
- package/VERSION +1 -1
- package/agents/build/api-contract-tester.md +8 -0
- package/agents/build/build-orchestrator.md +44 -9
- package/agents/build/change-epic-coherence.md +11 -2
- package/agents/build/coherence-three-way.md +12 -4
- package/agents/build/data-consistency-checker.md +7 -0
- package/agents/build/dor-dod-gatekeeper.md +26 -10
- package/agents/build/security-reviewer.md +11 -3
- package/agents/build/simple-design-reviewer.md +4 -3
- package/agents/build/stack-guardian.md +12 -4
- package/agents/build/ux-fidelity-reviewer.md +22 -15
- package/agents/build/ux-krug-reviewer.md +12 -3
- package/agents/build/wiring-adversarial-verifier.md +66 -0
- package/commands/build/onboard.md +36 -1
- package/commands/build/reflect.md +32 -8
- package/commands/build/release.md +84 -0
- package/commands/build/slice.md +93 -0
- package/commands/build/work.md +68 -0
- package/docs/agents.md +26 -3
- package/docs/customization/mcp-extensions.md +16 -5
- package/docs/getting-started.md +64 -209
- package/docs/super-power-workflows.md +281 -0
- package/hooks/build/build-gate-check.sh +3 -1
- package/hooks/build/load-build-state.sh +44 -6
- package/hooks/build/release-gate-nudge.sh +40 -0
- package/hooks/build/stack-guard.sh +30 -8
- package/hooks/build-harness.json +4 -0
- package/package.json +1 -1
- package/scripts/check-agnostic.sh +1 -1
- package/skills/building-a-slice/SKILL.md +62 -6
- package/skills/building-a-slice/references/dod.md +15 -3
- package/skills/building-a-slice/references/dor.md +6 -3
- package/skills/building-a-slice/references/exploration-fanout.md +36 -0
- package/skills/building-a-slice/references/integration-check.md +27 -0
- package/skills/building-a-slice/references/mcp-map.md +1 -1
- package/skills/building-a-slice/references/state-protocol.md +26 -4
- package/skills/building-a-slice/workflows/README.md +25 -0
- package/skills/building-a-slice/workflows/explore-fanout.workflow.js +77 -0
- package/skills/building-a-slice/workflows/wiring-verify.workflow.js +88 -0
- package/skills/releasing-a-version/SKILL.md +21 -0
- package/skills/releasing-a-version/references/release-dod.md +2 -1
- package/skills/releasing-a-version/workflows/README.md +19 -0
- package/skills/releasing-a-version/workflows/release-gate.workflow.js +104 -0
- package/state/README.md +23 -5
- package/state/build-state.schema.json +51 -4
- package/templates/CLAUDE.md.template +6 -2
- package/templates/integration-check.sh.template +65 -0
|
@@ -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.7.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
|
@@ -8,9 +8,10 @@ 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 | 12 agentes de build | `.claude/agents/build/` |
|
|
12
|
+
| Hooks | settings.json + 10 scripts | `.claude/settings.json`, `.claude/hooks/build/` |
|
|
13
|
+
| Skill | `building-a-slice` (+11 refs · `workflows/`) · `releasing-a-version` (`workflows/`) · `building-a-micro-change` (carril ligero de mantenimiento) | `.claude/skills/` |
|
|
14
|
+
| Comandos | `/opsx:*` · `/build:onboard` · `/build:reflect` · `/build:slice` · `/build:release` · `/build:work` | `.claude/commands/` |
|
|
14
15
|
| Config | allowlist de stack | `.claude/config/stack-allowlist.json` |
|
|
15
16
|
|
|
16
17
|
## Fases de activación (`harness_phase`)
|
|
@@ -28,7 +29,8 @@ evoluciona con el modelo y el proyecto. No es "instalar y olvidar".
|
|
|
28
29
|
hook o un agente? Si sí, retirarlo.
|
|
29
30
|
3. **Allowlist vs PRD**: re-sincronizar `stack-allowlist.json` con la sección de requisitos técnicos del PRD del consumidor (ruta declarada en `stack-allowlist.json#source`) si el stack cambió.
|
|
30
31
|
4. **Coherencia de convenciones**: que `build-state.schema.json`, los agentes y la skill sigan
|
|
31
|
-
alineados (mismos nombres de gate/fase).
|
|
32
|
+
alineados (mismos nombres de gate/fase). Las plantillas `*.workflow.js` de `skills/*/workflows/`
|
|
33
|
+
entran al **mismo barrido agnóstico** que `agents/` y `skills/` (`check-agnostic.sh` incluye `*.js`).
|
|
32
34
|
|
|
33
35
|
## DRI (Directly Responsible Individual)
|
|
34
36
|
Un **Agent Manager** (rol híbrido PM + DevEx) centraliza qué funciona y evita la fragmentación de
|
|
@@ -44,6 +46,44 @@ Editar `stack-allowlist.json` SOLO si la sección de requisitos técnicos del PR
|
|
|
44
46
|
## Bitácora de cambios de metodología
|
|
45
47
|
Cambios a la política de construcción (unidad de trabajo, gates, DoR/DoD). Aprueba el DRI; van por PR.
|
|
46
48
|
|
|
49
|
+
- **2026-06-24 · v0.7.0** — **Workflows dinámicos en el flujo build-a-slice** (origen:
|
|
50
|
+
evaluación adversarial del arnés con workflows dinámicos; 18 mejoras aprobadas contra una rúbrica de
|
|
51
|
+
hardness). **Aprobado por el DRI (Agent Manager); fusionado en PR #7.** No cambia la unidad de trabajo, los gates,
|
|
52
|
+
el DoR ni el DoD — introduce **mecanismos de ejecución** opcionales y endurece componentes existentes.
|
|
53
|
+
Cambios que tocan la metodología: (1) **§1-bis.2** — la exploración solo-lectura puede conducirse con un
|
|
54
|
+
**workflow fan-out** opcional, gated por el size-gate (`sub_slices[]`); read-only, no escribe estado.
|
|
55
|
+
(2) **§1-bis.3** — **plantilla de conducción** opcional del verificador adversarial del gate
|
|
56
|
+
`wiring_verified`; no es gate nuevo y no escribe estado (`build-orchestrator` sigue siendo single-writer).
|
|
57
|
+
(3) **§4** — el nudge "≥2 épicas archivadas desde el último `releases[]`" también lo emite un **hook Stop
|
|
58
|
+
determinista** (`release-gate-nudge.sh`) por aritmética de conjuntos sobre `epicas[]`. (4) **§0** — nuevo
|
|
59
|
+
router de entrada `/build:work` (classify-and-act) que codifica el ruteo micro-change/slice/release (ruteo,
|
|
60
|
+
no política nueva). Hardening sin cambio de política: corrección de la **deriva de nombres de gate** de los 5
|
|
61
|
+
reviewers pesados (`releases[].gates.{security,smell,ux,coherence,stack_arch}`; `stack`→`stack_arch`) y del
|
|
62
|
+
gate de inner loop `coherence_link`; **contrato de degradación segura** de reviewers (fallo de herramienta →
|
|
63
|
+
bloqueante, nunca PASS); refuerzo del `wiring-adversarial-verifier` (evidencia ejecutada, no por inspección);
|
|
64
|
+
**escritura atómica** del estado en `load-build-state.sh`; cierre del **bypass de specs no-semver** en
|
|
65
|
+
`stack-guard.sh`; `check-agnostic.sh` ahora barre `*.js`/`*.mjs`. Artefactos nuevos: **3 comandos**
|
|
66
|
+
(`/build:slice`, `/build:release`, `/build:work`), **1 hook** (`release-gate-nudge.sh`, total **10**),
|
|
67
|
+
**3 plantillas `*.workflow.js`** (read-only) + 1 reference. Empaquetado en el **release 0.7.0** (bump
|
|
68
|
+
simultáneo de `VERSION`, `package.json` y `plugin.json`, por la regla de version-sync).
|
|
69
|
+
|
|
70
|
+
- **2026-06-19 · v0.6.0** — **Calidad de cierre contra horizonte largo** (origen: feedback del equipo
|
|
71
|
+
exodocs tras varios releases, revisado por un experto de Anthropic; raíz: agotamiento de contexto +
|
|
72
|
+
cierre prematuro en épicas multicapa). Toca gates/DoR/DoD y el schema de estado → aprobado por el DRI
|
|
73
|
+
(Agent Manager). Cambios: (1) **handoff fino en disco** — nuevos campos por-slice `wiring_checklist[]`,
|
|
74
|
+
`progress_log[]`, `sub_slices[]` (refresh de contexto = estado por defecto); (2) **gate
|
|
75
|
+
`wiring_verified`** + nuevo agente **`wiring-adversarial-verifier`** (opus, contexto virgen): la
|
|
76
|
+
verificación es adversarial e independiente del generador, prerequisito duro de `dod` (el DoD
|
|
77
|
+
declarativo pasa a ser piso); (3) **cimiento pre-construido** — tag `layer: foundational|business` y
|
|
78
|
+
criterio de DoR que rechaza épicas de negocio que arrastran cimiento no construido (anula la cláusula
|
|
79
|
+
"no bloquean" para el cimiento); (4) **gate de tamaño** en el DoR (>3 HU ó ≥3 capas → descomposición
|
|
80
|
+
en sub-slices) + orquestación por fases con subagentes solo-lectura por área; (5) **runner fuera-de-chat
|
|
81
|
+
`integration-check`** que endurece `journey_smoke` (sin gate nuevo; el `integration` con deps reales
|
|
82
|
+
sigue en el outer loop); (6) **fidelidad estricta** — para UI, `fidelity` exige verificación visual
|
|
83
|
+
real vía MCP (INCONCLUSO ya no pasa). Convenciones anti-deriva (producto completo, no MVP) upstreadas
|
|
84
|
+
al bloque del arnés en `CLAUDE.md`. Se quitó la referencia colgante a `invest-validator` (agente
|
|
85
|
+
inexistente). Total: **12 agentes**.
|
|
86
|
+
|
|
47
87
|
- **2026-06-03 · v0.5.0** — Seguro de fuente de diseño + verificación de fidelidad. Nuevo gate de
|
|
48
88
|
proyecto `design_source` (espejo de scaffold, confirmado por humano; el arnés no genera el prototipo)
|
|
49
89
|
con hook `design-source-guard.sh`; criterio DoR "fuente de diseño identificada" para slices con UI;
|
package/INSTALL.md
CHANGED
|
@@ -13,6 +13,8 @@ Es el **compañero** de [`@trycore/spec-product-flow`](https://www.npmjs.com/pac
|
|
|
13
13
|
| Marketplace | `trycore-build` |
|
|
14
14
|
| Versión | `0.5.0` |
|
|
15
15
|
|
|
16
|
+
> **¿Solo quieres empezar ya?** El [Quickstart](docs/getting-started.md) te lleva de 0 a tu primer slice en pocos comandos. Esta guía es la **referencia detallada** (flags, CI, plugin, troubleshooting).
|
|
17
|
+
|
|
16
18
|
Hay **dos canales** de instalación: el **CLI npm** (canónico, recomendado para operar en un
|
|
17
19
|
proyecto) y el **plugin nativo** de Claude Code (conveniencia a nivel usuario). Lee el
|
|
18
20
|
[caveat de canales](#5-alternativa-plugin-nativo-con-caveat-de-canales) antes de elegir.
|
|
@@ -84,7 +86,7 @@ Qué hace `init`:
|
|
|
84
86
|
|
|
85
87
|
1. **Verifica requisitos duros** (a menos que uses `--skip-doctor`).
|
|
86
88
|
2. **Siembra los assets** en rutas nativas de Claude Code:
|
|
87
|
-
- `.claude/agents/build/` —
|
|
89
|
+
- `.claude/agents/build/` — 12 agentes.
|
|
88
90
|
- `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (`/build:onboard`, `/build:reflect`).
|
|
89
91
|
- `.claude/skills/` — 12 skills (`building-a-slice`, `releasing-a-version`, `openspec-*`).
|
|
90
92
|
- `.claude/hooks/build/` — 9 hooks bash.
|
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`, `/build:reflect`) |
|
|
31
|
+
| Comandos | `trycore/` (`/trycore:*`) | `opsx/` + `build/` (`/opsx:*`, `/build:work`, `/build:slice`, `/build:release`, `/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
|
|
|
@@ -63,6 +63,48 @@ por slice. Y el inner loop **no** dispara reviewers pesados. Cada gate vive en e
|
|
|
63
63
|
|
|
64
64
|
---
|
|
65
65
|
|
|
66
|
+
## 1-bis. Disciplina de horizonte largo (cómo NO dejar cableado a medias)
|
|
67
|
+
|
|
68
|
+
Una épica multicapa (SPA → gateway → core → cola → worker → IA → persistencia) es **demasiado para una
|
|
69
|
+
sola pasada**: a medida que crece el contexto, la atención se degrada ("context rot") y el modelo
|
|
70
|
+
**recorta, difiere o se declara terminado**. Cuatro disciplinas, todas obligatorias, lo previenen:
|
|
71
|
+
|
|
72
|
+
1. **Refresh de contexto = estado por defecto (no un fallback).** Cada iteración nace **headless /
|
|
73
|
+
contexto virgen** y reconstruye el estado desde **disco** (git history + `build-state.json` + logs),
|
|
74
|
+
**no** desde la conversación viva. El handoff fino vive en el estado: **`wiring_checklist[]`** (un item
|
|
75
|
+
por escenario AC y por **punto de integración entre capas**) nace `failing` y pasa a `passing`
|
|
76
|
+
**solo tras prueba real ejecutada**; **`progress_log[]`** deja un hito por sesión. **Mientras quede un
|
|
77
|
+
item `failing`, el cableado NO está hecho** — una sesión fresca no puede "creer que ya está".
|
|
78
|
+
2. **Unidades pequeñas, de a una (descomposición).** El cimiento se construye antes que el negocio
|
|
79
|
+
(épicas `layer: foundational` archivadas antes de las `layer: business`, ver §3.1). Una épica que
|
|
80
|
+
supera el **gate de tamaño** (>3 HU ó ≥3 capas) se trocea en `sub_slices[]` construidos de a uno. El
|
|
81
|
+
orquestador trabaja por **fases encadenadas** (mapear → generar → revisar → fix-loop → optimizar) y
|
|
82
|
+
reparte la **exploración** "ancho antes que profundo" con subagentes **solo-lectura** por área
|
|
83
|
+
(devuelven síntesis condensada); el **cableado** lo hace la sesión, no subagentes en paralelo. Ese
|
|
84
|
+
reparto de exploración solo-lectura **puede** conducirse, de forma OPCIONAL, con un **workflow fan-out**
|
|
85
|
+
(`parallel()`) **SOLO** para épicas que superaron el gate de tamaño (con `sub_slices[]`); en épicas
|
|
86
|
+
atómicas se hace secuencial en sesión. El workflow es **solo-lectura**: no escribe código de producto ni
|
|
87
|
+
`build-state.json` (plantilla en `skills/building-a-slice/workflows/explore-fanout.workflow.js`).
|
|
88
|
+
3. **Verificación adversarial independiente (no DoD declarativo).** Reusar el mismo agente como generador
|
|
89
|
+
y verificador produce **auto-confirmación**. Por eso el gate **`wiring_verified`** lo cierra un
|
|
90
|
+
subagente **independiente, de contexto virgen** (`wiring-adversarial-verifier`) cuyo trabajo es
|
|
91
|
+
**asumir que el slice está incompleto y refutarlo** (stubs, rutas sin cablear, AC sin test, items
|
|
92
|
+
`failing`) **antes** de permitir `dod`. El DoD declarativo del gatekeeper es un **piso, no el arreglo**.
|
|
93
|
+
Esta verificación adversarial **puede** conducirse, de forma OPCIONAL, con una **plantilla de conducción**
|
|
94
|
+
(`skills/building-a-slice/workflows/wiring-verify.workflow.js`) que envuelve al verificador ya existente: (a)
|
|
95
|
+
**NO** es un gate nuevo ni cambia política; (b) **NO** escribe estado — el verificador sigue read-only y
|
|
96
|
+
`build-orchestrator` sigue siendo el **único** escritor de `gates.wiring_verified`; (c) equivale a la prosa
|
|
97
|
+
actual, solo la hace reproducible. Los workflows quedan **acotados a tres hogares** (fan-out de exploración,
|
|
98
|
+
conducción del verificador adversarial, y el Release Gate del §5) y **prohibidos** en el camino caliente de
|
|
99
|
+
las fases del inner loop.
|
|
100
|
+
4. **Producto completo, no MVP (anti-deriva).** El alcance acordado se construye **entero**. **Recortar o
|
|
101
|
+
diferir es bloqueante explícito** que exige acuerdo del equipo — **nunca** una decisión del modelo. No
|
|
102
|
+
se "deja para después" ni se deriva en lo complejo. La verificación es **ejecutada, no por inspección**
|
|
103
|
+
(cargar la página, correr la suite, leer la consola). Estas convenciones viven también en el bloque
|
|
104
|
+
`trycore-build-harness` del `CLAUDE.md` del consumidor (duraderas, sobreviven a la reinstalación).
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
66
108
|
## 2. La regla del "esqueleto que camina"
|
|
67
109
|
|
|
68
110
|
> **Paso 1 fundamental — el scaffold (precondición, NO generada por el arnés).** Antes del primer
|
|
@@ -97,7 +139,9 @@ se listan en `active_slice.hus[]`. Construir por HU individual es sobre-ingenier
|
|
|
97
139
|
> PR, sin abrir `active_slice`). No es una excepción a la regla, sino mantenimiento fuera de su
|
|
98
140
|
> alcance. **Límites duros:** si el cambio añade una dependencia nueva, crea un endpoint/API nuevo, o
|
|
99
141
|
> 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.
|
|
142
|
+
> épica. Ante la duda, es una épica. El comando `/build:work` codifica este *decision gate* (y el default
|
|
143
|
+
> del Release Gate del §4) como **ruteo** —no política nueva—: enruta a `building-a-micro-change`,
|
|
144
|
+
> `building-a-slice` o `releasing-a-version` según el cambio; ante ambigüedad, escala a épica.
|
|
101
145
|
|
|
102
146
|
---
|
|
103
147
|
|
|
@@ -112,9 +156,9 @@ reference). Un gate no se salta.
|
|
|
112
156
|
| 1 | `dor` | Validar Definition of Ready de la épica y sus HU | `dor-dod-gatekeeper` | `dor` | `dor.md` |
|
|
113
157
|
| 2 | `change` | `opsx:new` + bloque `## Trazabilidad`; validar enlace (barato) | `opsx:new`, `change-epic-coherence` | `coherence_link` | `link-change-epic.md` |
|
|
114
158
|
| 3 | `red`→`green`→`refactor` | TDD por cada escenario AC (G/W/T) de cada HU | `superpowers:test-driven-development` | `tdd` | — |
|
|
115
|
-
| 4 | `smoke` | Recorrer el journey-hasta-aquí end-to-end | skill `verify`/`run`
|
|
159
|
+
| 4 | `smoke` | Recorrer el journey-hasta-aquí end-to-end con el **runner determinista fuera-de-chat** en sesión virgen; **UI:** fidelidad por **verificación visual real** (MCP) | runner `integration-check`, skill `verify`/`run` + MCP chrome-devtools, `ux-fidelity-reviewer` | `journey_smoke`, `fidelity` | `mcp-map.md` |
|
|
116
160
|
| 5 | `api`/`data` | Contratos de endpoints + invariantes de datos (si aplican) | `api-contract-tester`, `data-consistency-checker` | `api`, `data` | `newman-tests.md`, `data-consistency.md` |
|
|
117
|
-
| 6 | `dod` |
|
|
161
|
+
| 6 | `dod` | **Primero** verificación adversarial independiente del cableado (contexto virgen) → `wiring_verified`; **luego** Definition of Done reducido | `wiring-adversarial-verifier`, `dor-dod-gatekeeper` | `wiring_verified`, `dod` | `dod.md` |
|
|
118
162
|
| 7 | `pr` | Abrir PR + **archivar el change en el mismo PR** | `opsx:archive`, `opsx:sync` | — | `gitflow.md` |
|
|
119
163
|
| 8 | (decisión) | ¿Correr el Release Gate ahora? (default computado, decide el humano) | usuario | — | §4 |
|
|
120
164
|
|
|
@@ -132,12 +176,20 @@ Una épica **no entra a construcción** hasta cumplir todo (lo valida `dor-dod-g
|
|
|
132
176
|
rama de error/edge, debe tener su escenario.
|
|
133
177
|
- Cada HU pasa los 6 criterios **INVEST**.
|
|
134
178
|
- Dependencias resueltas (las épicas/HU de las que depende están en `history[]` o no bloquean).
|
|
179
|
+
- **Cimiento construido (épicas `layer: business`)**: todo el cimiento que arrastra (autenticación,
|
|
180
|
+
acceso a datos, arquitectura base, design-system/componentes base) ya existe como épica(s)
|
|
181
|
+
`layer: foundational` **archivada(s)**. Si arrastra cimiento no construido → STOP: se extrae a una
|
|
182
|
+
épica fundacional previa. La cláusula "no bloquean" de dependencias **no aplica al cimiento**.
|
|
183
|
+
- **Tamaño acotado (gate de descomposición)**: si la épica supera el umbral —por defecto **> 3 HU** ó
|
|
184
|
+
**≥ 3 capas tocadas**, configurable— se descompone en `sub_slices[]` construidos de a uno
|
|
185
|
+
(`journey_smoke` verde entre cada uno). Umbral proporcional, no cuota rígida.
|
|
135
186
|
- Cabe en el stack del PRD (no requiere tecnología fuera de `stack-allowlist.json`).
|
|
136
187
|
- Datos de prueba disponibles o identificables (fixtures sintéticos del dominio).
|
|
137
188
|
|
|
138
189
|
Si todo ✓ → se abre `active_slice` con `phase: dor`, `gates.dor: true` y el resto en `false`
|
|
139
|
-
(`
|
|
140
|
-
qué falta y se
|
|
190
|
+
—incluido **`wiring_verified: false`**— (`fidelity`/`api` en `null` si la épica no toca UI/endpoints;
|
|
191
|
+
`fidelity` arranca en `false` si toca UI). Si algo ✗ → no se abre el slice; se reporta qué falta y se
|
|
192
|
+
vuelve a discovery.
|
|
141
193
|
|
|
142
194
|
### 3.2 Definition of Done reducido (gate `dod`)
|
|
143
195
|
|
|
@@ -150,6 +202,12 @@ las revisiones pesadas **no** se piden aquí (van al Release Gate):
|
|
|
150
202
|
la trazabilidad triple completa va al Release Gate).
|
|
151
203
|
- `data` — invariantes de datos validadas (si el slice toca datos).
|
|
152
204
|
- `api` — Newman 100% verde (o `null` si el slice no tiene endpoints).
|
|
205
|
+
- `fidelity` (slices con UI) — **ESTRICTO**: solo `true` con verificación visual real vía MCP
|
|
206
|
+
chrome-devtools (screenshot app vs prototipo); INCONCLUSO ya **no** pasa (queda `false`). `null` si
|
|
207
|
+
no toca UI.
|
|
208
|
+
- `wiring_verified` — el `wiring-adversarial-verifier` (subagente **independiente**, contexto virgen)
|
|
209
|
+
intentó refutar el slice y no halló huecos. **Prerequisito duro de `dod`**: el DoD declarativo del
|
|
210
|
+
gatekeeper es un **piso, no el arreglo** (ver §1-bis).
|
|
153
211
|
- OpenSpec: todas las tasks `[x]`; el archive del change va **en el mismo PR**.
|
|
154
212
|
- Back-reference del change añadida en la épica y en cada HU de `hus[]`.
|
|
155
213
|
- Hooks verdes (automáticos, **no** son gates de agente): `lint-typecheck.sh`, `stack-guard.sh`,
|
|
@@ -161,8 +219,10 @@ vía el hook `stack-guard.sh` en tiempo real, no vía subagente.
|
|
|
161
219
|
|
|
162
220
|
### 3.3 Gates por slice y su naturaleza N/A
|
|
163
221
|
|
|
164
|
-
- `
|
|
165
|
-
bloquea** el DoD.
|
|
222
|
+
- `fidelity` y `api` admiten `null` cuando el slice no tiene UI o endpoints. `null` ≠ abierto: **no
|
|
223
|
+
bloquea** el DoD. Pero `fidelity` **no** puede quedar `null` si el slice toca UI (debe llegar a
|
|
224
|
+
`true` por verificación visual real). `wiring_verified` aplica **siempre** (sin `null`) y es
|
|
225
|
+
prerequisito de `dod`.
|
|
166
226
|
- En `harness_phase: authoring` (sin `package.json`) se puede hacer la Fase 0 (crear/confirmar el
|
|
167
227
|
scaffold) + `dor` + `change`, pero los gates de código (`tdd`, `journey_smoke`, `api`, `data`) **no
|
|
168
228
|
se cierran** hasta tener el scaffold confirmado (gate de proyecto `scaffold.confirmed`, ver §2).
|
|
@@ -182,6 +242,12 @@ Tras archivar la épica, `building-a-slice` **pregunta al humano** si correr el
|
|
|
182
242
|
El humano siempre puede sobreescribir el default. Si acepta, se invoca `releasing-a-version` sobre la
|
|
183
243
|
release correspondiente.
|
|
184
244
|
|
|
245
|
+
> El *nudge* "≥ 2 épicas archivadas desde el último entry de `releases[]`" también lo emite un **hook
|
|
246
|
+
> `Stop` determinista** (`release-gate-nudge.sh`), computado por **aritmética de conjuntos** sobre
|
|
247
|
+
> `epicas[]` (archivadas − cubiertas), independiente de timestamps; **solo sugiere** (no ejecuta nada, no
|
|
248
|
+
> llama al modelo, no escribe estado). El criterio "cierra una línea de release" requiere
|
|
249
|
+
> `docs/02-user-story-map/` y por eso **no** lo cubre el hook: lo computa la skill `building-a-slice`.
|
|
250
|
+
|
|
185
251
|
---
|
|
186
252
|
|
|
187
253
|
## 5. Los gates del Release Gate (outer loop)
|
|
@@ -264,8 +330,9 @@ agente lo lee antes de actuar. Estructura: `version`, `harness_phase`, `active_s
|
|
|
264
330
|
3. **Gates monótonos hacia adelante.** Un gate solo pasa de `false`→`true` cuando su agente lo
|
|
265
331
|
aprueba. Si una revisión posterior falla, **se vuelve a `false` y `phase` retrocede** (el retroceso
|
|
266
332
|
está permitido y es la forma de manejar fallos tardíos).
|
|
267
|
-
4. **`null` para N/A.** `
|
|
268
|
-
abiertos para el DoD.
|
|
333
|
+
4. **`null` para N/A.** `fidelity`/`api` son `null` cuando el slice no tiene UI/endpoints; no cuentan
|
|
334
|
+
como abiertos para el DoD. `fidelity` **no** puede ser `null` si toca UI; `wiring_verified` aplica
|
|
335
|
+
siempre y es prerequisito de `dod`.
|
|
269
336
|
5. **Archivar.** Al completar `opsx:archive`, mover `active_slice` a `history[]` con
|
|
270
337
|
`phase: "archived"` y dejar `active_slice: null`.
|
|
271
338
|
6. **Validar tras escribir** contra el schema (con `jsonschema`/`python3`).
|
|
@@ -277,9 +344,10 @@ agente lo lee antes de actuar. Estructura: `version`, `harness_phase`, `active_s
|
|
|
277
344
|
| `active_slice` (alta) · `gates.dor` · `gates.dod` | `dor-dod-gatekeeper` | slice |
|
|
278
345
|
| `gates.coherence_link` | `change-epic-coherence` | slice |
|
|
279
346
|
| `gates.tdd` | flujo `superpowers:test-driven-development` (vía `build-orchestrator`) | slice |
|
|
280
|
-
| `gates.journey_smoke` · `phase`
|
|
347
|
+
| `gates.journey_smoke` · `gates.fidelity` · `phase` · `history[]` · `wiring_checklist[]` · `progress_log[]` · `sub_slices[]` | `build-orchestrator` (fidelity desde `ux-fidelity-reviewer`) | slice |
|
|
281
348
|
| `gates.api` | `api-contract-tester` | slice |
|
|
282
349
|
| `gates.data` | `data-consistency-checker` | slice |
|
|
350
|
+
| `gates.wiring_verified` | `wiring-adversarial-verifier` (independiente, contexto virgen) | slice (antes de `dod`) |
|
|
283
351
|
| `releases[]` (security, smell, ux, coherence, stack_arch, integration, status) | `releasing-a-version` (delega en los reviewers) | release |
|
|
284
352
|
| `harness_phase` | `load-build-state.sh` (SessionStart) | — |
|
|
285
353
|
|
|
@@ -379,6 +447,13 @@ El arnés **no escribe** en `docs/`; cuando una HU no cumple DoR, devuelve el tr
|
|
|
379
447
|
commits/push directos.
|
|
380
448
|
7. **`integration` con dependencias reales es obligatorio** para cerrar una release; sin él no hay
|
|
381
449
|
release.
|
|
382
|
-
8.
|
|
383
|
-
`
|
|
384
|
-
|
|
450
|
+
8. **Disciplina de horizonte largo (§1-bis)**: refresh de contexto por defecto (estado en disco +
|
|
451
|
+
`wiring_checklist[]`); cimiento antes que negocio y descomposición por tamaño/topología; gate
|
|
452
|
+
`wiring_verified` por verificador **adversarial independiente** antes de `dod`; **producto completo,
|
|
453
|
+
no MVP** (recortar/diferir es bloqueante explícito, nunca decisión del modelo; verificación
|
|
454
|
+
ejecutada, no por inspección).
|
|
455
|
+
9. **Fidelidad estricta**: para slices con UI, `fidelity` solo cierra con **verificación visual real**
|
|
456
|
+
(MCP chrome-devtools); INCONCLUSO no pasa.
|
|
457
|
+
10. El core es **agnóstico**: lo específico del dominio se inyecta vía `/build:onboard` y
|
|
458
|
+
`stack-allowlist.json`; el ejemplo de referencia vive en `docs/examples/reference/`.
|
|
459
|
+
11. Si una skill, agente o reference contradice este documento, **gana la metodología**.
|
package/README.md
CHANGED
|
@@ -11,6 +11,8 @@ Ambos paquetes coexisten en el mismo `.claude/` sin colisión: namespaces disjun
|
|
|
11
11
|
|
|
12
12
|
## Cómo se usa (rápido)
|
|
13
13
|
|
|
14
|
+
> **Guía paso a paso:** [`docs/getting-started.md`](docs/getting-started.md) — Quickstart de 0 a tu primer slice.
|
|
15
|
+
|
|
14
16
|
```bash
|
|
15
17
|
# 0) Requisito: OpenSpec (lo usan los comandos /opsx:* y las skills openspec-*)
|
|
16
18
|
npm install -g @fission-ai/openspec
|
|
@@ -35,7 +37,7 @@ trycore-build init
|
|
|
35
37
|
/plugin install trycore-spec-build-harness@trycore-build
|
|
36
38
|
```
|
|
37
39
|
|
|
38
|
-
> **Caveat de canales
|
|
40
|
+
> **Caveat de canales.** Para operar dentro de un proyecto, **usa el canal CLI** (canónico): comandos namespaceados por subcarpeta (`/opsx:*`, `/build:*`) y agentes por nombre. El plugin los namespacea bajo su propio nombre (`/trycore-spec-build-harness:*`) y las cross-references internas asumen el canal CLI. Los hooks son idénticos en ambos canales (se deduplican si coexisten). Detalle → [`INSTALL.md`](INSTALL.md).
|
|
39
41
|
|
|
40
42
|
### Comandos del CLI `trycore-build`
|
|
41
43
|
|
|
@@ -71,16 +73,7 @@ Gate de release que corre **una sola vez por versión** sobre el conjunto de sli
|
|
|
71
73
|
|---|---|
|
|
72
74
|
| `/build:onboard` | Onboarding capa 2: lee el PRD, pregunta por PII/IA/determinismo/secretos, resuelve `{{placeholders}}` y escribe la auto-memory. |
|
|
73
75
|
| `/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. |
|
|
74
|
-
| `/opsx:explore`
|
|
75
|
-
| `/opsx:new` | Crea un nuevo OpenSpec change. |
|
|
76
|
-
| `/opsx:continue` | Retoma un change en curso. |
|
|
77
|
-
| `/opsx:apply` | Aplica los cambios propuestos del change. |
|
|
78
|
-
| `/opsx:verify` | Verifica el change contra sus specs. |
|
|
79
|
-
| `/opsx:archive` | Archiva un change completado. |
|
|
80
|
-
| `/opsx:bulk-archive` | Archiva varios changes en lote. |
|
|
81
|
-
| `/opsx:ff` | Fast-forward de un change. |
|
|
82
|
-
| `/opsx:onboard` | Onboarding de OpenSpec en el repo. |
|
|
83
|
-
| `/opsx:sync` | Sincroniza specs ↔ estado del proyecto. |
|
|
76
|
+
| `/opsx:*` (10) | Ciclo OpenSpec: `explore` · `new` · `continue` · `apply` · `verify` · `archive` · `bulk-archive` · `ff` · `onboard` · `sync`. Detalle → [`docs/commands.md`](docs/commands.md). |
|
|
84
77
|
|
|
85
78
|
## Arquitectura
|
|
86
79
|
|
|
@@ -89,7 +82,7 @@ trycore-spec-build-harness/
|
|
|
89
82
|
├── METODOLOGIA.md ← fuente de verdad metodológica (gana ante cualquier skill)
|
|
90
83
|
├── GOVERNANCE.md ← gobernanza del paquete + cadencia de auditoría
|
|
91
84
|
├── .claude-plugin/ ← manifiesto del plugin nativo (canal de conveniencia)
|
|
92
|
-
├── agents/build/ ←
|
|
85
|
+
├── agents/build/ ← 12 agentes revisores (segunda opinión, contexto limpio)
|
|
93
86
|
├── commands/
|
|
94
87
|
│ ├── opsx/ ← 10 comandos /opsx:* (ciclo OpenSpec)
|
|
95
88
|
│ └── build/ ← /build:onboard, /build:reflect
|
|
@@ -102,7 +95,7 @@ trycore-spec-build-harness/
|
|
|
102
95
|
└── docs/examples/reference/ ← ejemplo de referencia (fuera del core, excluido de check-agnostic)
|
|
103
96
|
```
|
|
104
97
|
|
|
105
|
-
Los **
|
|
98
|
+
Los **12 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`, `ux-fidelity-reviewer` y `wiring-adversarial-verifier` (opus).
|
|
106
99
|
|
|
107
100
|
**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/`.
|
|
108
101
|
|
|
@@ -128,7 +121,8 @@ El core no menciona ningún dominio de cliente. Toda parametrización entra por
|
|
|
128
121
|
- ✅ **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
122
|
- ✅ **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
123
|
- ✅ **v0.4.0** — carril `building-a-micro-change` (mantenimiento ligero sin slice) + DoR proporcional a la complejidad.
|
|
131
|
-
- ✅ **v0.5.0
|
|
124
|
+
- ✅ **v0.5.0** — 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**.
|
|
125
|
+
- ✅ **v0.6.0 (actual)** — **calidad de cierre contra horizonte largo** (feedback exodocs): handoff fino en disco (`wiring_checklist[]` + `progress_log[]` + `sub_slices[]`), gate `wiring_verified` por nuevo agente **`wiring-adversarial-verifier`** (verificación adversarial independiente, contexto virgen), cimiento pre-construido + tag `layer` y gate de tamaño en el DoR, runner fuera-de-chat `integration-check`, y **fidelidad estricta por verificación visual real** (MCP requerido para UI). Convenciones anti-deriva (producto completo, no MVP) upstreadas al bloque del arnés. Total: **12 agentes**, **9 hooks**.
|
|
132
126
|
|
|
133
127
|
## Licencia
|
|
134
128
|
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.7.0
|
|
@@ -29,4 +29,12 @@ Eres el **tester de contratos de API** del arnés de construcción. Si el slice
|
|
|
29
29
|
- Resumen de ejecución (totales, fallos con request + aserción).
|
|
30
30
|
- Veredicto: 100% verde → propón `gates.api: true`; fallos → `false` con el detalle; sin endpoints → `null`.
|
|
31
31
|
|
|
32
|
+
## Degradación segura
|
|
33
|
+
Si **no puedes completar tu verificación** (la app no levanta, `newman`/`npx` ausente, la colección no se puede
|
|
34
|
+
crear, readiness no llega), **NO devuelvas PASS ni inventes**: devuelve veredicto **BLOQUEANTE / INCONCLUSO** con
|
|
35
|
+
el motivo y qué falta para correr. *La ausencia de evidencia no es evidencia de ausencia de problemas.* Distingue
|
|
36
|
+
—como `ux-fidelity-reviewer` (INCONCLUSO ≠ N/A)— el **N/A legítimo** (slice **sin endpoints** → `gates.api: null`)
|
|
37
|
+
de **"no pude verificar"** (fallo de herramienta → `false`). Reserva el `null` SOLO para el N/A genuino (sin
|
|
38
|
+
endpoints), nunca para un fallo de herramienta.
|
|
39
|
+
|
|
32
40
|
No edites código de producto: si faltan casos, propón los requests a añadir. Devuelve al `build-orchestrator`.
|
|
@@ -14,17 +14,41 @@ Protocolo en `.claude/state/README.md`. **Sólo un slice activo a la vez** (mode
|
|
|
14
14
|
La **unidad de construcción es la épica** (`active_slice.epica`); las HU que cubre el change van en
|
|
15
15
|
`active_slice.hus[]`. Un slice = una épica = un change = una rama = un PR.
|
|
16
16
|
|
|
17
|
+
## Trabajo por fases encadenadas (NO one-shot)
|
|
18
|
+
Una épica multicapa es demasiado para una pasada. Trabaja por **fases encadenadas** —**mapear →
|
|
19
|
+
generar → revisar → fix-loop → optimizar**— nunca todo de golpe. Reparte la **exploración** "ancho
|
|
20
|
+
antes que profundo": lanza **subagentes SOLO-LECTURA por área** (frontend/backend/datos) que devuelven
|
|
21
|
+
**síntesis condensada** (~1–2K tokens) para que la sesión gaste su presupuesto en **cablear**, no en
|
|
22
|
+
descubrir. El **cableado lo hace la sesión** (o la sesión de integración), **no** subagentes que
|
|
23
|
+
escriben en paralelo.
|
|
24
|
+
|
|
25
|
+
**Descomposición (gate de tamaño).** Si la épica supera el umbral (>3 HU ó ≥3 capas; configurable),
|
|
26
|
+
el DoR la trocea en `sub_slices[]`: constrúyelos **de a uno**, con `journey_smoke` verde entre cada
|
|
27
|
+
uno, marcando `sub_slices[].status: done` al cerrar cada uno. Para épicas troceadas, la exploración
|
|
28
|
+
solo-lectura por área **puede** conducirse con la plantilla (opcional) `skills/building-a-slice/workflows/
|
|
29
|
+
explore-fanout.workflow.js` (gated por la guarda del propio workflow: `sub_slices[]` no vacío). **No** la uses
|
|
30
|
+
en épicas atómicas: inflaría el inner loop barato. Es read-only; el cableado sigue siendo de la sesión.
|
|
31
|
+
|
|
32
|
+
**Refresh de contexto por defecto.** Mantén el handoff fino en disco. **Siémbralo al entrar a `change`/`tdd`**:
|
|
33
|
+
deriva de las HU de `hus[]` un item de `wiring_checklist[]` por **cada escenario AC** y uno por **cada
|
|
34
|
+
punto de integración entre capas** que el slice toca, todos en `status: failing`. Pásalos a `passing`
|
|
35
|
+
**solo tras prueba real ejecutada** (registrando `evidence`). Deja un hito en `progress_log[]` por sesión.
|
|
36
|
+
Una sesión fresca retoma desde el estado en disco, no desde la conversación. El `wiring-adversarial-verifier`
|
|
37
|
+
auditará después que cada `passing` tenga evidencia real y que no falte ningún item.
|
|
38
|
+
|
|
17
39
|
## Pipeline — inner loop (orden estricto, rápido, SIN subagentes pesados)
|
|
18
40
|
```
|
|
19
|
-
1. dor → delega en dor-dod-gatekeeper (abre el slice si pasa)
|
|
41
|
+
1. dor → delega en dor-dod-gatekeeper (abre el slice si pasa; inicializa wiring_verified:false)
|
|
20
42
|
2. change → opsx:new + bloque ## Trazabilidad → delega en change-epic-coherence (gate coherence_link, barato)
|
|
21
|
-
3. tdd → conduce superpowers:test-driven-development (red→green→refactor)
|
|
22
|
-
4. smoke → recorre el journey-hasta-aquí end-to-end con
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
43
|
+
3. tdd → conduce superpowers:test-driven-development (red→green→refactor); marca items wiring_checklist passing al verde real
|
|
44
|
+
4. smoke → recorre el journey-hasta-aquí end-to-end con el RUNNER fuera-de-chat integration-check
|
|
45
|
+
(suite+build+reporte) en sesión/contexto virgen → gate journey_smoke.
|
|
46
|
+
Slices con UI: con la app levantada, delega en ux-fidelity-reviewer (verificación VISUAL REAL
|
|
47
|
+
vía MCP chrome-devtools) y ESCRIBE gates.fidelity desde su veredicto (FIEL/DESVIACIONES
|
|
48
|
+
justificadas→true; DESVIACIONES→false; INCONCLUSO/sin MCP→FALSE, bloquea; sin UI→null).
|
|
26
49
|
5. api/data → api-contract-tester (si hay endpoints) · data-consistency-checker (si toca datos)
|
|
27
|
-
6. dod →
|
|
50
|
+
6. dod → PRIMERO delega en wiring-adversarial-verifier (subagente INDEPENDIENTE, contexto virgen:
|
|
51
|
+
intenta refutar el slice; cierra gates.wiring_verified) → SOLO si true, dor-dod-gatekeeper (DoD reducido)
|
|
28
52
|
7. pr → abre PR y archiva el change EN EL MISMO PR (opsx:archive + opsx:sync); back-ref en épica y HU
|
|
29
53
|
8. release? → tras archivar, devuelve a la skill building-a-slice para preguntar el Release Gate (default computado)
|
|
30
54
|
```
|
|
@@ -33,7 +57,13 @@ La **unidad de construcción es la épica** (`active_slice.epica`); las HU que c
|
|
|
33
57
|
`ux-krug-reviewer`, `coherence-three-way` y `stack-guardian` (arquitectura) corren **una vez por
|
|
34
58
|
release** en la skill `releasing-a-version`. Las deps las vigila el hook `stack-guard.sh`.
|
|
35
59
|
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`).
|
|
60
|
+
por-slice; no es la revisión pesada de UX/Krug (esa sigue en `releasing-a-version`). El
|
|
61
|
+
`wiring-adversarial-verifier` **también** corre aquí (al inicio de `dod`): es un verificador
|
|
62
|
+
**enfocado y corto** (solo refuta cableado/AC/stubs, no re-revisa diseño/seguridad), e **independiente**
|
|
63
|
+
del que generó el código — por eso evita la auto-confirmación del cierre prematuro. Opcionalmente esa
|
|
64
|
+
verificación se conduce con la plantilla read-only `skills/building-a-slice/workflows/wiring-verify.workflow.js`
|
|
65
|
+
(envuelve al verificador); **tú** —`build-orchestrator`— sigues siendo quien escribe `gates.wiring_verified`
|
|
66
|
+
a partir del veredicto que la plantilla devuelve (la plantilla no toca el estado).
|
|
37
67
|
|
|
38
68
|
## Reglas de orquestación
|
|
39
69
|
- **No saltes gates.** No avances de fase si el gate previo está en `false`. Reporta qué falta.
|
|
@@ -42,7 +72,12 @@ por-slice; no es la revisión pesada de UX/Krug (esa sigue en `releasing-a-versi
|
|
|
42
72
|
- **Una escritura por transición**: actualiza `phase`, el gate tocado, `updated_at` (ISO UTC),
|
|
43
73
|
`updated_by: build-orchestrator`. No toques otros campos.
|
|
44
74
|
- **Gate `api`** puede quedar en `null` si la épica no tiene endpoints (no bloquea DoD). `data` solo
|
|
45
|
-
si el slice toca datos.
|
|
75
|
+
si el slice toca datos. **`fidelity`** no puede quedar `null` si el slice toca UI (debe ser `true`
|
|
76
|
+
por verificación visual real; INCONCLUSO → `false`).
|
|
77
|
+
- **`dod` exige `wiring_verified: true`.** No cierres `dod` sin que el `wiring-adversarial-verifier`
|
|
78
|
+
haya dado verde. El DoD del gatekeeper es declarativo (piso); el verificador independiente es el arreglo.
|
|
79
|
+
- **Producto completo, no MVP.** Construye el alcance acordado entero. **Recortar o diferir es
|
|
80
|
+
bloqueante explícito** que requiere acuerdo del equipo — nunca lo decides tú. No derives en lo complejo.
|
|
46
81
|
- Si `harness_phase` = `authoring` (no hay `package.json`), los gates de código (tdd, journey_smoke,
|
|
47
82
|
api, data) no pueden cerrarse: dilo y detente tras preparar lo que sí aplica.
|
|
48
83
|
- **Tras `archived`**, calcula el default del Release Gate y pásalo a la skill: (a) ¿esta épica
|
|
@@ -35,7 +35,16 @@ que aparezca un OpenSpec change "huérfano" desconectado de la discovery de Tryc
|
|
|
35
35
|
|
|
36
36
|
## Salida
|
|
37
37
|
- Veredicto: **COHERENTE** / **INCOHERENTE**, con lista ✓/✗ y citas textuales (archivo:línea).
|
|
38
|
-
- Si COHERENTE: indica que se puede marcar `gates.
|
|
38
|
+
- Si COHERENTE: indica que se puede marcar `gates.coherence_link: true` (gate del **inner loop**, fase
|
|
39
|
+
`change`). NO es el `coherence` pesado del outer loop (ese lo cierra `coherence-three-way` en
|
|
40
|
+
`releasing-a-version` sobre la implementación real): son gates distintos del schema — `coherence_link`
|
|
41
|
+
(inner, barato, enlace change↔épica) vs `coherence` (release, trazabilidad triple completa).
|
|
39
42
|
- Si INCOHERENTE: por cada ✗, propone el fix concreto (texto exacto a añadir/corregir).
|
|
40
43
|
|
|
41
|
-
|
|
44
|
+
## Degradación segura
|
|
45
|
+
Si **no puedes completar tu verificación** (`openspec validate` no corre, no puedes leer el `proposal.md`/las
|
|
46
|
+
HU/la épica), **NO devuelvas COHERENTE ni inventes**: devuelve **INCOHERENTE / INCONCLUSO** con el motivo y qué
|
|
47
|
+
falta para correr. *La ausencia de evidencia no es evidencia de ausencia de problemas.* Un fallo de herramienta
|
|
48
|
+
**no es N/A**: nunca devuelvas `null` por no poder verificar — devuelve bloqueante/`false`.
|
|
49
|
+
|
|
50
|
+
No edites archivos: devuelve el diagnóstico al `build-orchestrator` (gate de inner loop `coherence_link`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: coherence-three-way
|
|
3
|
-
description: Verifica la coherencia triple AC de las HU de la épica (Given/When/Then) ↔ OpenSpec change(specs/tasks) ↔ código/tests implementados. Detecta AC sin test, tasks sin AC, y código que no traza a ninguna HU. Úsalo en
|
|
3
|
+
description: Verifica la coherencia triple AC de las HU de la épica (Given/When/Then) ↔ OpenSpec change(specs/tasks) ↔ código/tests implementados. Detecta AC sin test, tasks sin AC, y código que no traza a ninguna HU. Úsalo en el Release Gate (releasing-a-version), sobre el diff acumulado de la release.
|
|
4
4
|
tools: Read, Grep, Glob, Bash
|
|
5
5
|
model: opus
|
|
6
6
|
---
|
|
@@ -29,7 +29,15 @@ construcción: nada implementado sin razón, nada especificado sin implementar.
|
|
|
29
29
|
## Salida
|
|
30
30
|
- Matriz de trazabilidad AC ↔ escenario ↔ task ↔ test/código (tabla compacta).
|
|
31
31
|
- Huérfanos top-down (AC de alguna HU sin test) y bottom-up (código sin HU), con `archivo:línea`.
|
|
32
|
-
- Veredicto: **COHERENTE** → propone `gates.coherence: true`; o **INCOHERENTE** con fixes.
|
|
32
|
+
- Veredicto: **COHERENTE** → propone `releases[].gates.coherence: true`; o **INCOHERENTE** con fixes.
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
## Degradación segura
|
|
35
|
+
Si **no puedes completar tu verificación** (no puedes leer las HU/specs/código, `openspec`/LSP ausente, `diff`
|
|
36
|
+
vacío inesperado), **NO devuelvas COHERENTE ni inventes**: devuelve **INCOHERENTE / INCONCLUSO** con el motivo y
|
|
37
|
+
qué falta para correr. *La ausencia de evidencia no es evidencia de ausencia de problemas.* Un fallo de
|
|
38
|
+
herramienta **no es N/A**: nunca devuelvas `null` por no poder verificar — devuelve bloqueante/`false`.
|
|
39
|
+
|
|
40
|
+
Complementa a `change-epic-coherence` (que valida el enlace, gate de inner loop `coherence_link`) verificando la
|
|
41
|
+
**implementación real** (gate de release `coherence`). No edites: devuelve el diagnóstico a la skill
|
|
42
|
+
`releasing-a-version` (Release Gate, **outer loop**), que escribe `releases[].gates`. Cadencia: **una vez por
|
|
43
|
+
RELEASE**, no por slice.
|
|
@@ -45,4 +45,11 @@ bloque de dominio del CLAUDE.md del consumidor / del PRD del consumidor. Este ag
|
|
|
45
45
|
- Invariantes ✓/✗ con evidencia (`archivo:línea` o salida de test).
|
|
46
46
|
- Veredicto: todas ✓ → propón `gates.data: true`; alguna ✗ → `false` con el fix/test faltante.
|
|
47
47
|
|
|
48
|
+
## Degradación segura
|
|
49
|
+
Si **no puedes completar tu verificación** (los tests no corren, runner `vitest`/`jest` ausente, no puedes leer
|
|
50
|
+
la capa de decisión), **NO devuelvas PASS ni inventes**: devuelve veredicto **BLOQUEANTE / INCONCLUSO** con el
|
|
51
|
+
motivo y qué falta para correr. *La ausencia de evidencia no es evidencia de ausencia de problemas.* Un fallo de
|
|
52
|
+
herramienta **no es N/A**: nunca devuelvas `null` por no poder verificar — devuelve bloqueante/`false` (el caso
|
|
53
|
+
N/A de `data` lo decide el `build-orchestrator` por aplicabilidad del slice, no tú por un fallo de herramienta).
|
|
54
|
+
|
|
48
55
|
No edites: devuelve el diagnóstico al `build-orchestrator`.
|
|
@@ -26,18 +26,25 @@ cumplen; lista cada una con ✓/✗:
|
|
|
26
26
|
4. **Cada HU**: AC en formato **Given/When/Then**, **proporcional a `complejidad`** (`trivial`/baja →
|
|
27
27
|
1–2; `media` → 3; `alta` → 3–5), cubriendo los modos de fallo que existen (happy + error/edge
|
|
28
28
|
reales). No exijas 3–5 a una HU trivial; sí exige el escenario de toda rama de error/edge que exista.
|
|
29
|
-
5. **Cada HU** pasa los 6 criterios **INVEST** (
|
|
29
|
+
5. **Cada HU** pasa los 6 criterios **INVEST** (Independent, Negotiable, Valuable, Estimable, Small, Testable); evalúalos tú mismo.
|
|
30
30
|
6. Dependencias declaradas (otras épicas/HU) están en `history[]` del estado o marcadas done.
|
|
31
|
-
7.
|
|
32
|
-
|
|
31
|
+
7. **Cimiento construido (épicas `layer: business`)**: si la épica es de negocio, todo el cimiento que
|
|
32
|
+
arrastra (autenticación, acceso a datos, arquitectura base, design-system/componentes base) ya existe
|
|
33
|
+
como épica(s) `layer: foundational` **archivada(s)** en `history[]`. Si arrastra cimiento no construido,
|
|
34
|
+
**NO abras el slice**: instruye extraerlo a una épica fundacional previa y construirla primero. Aquí la
|
|
35
|
+
cláusula "explícitamente no bloquean" del criterio 6 **NO aplica**: el cimiento bloquea siempre.
|
|
36
|
+
8. **Tamaño acotado**: si la épica supera el umbral del gate de descomposición —heurística por defecto
|
|
37
|
+
**> 3 HU** ó **≥ 3 capas tocadas** (configurable por proyecto)— **no la abras como slice único**:
|
|
38
|
+
instruye descomponerla en `sub_slices[]` construidos de a uno (`journey_smoke` verde entre cada uno).
|
|
39
|
+
9. **Fuente de diseño (solo slices con UI)**: si la épica toca UI, `design_source.confirmed===true`
|
|
33
40
|
(fuente visual de verdad declarada para el proyecto) y la épica apunta a la(s) pantalla(s)
|
|
34
41
|
equivalente(s) del `DESIGN_SOURCE`. Si no toca UI, este criterio es N/A.
|
|
35
42
|
|
|
36
43
|
Si DoR pasa: propón abrir `active_slice` con `epica`, `hus` (lista de las HU cubiertas),
|
|
37
44
|
`openspec_change` (kebab del título de la épica), `branch: feature/ep-xxx-<slug>`, `phase: dor`,
|
|
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
|
|
40
|
-
`
|
|
45
|
+
`gates: { dor: true, tdd: false, journey_smoke: false, coherence_link: false, data: false, fidelity: false, wiring_verified: false, dod: false }`
|
|
46
|
+
(`api` en `null` si la épica no toca endpoints; **`fidelity` en `null` si la épica NO toca UI** —si toca UI
|
|
47
|
+
arranca en `false`—; `wiring_verified` **siempre** arranca en `false`). Si falla: reporta ✗ y NO abras el slice.
|
|
41
48
|
|
|
42
49
|
## Definition of Done (gate `dod`) — antes de archivar (DoD **reducido**, por slice)
|
|
43
50
|
Pasa SOLO si **todos** estos gates del **inner loop** están en `true` (o `null` cuando N/A):
|
|
@@ -46,10 +53,19 @@ Pasa SOLO si **todos** estos gates del **inner loop** están en `true` (o `null`
|
|
|
46
53
|
3. `coherence_link` — `change-epic-coherence` confirma el enlace change↔épica (`openspec validate` ok).
|
|
47
54
|
4. `data` — `data-consistency-checker` verde (si el slice toca datos).
|
|
48
55
|
5. `api` — `api-contract-tester` verde (o `null` si sin endpoints).
|
|
49
|
-
6. `fidelity` — `true` (FIEL o DESVIACIONES justificadas) o `null` (slice sin UI).
|
|
50
|
-
(
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
6. `fidelity` — `true` (FIEL o DESVIACIONES justificadas) o `null` (slice sin UI). **ESTRICTO para UI**
|
|
57
|
+
(`design_source.applies===true`): solo `true` si hubo **verificación visual real** vía MCP
|
|
58
|
+
chrome-devtools (screenshot app vs prototipo). **INCONCLUSO ya NO pasa**: sin MCP queda `false` y el
|
|
59
|
+
`dod` no cierra (correr donde haya MCP). Es gate **vivo** de inner loop, no la revisión Krug.
|
|
60
|
+
6-bis. **Sub-slices completos**: si `active_slice.sub_slices[]` no está vacío, **todos** deben estar en
|
|
61
|
+
`status: done` (cada uno con su `journey_smoke` verde). Una épica descompuesta no cierra `dod` con
|
|
62
|
+
sub-slices pendientes (sería cierre prematuro de alcance).
|
|
63
|
+
7. **`wiring_verified`** — `true`. Prerequisito **duro** de `dod`: lo cierra el `wiring-adversarial-verifier`
|
|
64
|
+
(subagente **independiente**, contexto virgen) tras intentar refutar el slice (stubs, rutas sin cablear,
|
|
65
|
+
AC sin test, items de `wiring_checklist[]` aún `failing`) y no hallar huecos. **Tu DoD declarativo es un
|
|
66
|
+
piso, no el arreglo**: no marques `dod` sin `wiring_verified: true`.
|
|
67
|
+
8. Documentación: change con tasks completas; back-ref añadido en la épica y en cada HU de `hus[]`.
|
|
68
|
+
9. Hooks verdes (automáticos): `lint-typecheck.sh`, `stack-guard.sh`, `gitflow-guard.sh`.
|
|
53
69
|
|
|
54
70
|
**NO valides aquí** `security`, `smell`, `ux`, `coherence` (triple completa) ni `stack` (arquitectura):
|
|
55
71
|
esos son del **Release Gate** (`releasing-a-version`, `release-dod.md`), cadencia por release.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: security-reviewer
|
|
3
|
-
description: Revisión de seguridad del slice con foco en el dominio declarado por el consumidor (PII/datos regulados, claves de servicios externos, validación de entrada). Envuelve la lógica de /security-review y la especializa para este proyecto. Úsalo en la
|
|
3
|
+
description: Revisión de seguridad del slice con foco en el dominio declarado por el consumidor (PII/datos regulados, claves de servicios externos, validación de entrada). Envuelve la lógica de /security-review y la especializa para este proyecto. Úsalo en el Release Gate (releasing-a-version), sobre el diff acumulado de la release. Requiere código.
|
|
4
4
|
tools: Read, Grep, Glob, Bash
|
|
5
5
|
model: sonnet
|
|
6
6
|
---
|
|
@@ -41,6 +41,14 @@ consumidor o de su PRD (la sección de requisitos técnicos del PRD, en la ruta
|
|
|
41
41
|
|
|
42
42
|
## Salida
|
|
43
43
|
- Hallazgos por severidad **CRÍTICO / ALTO / MEDIO / BAJO** con `archivo:línea` y remediación.
|
|
44
|
-
- Veredicto: sin CRÍTICO/ALTO abiertos → propón `gates.security: true`; si los hay → `false`.
|
|
44
|
+
- Veredicto: sin CRÍTICO/ALTO abiertos → propón `releases[].gates.security: true`; si los hay → `false`.
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
## Degradación segura
|
|
47
|
+
Si **no puedes completar tu verificación** (herramienta/comando indisponible, app no levantable, `diff`
|
|
48
|
+
vacío inesperado, runner/`npm audit` ausente), **NO devuelvas PASS ni inventes**: devuelve veredicto
|
|
49
|
+
**BLOQUEANTE / INCONCLUSO** con el motivo y qué falta para correr. *La ausencia de evidencia no es evidencia
|
|
50
|
+
de ausencia de problemas.* Un fallo de herramienta **no es N/A**: nunca devuelvas `null` por no poder
|
|
51
|
+
verificar — devuelve bloqueante/`false`.
|
|
52
|
+
|
|
53
|
+
No edites: devuelve el diagnóstico a la skill `releasing-a-version` (Release Gate, **outer loop**), que
|
|
54
|
+
escribe `releases[].gates`. Cadencia: **una vez por RELEASE**, no por slice.
|