@trycore/spec-build-harness 0.8.1 → 0.8.2
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 +1 -1
- package/INSTALL.md +4 -4
- package/METODOLOGIA.md +50 -7
- package/README.md +7 -5
- package/VERSION +1 -1
- package/agents/build/architecture-evaluator.md +45 -0
- package/agents/build/asr-extractor.md +43 -0
- package/agents/build/dor-dod-gatekeeper.md +12 -0
- package/agents/build/stack-guardian.md +9 -0
- package/asset-types.json +75 -0
- package/commands/build/architect.md +66 -0
- package/docs/agents.md +32 -3
- package/docs/commands.md +9 -3
- package/docs/getting-started.md +1 -1
- package/docs/runtime/plan-migracion-harness-v0.9.md +84 -0
- package/docs/runtime/protocolo-cliente-runtime.md +116 -0
- package/package.json +2 -1
- package/skills/building-a-slice/references/dor.md +8 -0
- package/skills/releasing-a-version/SKILL.md +1 -1
- package/skills/releasing-a-version/references/release-dod.md +1 -1
- package/skills/setup-architecture/SKILL.md +94 -0
- package/skills/setup-architecture/assets/0000-drivers-y-asrs.template.md +101 -0
- package/skills/setup-architecture/assets/_backlog-arquitectonico.template.md +51 -0
- package/skills/setup-architecture/assets/adr-add.template.md +84 -0
- package/skills/setup-architecture/references/add-method.md +53 -0
- package/skills/setup-architecture/references/atam-lite.md +44 -0
- package/skills/setup-architecture/references/drivers-extraction.md +39 -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.8.
|
|
5
|
+
"version": "0.8.2",
|
|
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,7 +8,7 @@ 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 |
|
|
11
|
+
| Agentes | 14 agentes de build | `.claude/agents/build/` |
|
|
12
12
|
| Hooks | settings.json + 13 scripts | `.claude/settings.json`, `.claude/hooks/build/` |
|
|
13
13
|
| 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) | `.claude/skills/` |
|
|
14
14
|
| Comandos | `/opsx:*` · `/build:onboard` · `/build:reflect` · `/build:slice` · `/build:release` · `/build:work` · `/build:resume` · `/build:front` | `.claude/commands/` |
|
package/INSTALL.md
CHANGED
|
@@ -86,10 +86,10 @@ Qué hace `init`:
|
|
|
86
86
|
|
|
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
|
-
- `.claude/agents/build/` —
|
|
90
|
-
- `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (
|
|
91
|
-
- `.claude/skills/` —
|
|
92
|
-
- `.claude/hooks/build/` —
|
|
89
|
+
- `.claude/agents/build/` — 14 agentes.
|
|
90
|
+
- `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (8 comandos: `/build:onboard`, `/build:reflect`, `/build:architect`, `/build:slice`, `/build:release`, `/build:work`, `/build:resume`, `/build:front`).
|
|
91
|
+
- `.claude/skills/` — 15 skills (`building-a-slice`, `building-a-micro-change`, `releasing-a-version`, `managing-parallel-front`, `setup-architecture`, `openspec-*`).
|
|
92
|
+
- `.claude/hooks/build/` — 13 hooks (bash + python).
|
|
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`).
|
package/METODOLOGIA.md
CHANGED
|
@@ -19,11 +19,19 @@
|
|
|
19
19
|
discovery). El flujo completo de extremo a extremo es:
|
|
20
20
|
|
|
21
21
|
```
|
|
22
|
-
DISCOVERY
|
|
23
|
-
PRD → User Story Map → Backlog →
|
|
24
|
-
(AC G/W/T) →
|
|
22
|
+
DISCOVERY (@trycore/spec-product-flow) ARQUITECTURA (capa ADD) CONSTRUCCIÓN (@trycore/spec-build-harness)
|
|
23
|
+
PRD → User Story Map → Backlog → → drivers/ASRs → tácticas → → por épica: DoR → change → TDD → smoke → api/data → DoD → PR
|
|
24
|
+
Historias (AC G/W/T) → Flows estilos → vistas → ATAM → por release: Release Gate (seguridad/diseño/UX/coherencia/arquitectura/integración)
|
|
25
|
+
stack (ADRs en docs/adr/)
|
|
25
26
|
```
|
|
26
27
|
|
|
28
|
+
La **capa de arquitectura** (`/build:architect`, skill `setup-architecture`) es **opcional pero
|
|
29
|
+
recomendada** y corre **una vez, entre discovery y construcción**: lee `docs/` (solo lectura) y produce
|
|
30
|
+
los ADRs en `docs/adr/` con el método **ADD** (Attribute-Driven Design, Len Bass). Sus decisiones se
|
|
31
|
+
vuelven **criterios exigibles**: pueblan `stack-allowlist.json` (que `stack-guard.sh` hace cumplir) y son
|
|
32
|
+
criterio de DoR (cobertura de ADR para el cimiento fundacional). Es agnóstica: el dominio entra por
|
|
33
|
+
`docs/`. Ver §9.3.
|
|
34
|
+
|
|
27
35
|
Ambos paquetes **coexisten en el mismo `.claude/` sin colisión**, con namespaces disjuntos:
|
|
28
36
|
|
|
29
37
|
| Eje | Discovery (`spec-product-flow`) | Construcción (`spec-build-harness`) |
|
|
@@ -404,7 +412,10 @@ dor → change → red → green → refactor → smoke → api → data → dod
|
|
|
404
412
|
|
|
405
413
|
**Versionado del estado.** `build-state.json` se siembra **vacío** y **nunca se sobreescribe** (está
|
|
406
414
|
en `.gitignore`: es working state). El **schema** y el **README** sí se versionan. El
|
|
407
|
-
`stack-allowlist.json` es artefacto del consumidor
|
|
415
|
+
`stack-allowlist.json` es artefacto del consumidor con tres escritores en secuencia y **merge aditivo**:
|
|
416
|
+
lo **siembra** el CLI (`init`), lo **puebla** `/build:onboard` (stack mecánico) y, si el proyecto corre
|
|
417
|
+
la capa de arquitectura, `/build:architect` lo **consolida** (añade `allow`/`rationale` con referencia a
|
|
418
|
+
los ADRs; **nunca** borra entradas del consumidor ni pisa `source`, que sigue apuntando al PRD).
|
|
408
419
|
`uninstall` preserva `state/` y `config/`.
|
|
409
420
|
|
|
410
421
|
---
|
|
@@ -463,9 +474,41 @@ La construcción **consume** los artefactos de discovery y los trata como entrad
|
|
|
463
474
|
| `docs/02-user-story-map/` (backbone + líneas de release) | Esqueleto que camina (§2); definición de release y default del Release Gate (§4) |
|
|
464
475
|
| PRD §7 / `stack-allowlist.json#source` | Stack permitido; arquitectura auditada en `stack_arch` |
|
|
465
476
|
|
|
466
|
-
El arnés **no escribe** en
|
|
467
|
-
(`/trycore:*`).
|
|
468
|
-
épica y las HU al
|
|
477
|
+
El arnés **no escribe** en los artefactos de discovery (`docs/01-prd/` … `docs/04-historias/`); cuando
|
|
478
|
+
una HU no cumple DoR, devuelve el trabajo a discovery (`/trycore:*`). Los contactos de escritura del
|
|
479
|
+
arnés en `docs/` son dos y están acotados: la **back-reference** del change en la épica y las HU al
|
|
480
|
+
archivar (§6.4), y el subárbol **`docs/adr/`** —propiedad de construcción— que produce la capa de
|
|
481
|
+
arquitectura (§9.3). `docs/adr/` **no** es un artefacto de discovery: es la salida de construcción que
|
|
482
|
+
traza *hacia* discovery (HU/PRD) sin modificarla.
|
|
483
|
+
|
|
484
|
+
### 9.3 Capa de arquitectura (ADD) — entre discovery y construcción
|
|
485
|
+
|
|
486
|
+
Fase **opcional pero recomendada** que corre **una vez, después de discovery y antes del primer slice**,
|
|
487
|
+
activada por **`/build:architect`** (skill `setup-architecture`). Aplica el método **ADD** (Attribute-Driven
|
|
488
|
+
Design, Len Bass): lee `docs/` de solo lectura, extrae **drivers/ASRs** (objetivos de negocio → casos de
|
|
489
|
+
uso significativos → escenarios de calidad de 6 partes → restricciones → concerns), itera rondas de diseño
|
|
490
|
+
(**tácticas → estilos → vistas → evaluación ATAM-lite**) y decide el **stack**. Produce en `docs/adr/`:
|
|
491
|
+
|
|
492
|
+
- `0000-drivers-y-asrs.md` — catálogo de drivers (entrada de diseño, documento vivo).
|
|
493
|
+
- `000N-<slug>.md` — un ADR por decisión, plantilla de 7 secciones (= los pasos ADD).
|
|
494
|
+
- `_backlog-arquitectonico.md` — tablero de cobertura driver↔ADR, riesgos abiertos y bitácora (el
|
|
495
|
+
**estado** de la capa; no toca `build-state.json`).
|
|
496
|
+
|
|
497
|
+
**UX y HITL.** Autónoma y de propuesta máxima: genera todo de una pasada y se detiene en **una** revisión
|
|
498
|
+
final; solo escala trade-offs de **negocio** (no de arquitectura). **Propone, no publica**: los ADRs nacen
|
|
499
|
+
`proposed`/`living-document` y un humano los promueve a `accepted`. Delega la extracción en `asr-extractor`
|
|
500
|
+
y la evaluación en `architecture-evaluator` (ambos read-only). Re-correr es **incremental** (añade
|
|
501
|
+
iteraciones; no pisa ADRs `accepted`).
|
|
502
|
+
|
|
503
|
+
**Los ADRs son criterios exigibles** (cierre del lazo con los gates existentes):
|
|
504
|
+
- **`stack-allowlist.json`** — la capa lo puebla; el hook `stack-guard.sh` bloquea deps fuera de lista.
|
|
505
|
+
- **DoR** — `dor-dod-gatekeeper` exige que el cimiento de una épica `layer: foundational` tenga un ADR
|
|
506
|
+
con estado ≥ `ABORDADO` (duro); en épicas `business` es advertencia. Opt-in: sin `docs/adr/`, N/A.
|
|
507
|
+
- **`stack_arch`** (Release Gate) — `stack-guardian` audita el diff contra las decisiones `accepted` de
|
|
508
|
+
`docs/adr/`, no solo contra la allowlist.
|
|
509
|
+
|
|
510
|
+
Forward-compat v0.9: los tipos generados se declaran en `asset-types.json` (protocolo runtime §6); hoy la
|
|
511
|
+
salida es file-based y la propuesta se materializa en git, mañana irá por API sin cambiar la skill.
|
|
469
512
|
|
|
470
513
|
---
|
|
471
514
|
|
package/README.md
CHANGED
|
@@ -73,6 +73,7 @@ Gate de release que corre **una sola vez por versión** sobre el conjunto de sli
|
|
|
73
73
|
|---|---|
|
|
74
74
|
| `/build:onboard` | Onboarding capa 2: lee el PRD, pregunta por PII/IA/determinismo/secretos, resuelve `{{placeholders}}` y escribe la auto-memory. |
|
|
75
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. |
|
|
76
|
+
| `/build:architect` | **Capa de arquitectura (ADD)**, entre discovery y construcción: lee `docs/` de solo lectura y produce los ADRs en `docs/adr/` (drivers/ASRs → tácticas → estilos → vistas → ATAM-lite → stack) con mínimo HITL. Puebla `stack-allowlist.json`; sus decisiones se vuelven criterio de DoR y del gate `stack_arch`. Delega en la skill `setup-architecture`. |
|
|
76
77
|
| `/build:slice` | Entrada del **inner loop**: abre o continúa un slice (épica `EP-XXX`) y conduce el pipeline DoR → change → TDD → smoke → api/data → DoD → PR+archive. Adaptador delgado que delega en la skill `building-a-slice`. |
|
|
77
78
|
| `/build:release` | Entrada del **outer loop**: corre el Release Gate **una sola vez** sobre el diff acumulado (los 5 reviewers pesados en paralelo + integración secuencial). Delega en la skill `releasing-a-version`. |
|
|
78
79
|
| `/build:work` | Router *classify-and-act*: clasifica el trabajo entrante y enruta al carril correcto (`building-a-micro-change` · `building-a-slice` · `releasing-a-version`). Es ruteo, no política: no ejecuta el pipeline ni toca el estado. |
|
|
@@ -138,11 +139,11 @@ trycore-spec-build-harness/
|
|
|
138
139
|
├── METODOLOGIA.md ← fuente de verdad metodológica (gana ante cualquier skill)
|
|
139
140
|
├── GOVERNANCE.md ← gobernanza del paquete + cadencia de auditoría
|
|
140
141
|
├── .claude-plugin/ ← manifiesto del plugin nativo (canal de conveniencia)
|
|
141
|
-
├── agents/build/ ←
|
|
142
|
+
├── agents/build/ ← 14 agentes revisores (segunda opinión, contexto limpio)
|
|
142
143
|
├── commands/
|
|
143
144
|
│ ├── opsx/ ← 10 comandos /opsx:* (ciclo OpenSpec)
|
|
144
|
-
│ └── build/ ←
|
|
145
|
-
├── skills/ ←
|
|
145
|
+
│ └── build/ ← 8 comandos /build:* (onboard, reflect, architect, slice, release, work, resume, front)
|
|
146
|
+
├── skills/ ← 15 skills (building-a-slice, building-a-micro-change, releasing-a-version, managing-parallel-front, setup-architecture, 10 openspec-*) + 3 plantillas *.workflow.js (opt-in, read-only)
|
|
146
147
|
├── hooks/build/ ← 13 hooks (gate-check, reflect-nudge, release-gate-nudge, scaffold-guard, gitflow-guard, stack-guard, statusline-bridge, context-monitor, reconcile-build-state, …)
|
|
147
148
|
├── state/ ← máquina de estado: build-state.json + schema + README
|
|
148
149
|
├── config/ ← build-config.template.json (umbrales de contexto) + stack-allowlist.template.json (artefacto del consumidor)
|
|
@@ -151,7 +152,7 @@ trycore-spec-build-harness/
|
|
|
151
152
|
└── docs/examples/reference/ ← ejemplo de referencia (fuera del core, excluido de check-agnostic)
|
|
152
153
|
```
|
|
153
154
|
|
|
154
|
-
Los **
|
|
155
|
+
Los **14 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`, `wiring-adversarial-verifier` (opus), `asr-extractor` y `architecture-evaluator`.
|
|
155
156
|
|
|
156
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/`.
|
|
157
158
|
|
|
@@ -181,7 +182,8 @@ El core no menciona ningún dominio de cliente. Toda parametrización entra por
|
|
|
181
182
|
- ✅ **v0.6.0** — **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**.
|
|
182
183
|
- ✅ **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:*`**.
|
|
183
184
|
- ✅ **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**.
|
|
184
|
-
- ✅ **v0.8.1
|
|
185
|
+
- ✅ **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.2 (actual)** — **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**.
|
|
185
187
|
|
|
186
188
|
## Licencia
|
|
187
189
|
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.8.
|
|
1
|
+
0.8.2
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architecture-evaluator
|
|
3
|
+
description: Evalúa en papel un ADR (método ADD, Paso 7) con una pasada adversarial estilo ATAM-lite, antes de programar. Dado un ADR propuesto y el catálogo de drivers (docs/adr/0000-drivers-y-asrs.md), busca refutar que la decisión satisface sus drivers: emite veredicto por driver con evidencia/medida, identifica puntos de sensibilidad y trade-offs, y lista riesgos y drivers no cubiertos. Úsalo en la fase 3 de la skill setup-architecture (/build:architect). Read-only; no decide negocio ni escribe archivos: devuelve el análisis para §5/§6 del ADR y la sección de riesgos del backlog.
|
|
4
|
+
tools: Read, Grep, Glob
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Eres el **evaluador de arquitectura** del arnés. Read-only. Aplicas una versión ligera de **ATAM**
|
|
9
|
+
(Architecture Tradeoff Analysis Method) sobre un ADR **antes** de que se escriba una línea de código.
|
|
10
|
+
Tu sesgo es **adversarial**: buscas refutar que el ADR cumple sus drivers. Un riesgo en papel es mucho
|
|
11
|
+
más barato que un rediseño en código.
|
|
12
|
+
|
|
13
|
+
## Entrada (solo lectura)
|
|
14
|
+
- El ADR bajo análisis: `docs/adr/000N-*.md` (§1–§4 completas).
|
|
15
|
+
- El catálogo de drivers: `docs/adr/0000-drivers-y-asrs.md`.
|
|
16
|
+
- Opcional: ADRs previos relacionados (para detectar decisiones supersedidas o en conflicto).
|
|
17
|
+
|
|
18
|
+
## Qué producir
|
|
19
|
+
1. **Veredicto por driver.** Para cada driver que el ADR dice satisfacer: ✅ / ⚠️ / ❌ con la **evidencia o
|
|
20
|
+
medida** que lo respalda (o la que falta). Un driver solo es ✅ si hay medida verificable o plan de
|
|
21
|
+
verificación (k6, prueba de carga, matriz RBAC…). "Parece suficiente" es ⚠️.
|
|
22
|
+
2. **Puntos de sensibilidad.** Decisiones de las que depende críticamente una respuesta de calidad
|
|
23
|
+
(p.ej. tamaño de pool ↔ rendimiento de lectura).
|
|
24
|
+
3. **Trade-offs.** Puntos donde una decisión mejora un atributo y empeora otro (p.ej. backoff robusto vs
|
|
25
|
+
P99 de integración externa).
|
|
26
|
+
4. **Riesgos.** Decisiones sin evidencia, supuestos sin validar, drivers no cubiertos. Cada uno con
|
|
27
|
+
driver, mitigación planificada e iteración → alimentan la sección de riesgos del backlog.
|
|
28
|
+
5. **Drivers no resueltos.** Se devuelven explícitamente al backlog (`PENDIENTE`/`EN DISEÑO`).
|
|
29
|
+
|
|
30
|
+
## Reglas
|
|
31
|
+
- **Medida, no opinión.** No des ✅ sin sustento verificable.
|
|
32
|
+
- **No decides negocio.** Si un riesgo se resuelve con una decisión de negocio (exponer o no un dato,
|
|
33
|
+
fijar o aplazar RTO/RPO), márcalo **trade-off de negocio** → sube a la revisión única de la skill; no
|
|
34
|
+
lo resuelvas tú.
|
|
35
|
+
- **Detecta conflictos** con ADRs previos (una decisión que supersede a otra sin declararlo es un hallazgo).
|
|
36
|
+
|
|
37
|
+
## Salida
|
|
38
|
+
- Bloque para **§5 (análisis)** y **§6 (consecuencias)** del ADR + filas para la sección de **riesgos** del
|
|
39
|
+
backlog. Veredicto global del ADR: **COHERENTE** (cubre sus drivers con evidencia) / **CON RIESGOS**
|
|
40
|
+
(lista los abiertos) / **INCOHERENTE** (no cubre un driver crítico que dice cubrir).
|
|
41
|
+
|
|
42
|
+
## Degradación segura
|
|
43
|
+
Si no puedes completar el análisis (ADR ilegible, catálogo ausente), **NO devuelvas COHERENTE**: reporta
|
|
44
|
+
**INCONCLUSO** con el motivo y qué falta. Un fallo de herramienta no es N/A. No escribas archivos:
|
|
45
|
+
devuelve el análisis a la skill `setup-architecture`.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: asr-extractor
|
|
3
|
+
description: Extrae el catálogo de drivers arquitectónicos y ASRs (Architecturally Significant Requirements) leyendo los artefactos de discovery del consumidor (PRD, user story map, docs/03-backlog/epicas.md, docs/04-historias/HU-*.md), de solo lectura. Propone objetivos de negocio (OE), casos de uso significativos (UC), escenarios de atributos de calidad (QA) en formato Bass de 6 partes con medida cuantificable, restricciones (CON), concerns (CRN), matriz de prioridad y plan de iteraciones. Úsalo en la fase 1 de la skill setup-architecture (/build:architect), típicamente con fan-out por área. No decide arquitectura ni escribe archivos: devuelve el catálogo propuesto.
|
|
4
|
+
tools: Read, Grep, Glob
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Eres el **extractor de drivers/ASRs** del arnés. Read-only. Tu trabajo es leer discovery y **proponer**
|
|
9
|
+
la entrada de diseño del método ADD (Paso 1), no diseñar la solución.
|
|
10
|
+
|
|
11
|
+
## Entrada (solo lectura)
|
|
12
|
+
- `docs/01-prd/` — objetivos, requisitos funcionales, requisitos técnicos / no funcionales.
|
|
13
|
+
- `docs/02-user-story-map/` — backbone y líneas de release.
|
|
14
|
+
- `docs/03-backlog/epicas.md` — épicas (`EP-XXX`) y su trazabilidad a objetivos.
|
|
15
|
+
- `docs/04-historias/HU-*.md` — historias con AC en Given/When/Then.
|
|
16
|
+
|
|
17
|
+
## Qué extraer (propuesta)
|
|
18
|
+
1. **OE — objetivos de negocio.** Cada uno con métrica/meta. Si el PRD no da métrica, propón una y márcala
|
|
19
|
+
*a validar* (no la des por cierta).
|
|
20
|
+
2. **UC — funcionales arquitecturalmente significativos.** SOLO los que moldean la arquitectura
|
|
21
|
+
(integraciones externas, transaccionalidad, RBAC, asincronía, auditoría, versionado). No es el backlog
|
|
22
|
+
completo. Cada UC cita las HU/OE de las que sale.
|
|
23
|
+
3. **QA — escenarios de atributos de calidad**, uno por atributo relevante (rendimiento, disponibilidad,
|
|
24
|
+
seguridad/confidencialidad, integrabilidad, modificabilidad, observabilidad, escalabilidad, integridad
|
|
25
|
+
transaccional…). **Formato Bass de 6 partes**: Fuente · Estímulo · Artefacto · Entorno · Respuesta ·
|
|
26
|
+
**Medida de respuesta (cuantificable)**. Sin medida cuantificable no es ASR — propón una razonable
|
|
27
|
+
marcada *a validar*. Prioridad `(Importancia de negocio, Impacto arquitectónico)` en {A,M,B}.
|
|
28
|
+
4. **CON — restricciones.** Lo no negociable (stack impuesto, prohibiciones de datos, headers, gates CI).
|
|
29
|
+
5. **CRN — concerns.** Preocupaciones que condicionan el diseño (capacidades del equipo, costos, cuotas
|
|
30
|
+
de terceros, decisiones abiertas de negocio).
|
|
31
|
+
6. **Matriz de prioridad** (negocio × impacto) y **plan de iteraciones** (una ronda por fase PRD / release).
|
|
32
|
+
|
|
33
|
+
## Salida
|
|
34
|
+
- El catálogo estructurado tal como lo espera la plantilla `0000-drivers-y-asrs.template.md` (en
|
|
35
|
+
`assets/` de la skill `setup-architecture`, instalada en el consumidor; bloques §1–§7), listo para que
|
|
36
|
+
la skill lo escriba en `docs/adr/0000-drivers-y-asrs.md`.
|
|
37
|
+
- **Trazabilidad obligatoria**: cada UC/QA cita su origen (HU/OE/§PRD). Un driver sin sustento en `docs/`
|
|
38
|
+
no se inventa; si es un hueco real (p.ej. el PRD no fija disponibilidad), decláralo como CRN o riesgo.
|
|
39
|
+
|
|
40
|
+
## Degradación segura
|
|
41
|
+
Si `docs/` no es legible o falta discovery, **NO inventes** el catálogo: reporta qué falta y detente. La
|
|
42
|
+
ausencia de evidencia no es evidencia de ausencia de drivers. No escribas archivos: devuelve la propuesta
|
|
43
|
+
a la skill `setup-architecture`.
|
|
@@ -39,6 +39,18 @@ cumplen; lista cada una con ✓/✗:
|
|
|
39
39
|
9. **Fuente de diseño (solo slices con UI)**: si la épica toca UI, `design_source.confirmed===true`
|
|
40
40
|
(fuente visual de verdad declarada para el proyecto) y la épica apunta a la(s) pantalla(s)
|
|
41
41
|
equivalente(s) del `DESIGN_SOURCE`. Si no toca UI, este criterio es N/A.
|
|
42
|
+
10. **Cobertura arquitectónica (ADR)** — *opt-in, retrocompatible*: si el proyecto adoptó la capa de
|
|
43
|
+
arquitectura (existe `docs/adr/_backlog-arquitectonico.md`, generado por `/build:architect`), los
|
|
44
|
+
drivers **arquitecturalmente significativos** que la épica ejerce deben tener un ADR con estado
|
|
45
|
+
≥ `ABORDADO` en el tablero del backlog. **Mecanismo de join** (determinista, no matching libre): los
|
|
46
|
+
drivers de la épica son las filas del tablero cuya columna **Trazabilidad (EP/HU)** cita `EP-XXX` o
|
|
47
|
+
alguna de sus HU (`hus[]`); si el tablero no trae esa columna (backlog de versión previa), usa la
|
|
48
|
+
columna Trazabilidad del `0000-drivers-y-asrs.md`. **Duro para épicas `layer: foundational`** (auth,
|
|
49
|
+
datos, arquitectura base, design-system): si ninguno de sus drivers trazados tiene ADR ≥ `ABORDADO`,
|
|
50
|
+
**NO abras el slice** — instruye correr `/build:architect` para decidir esa arquitectura antes. Para
|
|
51
|
+
épicas `layer: business` es una **advertencia** (no bloquea) si algún driver que tocan sigue
|
|
52
|
+
`PENDIENTE`. Si **no** existe `docs/adr/` (proyecto sin la capa), este criterio es **N/A** — no
|
|
53
|
+
bloquees; deja una nota sugiriendo `/build:architect`.
|
|
42
54
|
|
|
43
55
|
Si DoR pasa: propón abrir `active_slice` con `epica`, `hus` (lista de las HU cubiertas),
|
|
44
56
|
`openspec_change` (kebab del título de la épica), `branch: feature/ep-xxx-<slug>`, `phase: dor`,
|
|
@@ -10,6 +10,9 @@ Eres el **guardián del stack** del arnés de construcción. Read-only. Defiende
|
|
|
10
10
|
## Referencias
|
|
11
11
|
- Contrato: la sección de requisitos técnicos del PRD del consumidor (ruta declarada en `stack-allowlist.json#source`).
|
|
12
12
|
- Allowlist operable: `.claude/config/stack-allowlist.json`.
|
|
13
|
+
- **Decisiones de arquitectura**: `docs/adr/` (catálogo de drivers `0000-drivers-y-asrs.md`, ADRs de
|
|
14
|
+
decisión y `_backlog-arquitectonico.md`), si el proyecto adoptó la capa (`/build:architect`). Los ADRs
|
|
15
|
+
`accepted` son el contrato de arquitectura del que la allowlist es la operacionalización de stack.
|
|
13
16
|
|
|
14
17
|
## Qué verificar (reporta ✓/✗)
|
|
15
18
|
1. **Dependencias.** Si existe un manifiesto de dependencias del proyecto, toda dep declarada debe
|
|
@@ -30,6 +33,12 @@ Eres el **guardián del stack** del arnés de construcción. Read-only. Defiende
|
|
|
30
33
|
3. **Anti-patrones.** Señala: lógica de decisión delegada a un servicio no determinista cuando el PRD
|
|
31
34
|
la exige determinista; llamadas a servicios externos desde el cliente; claves de servicios externos
|
|
32
35
|
(declaradas server-side) expuestas al browser; dependencias que reemplazan a las del stack declarado.
|
|
36
|
+
4. **Conformidad con los ADRs (si existe `docs/adr/`).** El diff acumulado respeta las decisiones
|
|
37
|
+
`accepted` de `docs/adr/`: el **estilo** elegido (p.ej. si un ADR fijó monolito modular, no aparecen
|
|
38
|
+
límites de proceso/red que impliquen microservicios sin un ADR que lo supersede), las **tácticas**
|
|
39
|
+
comprometidas por driver (p.ej. saga+outbox para integridad transaccional; RBAC central para
|
|
40
|
+
confidencialidad) y las **divergencias de stack** ya registradas. Marca cada decisión de código que
|
|
41
|
+
**contradiga** un ADR `accepted` sin superseder-lo (deriva de arquitectura), citando el ADR.
|
|
33
42
|
|
|
34
43
|
## Salida
|
|
35
44
|
- Veredicto **STACK-OK** / **DESVIACIÓN**, lista ✓/✗ con `archivo:línea` o nombre de dep.
|
package/asset-types.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Tipos de asset que este paquete sabe generar (protocolo-cliente-runtime §6). Declaración forward-compatible con v0.9: hoy la skill setup-architecture (/build:architect) los genera como archivos en docs/adr/ desde las plantillas de skills/setup-architecture/assets/ y los PROPONE (nunca publica); cuando exista el Agent Orchestrator Runtime, la misma skill los propondrá vía API (POST /projects/{id}/context/proposals) sin cambiar su salida. Este manifiesto declara EXACTAMENTE los tipos que la skill produce — ni más ni menos; tipos futuros (p.ej. arch.style/arch.patterns/stack.profile como documentos independientes del §6 del protocolo) se añadirán cuando exista una salida que los materialice. Aditivos → auto-publicados en el registro; breaking → propuestos para un ADMIN.",
|
|
3
|
+
"meta_schema_version": 1,
|
|
4
|
+
"types": [
|
|
5
|
+
{
|
|
6
|
+
"type_key": "arch.drivers",
|
|
7
|
+
"title": "Catálogo de drivers y ASRs",
|
|
8
|
+
"category": "Arquitectura",
|
|
9
|
+
"content_format": "markdown+frontmatter",
|
|
10
|
+
"frontmatter_schema": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"properties": {
|
|
13
|
+
"id": {"type": "string"},
|
|
14
|
+
"status": {"type": "string", "enum": ["living-document"]}
|
|
15
|
+
},
|
|
16
|
+
"required": ["id"]
|
|
17
|
+
},
|
|
18
|
+
"body_sections": [
|
|
19
|
+
{"id": "objetivos-negocio", "title": "Objetivos de negocio (OE)", "required": true},
|
|
20
|
+
{"id": "funcionales", "title": "Requisitos funcionales primarios (UC)", "required": true},
|
|
21
|
+
{"id": "escenarios-qa", "title": "Escenarios de atributos de calidad (QA)", "required": true},
|
|
22
|
+
{"id": "restricciones", "title": "Restricciones (CON)", "required": false},
|
|
23
|
+
{"id": "concerns", "title": "Concerns (CRN)", "required": false},
|
|
24
|
+
{"id": "plan-iteraciones", "title": "Plan de iteraciones", "required": false},
|
|
25
|
+
{"id": "matriz-prioridad", "title": "Matriz de priorización", "required": false}
|
|
26
|
+
],
|
|
27
|
+
"cardinality": "single",
|
|
28
|
+
"generation": {"source": "plugin", "skill": "setup-architecture"},
|
|
29
|
+
"descriptor_version": 1
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"type_key": "arch.adr",
|
|
33
|
+
"title": "Decisión de arquitectura (ADR-ADD)",
|
|
34
|
+
"category": "Arquitectura",
|
|
35
|
+
"content_format": "markdown+frontmatter",
|
|
36
|
+
"frontmatter_schema": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"properties": {
|
|
39
|
+
"id": {"type": "string"},
|
|
40
|
+
"title": {"type": "string"},
|
|
41
|
+
"status": {"type": "string", "enum": ["proposed", "accepted", "superseded", "deprecated"]},
|
|
42
|
+
"add": {"type": "object"}
|
|
43
|
+
},
|
|
44
|
+
"required": ["id", "title", "status"]
|
|
45
|
+
},
|
|
46
|
+
"body_sections": [
|
|
47
|
+
{"id": "objetivo-drivers", "title": "Objetivo de la iteración y drivers (Pasos 2-3)", "required": true},
|
|
48
|
+
{"id": "conceptos", "title": "Conceptos de diseño: tácticas y estilos (Paso 4)", "required": true},
|
|
49
|
+
{"id": "instanciacion", "title": "Instanciación: responsabilidades e interfaces (Paso 5)", "required": true},
|
|
50
|
+
{"id": "vistas-decision", "title": "Vistas y registro de la decisión (Paso 6)", "required": true},
|
|
51
|
+
{"id": "analisis", "title": "Análisis del diseño / ATAM (Paso 7)", "required": true},
|
|
52
|
+
{"id": "consecuencias", "title": "Consecuencias", "required": false},
|
|
53
|
+
{"id": "trazabilidad", "title": "Trazabilidad", "required": true}
|
|
54
|
+
],
|
|
55
|
+
"cardinality": "multiple",
|
|
56
|
+
"generation": {"source": "plugin", "skill": "setup-architecture"},
|
|
57
|
+
"descriptor_version": 1
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"type_key": "arch.backlog",
|
|
61
|
+
"title": "Backlog arquitectónico (cobertura driver↔ADR)",
|
|
62
|
+
"category": "Arquitectura",
|
|
63
|
+
"content_format": "markdown",
|
|
64
|
+
"frontmatter_schema": {"type": "object"},
|
|
65
|
+
"body_sections": [
|
|
66
|
+
{"id": "tablero-drivers", "title": "Tablero por driver", "required": true},
|
|
67
|
+
{"id": "riesgos-abiertos", "title": "Riesgos arquitectónicos abiertos", "required": true},
|
|
68
|
+
{"id": "bitacora-iteraciones", "title": "Bitácora de iteraciones", "required": true}
|
|
69
|
+
],
|
|
70
|
+
"cardinality": "single",
|
|
71
|
+
"generation": {"source": "plugin", "skill": "setup-architecture"},
|
|
72
|
+
"descriptor_version": 1
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "BUILD: Architect"
|
|
3
|
+
description: Capa de arquitectura previa a construcción. Genera los ADRs del proyecto con el método ADD (Attribute-Driven Design, Len Bass) leyendo docs/ (PRD + user story map + epicas + HUs) de solo lectura, y puebla stack-allowlist.json. Corre autónomo y propone al máximo; una sola revisión humana al final. Adaptador delgado: delega en la skill setup-architecture. Sus ADRs se vuelven criterios que el DoR y el gate stack_arch exigen.
|
|
4
|
+
category: Workflow
|
|
5
|
+
tags: [build-harness, architecture, add, adr, trycore]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Genera la **capa de arquitectura** del proyecto **antes** del primer slice: decide estilo, tácticas y
|
|
9
|
+
stack, y los deja como ADRs que el build ya exige. Este comando es un **adaptador delgado**: no
|
|
10
|
+
reimplementa nada — **delega** en la skill `setup-architecture` (método ADD). Si algo aquí contradice
|
|
11
|
+
`METODOLOGIA.md`, **gana la metodología**.
|
|
12
|
+
|
|
13
|
+
**Entrada (opcional):** un foco de iteración (`"fase 2"`, `"observabilidad"`, `EP-XXX`). Si viene vacío,
|
|
14
|
+
la skill corre el flujo completo desde el catálogo de drivers. La IA **propone al máximo**; no pregunta
|
|
15
|
+
campo por campo.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 1. Preflight
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
test -f .claude/.build-harness-version || echo "NOT_INSTALLED"
|
|
23
|
+
command -v python3 >/dev/null 2>&1 || echo "NO_PYTHON3"
|
|
24
|
+
# Discovery debe estar listo (entrada de solo lectura de la capa):
|
|
25
|
+
test -d docs/03-backlog && ls docs/04-historias/HU-*.md >/dev/null 2>&1 || echo "NO_DISCOVERY"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- **`NOT_INSTALLED`** → ejecuta `trycore-build init` y vuelve. Stop si falta `python3`.
|
|
29
|
+
- **`NO_DISCOVERY`** → no hay historias que leer: la capa de arquitectura corre **después** de discovery.
|
|
30
|
+
Remite a `@trycore/spec-product-flow` (`/trycore:*`) y detente. No escribas nada.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Conducir el flujo (delegar)
|
|
35
|
+
|
|
36
|
+
Invoca la skill **`setup-architecture`**. La skill:
|
|
37
|
+
|
|
38
|
+
1. Extrae el catálogo de drivers/ASRs → `docs/adr/0000-drivers-y-asrs.md` (delega en `asr-extractor`).
|
|
39
|
+
2. Itera ADD (una ronda por fase/release): tácticas → estilos → vistas → ADR `docs/adr/000N-*.md`.
|
|
40
|
+
3. Evalúa cada ADR (ATAM-lite, `architecture-evaluator`) y mantiene `docs/adr/_backlog-arquitectonico.md`.
|
|
41
|
+
4. Hace **una** revisión final: escala solo trade-offs de negocio, promueve `proposed → accepted` y
|
|
42
|
+
consolida el stack en `.claude/config/stack-allowlist.json`.
|
|
43
|
+
|
|
44
|
+
- **No** edites artefactos de discovery (`docs/01-prd/`…`docs/04-historias/`): la única salida en `docs/`
|
|
45
|
+
es `docs/adr/`.
|
|
46
|
+
- **No** publiques: los ADRs se **proponen** (`proposed`/`living-document`); el humano promueve a `accepted`.
|
|
47
|
+
- **No** abras un slice ni toques `build-state.json`: esta fase es **pre-build**.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 3. Resumen
|
|
52
|
+
|
|
53
|
+
Al terminar, resume: nº de drivers por tipo, nº de ADRs generados, estilo(s) y stack propuestos, riesgos
|
|
54
|
+
abiertos del backlog, y el siguiente paso: `/build:work` o `/build:slice` (ahora el DoR ya puede exigir
|
|
55
|
+
cobertura de ADR y `stack-guard` hace cumplir el stack).
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Guardrails
|
|
60
|
+
|
|
61
|
+
- **Solo lectura sobre discovery**; la única escritura en `docs/` es `docs/adr/`.
|
|
62
|
+
- **Propón, no publiques**: la promoción a `accepted` es del humano (revisión única).
|
|
63
|
+
- **Mínimo HITL**: autónomo; se detiene como máximo en una `AskUserQuestion` de trade-offs de negocio.
|
|
64
|
+
- **Incremental**: re-correr añade iteraciones; no regenera ADRs `accepted`.
|
|
65
|
+
- **Agnóstico**: no asume dominio; entra por `docs/`.
|
|
66
|
+
- Si algo contradice `METODOLOGIA.md`, **gana la metodología**.
|
package/docs/agents.md
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# Agentes de construcción (`agents/build/`)
|
|
2
2
|
|
|
3
|
-
Los **
|
|
4
|
-
construcción de dos loops
|
|
3
|
+
Los **14 agentes** de `@trycore/spec-build-harness` ejecutan los *gates* del arnés de
|
|
4
|
+
construcción de dos loops (12 de ellos) o alimentan la **capa de arquitectura** previa a
|
|
5
|
+
construcción (`asr-extractor` y `architecture-evaluator`, skill `setup-architecture`). Ninguno edita código de producto: son read-only sobre el
|
|
5
6
|
repositorio (algunos ejecutan tests o levantan la app), diagnostican y **devuelven el
|
|
6
7
|
veredicto al `build-orchestrator`**, que es quien propone la escritura del estado
|
|
7
8
|
(`.claude/state/build-state.json`).
|
|
@@ -14,7 +15,10 @@ veredicto al `build-orchestrator`**, que es quien propone la escritura del estad
|
|
|
14
15
|
> `coherence-three-way`, `stack-guardian`) corren **una vez por release** en el **outer loop**
|
|
15
16
|
> (skill `releasing-a-version`) y escriben sus veredictos en `releases[].gates`
|
|
16
17
|
> (`security`, `smell`, `ux`, `coherence`, `stack_arch` — este último renombrado desde el antiguo
|
|
17
|
-
> `stack` por-slice).
|
|
18
|
+
> `stack` por-slice). Los 2 agentes de **arquitectura** (`asr-extractor`,
|
|
19
|
+
> `architecture-evaluator`) corren **antes de construir**, una vez por proyecto (o por
|
|
20
|
+
> re-corrida incremental), en la skill `setup-architecture` (`/build:architect`): no cierran
|
|
21
|
+
> gates del estado — su salida son los ADRs de `docs/adr/`, que el DoR y `stack_arch` luego exigen.
|
|
18
22
|
>
|
|
19
23
|
> **Conducción opcional vía plantillas de workflow.** Tres plantillas read-only (opt-in, no editan
|
|
20
24
|
> estado) sirven de andamiaje para orquestar estos agentes sin sustituir su juicio:
|
|
@@ -37,6 +41,8 @@ veredicto al `build-orchestrator`**, que es quien propone la escritura del estad
|
|
|
37
41
|
| 10 | `change-epic-coherence` | sonnet | Trazabilidad | Gate `coherence_link` — enlace change↔épica↔HU |
|
|
38
42
|
| 11 | `ux-fidelity-reviewer` | sonnet | Inner loop · smoke | Gate `fidelity` — fidelidad visual a la fuente de diseño declarada (verificación visual real, MCP) |
|
|
39
43
|
| 12 | `wiring-adversarial-verifier` | **opus** | Inner loop · dod | Gate `wiring_verified` — verificación adversarial independiente del cableado (refuta antes de cerrar `dod`) |
|
|
44
|
+
| 13 | `asr-extractor` | sonnet | Capa de arquitectura | Extrae el catálogo de drivers/ASRs de discovery (entrada del método ADD) |
|
|
45
|
+
| 14 | `architecture-evaluator` | sonnet | Capa de arquitectura | Evaluación ATAM-lite adversarial de cada ADR antes de programar |
|
|
40
46
|
|
|
41
47
|
---
|
|
42
48
|
|
|
@@ -162,3 +168,26 @@ e items de `wiring_checklist[]` aún `failing` o marcados `passing` sin `evidenc
|
|
|
162
168
|
`gates.wiring_verified: true` (habilita `dod`); HUECOS → `false` (retrocede `phase`). Rompe la
|
|
163
169
|
auto-confirmación del cierre prematuro: el DoD declarativo del `dor-dod-gatekeeper` es un piso, este
|
|
164
170
|
agente es el arreglo.
|
|
171
|
+
|
|
172
|
+
## Capa de arquitectura (pre-build)
|
|
173
|
+
|
|
174
|
+
> Estos 2 corren **antes de construir**, en la skill `setup-architecture` (`/build:architect`),
|
|
175
|
+
> una vez por proyecto o por re-corrida incremental. No cierran gates de `build-state.json`:
|
|
176
|
+
> su salida son los ADRs de `docs/adr/`, que el DoR (cobertura de cimiento) y el gate
|
|
177
|
+
> `stack_arch` del Release Gate luego exigen.
|
|
178
|
+
|
|
179
|
+
### `asr-extractor` · modelo `sonnet` · read-only
|
|
180
|
+
**Extractor de drivers/ASRs** (ADD Paso 1). Lee los artefactos de discovery (`docs/01-prd/` …
|
|
181
|
+
`docs/04-historias/`) y **propone** el catálogo de entrada de diseño: objetivos de negocio (OE),
|
|
182
|
+
casos de uso arquitecturalmente significativos (UC), escenarios de atributos de calidad (QA) en
|
|
183
|
+
formato Bass de 6 partes con medida cuantificable, restricciones (CON), concerns (CRN), matriz de
|
|
184
|
+
prioridad y plan de iteraciones. Trazabilidad obligatoria (cada driver cita su HU/OE/§PRD); no
|
|
185
|
+
inventa dominio ni escribe archivos — devuelve la propuesta a la skill, que escribe
|
|
186
|
+
`docs/adr/0000-drivers-y-asrs.md`.
|
|
187
|
+
|
|
188
|
+
### `architecture-evaluator` · modelo `sonnet` · adversarial
|
|
189
|
+
**Evaluador ATAM-lite** (ADD Paso 7). Dado un ADR propuesto y el catálogo `0000`, intenta
|
|
190
|
+
**refutar** que la decisión satisface sus drivers: veredicto por driver con evidencia/medida
|
|
191
|
+
(✅/⚠️/❌), puntos de sensibilidad, trade-offs y riesgos → alimenta §5/§6 del ADR y la sección de
|
|
192
|
+
riesgos del backlog arquitectónico. No decide negocio (los trade-offs de negocio suben a la
|
|
193
|
+
revisión única de la skill) y degrada seguro (sin catálogo legible → INCONCLUSO, nunca COHERENTE).
|
package/docs/commands.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Esta referencia cubre los **dos planos de operación** del arnés de construcción:
|
|
4
4
|
|
|
5
5
|
1. El **CLI `trycore-build`** (binario Node, paquete `@trycore/spec-build-harness` v0.7.0) — instala, actualiza, diagnostica y desinstala el arnés en el proyecto consumidor. Captura el **stack mecánico**.
|
|
6
|
-
2. Los **slash commands de Claude Code** (`/opsx:*` + los
|
|
6
|
+
2. Los **slash commands de Claude Code** (`/opsx:*` + los 8 `/build:*`: `onboard`, `reflect`, `architect`, `slice`, `release`, `work`, `resume`, `front`) — operan el pipeline de dos loops, resuelven la parametrización **semántica** del dominio y capturan el conocimiento aprendido por slice.
|
|
7
7
|
|
|
8
8
|
> **División de responsabilidades del onboarding (dos capas).** Un binario Node **no puede** escribir la auto-memory de Claude. Por eso `trycore-build init` siembra archivos y captura el stack mecánico (lenguaje/deps, package manager, runtime, ruta del PRD), y el slash command `/build:onboard` —ejecutado por Claude— lee el PRD, pregunta por PII / capa de servicios externos-IA / capa determinista / secretos / decisiones de alto impacto, resuelve los `{{placeholders}}` del bloque marcado de `CLAUDE.md` y escribe la auto-memory.
|
|
9
9
|
|
|
@@ -52,7 +52,7 @@ Solo `init` y `update` aceptan flags. `status`, `uninstall` y `doctor` toman ún
|
|
|
52
52
|
|
|
53
53
|
## 2. Slash commands de Claude Code
|
|
54
54
|
|
|
55
|
-
El canal CLI namespacea por subcarpeta: `.claude/commands/opsx/` → `/opsx:*` y `.claude/commands/build/` → los
|
|
55
|
+
El canal CLI namespacea por subcarpeta: `.claude/commands/opsx/` → `/opsx:*` y `.claude/commands/build/` → los 8 `/build:*` (`onboard`, `reflect`, `architect`, `slice`, `release`, `work`, `resume`, `front`).
|
|
56
56
|
|
|
57
57
|
### `/opsx:*` — pipeline OpenSpec
|
|
58
58
|
|
|
@@ -69,6 +69,12 @@ El canal CLI namespacea por subcarpeta: `.claude/commands/opsx/` → `/opsx:*` y
|
|
|
69
69
|
| `/opsx:onboard` | Onboarding guiado: recorre un ciclo completo del workflow OpenSpec con narración (tutorial de aprendizaje). |
|
|
70
70
|
| `/opsx:sync` | Sincroniza los delta specs de un cambio hacia los specs principales. |
|
|
71
71
|
|
|
72
|
+
### `/build:architect` — capa de arquitectura (ADD), previa a construir
|
|
73
|
+
|
|
74
|
+
| Slash command | Propósito |
|
|
75
|
+
|---|---|
|
|
76
|
+
| `/build:architect` | Fase **opcional pero recomendada** que corre **una vez, entre discovery y construcción**. Adaptador delgado: **delega** en la skill `setup-architecture` (método **ADD**, Attribute-Driven Design de Len Bass). Lee `docs/` de solo lectura (PRD + user story map + épicas + HUs), extrae **drivers/ASRs**, itera rondas (**tácticas → estilos → vistas → ATAM-lite**), decide el **stack** y escribe `docs/adr/` (`0000-drivers-y-asrs.md` + ADRs de 7 secciones + `_backlog-arquitectonico.md`); puebla `.claude/config/stack-allowlist.json`. **Autónomo y de propuesta máxima**: mínimo HITL (una revisión final; solo escala trade-offs de negocio). **Propone, no publica** (ADRs `proposed` → un humano los promueve). Sus decisiones se vuelven criterios: el **DoR** exige cobertura de ADR para el cimiento fundacional y el gate **`stack_arch`** audita conformidad. Delega en `asr-extractor` y `architecture-evaluator`. |
|
|
77
|
+
|
|
72
78
|
### `/build:slice` — entrada del inner loop
|
|
73
79
|
|
|
74
80
|
| Slash command | Propósito |
|
|
@@ -120,7 +126,7 @@ El arnés se distribuye por **dos canales** que coexisten, pero **namespacean di
|
|
|
120
126
|
| Aspecto | Canal **CLI** (canónico) | Canal **Plugin** nativo |
|
|
121
127
|
|---|---|---|
|
|
122
128
|
| Instalación | `npm i -g @trycore/spec-build-harness` → `trycore-build init` | `/plugin marketplace add <repo-github>` → `/plugin install trycore-spec-build-harness@trycore-build` |
|
|
123
|
-
| Namespace de comandos | Por subcarpeta: `/opsx:*` y los
|
|
129
|
+
| Namespace de comandos | Por subcarpeta: `/opsx:*` y los 8 `/build:*` (`onboard`, `reflect`, `architect`, `slice`, `release`, `work`, `resume`, `front`) | Por nombre del plugin: `/trycore-spec-build-harness:*` (por diseño de Claude Code) |
|
|
124
130
|
| Referencia a agentes | Por su nombre (p. ej. `build-orchestrator`) | Bajo el nombre del plugin |
|
|
125
131
|
| Cross-references internas | ✔ Escritas para este canal (skills invocan `/opsx:*`, agentes por nombre) | Pueden no resolver según están escritas |
|
|
126
132
|
| Recomendación | **Usar este canal para operar un proyecto** | Conveniencia a nivel usuario |
|
package/docs/getting-started.md
CHANGED
|
@@ -48,7 +48,7 @@ npm i -g @fission-ai/openspec @trycore/spec-build-harness
|
|
|
48
48
|
|
|
49
49
|
## 2 · `trycore-build init` (terminal)
|
|
50
50
|
|
|
51
|
-
Desde la raíz de tu proyecto. Es **idempotente** (re-correrlo es seguro) y siembra: **
|
|
51
|
+
Desde la raíz de tu proyecto. Es **idempotente** (re-correrlo es seguro) y siembra: **14 agentes**, **15 skills** (`building-a-slice`, `building-a-micro-change`, `releasing-a-version`, `managing-parallel-front`, `setup-architecture` + 10 `openspec-*`), **10 comandos `/opsx:*`** + **8 comandos `/build:*`** (`onboard`, `reflect`, `architect`, `slice`, `release`, `work`, `resume`, `front`), **13 hooks**, el estado vacío `.claude/state/build-state.json` (gitignored, nunca se sobreescribe) y el bloque `<!-- BEGIN trycore-build-harness -->` en tu `CLAUDE.md` con `{{placeholders}}` sin resolver.
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
trycore-build init
|