@trycore/spec-build-harness 0.8.1 → 0.8.3

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.
Files changed (32) hide show
  1. package/.claude-plugin/plugin.json +5 -2
  2. package/GOVERNANCE.md +1 -1
  3. package/INSTALL.md +4 -4
  4. package/METODOLOGIA.md +50 -7
  5. package/README.md +8 -5
  6. package/VERSION +1 -1
  7. package/agents/build/architecture-evaluator.md +45 -0
  8. package/agents/build/asr-extractor.md +43 -0
  9. package/agents/build/dor-dod-gatekeeper.md +20 -0
  10. package/agents/build/stack-guardian.md +9 -0
  11. package/asset-types.json +75 -0
  12. package/commands/build/architect.md +66 -0
  13. package/docs/agents.md +32 -3
  14. package/docs/commands.md +9 -3
  15. package/docs/getting-started.md +1 -1
  16. package/docs/runtime/plan-migracion-harness-v0.9.md +84 -0
  17. package/docs/runtime/protocolo-cliente-runtime.md +116 -0
  18. package/package.json +2 -1
  19. package/skills/building-a-slice/references/dor.md +8 -0
  20. package/skills/building-a-slice/workflows/README.md +7 -1
  21. package/skills/building-a-slice/workflows/dor-fanout.workflow.js +98 -0
  22. package/skills/releasing-a-version/SKILL.md +5 -2
  23. package/skills/releasing-a-version/references/release-dod.md +1 -1
  24. package/skills/releasing-a-version/workflows/README.md +6 -1
  25. package/skills/releasing-a-version/workflows/release-gate.workflow.js +59 -4
  26. package/skills/setup-architecture/SKILL.md +94 -0
  27. package/skills/setup-architecture/assets/0000-drivers-y-asrs.template.md +101 -0
  28. package/skills/setup-architecture/assets/_backlog-arquitectonico.template.md +51 -0
  29. package/skills/setup-architecture/assets/adr-add.template.md +84 -0
  30. package/skills/setup-architecture/references/add-method.md +53 -0
  31. package/skills/setup-architecture/references/atam-lite.md +44 -0
  32. 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.1",
5
+ "version": "0.8.3",
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",
@@ -22,7 +22,10 @@
22
22
  "trycore"
23
23
  ],
24
24
  "skills": "./skills/",
25
- "commands": ["./commands/opsx/", "./commands/build/"],
25
+ "commands": [
26
+ "./commands/opsx/",
27
+ "./commands/build/"
28
+ ],
26
29
  "agents": "./agents/build/",
27
30
  "hooks": "./hooks/build-harness.json"
28
31
  }
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 | 12 agentes de build | `.claude/agents/build/` |
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/` — 12 agentes.
90
- - `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (5 comandos: `/build:onboard`, `/build:reflect`, `/build:slice`, `/build:release`, `/build:work`).
91
- - `.claude/skills/` — 13 skills (`building-a-slice`, `building-a-micro-change`, `releasing-a-version`, `openspec-*`).
92
- - `.claude/hooks/build/` — 10 hooks bash.
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 (@trycore/spec-product-flow) CONSTRUCCIÓN (@trycore/spec-build-harness)
23
- PRD → User Story Map → Backlog → Historias → por épica: DoR → change → TDD → smoke → api/data → DoD → PR
24
- (AC G/W/T) → PriorizaciónFlows por release: Release Gate (seguridad/diseño/UX/coherencia/arquitectura/integración)
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 estilosvistas → 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 (lo siembra el CLI, lo puebla `/build:onboard`).
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 `docs/`; cuando una HU no cumple DoR, devuelve el trabajo a discovery
467
- (`/trycore:*`). El único contacto de escritura cruzada es la **back-reference** del change en la
468
- épica y las HU al archivar (§6.4).
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/ ← 12 agentes revisores (segunda opinión, contexto limpio)
142
+ ├── agents/build/ ← 14 agentes revisores (segunda opinión, contexto limpio)
142
143
  ├── commands/
143
144
  │ ├── opsx/ ← 10 comandos /opsx:* (ciclo OpenSpec)
144
- │ └── build/ ← 7 comandos /build:* (onboard, reflect, slice, release, work, resume, front)
145
- ├── skills/ ← 14 skills (building-a-slice, building-a-micro-change, releasing-a-version, managing-parallel-front, 10 openspec-*) + 3 plantillas *.workflow.js (opt-in, read-only)
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 **12 agentes** en `agents/build/` son: `build-orchestrator`, `dor-dod-gatekeeper`, `security-reviewer`, `simple-design-reviewer`, `ux-krug-reviewer`, `coherence-three-way` (opus), `stack-guardian`, `api-contract-tester`, `data-consistency-checker`, `change-epic-coherence`, `ux-fidelity-reviewer` y `wiring-adversarial-verifier` (opus).
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,9 @@ 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 (actual)** — **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`.
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.3 (actual)** — **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).
187
+ - ✅ **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**.
185
188
 
186
189
  ## Licencia
187
190
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.1
1
+ 0.8.3
@@ -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`.
@@ -19,6 +19,14 @@ las fases de código.)
19
19
  La unidad es la **épica**. Identifica `EP-XXX` en `docs/03-backlog/epicas.md` y el conjunto de HU
