@trycore/spec-build-harness 0.8.5 → 0.11.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 +27 -4
- package/INSTALL.md +27 -5
- package/METODOLOGIA.md +55 -5
- package/README.md +39 -6
- package/VERSION +1 -1
- package/agents/build/build-orchestrator.md +33 -7
- package/agents/build/dor-dod-gatekeeper.md +13 -5
- 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 +75 -14
- package/commands/build/prototype.md +3 -2
- 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 +32 -0
- package/dist/commands/doctor.js +42 -0
- package/dist/commands/init.js +84 -1
- package/dist/commands/migrate.js +153 -0
- package/dist/commands/status.js +34 -0
- package/dist/lib/normalize.js +1123 -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 +150 -0
- package/docs/commands.md +25 -8
- package/docs/getting-started.md +1 -0
- package/docs/hooks.md +114 -27
- package/docs/runtime/guia-modo-dual-y-migracion.md +143 -0
- package/docs/runtime/plan-migracion-harness-v0.9.md +11 -0
- package/docs/runtime/protocolo-cliente-runtime.md +120 -35
- 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 +30 -2
- package/hooks/build/dual-compare.sh +92 -0
- package/hooks/build/event-emitter.sh +32 -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 +625 -0
- package/hooks/build/lib/runtime-ops.sh +227 -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 +171 -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 +948 -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/denylist.txt +4 -0
- package/scripts/lib/front-plan.py +4 -0
- package/scripts/lib/graph-bundle.py +181 -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 +828 -0
- package/scripts/tests/test-install.sh +103 -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 +1367 -0
- package/skills/building-a-micro-change/SKILL.md +22 -4
- package/skills/building-a-slice/SKILL.md +55 -21
- 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 +3 -2
- 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 +9 -5
- package/skills/releasing-a-version/SKILL.md +26 -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 +16 -1
- package/state/build-state.schema.json +2 -1
- package/templates/CLAUDE.md.template +16 -0
- package/templates/settings-hooks.template.json +8 -4
- package/internal/skills/auditar-arnes/SKILL.md +0 -29
|
@@ -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.11.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
|
@@ -7,12 +7,14 @@ evoluciona con el modelo y el proyecto. No es "instalar y olvidar".
|
|
|
7
7
|
| Capa | Artefactos | Ubicación |
|
|
8
8
|
|---|---|---|
|
|
9
9
|
| Contexto | sección Construcción de CLAUDE.md, `openspec/project.md` | raíz / `openspec/` |
|
|
10
|
-
| Estado | `build-state.json` (+schema, README) | `.claude/state/` |
|
|
10
|
+
| Estado (modo `legacy`, default) | `build-state.json` (+schema, README) | `.claude/state/` |
|
|
11
|
+
| Cliente runtime (modo `dual`/`runtime`, opt-in — beta) | `runtime.credentials` (0600), `context.lock`, `runtime-projection.json`, `outbox/`; `slice-ops.sh`/`release-ops.sh` (13 subcomandos) | `.claude/state/`, `.claude/hooks/build/` |
|
|
11
12
|
| Agentes | 14 agentes de build | `.claude/agents/build/` |
|
|
12
|
-
| Hooks | settings.json +
|
|
13
|
+
| Hooks | settings.json + 19 scripts (15 registrados + 4 invocados: `reconcile-build-state.py`, `context-sync.sh`, `heartbeat.sh` como daemon, `statusline-bridge.sh` como comando `statusLine`) | `.claude/settings.json`, `.claude/hooks/build/` |
|
|
13
14
|
| Skill | `building-a-slice` (+11 refs · `workflows/`) · `releasing-a-version` (`workflows/`) · `building-a-micro-change` (carril ligero de mantenimiento) · `managing-parallel-front` (front paralelo inter-épica) · `prototyping-screens` (prototipo HTML de referencia) | `.claude/skills/` |
|
|
14
|
-
| Comandos | `/opsx:*` · `/build:onboard` · `/build:reflect` · `/build:prototype` · `/build:slice` · `/build:release` · `/build:work` · `/build:resume` · `/build:front` | `.claude/commands/` |
|
|
15
|
-
| Config | allowlist de stack | `.claude/config
|
|
15
|
+
| Comandos | `/opsx:*` · `/build:onboard` · `/build:reflect` · `/build:prototype` · `/build:slice` · `/build:release` · `/build:work` · `/build:resume` · `/build:front` · `/build:claim` · `/build:status` · `/build:escalate` | `.claude/commands/` |
|
|
16
|
+
| Config | allowlist de stack, `build-config.json` (umbrales de contexto + `runtime.mode`) | `.claude/config/` |
|
|
17
|
+
| CLI (`trycore-build`) | `init`/`update`/`status`/`doctor`/`uninstall`/`migrate` | `src/` → `dist/` (este repo, no el consumidor) |
|
|
16
18
|
|
|
17
19
|
## Fases de activación (`harness_phase`)
|
|
18
20
|
- **authoring** (actual): aún no hay `package.json`. Activos: `gitflow-guard`, `load-build-state`,
|
|
@@ -114,6 +116,27 @@ Cambios a la política de construcción (unidad de trabajo, gates, DoR/DoD). Apr
|
|
|
114
116
|
el nº de escenarios G/W/T con `complejidad` en vez de exigir 3–5 fijos. La regla "épica = unidad"
|
|
115
117
|
se mantiene intacta para producto. Origen: auditoría del arnés vs. crítica de sobre-configuración.
|
|
116
118
|
|
|
119
|
+
## Modo runtime (Agent Orchestrator Runtime) — beta, opt-in
|
|
120
|
+
|
|
121
|
+
Desde EP-OR-08 (sub-slices A-E, código completo en `main`), el arnés puede correr como cliente de
|
|
122
|
+
un **Agent Orchestrator Runtime** remoto (repo hermano `trycore-ia-hub`) en vez de (o además de)
|
|
123
|
+
`build-state.json`. Gobernanza específica de esta capa:
|
|
124
|
+
|
|
125
|
+
- **El agente propone/reporta; un ADMIN publica/importa.** Ningún acto de agente sube contexto
|
|
126
|
+
(`POST …/context/agent-proposals`, nunca `…/context/proposals`), importa el grafo de épicas
|
|
127
|
+
(`scripts/lib/graph-bundle.py` prepara, no sube) ni cierra una release o un front paralelo — esas
|
|
128
|
+
son superficies humanas en la consola del hub. Detalle → `docs/runtime/protocolo-cliente-runtime.md`.
|
|
129
|
+
- **`legacy` es el default y el único camino con soporte completo.** `dual`/`runtime` se activan
|
|
130
|
+
explícitamente (`trycore-build init --runtime-url --runtime-token`); nadie los activa por decisión
|
|
131
|
+
del modelo. En `dual`, `hooks/build/dual-compare.sh` mide discrepancias fichero↔servidor — es el
|
|
132
|
+
instrumento de medición del piloto, no un gate.
|
|
133
|
+
- **El corte (retirar `legacy`, reescribir METODOLOGIA/CLAUDE.md/`state/README.md` como si el
|
|
134
|
+
runtime fuera canónico) requiere DRI + un piloto real sin discrepancias durante 1 sprint**
|
|
135
|
+
(`docs/runtime/plan-migracion-harness-v0.9.md` §2.3) — no es una decisión de PR aislado. La
|
|
136
|
+
versión `0.9.0` ya publica el cliente en beta/opt-in (ver CHANGELOG); el corte es una release
|
|
137
|
+
posterior y distinta.
|
|
138
|
+
- **Cómo migrar un proyecto al modo dual** → `docs/runtime/guia-modo-dual-y-migracion.md`.
|
|
139
|
+
|
|
117
140
|
## Extensiones futuras (no implementadas)
|
|
118
141
|
- **Construcción en paralelo** de slices con `superpowers:using-git-worktrees` + orquestación
|
|
119
142
|
multi-worktree (hoy el modelo es **secuencial** por decisión de proyecto). El `build-state.json`
|
package/INSTALL.md
CHANGED
|
@@ -11,7 +11,7 @@ Es el **compañero** de [`@trycore/spec-product-flow`](https://www.npmjs.com/pac
|
|
|
11
11
|
| CLI (bin) | `trycore-build` |
|
|
12
12
|
| Plugin | `trycore-spec-build-harness` |
|
|
13
13
|
| Marketplace | `trycore-build` |
|
|
14
|
-
| Versión | `
|
|
14
|
+
| Versión | ver `VERSION` en la raíz del paquete (`trycore-build --version`) |
|
|
15
15
|
|
|
16
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
17
|
|
|
@@ -30,11 +30,11 @@ npm install -g @trycore/spec-build-harness
|
|
|
30
30
|
Esto expone el binario `trycore-build`. Comprueba la versión:
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
|
-
trycore-build --version
|
|
33
|
+
trycore-build --version
|
|
34
34
|
trycore-build --help
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
Comandos disponibles: `init` · `update` · `status` · `uninstall` · `doctor
|
|
37
|
+
Comandos disponibles: `init` · `update` · `status` · `uninstall` · `doctor` · `migrate` (beta — ver §9).
|
|
38
38
|
|
|
39
39
|
> Requiere Node `>=18.0.0` (`engines` del paquete).
|
|
40
40
|
|
|
@@ -87,9 +87,9 @@ Qué hace `init`:
|
|
|
87
87
|
1. **Verifica requisitos duros** (a menos que uses `--skip-doctor`).
|
|
88
88
|
2. **Siembra los assets** en rutas nativas de Claude Code:
|
|
89
89
|
- `.claude/agents/build/` — 14 agentes.
|
|
90
|
-
- `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (
|
|
90
|
+
- `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (12 comandos: `/build:onboard`, `/build:reflect`, `/build:architect`, `/build:prototype`, `/build:slice`, `/build:release`, `/build:work`, `/build:resume`, `/build:front`, `/build:claim`, `/build:status`, `/build:escalate`).
|
|
91
91
|
- `.claude/skills/` — 16 skills (`building-a-slice`, `building-a-micro-change`, `releasing-a-version`, `managing-parallel-front`, `setup-architecture`, `prototyping-screens`, `openspec-*`).
|
|
92
|
-
- `.claude/hooks/build/` —
|
|
92
|
+
- `.claude/hooks/build/` — 19 hooks (bash + python; 6 son del cliente runtime opt-in — §9).
|
|
93
93
|
3. **Siembra el estado**: `state/build-state.schema.json` y `state/README.md` se versionan;
|
|
94
94
|
`state/build-state.json` se siembra **vacío y nunca se sobrescribe** (va al `.gitignore`).
|
|
95
95
|
4. **Siembra `config/stack-allowlist.json`** (artefacto del consumidor; lo puebla `/build:onboard`).
|
|
@@ -114,6 +114,9 @@ Al terminar imprime el siguiente paso: abrir Claude Code y ejecutar `/build:onbo
|
|
|
114
114
|
| `--runtime <semver>` | Semver del runtime (ej. `">=18.18"`) |
|
|
115
115
|
| `--prd-path <path>` | Ruta#ancla del PRD técnico (fuente del allowlist) |
|
|
116
116
|
| `--yes` | No interactivo: usa defaults para el stack (CI-safe) |
|
|
117
|
+
| `--runtime-url <url>` | (Beta — §9.) URL del Agent Orchestrator Runtime; junto con `--runtime-token`, registra el agente. |
|
|
118
|
+
| `--runtime-token <token>` | (Beta — §9.) Token de proyecto emitido por un ADMIN en la consola del hub. |
|
|
119
|
+
| `--runtime-mode <mode>` | (Beta — §9.) `legacy`\|`dual`\|`runtime` (default `dual` si diste URL+token). |
|
|
117
120
|
|
|
118
121
|
### Modo `--copy` (Windows / sandbox)
|
|
119
122
|
|
|
@@ -297,6 +300,25 @@ del consumidor y no se borran.
|
|
|
297
300
|
|
|
298
301
|
---
|
|
299
302
|
|
|
303
|
+
## 9. Modo runtime (beta, opcional)
|
|
304
|
+
|
|
305
|
+
El arnés puede correr el mismo pipeline contra un **Agent Orchestrator Runtime** remoto en vez de
|
|
306
|
+
(o además de) `build-state.json`. **Es opt-in**: sin las flags de abajo, `init` deja el proyecto en
|
|
307
|
+
modo `legacy` (default, sin cambios). Requiere un runtime corriendo y un **token de proyecto**
|
|
308
|
+
emitido por un ADMIN en la consola del hub.
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
trycore-build init --runtime-url "https://tu-runtime.example.com" --runtime-token "<token>"
|
|
312
|
+
trycore-build doctor # sección "Runtime": token, conectividad, lock, cola offline
|
|
313
|
+
trycore-build status # sección "Runtime": conexión, proyección, contexto sincronizado
|
|
314
|
+
trycore-build migrate --project-ref "<nombre-en-el-hub>" # bundle de estado histórico para un ADMIN
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
Guía completa (los tres modos, cómo activar/verificar/volver a legacy, cuándo se corta) →
|
|
318
|
+
[`docs/runtime/guia-modo-dual-y-migracion.md`](docs/runtime/guia-modo-dual-y-migracion.md).
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
300
322
|
> **Nota de gobierno:** `METODOLOGIA.md` es la fuente de verdad del arnés. Si una skill contradice
|
|
301
323
|
> la metodología, **gana la metodología** (regla dura del bloque `CLAUDE.md`). El core es 100%
|
|
302
324
|
> agnóstico al proyecto; el ejemplo de referencia vive en `docs/examples/reference/`.
|
package/METODOLOGIA.md
CHANGED
|
@@ -105,6 +105,16 @@ sola pasada**: a medida que crece el contexto, la atención se degrada ("context
|
|
|
105
105
|
actual, solo la hace reproducible. Los workflows quedan **acotados a tres hogares** (fan-out de exploración,
|
|
106
106
|
conducción del verificador adversarial, y el Release Gate del §5) y **prohibidos** en el camino caliente de
|
|
107
107
|
las fases del inner loop.
|
|
108
|
+
**La verificación adversarial es incremental y acotada.** Cada item de `wiring_checklist[]` cuya
|
|
109
|
+
evidencia fue reproducida lleva `verified_at_sha` (lo estampa el `build-orchestrator` al aplicar el
|
|
110
|
+
veredicto); en pasadas posteriores el verificador re-ejecuta **solo** los items cuyo código cambió
|
|
111
|
+
desde su sha (`git diff <sha>..HEAD -- <rutas del item>`) — el resto conserva veredicto («sin
|
|
112
|
+
cambios desde <sha>»). Pasada completa solo la primera (y, opcionalmente, una final). Y el bucle
|
|
113
|
+
tiene **condición de parada**: **máximo 2 pasadas completas por slice** — los hallazgos de la 2ª en
|
|
114
|
+
código nuevo del cierre se arreglan y se cierran con mutación verificada, sin tercera pasada; la
|
|
115
|
+
revisión independiente restante se **difiere explícitamente al Release Gate**, declarada en el PR
|
|
116
|
+
(gates honestos). Excepción única: un hallazgo ALTA en código **preexistente** durante la 2ª pasada
|
|
117
|
+
habilita una pasada extra **acotada** a ese frente.
|
|
108
118
|
4. **Producto completo, no MVP (anti-deriva).** El alcance acordado se construye **entero**. **Recortar o
|
|
109
119
|
diferir es bloqueante explícito** que exige acuerdo del equipo — **nunca** una decisión del modelo. No
|
|
110
120
|
se "deja para después" ni se deriva en lo complejo. La verificación es **ejecutada, no por inspección**
|
|
@@ -232,7 +242,11 @@ las revisiones pesadas **no** se piden aquí (van al Release Gate):
|
|
|
232
242
|
no toca UI.
|
|
233
243
|
- `wiring_verified` — el `wiring-adversarial-verifier` (subagente **independiente**, contexto virgen)
|
|
234
244
|
intentó refutar el slice y no halló huecos. **Prerequisito duro de `dod`**: el DoD declarativo del
|
|
235
|
-
gatekeeper es un **piso, no el arreglo** (ver §1-bis).
|
|
245
|
+
gatekeeper es un **piso, no el arreglo** (ver §1-bis). El bucle adversarial tiene **condición de
|
|
246
|
+
parada** (§1-bis): máximo **2 pasadas completas** por slice; hallazgos de la 2ª en código nuevo del
|
|
247
|
+
cierre → mutación verificada sin tercera pasada; lo restante se **difiere declarado en el PR** al
|
|
248
|
+
Release Gate. Ese diferimiento es **sancionado por la metodología** (no viola «producto completo,
|
|
249
|
+
no MVP»: no recorta alcance — difiere una *re-revisión* al gate que ya existe para custodiarla).
|
|
236
250
|
- OpenSpec: todas las tasks `[x]`; el archive del change va **en el mismo PR**.
|
|
237
251
|
- Back-reference del change añadida en la épica y en cada HU de `hus[]`.
|
|
238
252
|
- Hooks verdes (automáticos, **no** son gates de agente): `lint-typecheck.sh`, `stack-guard.sh`,
|
|
@@ -435,6 +449,36 @@ la capa de arquitectura, `/build:architect` lo **consolida** (añade `allow`/`ra
|
|
|
435
449
|
los ADRs; **nunca** borra entradas del consumidor ni pisa `source`, que sigue apuntando al PRD).
|
|
436
450
|
`uninstall` preserva `state/` y `config/`.
|
|
437
451
|
|
|
452
|
+
## 7-bis. Modo runtime (opcional, piloto — EP-OR-08)
|
|
453
|
+
|
|
454
|
+
Las reglas de §7 (leer antes de actuar, una transición = una escritura, gates monótonos, `null`
|
|
455
|
+
para N/A, archivar, dos loops) **no cambian**. Lo que puede cambiar es **el medio**: en vez de
|
|
456
|
+
leer/escribir `build-state.json` directamente, el pipeline puede correr contra el **Agent
|
|
457
|
+
Orchestrator Runtime** (servidor remoto, repo hermano `trycore-ia-hub`), que valida las
|
|
458
|
+
transiciones server-side y es la fuente de verdad para la flota (varios agentes, un proyecto).
|
|
459
|
+
|
|
460
|
+
- **Lo decide `config/build-config.json#runtime.mode`** (`legacy` default | `dual` | `runtime`),
|
|
461
|
+
nunca una elección del modelo. `legacy`: sin cambios, todo este documento aplica literal.
|
|
462
|
+
`dual`: el fichero sigue siendo **primario**, y cada transición se **espeja** al servidor
|
|
463
|
+
(comparador `dual-compare.sh` en el hook `Stop` detecta discrepancias y escala — no bloquea).
|
|
464
|
+
`runtime`: el servidor es primario; el fichero desaparece del camino de escritura.
|
|
465
|
+
- **Las skills no arman peticiones a mano.** Todo acto de dominio pasa por `slice-ops.sh`
|
|
466
|
+
(inner loop) / `release-ops.sh` (outer loop) — el equivalente runtime del "patrón
|
|
467
|
+
lee-modifica-escribe con `python3`" de la regla 2. Protocolo completo:
|
|
468
|
+
`skills/building-a-slice/references/runtime-protocol.md` y
|
|
469
|
+
`docs/runtime/protocolo-cliente-runtime.md`.
|
|
470
|
+
- **Gobierno sin cambios**: recortar/diferir alcance sigue siendo bloqueante explícito humano
|
|
471
|
+
(regla 8 de §10); el import del grafo de épicas y del histórico de estado los sube un **ADMIN**
|
|
472
|
+
en la consola del hub — el arnés **prepara y valida** bundles (`scripts/lib/graph-bundle.py`,
|
|
473
|
+
`trycore-build migrate`) pero nunca los publica.
|
|
474
|
+
- **Es beta, opt-in, y NO es el default.** Se activa explícitamente con
|
|
475
|
+
`trycore-build init --runtime-url <url> --runtime-token <token> [--runtime-mode dual|runtime]`.
|
|
476
|
+
El corte a `runtime` como único camino (y el retiro de la maquinaria legacy) está condicionado a
|
|
477
|
+
que un piloto real corra en `dual` **un sprint sin discrepancias** — ver
|
|
478
|
+
`docs/runtime/plan-migracion-harness-v0.9.md` §2. Hasta entonces, `legacy` es el camino con
|
|
479
|
+
soporte completo y **este documento sigue siendo la fuente de verdad primaria**.
|
|
480
|
+
- **Cómo migrar un proyecto** (paso a paso, con `trycore-build`) → `docs/runtime/guia-modo-dual-y-migracion.md`.
|
|
481
|
+
|
|
438
482
|
---
|
|
439
483
|
|
|
440
484
|
## 8. GitHub Flow estricto
|
|
@@ -547,7 +591,8 @@ salida es file-based y la propuesta se materializa en git, mañana irá por API
|
|
|
547
591
|
(outer). Ningún gate vive en ambos.
|
|
548
592
|
4. La trazabilidad change↔épica va en el **cuerpo markdown** de `proposal.md` (`## Trazabilidad`),
|
|
549
593
|
**nunca** en frontmatter YAML.
|
|
550
|
-
5. `build-state.json
|
|
594
|
+
5. `build-state.json` (modo `legacy`, default) o su equivalente runtime (modo `dual`/`runtime`, opt-in
|
|
595
|
+
— §7-bis): leer antes de actuar; **una transición = una escritura**; gates **monótonos**
|
|
551
596
|
(retroceso solo ante fallo); solo `dor-dod-gatekeeper` abre un slice cuando no hay activo.
|
|
552
597
|
6. **GitHub Flow estricto**: `main` desplegable, integración solo por PR; `gitflow-guard.sh` bloquea
|
|
553
598
|
commits/push directos.
|
|
@@ -555,9 +600,14 @@ salida es file-based y la propuesta se materializa en git, mañana irá por API
|
|
|
555
600
|
release.
|
|
556
601
|
8. **Disciplina de horizonte largo (§1-bis)**: refresh de contexto por defecto (estado en disco +
|
|
557
602
|
`wiring_checklist[]`); cimiento antes que negocio y descomposición por tamaño/topología; gate
|
|
558
|
-
`wiring_verified` por verificador **adversarial independiente** antes de `dod
|
|
559
|
-
|
|
560
|
-
|
|
603
|
+
`wiring_verified` por verificador **adversarial independiente** antes de `dod` — **incremental**
|
|
604
|
+
(pasadas 2+ solo re-ejecutan items cambiados desde su `verified_at_sha`) y con **condición de
|
|
605
|
+
parada**: máximo **2 pasadas completas** por slice, hallazgos de la 2ª en código nuevo → mutación
|
|
606
|
+
verificada sin tercera pasada, lo restante diferido **declarado en el PR** al Release Gate
|
|
607
|
+
(excepción: hallazgo ALTA en código preexistente → una pasada extra acotada); **producto completo,
|
|
608
|
+
no MVP** (recortar/diferir alcance es bloqueante explícito, nunca decisión del modelo; verificación
|
|
609
|
+
ejecutada, no por inspección — el diferimiento por condición de parada NO recorta alcance: difiere
|
|
610
|
+
una re-revisión al gate que la custodia).
|
|
561
611
|
9. **Fidelidad estricta**: para slices con UI, `fidelity` solo cierra con **verificación visual real**
|
|
562
612
|
(MCP chrome-devtools); INCONCLUSO no pasa. La fuente de diseño puede **producirse** con
|
|
563
613
|
`/build:prototype` (en modo feature exige extracción viva de la app corriendo);
|
package/README.md
CHANGED
|
@@ -142,12 +142,12 @@ trycore-spec-build-harness/
|
|
|
142
142
|
├── agents/build/ ← 14 agentes revisores (segunda opinión, contexto limpio)
|
|
143
143
|
├── commands/
|
|
144
144
|
│ ├── opsx/ ← 10 comandos /opsx:* (ciclo OpenSpec)
|
|
145
|
-
│ └── build/ ←
|
|
145
|
+
│ └── build/ ← 12 comandos /build:* (onboard, reflect, architect, prototype, slice, release, work, resume, front, claim, status, escalate)
|
|
146
146
|
├── skills/ ← 16 skills (building-a-slice, building-a-micro-change, releasing-a-version, managing-parallel-front, setup-architecture, prototyping-screens, 10 openspec-*) + 3 plantillas *.workflow.js (opt-in, read-only)
|
|
147
|
-
├── hooks/build/ ←
|
|
148
|
-
├── state/ ← máquina de estado: build-state.json + schema + README
|
|
149
|
-
├── config/ ← build-config.template.json (umbrales de contexto) + stack-allowlist.template.json (artefacto del consumidor)
|
|
150
|
-
├── src/ + dist/ ← CLI trycore-build (init/update/status/uninstall/doctor)
|
|
147
|
+
├── hooks/build/ ← 19 hooks (gate-check, reflect-nudge, release-gate-nudge, scaffold-guard, gitflow-guard, stack-guard, statusline-bridge, context-monitor, reconcile-build-state, …) + 6 opt-in del cliente runtime (session-start, event-emitter, context-sync, heartbeat, dual-compare, session-stop — ver docs/hooks.md)
|
|
148
|
+
├── state/ ← máquina de estado legacy: build-state.json + schema + README
|
|
149
|
+
├── config/ ← build-config.template.json (umbrales de contexto + runtime.mode) + stack-allowlist.template.json (artefacto del consumidor)
|
|
150
|
+
├── src/ + dist/ ← CLI trycore-build (init/update/status/uninstall/doctor/migrate)
|
|
151
151
|
├── scripts/ ← installer + guardias (check-version-sync/agnostic/state-clean)
|
|
152
152
|
└── docs/examples/reference/ ← ejemplo de referencia (fuera del core, excluido de check-agnostic)
|
|
153
153
|
```
|
|
@@ -156,6 +156,14 @@ Los **14 agentes** en `agents/build/` son: `build-orchestrator`, `dor-dod-gateke
|
|
|
156
156
|
|
|
157
157
|
**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/`.
|
|
158
158
|
|
|
159
|
+
## Modo runtime (beta, opcional)
|
|
160
|
+
|
|
161
|
+
El arnés puede correr el mismo pipeline contra un **Agent Orchestrator Runtime** remoto en vez de
|
|
162
|
+
(o además de) `build-state.json` — útil para flotas de varios agentes sobre un mismo proyecto.
|
|
163
|
+
**Es opt-in**: `legacy` (el fichero local) sigue siendo el default y el único camino con soporte
|
|
164
|
+
completo. Activarlo: `trycore-build init --runtime-url <url> --runtime-token <token>` (el token lo
|
|
165
|
+
emite un ADMIN en la consola del hub). Guía paso a paso → [`docs/runtime/guia-modo-dual-y-migracion.md`](docs/runtime/guia-modo-dual-y-migracion.md).
|
|
166
|
+
|
|
159
167
|
## Requisitos
|
|
160
168
|
|
|
161
169
|
`init` y `doctor` **fallan** si falta cualquiera de estos:
|
|
@@ -174,6 +182,31 @@ El core no menciona ningún dominio de cliente. Toda parametrización entra por
|
|
|
174
182
|
|
|
175
183
|
## Roadmap
|
|
176
184
|
|
|
185
|
+
- ✅ **v0.10.0 (actual) — convergencia del inner loop** — ataque a los seis multiplicadores de
|
|
186
|
+
latencia de la verificación adversarial (iniciativa #31, issues #25–#30) **sin bajar el rigor**:
|
|
187
|
+
**re-verificación incremental** con `verified_at_sha` por item de `wiring_checklist[]` (las
|
|
188
|
+
pasadas 2+ re-ejecutan O(items tocados), no O(items totales)); **condición de parada** del bucle
|
|
189
|
+
adversarial (máx. 2 pasadas completas por slice; lo diferido se declara en el PR y lo custodia el
|
|
190
|
+
Release Gate; excepción única: hallazgo ALTA en código preexistente → pasada extra acotada);
|
|
191
|
+
**carril micro blindado** (`building-a-micro-change` exento de mutación obligatoria/evidencia
|
|
192
|
+
anclada/regresión con worktree — 1 test de regresión + suite del módulo en verde);
|
|
193
|
+
**presupuesto de mutación** (obligatoria solo para tests que sostienen items del checklist);
|
|
194
|
+
**evidencia en dos clases** (determinista → HEAD; viva → último commit del módulo medido,
|
|
195
|
+
`anchored_at.sha`/`head_at_run`); y **baseline de regresión cacheado por sha**
|
|
196
|
+
(`assets/baseline-verdict.sh`: capture/compare contra `origin/<destino>` con guard contra refs
|
|
197
|
+
locales). Nuevos references `evidence-budget.md` y `regression-baseline.md`; superficies
|
|
198
|
+
sincronizadas en METODOLOGIA §1-bis/§3.2/§10.
|
|
199
|
+
- ✅ **v0.9.0 — beta/opt-in, EP-OR-08** — **cliente del Agent Orchestrator Runtime**,
|
|
200
|
+
opt-in, sin cambiar el default: el mismo pipeline de dos loops puede correr contra un servidor
|
|
201
|
+
remoto en vez de (o además de) `build-state.json`. 6 hooks nuevos (`session-start`,
|
|
202
|
+
`event-emitter`, `context-sync`, `heartbeat`, `dual-compare`, `session-stop`), `slice-ops.sh`/
|
|
203
|
+
`release-ops.sh` (13 subcomandos que conducen las skills), 3 comandos nuevos (`/build:claim`,
|
|
204
|
+
`/build:status`, `/build:escalate`), CLI extendido (`init --runtime-url/--runtime-token`,
|
|
205
|
+
`doctor`/`status` con sección Runtime, `migrate`). **Esta versión NO es "el corte"**: el paso a
|
|
206
|
+
`runtime` como único camino y el retiro del legacy esperan a un piloto real sin discrepancias
|
|
207
|
+
(release posterior) — ver
|
|
208
|
+
[`docs/runtime/guia-modo-dual-y-migracion.md`](docs/runtime/guia-modo-dual-y-migracion.md).
|
|
209
|
+
Total: **19 hooks**, **12 comandos `/build:*`**.
|
|
177
210
|
- ✅ **v0.1.0** — arnés de dos loops (`building-a-slice` + `releasing-a-version`), 10 agentes, comandos `/opsx:*` + `/build:onboard`, 12 skills, 6 hooks, máquina de estado `build-state.json`, allowlist de stack, CLI `trycore-build` (init/update/status/uninstall/doctor) y plugin nativo. Compañero de `@trycore/spec-product-flow`.
|
|
178
211
|
- ✅ **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**.
|
|
179
212
|
- ✅ **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`.
|
|
@@ -183,7 +216,7 @@ El core no menciona ningún dominio de cliente. Toda parametrización entra por
|
|
|
183
216
|
- ✅ **v0.7.0** — **orquestación con workflows dinámicos + hardening** (de una evaluación adversarial del propio arnés): **3 plantillas `*.workflow.js`** opt-in y read-only (`explore-fanout`, `wiring-verify`, `release-gate`) que entran **solo donde aportan valor** y nunca en el camino caliente del inner loop; **3 comandos nuevos** `/build:slice` (entrada del inner loop), `/build:release` (outer loop) y `/build:work` (router *classify-and-act*); hook **`release-gate-nudge.sh`** (Stop, determinista: solo sugiere el Release Gate). Rename de los gates de los 5 reviewers pesados → `releases[].gates.{security,smell,ux,coherence,stack_arch}` (`stack`→`stack_arch`; separación `coherence` (release) / `coherence_link` (inner)). Hardening: degradación segura en 8 agentes, escritura atómica del estado, cierre del bypass de specs no-semver, `wiring` exige evidencia ejecutada y `check-agnostic` barre `*.js`. Total: **12 agentes**, **10 hooks**, **5 comandos `/build:*`**.
|
|
184
217
|
- ✅ **v0.8.0** — **motor de contexto + estado anclado a disco + front paralelo inter-épica**: hooks **`statusline-bridge.sh`** (canal CLI) + **`context-monitor.sh`** (umbrales `context.warning_pct`/`context.critical_pct` configurables, 35%/25% por defecto) con **auto-handoff** a `session_continuity` en critical/`PreCompact` y comando **`/build:resume`** para rehidratar desde disco; config **`context.auto_checkpoint`** (opt-in). Reconciliador **`reconcile-build-state.py`** (`SessionStart`): deriva de git + evidencia de tests, degrada `wiring_checklist` sin evidencia, anota *branch drift*, ratchet de gates, fail-open. **Front paralelo** (`parallel_front` en el estado): comando **`/build:front`** + skill **`managing-parallel-front`** + `scripts/lib/front-plan.py` (disjunción por `files_scope`, foundational-first). Schema nuevo: `slice.layer`, `slice.files_scope`, `slice.branch_drift`, `slice.session_continuity`. **Caveat:** `statusLine` es solo canal CLI; en plugin-only el motor de contexto degrada fail-open. Total: **12 agentes**, **13 hooks**, **7 comandos `/build:*`**, **14 skills**.
|
|
185
218
|
- ✅ **v0.8.1** — **hotfix del motor de contexto**: `context-monitor.sh` re-inyectaba `additionalContext` en cada evento `Stop`, lo que re-lanzaba el turno en bucle hasta el tope `CLAUDE_CODE_STOP_HOOK_BLOCK_CAP` (9→override). Ahora en `Stop` re-lanza como mucho una vez por sesión (solo la transición a crítico que graba el handoff) y `warning` nunca inyecta en `Stop`. Cubierto por `test-context-monitor.sh`.
|
|
186
|
-
- ✅ **v0.8.5
|
|
219
|
+
- ✅ **v0.8.5** — **generador de prototipos HTML de referencia**: comando **`/build:prototype`** + skill **`prototyping-screens`** que producen la fuente de diseño (`DESIGN_SOURCE`) en `docs/05-prototipo/` (`DESIGN.md` + `tokens.css` + `manifest.json` pantalla↔épica/HU + un HTML autocontenido por pantalla). Dos modos: **greenfield** (inventario desde PRD/mapa/historias → dirección estética con 2-3 variantes a elección humana → generación por lotes) y **feature** (pantallas de una épica nueva con **extracción viva obligatoria** del UI implementado: CSS computado + screenshots en 3 viewports vía MCP; sin degradación estática). Auto-verificación visual (render real, máx. 3 iteraciones, sin pixel-diff) y **aprobación humana** de cada pantalla (`borrador`→`aprobada`); `ux-fidelity-reviewer` resuelve pantallas vía `manifest.json` (solo `aprobada`). La regla "el arnés no genera el prototipo" evoluciona a "puede generarlo; `design_source.confirmed` sigue siendo humano". 4º carve-out de escritura en `docs/` (§9.2). Total: **14 agentes**, **13 hooks**, **9 comandos `/build:*`**, **16 skills**.
|
|
187
220
|
- ✅ **v0.8.4** — **épica caparazón obligatoria en greenfield**: nuevo campo `project_kind` con detección automática conservadora en `trycore-build init` (brownfield seguro = manifiesto + código + **historial git con commits de código**; ambigüedad → una sola pregunta en `/build:onboard`; **en brownfield el mecanismo es N/A total, sin preguntar**) y gate de proyecto **`foundation`**: contrato del caparazón (navegación/menús · layout/panel central · homepage · login/authN · redirecciones/guards) como checklist podable con **evidencia de ejecución por ítem** (patrón `wiring_checklist`, contrato en `skills/building-a-slice/references/foundation-contract.md`). `/build:onboard` **Fase 2c** poda el contrato y redacta el **borrador híbrido** de la épica (solo se escribe en `epicas.md` con aprobación humana explícita — carve-out §9.2). **DoR 7-bis proactivo**: en greenfield ninguna épica `business` abre slice hasta que la caparazón esté **archivada con checklist evidenciada** (`foundation.completed_at`); las fundacionales y el carril micro-change nunca se bloquean. Línea `Caparazón` en `status`/`doctor`. Retrocompatible: campos opcionales del schema.
|
|
188
221
|
- ✅ **v0.8.3** — **gates de validación paralelizados (sharding lossless)**: el carril `coherence` del Release Gate se shardea **por HU** (≥ 3 HUs, `args.hus[]`) — de un solo agente opus O(HUs) a un shard por HU en paralelo con consolidación **fail-closed** y cobertura completa; nueva plantilla **`dor-fanout.workflow.js`** para los chequeos per-HU del DoR (frontmatter/G-W-T/INVEST en paralelo; el nivel épica sigue en `dor-dod-gatekeeper`, único emisor del veredicto). `security`/`smell`/`ux`/`stack_arch` quedan monolíticos a propósito (riesgo cross-cutting); `integration` sigue secuencial (regla dura §5).
|
|
189
222
|
- ✅ **v0.8.2** — **capa de arquitectura (ADD)** entre discovery y construcción: comando **`/build:architect`** + skill **`setup-architecture`** que aplica el método **Attribute-Driven Design** (Len Bass) leyendo `docs/` (solo lectura) y produciendo `docs/adr/` (drivers/ASRs → tácticas → estilos → vistas → ATAM-lite → stack), con **mínimo HITL** (autónomo, una revisión final; propone, no publica). Dos agentes nuevos (`asr-extractor`, `architecture-evaluator`), plantillas ADD embebidas en la skill (`skills/setup-architecture/assets/`) y **`asset-types.json`** (forward-compat runtime v0.9: `arch.drivers`/`arch.adr`/`arch.backlog`). Cierre del lazo: los ADRs se vuelven criterios — el **DoR** exige cobertura para el cimiento fundacional (opt-in, retrocompatible) y el gate **`stack_arch`** audita conformidad contra `docs/adr/`. Total: **14 agentes**, **13 hooks**, **8 comandos `/build:*`**, **15 skills**.
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.11.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: build-orchestrator
|
|
3
|
-
description: Orquesta el pipeline secuencial de construcción de un slice (épica EP-XXX) del arnés de construcción.
|
|
3
|
+
description: Orquesta el pipeline secuencial de construcción de un slice (épica EP-XXX) del arnés de construcción. Consulta el estado y reporta cada transición por slice-ops.sh (o, en modo legacy, por el fichero local), transiciona las fases y delega en los gates, en los skills opsx:* (motor de changes) y en superpowers:test-driven-development (motor TDD). Úsalo cuando el usuario quiera construir, continuar o avanzar una épica EP-XXX (las HU que cubre son su alcance interno).
|
|
4
4
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
5
|
model: sonnet
|
|
6
6
|
---
|
|
@@ -9,13 +9,19 @@ Eres el **orquestador de construcción** del arnés de construcción. NO escribe
|
|
|
9
9
|
diriges el pipeline secuencial, mantienes el estado y delegas en agentes y skills.
|
|
10
10
|
|
|
11
11
|
## Fuente de verdad
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
Depende del modo (`bash .claude/hooks/build/slice-ops.sh mode`):
|
|
13
|
+
- `dual`/`runtime` → el **Agent Orchestrator Runtime**. Consulta con `slice-ops.sh status` y
|
|
14
|
+
transiciona con `slice-ops.sh gate|wiring|progress|checkpoint|submit|archive`. Protocolo en
|
|
15
|
+
`.claude/skills/building-a-slice/references/runtime-protocol.md`.
|
|
16
|
+
- `legacy` → el fichero local, con el protocolo de
|
|
17
|
+
`.claude/skills/building-a-slice/references/state-protocol.md`.
|
|
18
|
+
|
|
19
|
+
**Sólo un slice activo a la vez** (modelo secuencial). La **unidad de construcción es la épica**;
|
|
20
|
+
las HU que cubre el change son su alcance interno. Un slice = una épica = un change = una rama = un PR.
|
|
21
|
+
Eres el único que reporta gates y transiciona fases; los reviewers solo emiten su veredicto.
|
|
16
22
|
|
|
17
23
|
## Coexistencia con el front paralelo (outer-loop)
|
|
18
|
-
Si
|
|
24
|
+
Si hay un front paralelo abierto, el paralelismo lo gobierna la skill
|
|
19
25
|
`managing-parallel-front`; cada worktree corre su propio inner loop con `active_slice` singular.
|
|
20
26
|
**Regla de drenado:** si se necesita abrir una épica `layer=foundational`, primero pon
|
|
21
27
|
`parallel_front.status="draining"` (termina las en curso, no admite nuevas) y espera a cerrarlo.
|
|
@@ -54,7 +60,9 @@ auditará después que cada `passing` tenga evidencia real y que no falte ningú
|
|
|
54
60
|
justificadas→true; DESVIACIONES→false; INCONCLUSO/sin MCP→FALSE, bloquea; sin UI→null).
|
|
55
61
|
5. api/data → api-contract-tester (si hay endpoints) · data-consistency-checker (si toca datos)
|
|
56
62
|
6. dod → PRIMERO delega en wiring-adversarial-verifier (subagente INDEPENDIENTE, contexto virgen:
|
|
57
|
-
intenta refutar el slice; cierra gates.wiring_verified) → SOLO si true, dor-dod-gatekeeper (DoD reducido)
|
|
63
|
+
intenta refutar el slice; cierra gates.wiring_verified) → SOLO si true, dor-dod-gatekeeper (DoD reducido).
|
|
64
|
+
Máximo 2 pasadas completas por slice (condición de parada, ver abajo); pasadas 2+ incrementales
|
|
65
|
+
(solo items cuyo código cambió desde su verified_at_sha)
|
|
58
66
|
7. pr → abre PR y archiva el change EN EL MISMO PR (opsx:archive + opsx:sync); back-ref en épica y HU
|
|
59
67
|
8. release? → tras archivar, devuelve a la skill building-a-slice para preguntar el Release Gate (default computado)
|
|
60
68
|
```
|
|
@@ -71,6 +79,24 @@ verificación se conduce con la plantilla read-only `skills/building-a-slice/wor
|
|
|
71
79
|
(envuelve al verificador); **tú** —`build-orchestrator`— sigues siendo quien escribe `gates.wiring_verified`
|
|
72
80
|
a partir del veredicto que la plantilla devuelve (la plantilla no toca el estado).
|
|
73
81
|
|
|
82
|
+
**Estampa `verified_at_sha` al aplicar un veredicto.** Cuando apliques el veredicto del
|
|
83
|
+
`wiring-adversarial-verifier` al estado, escribe en cada item de `wiring_checklist[]` cuya evidencia
|
|
84
|
+
fue **reproducida en esa pasada** el campo `verified_at_sha` con el sha del commit verificado
|
|
85
|
+
(`git rev-parse HEAD` al momento de la pasada). Los items que el verificador listó como «sin cambios
|
|
86
|
+
desde <sha>» conservan su `verified_at_sha` anterior; los items que pasaron a `failing` lo pierden
|
|
87
|
+
(quítalo o déjalo intacto solo si la evidencia sigue reproducida). Ese sello es lo que habilita la
|
|
88
|
+
re-verificación incremental de las pasadas siguientes.
|
|
89
|
+
|
|
90
|
+
**Condición de parada del bucle adversarial (máximo 2 pasadas completas por slice).** No conduzcas
|
|
91
|
+
una tercera pasada: los hallazgos de la 2ª que estén en **código nuevo del cierre** se arreglan y se
|
|
92
|
+
cierran con **mutación verificada** (re-ejecutar la evidencia del item afectado tras el fix), sin
|
|
93
|
+
pasada adicional; la revisión independiente restante se **difiere explícitamente al Release Gate**
|
|
94
|
+
(`releasing-a-version`) y se declara en el PR del slice (los gates `wiring_verified`/`dod` se cierran
|
|
95
|
+
honestos, con el diferimiento anotado). **Única excepción**: un hallazgo ALTA en código
|
|
96
|
+
**preexistente** durante la 2ª pasada habilita una pasada extra **acotada a ese frente** (no una
|
|
97
|
+
tercera pasada completa). El diferimiento por condición de parada NO es «recortar alcance en
|
|
98
|
+
silencio»: queda declarado en el PR y lo custodia el gate que ya existe para eso.
|
|
99
|
+
|
|
74
100
|
## Reglas de orquestación
|
|
75
101
|
- **No saltes gates.** No avances de fase si el gate previo está en `false`. Reporta qué falta.
|
|
76
102
|
- **Delega, no reimplementes.** Changes = `opsx:*`. TDD = `superpowers:test-driven-development`.
|
|
@@ -11,7 +11,8 @@ proponer la escritura del estado (no editas código de producto).
|
|
|
11
11
|
## Definition of Ready (gate `dor`) — antes de construir
|
|
12
12
|
|
|
13
13
|
**Precondición — Paso 1 fundamental (scaffold):** antes de validar nada más, exige
|
|
14
|
-
|
|
14
|
+
el scaffold confirmado (`bash .claude/hooks/build/slice-ops.sh status`). Si no lo está, **NO valides
|
|
15
|
+
el DoR**: instruye
|
|
15
16
|
confirmar primero que existe un scaffold runnable del proyecto (ver `building-a-slice` Fase 0). El
|
|
16
17
|
arnés **no genera** el scaffold; lo exige. (El hook `scaffold-guard.sh` respalda este bloqueo en
|
|
17
18
|
las fases de código.)
|
|
@@ -41,10 +42,10 @@ cumplen; lista cada una con ✓/✗:
|
|
|
41
42
|
como épica(s) `layer: foundational` **archivada(s)** en `history[]`. Si arrastra cimiento no construido,
|
|
42
43
|
**NO abras el slice**: instruye extraerlo a una épica fundacional previa y construirla primero. Aquí la
|
|
43
44
|
cláusula "explícitamente no bloquean" del criterio 6 **NO aplica**: el cimiento bloquea siempre.
|
|
44
|
-
7-bis. **Caparazón construido (solo greenfield — PROACTIVO)**: lee
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
7-bis. **Caparazón construido (solo greenfield — PROACTIVO)**: lee los hechos de proyecto con
|
|
46
|
+
`slice-ops.sh status`. Si el proyecto es `greenfield` con caparazón **requerida** y la épica
|
|
47
|
+
evaluada es `layer: business`: exige la caparazón **completada** (su épica archivada y con la
|
|
48
|
+
checklist evidenciada). Si no lo está,
|
|
48
49
|
**NO abras el slice**: instruye construir primero la épica caparazón (`foundation.epic`; si es
|
|
49
50
|
`null`, correr `/build:onboard` Fase 2c o crearla en discovery). Las épicas `layer: foundational`
|
|
50
51
|
no se bloquean por este criterio. Brownfield o `foundation.required !== true` → **N/A** (no
|
|
@@ -105,6 +106,13 @@ Pasa SOLO si **todos** estos gates del **inner loop** están en `true` (o `null`
|
|
|
105
106
|
(subagente **independiente**, contexto virgen) tras intentar refutar el slice (stubs, rutas sin cablear,
|
|
106
107
|
AC sin test, items de `wiring_checklist[]` aún `failing`) y no hallar huecos. **Tu DoD declarativo es un
|
|
107
108
|
piso, no el arreglo**: no marques `dod` sin `wiring_verified: true`.
|
|
109
|
+
**Condición de parada (máximo 2 pasadas completas por slice)**: NO exijas una 3ª pasada adversarial.
|
|
110
|
+
Los hallazgos de la 2ª en código nuevo del cierre se cierran con **mutación verificada** (evidencia
|
|
111
|
+
del item re-ejecutada tras el fix), y la revisión independiente restante se **difiere explícitamente
|
|
112
|
+
al Release Gate**, declarada en el PR — con eso `wiring_verified`/`dod` cierran **honestos**. Verifica
|
|
113
|
+
que el diferimiento esté declarado en el PR; si no lo está, `dod` NO cierra. Excepción: un hallazgo
|
|
114
|
+
ALTA en código **preexistente** durante la 2ª pasada sí habilita (solo) una pasada extra **acotada**
|
|
115
|
+
a ese frente antes de cerrar.
|
|
108
116
|
8. Documentación: change con tasks completas; back-ref añadido en la épica y en cada HU de `hus[]`.
|
|
109
117
|
9. Hooks verdes (automáticos): `lint-typecheck.sh`, `stack-guard.sh`, `gitflow-guard.sh`.
|
|
110
118
|
|
|
@@ -41,16 +41,63 @@ prueba es del código: ante la duda, es `failing`.
|
|
|
41
41
|
|
|
42
42
|
## Método
|
|
43
43
|
- Traza **cada** AC y **cada** integration_point hasta el código y un test que lo ejerza de verdad.
|
|
44
|
-
- **Evidencia EJECUTADA, no por inspección.** Por cada item de `wiring_checklist[]`
|
|
45
|
-
**
|
|
46
|
-
|
|
44
|
+
- **Evidencia EJECUTADA, no por inspección.** Por cada item de `wiring_checklist[]` **seleccionado
|
|
45
|
+
para re-verificación** (ver protocolo incremental) y marcado `passing`, **REPRODUCE su `evidence`**
|
|
46
|
+
ejecutándola (el test/comando citado). Si **no puedes ejecutarla** (entorno sin runner, build roto,
|
|
47
|
+
dependencia ausente), ese item es `failing` — **NUNCA** `passing` por inspección.
|
|
47
48
|
- Corre la suite (`Bash`) para confirmar que lo verde es verde de verdad.
|
|
48
49
|
|
|
50
|
+
## Protocolo incremental (re-verificación por `verified_at_sha`)
|
|
51
|
+
|
|
52
|
+
Cada pasada re-ejecutar TODO es el multiplicador de coste más grande del bucle (coste ∝ items
|
|
53
|
+
acumulados, y los items solo crecen). Por eso la selección de qué reproducir es **incremental**:
|
|
54
|
+
|
|
55
|
+
1. **Primera pasada del slice** (ningún item trae `verified_at_sha`): pasada **completa** — reproduce
|
|
56
|
+
la evidencia de todos los items `passing`, como siempre.
|
|
57
|
+
2. **Pasadas 2+**: por cada item con `verified_at_sha`, calcula si su código cambió desde ese sha —
|
|
58
|
+
`git diff <verified_at_sha>..HEAD -- <rutas del item>` (las rutas que su `evidence` y tu trazado
|
|
59
|
+
del item citan: código bajo prueba + test que lo ejerce).
|
|
60
|
+
- **Diff no vacío** (o item sin `verified_at_sha`, o sha inexistente en el repo) → re-ejecuta su
|
|
61
|
+
evidencia.
|
|
62
|
+
- **Diff vacío** → el item **conserva su veredicto** y lo listas como «sin cambios desde <sha>»
|
|
63
|
+
(no re-ejecutas su evidencia).
|
|
64
|
+
Acota además el foco de la pasada al **diff de los arreglos + sus rutas gemelas** (el patrón
|
|
65
|
+
documentado de defectos inducidos es «blindar una ruta y dejar la gemela»: si el fix tocó un
|
|
66
|
+
handler/rama/capa, revisa también su simétrico — el otro endpoint del par, la rama de error del
|
|
67
|
+
happy arreglado, el consumidor del productor tocado).
|
|
68
|
+
3. **Pasada completa** solo la primera y, opcionalmente, una final si el orquestador la pide.
|
|
69
|
+
4. **La incrementalidad no diluye el sesgo adversarial**: si por cualquier motivo re-ejecutas la
|
|
70
|
+
evidencia de un item «sin cambios» y resulta **irreproducible**, el veredicto es **HUECOS**
|
|
71
|
+
igual que siempre (conservar veredicto es un ahorro de ejecución, no una amnistía). Y la
|
|
72
|
+
degradación segura sigue intacta: «no pude calcular el diff» o «no pude ejecutar» jamás se
|
|
73
|
+
convierte en «sin cambios».
|
|
74
|
+
|
|
75
|
+
Tú NO escribes `verified_at_sha` (eres read-only sobre el estado): reporta en tu salida **qué items
|
|
76
|
+
reprodujiste** en esta pasada y cuáles quedaron «sin cambios desde <sha>»; el `build-orchestrator`
|
|
77
|
+
estampa el sello al aplicar tu veredicto.
|
|
78
|
+
|
|
79
|
+
## Anclaje de la evidencia: dos clases
|
|
80
|
+
|
|
81
|
+
Al validar si una `evidence` sigue vigente, distingue la clase de evidencia:
|
|
82
|
+
|
|
83
|
+
- **Evidencia determinista** (runners sin LLM: suite de tests, build, comando reproducible) — se
|
|
84
|
+
valida contra **HEAD**, como siempre: si el código cambió, se re-ejecuta contra el estado actual.
|
|
85
|
+
- **Evidencia viva** (corridas contra un LLM real: evaluaciones, journeys conducidos por modelo,
|
|
86
|
+
mediciones de calidad de salida) — se valida contra **el último commit que tocó el módulo bajo
|
|
87
|
+
medición** (`git log -1 --format=%H -- <rutas del módulo>`), **no** contra HEAD: un commit de
|
|
88
|
+
docs/estado/otro módulo **no** la invalida. El artefacto de la corrida declara `anchored_at.sha`
|
|
89
|
+
(ese último commit del módulo) y `head_at_run` (el HEAD al momento de correr); la evidencia sigue
|
|
90
|
+
anclada mientras `anchored_at.sha` no cambie. Si el módulo bajo medición SÍ cambió desde
|
|
91
|
+
`anchored_at.sha`, la corrida está desanclada → re-ejecutar o `failing`.
|
|
92
|
+
|
|
49
93
|
## Salida + mapeo al gate
|
|
50
94
|
Veredicto **CABLEADO COMPLETO** o **HUECOS** + lista priorizada de huecos con `archivo:línea`, la HU/AC o
|
|
51
95
|
el par de capas afectado, y el fix mínimo. Devuelve también qué items de `wiring_checklist[]` deberían
|
|
52
|
-
estar `failing
|
|
53
|
-
|
|
96
|
+
estar `failing`, qué items **reprodujiste en esta pasada** (para que el orquestador estampe
|
|
97
|
+
`verified_at_sha`) y cuáles conservaron veredicto como **«sin cambios desde <sha>»**. **CABLEADO
|
|
98
|
+
COMPLETO solo si CADA AC y CADA integration_point quedó trazado a un test ejercido y reproducido —
|
|
99
|
+
en esta pasada o en una anterior sin cambios desde su `verified_at_sha`**; cualquier duda no resuelta
|
|
100
|
+
→ **HUECOS** (la carga de la prueba es del código).
|
|
54
101
|
|
|
55
102
|
**Degradación segura (no éxito silencioso).** Si **no pudiste ejecutar** la verificación de uno o más items
|
|
56
103
|
(sin runner, build roto, dependencia ausente, sin reporte de `integration-check`) → veredicto **HUECOS** (no
|
|
@@ -44,7 +44,7 @@ Invoca la skill **`setup-architecture`**. La skill:
|
|
|
44
44
|
- **No** edites artefactos de discovery (`docs/01-prd/`…`docs/04-historias/`): la única salida en `docs/`
|
|
45
45
|
es `docs/adr/`.
|
|
46
46
|
- **No** publiques: los ADRs se **proponen** (`proposed`/`living-document`); el humano promueve a `accepted`.
|
|
47
|
-
- **No** abras un slice ni
|
|
47
|
+
- **No** abras un slice ni transiciones el estado del slice: esta fase es **pre-build**.
|
|
48
48
|
|
|
49
49
|
---
|
|
50
50
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "BUILD: Claim"
|
|
3
|
+
description: Reclama trabajo al Agent Orchestrator Runtime (POST /tasks/next) sincronizando el contexto antes, reportando los hashes locales de los archivos gobernados y continuando desde el checkpoint si lo hay. Adaptador delgado sobre slice-ops.sh claim; en modo legacy o dual el slice lo decide el fichero local.
|
|
4
|
+
category: Workflow
|
|
5
|
+
tags: [build-harness, runtime, claim, trycore]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /build:claim — Pedir la siguiente tarea al runtime
|
|
9
|
+
|
|
10
|
+
**Entrada (opcional):** `EP-XXX` para pedir una épica concreta. Sin argumento, el runtime elige.
|
|
11
|
+
|
|
12
|
+
## 1. Reclamar
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
bash .claude/hooks/build/slice-ops.sh claim ${1:+--epic "$1"}
|
|
16
|
+
echo "rc=$?"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
El comando ya hace, por ti y en este orden: sincroniza el contexto (no se abre trabajo con
|
|
20
|
+
contexto viejo), reporta los `sha256` locales efectivos de los archivos gobernados (el servidor
|
|
21
|
+
detecta drift), reclama por **POST**, refresca la caché de proyección y rinde el slice.
|
|
22
|
+
|
|
23
|
+
## 2. Ramificar por el código de salida
|
|
24
|
+
|
|
25
|
+
| rc | Qué significa | Qué haces |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| 0 | slice reclamado | si la salida trae **CHECKPOINT**, haz checkout de esa rama y **continúa desde ahí, jamás reinicies**; luego `/build:slice` |
|
|
28
|
+
| 3 | modo `legacy`, o `dual` (el fichero decide) | abre/retoma el slice con el protocolo del fichero (`/build:slice`) |
|
|
29
|
+
| 5 | runtime inalcanzable | **sigue trabajando** con lo local; reintenta al reconectar |
|
|
30
|
+
| 6 | rechazo del servidor (409/401/422) | muestra su razón tal cual; **no reintentes** — token, contexto o proyecto a resolver con el ADMIN |
|
|
31
|
+
| 7 | sin trabajo disponible, o carrera perdida | dilo y termina limpio; ofrece `/build:status` |
|
|
32
|
+
|
|
33
|
+
## 3. Seguir
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
bash .claude/hooks/build/slice-ops.sh next-step
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Ejecuta esa acción, o entra al pipeline con `/build:slice`.
|
|
40
|
+
|
|
41
|
+
## Guardrails
|
|
42
|
+
|
|
43
|
+
- **No** armes peticiones al runtime a mano: todo pasa por `slice-ops.sh`.
|
|
44
|
+
- **Un solo slice activo**: reclamar con lease vigente devuelve el mismo slice (idempotente).
|
|
45
|
+
- **Nunca reinicies** un slice que trae checkpoint: es trabajo de otro agente que cayó.
|
|
46
|
+
- Si algo contradice `METODOLOGIA.md`, **gana la metodología**.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "BUILD: Escalate"
|
|
3
|
+
description: Registra un bloqueo del slice en el runtime (evento slice_escalated) y devuelve la decisión al humano — recortar, diferir o desbloquear nunca lo decide el modelo. Adaptador delgado sobre slice-ops.sh escalate.
|
|
4
|
+
category: Workflow
|
|
5
|
+
tags: [build-harness, runtime, escalada, gobierno, trycore]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /build:escalate — Bloqueo que decide una persona
|
|
9
|
+
|
|
10
|
+
**Entrada:** la razón del bloqueo (una frase concreta y verificable). Opcional: el gate afectado.
|
|
11
|
+
|
|
12
|
+
## 1. Registrar
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
bash .claude/hooks/build/slice-ops.sh escalate "<razón>" --gate <gate opcional>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Deja el rastro tipado en el runtime (ámbito slice si hay slice reclamado; de proyecto si no).
|
|
19
|
+
Para razones largas, escríbelas en un fichero y usa `--file`.
|
|
20
|
+
|
|
21
|
+
## 2. Devolver la decisión al humano
|
|
22
|
+
|
|
23
|
+
Presenta al usuario, en tres líneas: **qué está bloqueado**, **qué evidencia lo demuestra** y
|
|
24
|
+
**las opciones reales** (con su coste). No elijas por él.
|
|
25
|
+
|
|
26
|
+
> **Regla dura del arnés:** *Producto completo, no MVP.* Recortar o diferir alcance es un
|
|
27
|
+
> **bloqueante explícito** que requiere acuerdo del equipo — jamás una decisión del modelo. Escalar
|
|
28
|
+
> no es rendirse: es negarse a degradar el alcance en silencio.
|
|
29
|
+
|
|
30
|
+
## Guardrails
|
|
31
|
+
|
|
32
|
+
- **No** cierres gates «para avanzar» mientras el bloqueo esté vivo.
|
|
33
|
+
- **No** inventes alternativas fuera del alcance acordado.
|
|
34
|
+
- Si el bloqueo es de contexto gobernado (allowlist, política, reglas), la salida es una
|
|
35
|
+
**propuesta** en el hub que publica un ADMIN, no una edición local del fichero sincronizado.
|
|
36
|
+
- Si algo contradice `METODOLOGIA.md`, **gana la metodología**.
|