20
20
  que la componen (las que tienen `epica: EP-XXX` en `docs/04-historias/`). Pasa SOLO si **todas** se
21
21
  cumplen; lista cada una con ✓/✗:
22
+
23
+ > **Conducción opcional — fan-out per-HU (épicas con ≥ 3 HUs).** Los criterios 3-5 (frontmatter, AC
24
+ > G/W/T, INVEST) son por-HU e independientes: puedes conducirlos con la plantilla
25
+ > `building-a-slice/workflows/dor-fanout.workflow.js` (read-only; `args: {epica, hus[]}`) para validarlos
26
+ > **en paralelo** en vez de HU por HU. La plantilla devuelve el diagnóstico per-HU con consolidación
27
+ > fail-closed (HU fallida o shard ausente = false); tú **combinas** ese diagnóstico con los criterios de
28
+ > nivel épica (1-2 y 6-10, que valides tú en sesión) y sigues siendo el **único** que emite el veredicto
29
+ > DoR y abre `active_slice`. Con < 3 HUs la plantilla se auto-salta: valida secuencial como siempre.
22
30
  1. La épica existe en `docs/03-backlog/epicas.md` con su trazabilidad a objetivos del PRD.
23
31
  2. Tiene **al menos una HU** asociada y todas se enumeran en `hus[]`.
24
32
  3. **Cada HU** de la épica: frontmatter YAML completo (`id, titulo, epica, prioridad, complejidad,
@@ -39,6 +47,18 @@ cumplen; lista cada una con ✓/✗:
39
47
  9. **Fuente de diseño (solo slices con UI)**: si la épica toca UI, `design_source.confirmed===true`
40
48
  (fuente visual de verdad declarada para el proyecto) y la épica apunta a la(s) pantalla(s)
41
49
  equivalente(s) del `DESIGN_SOURCE`. Si no toca UI, este criterio es N/A.
50
+ 10. **Cobertura arquitectónica (ADR)** — *opt-in, retrocompatible*: si el proyecto adoptó la capa de
51
+ arquitectura (existe `docs/adr/_backlog-arquitectonico.md`, generado por `/build:architect`), los
52
+ drivers **arquitecturalmente significativos** que la épica ejerce deben tener un ADR con estado
53
+ ≥ `ABORDADO` en el tablero del backlog. **Mecanismo de join** (determinista, no matching libre): los
54
+ drivers de la épica son las filas del tablero cuya columna **Trazabilidad (EP/HU)** cita `EP-XXX` o
55
+ alguna de sus HU (`hus[]`); si el tablero no trae esa columna (backlog de versión previa), usa la
56
+ columna Trazabilidad del `0000-drivers-y-asrs.md`. **Duro para épicas `layer: foundational`** (auth,
57
+ datos, arquitectura base, design-system): si ninguno de sus drivers trazados tiene ADR ≥ `ABORDADO`,
58
+ **NO abras el slice** — instruye correr `/build:architect` para decidir esa arquitectura antes. Para
59
+ épicas `layer: business` es una **advertencia** (no bloquea) si algún driver que tocan sigue
60
+ `PENDIENTE`. Si **no** existe `docs/adr/` (proyecto sin la capa), este criterio es **N/A** — no
61
+ bloquees; deja una nota sugiriendo `/build:architect`.
42
62
 
43
63
  Si DoR pasa: propón abrir `active_slice` con `epica`, `hus` (lista de las HU cubiertas),
44
64
  `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.
@@ -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 **12 agentes** de `@trycore/spec-build-harness` ejecutan los *gates* del arnés de
4
- construcción de dos loops. Ninguno edita código de producto: son read-only sobre el
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 7 `/build:*`: `onboard`, `reflect`, `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.
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 7 `/build:*` (`onboard`, `reflect`, `slice`, `release`, `work`, `resume`, `front`).
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 7 `/build:*` (`onboard`, `reflect`, `slice`, `release`, `work`, `resume`, `front`) | Por nombre del plugin: `/trycore-spec-build-harness:*` (por diseño de Claude Code) |
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 |
@@ -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: **12 agentes**, **13 skills** (`building-a-slice`, `building-a-micro-change`, `releasing-a-version` + 10 `openspec-*`), **10 comandos `/opsx:*`** + **5 comandos `/build:*`** (`onboard`, `slice`, `release`, `reflect`, `work`), **10 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.
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