@trycore/spec-build-harness 0.8.4 → 0.8.5

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.
@@ -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.4",
5
+ "version": "0.8.5",
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
@@ -10,8 +10,8 @@ evoluciona con el modelo y el proyecto. No es "instalar y olvidar".
10
10
  | Estado | `build-state.json` (+schema, README) | `.claude/state/` |
11
11
  | Agentes | 14 agentes de build | `.claude/agents/build/` |
12
12
  | Hooks | settings.json + 13 scripts | `.claude/settings.json`, `.claude/hooks/build/` |
13
- | Skill | `building-a-slice` (+11 refs · `workflows/`) · `releasing-a-version` (`workflows/`) · `building-a-micro-change` (carril ligero de mantenimiento) · `managing-parallel-front` (front paralelo inter-épica) | `.claude/skills/` |
14
- | Comandos | `/opsx:*` · `/build:onboard` · `/build:reflect` · `/build:slice` · `/build:release` · `/build:work` · `/build:resume` · `/build:front` | `.claude/commands/` |
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) · `prototyping-screens` (prototipo HTML de referencia) | `.claude/skills/` |
14
+ | Comandos | `/opsx:*` · `/build:onboard` · `/build:reflect` · `/build:prototype` · `/build:slice` · `/build:release` · `/build:work` · `/build:resume` · `/build:front` | `.claude/commands/` |
15
15
  | Config | allowlist de stack | `.claude/config/stack-allowlist.json` |
16
16
 
17
17
  ## Fases de activación (`harness_phase`)
@@ -46,6 +46,21 @@ Editar `stack-allowlist.json` SOLO si la sección de requisitos técnicos del PR
46
46
  ## Bitácora de cambios de metodología
47
47
  Cambios a la política de construcción (unidad de trabajo, gates, DoR/DoD). Aprueba el DRI; van por PR.
48
48
 
49
+ - **2026-08-05 · v0.8.5** — **El arnés puede generar el prototipo (fuente de diseño)** (origen:
50
+ investigación de comunidad sobre fidelidad visual + dolor recurrente de pantallas que difieren del
51
+ prototipo; spec `docs/superpowers/specs/2026-08-05-prototype-generator-design.md`). **Aprobación del
52
+ DRI (Agent Manager) requerida en el PR.** Cambia una regla de política: "el arnés NO genera el
53
+ prototipo" → "**puede generarlo** vía `/build:prototype` (skill `prototyping-screens`); la
54
+ confirmación (`design_source.confirmed`) y la aprobación de cada pantalla (`borrador`→`aprobada`
55
+ en `manifest.json`) siguen siendo **exclusivamente humanas**". No cambia unidad de trabajo, gates,
56
+ DoR ni DoD: el gate `design_source` conserva su semántica (espejo de `scaffold`) y `fidelity`
57
+ sigue igual. Toca §9.2 (4º carve-out de escritura: subárbol `docs/05-prototipo/`, análogo a
58
+ `docs/adr/`) y §10 regla 9 (nota de producción de la fuente). Modo feature con **precondición
59
+ dura** (app corriendo + MCP de inspección de UI; sin degradación estática), coherente con la
60
+ postura estricta de `fidelity`. Artefactos nuevos: **1 comando** (`/build:prototype`, total 9
61
+ `/build:*`) y **1 skill** (`prototyping-screens`, total 16); sin hooks ni agentes nuevos; schema
62
+ sin cambio estructural (solo texto de `description`). Release **0.8.5** (version-sync ×3).
63
+
49
64
  - **2026-06-24 · v0.7.0** — **Workflows dinámicos en el flujo build-a-slice** (origen:
50
65
  evaluación adversarial del arnés con workflows dinámicos; 18 mejoras aprobadas contra una rúbrica de
51
66
  hardness). **Aprobado por el DRI (Agent Manager); fusionado en PR #7.** No cambia la unidad de trabajo, los gates,
package/INSTALL.md CHANGED
@@ -87,8 +87,8 @@ Qué hace `init`:
87
87
  1. **Verifica requisitos duros** (a menos que uses `--skip-doctor`).
88
88
  2. **Siembra los assets** en rutas nativas de Claude Code:
89
89
  - `.claude/agents/build/` — 14 agentes.
90
- - `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (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-*`).
90
+ - `.claude/commands/opsx/` (10 comandos `/opsx:*`) y `.claude/commands/build/` (9 comandos: `/build:onboard`, `/build:reflect`, `/build:architect`, `/build:prototype`, `/build:slice`, `/build:release`, `/build:work`, `/build:resume`, `/build:front`).
91
+ - `.claude/skills/` — 16 skills (`building-a-slice`, `building-a-micro-change`, `releasing-a-version`, `managing-parallel-front`, `setup-architecture`, `prototyping-screens`, `openspec-*`).
92
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`).
package/METODOLOGIA.md CHANGED
@@ -493,13 +493,16 @@ La construcción **consume** los artefactos de discovery y los trata como entrad
493
493
 
494
494
  El arnés **no escribe** en los artefactos de discovery (`docs/01-prd/` … `docs/04-historias/`); cuando
495
495
  una HU no cumple DoR, devuelve el trabajo a discovery (`/trycore:*`). Los contactos de escritura del
496
- arnés en `docs/` son **tres** y están acotados: la **back-reference** del change en la épica y las HU
496
+ arnés en `docs/` son **cuatro** y están acotados: la **back-reference** del change en la épica y las HU
497
497
  al archivar (§6.4), el subárbol **`docs/adr/`** —propiedad de construcción— que produce la capa de
498
- arquitectura (§9.3), y la **épica caparazón** en `docs/03-backlog/epicas.md` — únicamente esa épica,
498
+ arquitectura (§9.3), la **épica caparazón** en `docs/03-backlog/epicas.md` — únicamente esa épica,
499
499
  únicamente con **aprobación humana explícita** del borrador propuesto en `/build:onboard` Fase 2c
500
500
  (frontmatter `origin: harness-draft`); si el humano rechaza, la épica se crea en discovery como
501
- siempre. `docs/adr/` **no** es un artefacto de discovery: es la salida de construcción que traza
502
- *hacia* discovery (HU/PRD) sin modificarla.
501
+ siempre —, y el subárbol **`docs/05-prototipo/`** —propiedad de construcción donde
502
+ `/build:prototype` (skill `prototyping-screens`) produce el prototipo HTML de referencia (la fuente
503
+ de diseño): las pantallas nacen `borrador` y solo pasan a `aprobada` con aprobación humana, análogo
504
+ a `docs/adr/`. Ni `docs/adr/` ni `docs/05-prototipo/` son artefactos de discovery: son salida de
505
+ construcción que traza *hacia* discovery (HU/PRD) sin modificarla.
503
506
 
504
507
  ### 9.3 Capa de arquitectura (ADD) — entre discovery y construcción
505
508
 
@@ -556,7 +559,9 @@ salida es file-based y la propuesta se materializa en git, mañana irá por API
556
559
  no MVP** (recortar/diferir es bloqueante explícito, nunca decisión del modelo; verificación
557
560
  ejecutada, no por inspección).
558
561
  9. **Fidelidad estricta**: para slices con UI, `fidelity` solo cierra con **verificación visual real**
559
- (MCP chrome-devtools); INCONCLUSO no pasa.
562
+ (MCP chrome-devtools); INCONCLUSO no pasa. La fuente de diseño puede **producirse** con
563
+ `/build:prototype` (en modo feature exige extracción viva de la app corriendo);
564
+ `design_source.confirmed` sigue siendo confirmación humana, nunca del arnés.
560
565
  10. El core es **agnóstico**: lo específico del dominio se inyecta vía `/build:onboard` y
561
566
  `stack-allowlist.json`; el ejemplo de referencia vive en `docs/examples/reference/`.
562
567
  11. Si una skill, agente o reference contradice este documento, **gana la metodología**.
package/README.md CHANGED
@@ -142,8 +142,8 @@ trycore-spec-build-harness/
142
142
  ├── agents/build/ ← 14 agentes revisores (segunda opinión, contexto limpio)
143
143
  ├── commands/
144
144
  │ ├── opsx/ ← 10 comandos /opsx:* (ciclo OpenSpec)
145
- │ └── build/ ← 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)
145
+ │ └── build/ ← 9 comandos /build:* (onboard, reflect, architect, prototype, slice, release, work, resume, front)
146
+ ├── skills/ ← 16 skills (building-a-slice, building-a-micro-change, releasing-a-version, managing-parallel-front, setup-architecture, prototyping-screens, 10 openspec-*) + 3 plantillas *.workflow.js (opt-in, read-only)
147
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, …)
148
148
  ├── state/ ← máquina de estado: build-state.json + schema + README
149
149
  ├── config/ ← build-config.template.json (umbrales de contexto) + stack-allowlist.template.json (artefacto del consumidor)
@@ -183,7 +183,8 @@ El core no menciona ningún dominio de cliente. Toda parametrización entra por
183
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:*`**.
184
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**.
185
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.4 (actual)** — **épica caparazón obligatoria en greenfield**: nuevo campo `project_kind` con detección automática conservadora en `trycore-build init` (brownfield seguro = manifiesto + código + **historial git con commits de código**; ambigüedad una sola pregunta en `/build:onboard`; **en brownfield el mecanismo es N/A total, sin preguntar**) y gate de proyecto **`foundation`**: contrato del caparazón (navegación/menús · layout/panel central · homepage · login/authN · redirecciones/guards) como checklist podable con **evidencia de ejecución por ítem** (patrón `wiring_checklist`, contrato en `skills/building-a-slice/references/foundation-contract.md`). `/build:onboard` **Fase 2c** poda el contrato y redacta el **borrador híbrido** de la épica (solo se escribe en `epicas.md` con aprobación humana explícita carve-out §9.2). **DoR 7-bis proactivo**: en greenfield ninguna épica `business` abre slice hasta que la caparazón esté **archivada con checklist evidenciada** (`foundation.completed_at`); las fundacionales y el carril micro-change nunca se bloquean. Línea `Caparazón` en `status`/`doctor`. Retrocompatible: campos opcionales del schema.
186
+ - ✅ **v0.8.5 (actual)** — **generador de prototipos HTML de referencia**: comando **`/build:prototype`** + skill **`prototyping-screens`** que producen la fuente de diseño (`DESIGN_SOURCE`) en `docs/05-prototipo/` (`DESIGN.md` + `tokens.css` + `manifest.json` pantalla↔épica/HU + un HTML autocontenido por pantalla). Dos modos: **greenfield** (inventario desde PRD/mapa/historias dirección estética con 2-3 variantes a elección humana generación por lotes) y **feature** (pantallas de una épica nueva con **extracción viva obligatoria** del UI implementado: CSS computado + screenshots en 3 viewports vía MCP; sin degradación estática). Auto-verificación visual (render real, máx. 3 iteraciones, sin pixel-diff) y **aprobación humana** de cada pantalla (`borrador`→`aprobada`); `ux-fidelity-reviewer` resuelve pantallas vía `manifest.json` (solo `aprobada`). La regla "el arnés no genera el prototipo" evoluciona a "puede generarlo; `design_source.confirmed` sigue siendo humano". carve-out de escritura en `docs/` (§9.2). Total: **14 agentes**, **13 hooks**, **9 comandos `/build:*`**, **16 skills**.
187
+ - ✅ **v0.8.4** — **épica caparazón obligatoria en greenfield**: nuevo campo `project_kind` con detección automática conservadora en `trycore-build init` (brownfield seguro = manifiesto + código + **historial git con commits de código**; ambigüedad → una sola pregunta en `/build:onboard`; **en brownfield el mecanismo es N/A total, sin preguntar**) y gate de proyecto **`foundation`**: contrato del caparazón (navegación/menús · layout/panel central · homepage · login/authN · redirecciones/guards) como checklist podable con **evidencia de ejecución por ítem** (patrón `wiring_checklist`, contrato en `skills/building-a-slice/references/foundation-contract.md`). `/build:onboard` **Fase 2c** poda el contrato y redacta el **borrador híbrido** de la épica (solo se escribe en `epicas.md` con aprobación humana explícita — carve-out §9.2). **DoR 7-bis proactivo**: en greenfield ninguna épica `business` abre slice hasta que la caparazón esté **archivada con checklist evidenciada** (`foundation.completed_at`); las fundacionales y el carril micro-change nunca se bloquean. Línea `Caparazón` en `status`/`doctor`. Retrocompatible: campos opcionales del schema.
187
188
  - ✅ **v0.8.3** — **gates de validación paralelizados (sharding lossless)**: el carril `coherence` del Release Gate se shardea **por HU** (≥ 3 HUs, `args.hus[]`) — de un solo agente opus O(HUs) a un shard por HU en paralelo con consolidación **fail-closed** y cobertura completa; nueva plantilla **`dor-fanout.workflow.js`** para los chequeos per-HU del DoR (frontmatter/G-W-T/INVEST en paralelo; el nivel épica sigue en `dor-dod-gatekeeper`, único emisor del veredicto). `security`/`smell`/`ux`/`stack_arch` quedan monolíticos a propósito (riesgo cross-cutting); `integration` sigue secuencial (regla dura §5).
188
189
  - ✅ **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**.
189
190
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.4
1
+ 0.8.5
@@ -55,7 +55,10 @@ cumplen; lista cada una con ✓/✗:
55
55
  instruye descomponerla en `sub_slices[]` construidos de a uno (`journey_smoke` verde entre cada uno).
56
56
  9. **Fuente de diseño (solo slices con UI)**: si la épica toca UI, `design_source.confirmed===true`
57
57
  (fuente visual de verdad declarada para el proyecto) y la épica apunta a la(s) pantalla(s)
58
- equivalente(s) del `DESIGN_SOURCE`. Si no toca UI, este criterio es N/A.
58
+ equivalente(s) del `DESIGN_SOURCE`. Si la fuente es un prototipo generado (convención
59
+ `docs/05-prototipo/`), la(s) pantalla(s) equivalente(s) deben existir en su `manifest.json` con
60
+ `estado: "aprobada"` — un `borrador` **no** satisface este criterio (genera/aprueba primero con
61
+ `/build:prototype`). Si no toca UI, este criterio es N/A.
59
62
  10. **Cobertura arquitectónica (ADR)** — *opt-in, retrocompatible*: si el proyecto adoptó la capa de
60
63
  arquitectura (existe `docs/adr/_backlog-arquitectonico.md`, generado por `/build:architect`), los
61
64
  drivers **arquitecturalmente significativos** que la épica ejerce deben tener un ADR con estado
@@ -20,7 +20,10 @@ igual que `ux-krug-reviewer`.
20
20
  ## Entradas (pídelas si faltan)
21
21
  - La(s) pantalla(s) del slice (rutas de la app, p.ej. `<URL-local-del-dev-server>/<ruta>`).
22
22
  - La fuente de diseño (`DESIGN_SOURCE`): archivo/URL del prototipo o export, y cómo localizar la
23
- pantalla equivalente.
23
+ pantalla equivalente. Si apunta a un directorio de prototipo generado (convención
24
+ `docs/05-prototipo/`), resuelve la pantalla equivalente vía su `manifest.json` (mapa
25
+ pantalla↔épica/HU↔archivo) y considera **solo** las entradas `estado: "aprobada"` como fuente
26
+ de verdad — un `borrador` no acredita fidelidad.
24
27
  - Tokens de diseño del proyecto (los que declare el stack del PRD del consumidor: variables CSS, tema,
25
28
  design tokens), si existen.
26
29
 
@@ -66,7 +66,10 @@ Voy a leer tu PRD/openspec para proponer valores y confirmar contigo:
66
66
  - **Decisiones de alto impacto** (`HIGH_STAKES_DECISIONS`): decisiones que exigen explicabilidad/justificación en la UI.
67
67
  - **Fuente de diseño** (`DESIGN_SOURCE`): ¿el producto tiene UI? Si sí, ruta/URL de la fuente
68
68
  visual de verdad (prototipo, export de diseño o mockups) y cómo localizar cada pantalla; si no,
69
- "N/A". (La escritura del estado `design_source` en `build-state.json` se hace en la Fase 3c.)
69
+ "N/A". Si hay UI pero **no existe** fuente aún, indica que `/build:prototype` puede generarla
70
+ tras el onboarding (prototipo HTML de referencia en `docs/05-prototipo/`; la confirmación
71
+ sigue siendo humana). (La escritura del estado `design_source` en `build-state.json` se hace
72
+ en la Fase 3c.)
70
73
  3. Si un punto no aplica al proyecto, registra explícitamente "no aplica" (no lo dejes como `{{...}}`).
71
74
 
72
75
  ---
@@ -167,7 +170,8 @@ Si el usuario lo desea y existe `package.json` en el proyecto:
167
170
  Espejo de la confirmación de scaffold, para `design_source` en `build-state.json`:
168
171
  - Si el producto **tiene UI**: setea `design_source.applies=true`, `source` (el puntero confirmado) y
169
172
  `confirmed=true` **solo si** el usuario confirma que la fuente de diseño existe (con `confirmed_by`,
170
- `confirmed_at`). El arnés **no genera** el prototipo.
173
+ `confirmed_at`). El prototipo puede generarse con `/build:prototype` (skill `prototyping-screens`);
174
+ `confirmed` sigue siendo exclusivamente humano.
171
175
  - Si **no hay UI**: setea `design_source.applies=false` (el mecanismo de fidelidad queda N/A).
172
176
 
173
177
  Escribe **solo** los campos del schema (`applies`, `source`, `confirmed`, `confirmed_by`, `confirmed_at`,
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: "BUILD: Prototype"
3
+ description: Genera o amplía el prototipo HTML de referencia (la fuente de diseño / DESIGN_SOURCE) en docs/05-prototipo/. Dos modos — greenfield (prototipo inicial desde los docs de discovery + dirección estética elegida por el humano) y feature (pantallas de una épica nueva extraídas en vivo del UI ya implementado). Delega en la skill prototyping-screens. La confirmación de design_source sigue siendo humana.
4
+ category: Workflow
5
+ tags: [build-harness, outer-loop, prototipo, design-source, trycore]
6
+ ---
7
+
8
+ # /build:prototype — Prototipo HTML de referencia
9
+
10
+ Delega en la skill **prototyping-screens**. Uso:
11
+
12
+ - `/build:prototype` — modo **greenfield** (o detección automática): prototipo inicial completo.
13
+ Inventario de pantallas desde PRD/mapa/historias → confirmación humana → dirección estética
14
+ (manual de marca o 2-3 variantes a elección humana) → generación por lotes con auto-verificación.
15
+ - `/build:prototype <épica>` — modo **feature**: pantallas nuevas de esa épica, coherentes con el
16
+ UX/UI ya implementado. **Precondición dura**: app corriendo + MCP de inspección de UI (p.ej.
17
+ chrome-devtools); sin ellos hace STOP (la extracción viva de CSS computado no se degrada).
18
+
19
+ Es **outer-loop**: córrelo antes de abrir slices (como `/build:architect`). Produce
20
+ `docs/05-prototipo/` (DESIGN.md, tokens.css, manifest.json, pantallas/) y, en greenfield con
21
+ aprobación humana, registra `design_source` en `build-state.json`. **La skill genera; el humano
22
+ aprueba**: `design_source.confirmed` y el `estado: "aprobada"` del manifest nunca se auto-marcan.
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 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.
6
+ 2. Los **slash commands de Claude Code** (`/opsx:*` + los 9 `/build:*`: `onboard`, `reflect`, `architect`, `prototype`, `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 8 `/build:*` (`onboard`, `reflect`, `architect`, `slice`, `release`, `work`, `resume`, `front`).
55
+ El canal CLI namespacea por subcarpeta: `.claude/commands/opsx/` → `/opsx:*` y `.claude/commands/build/` → los 9 `/build:*` (`onboard`, `reflect`, `architect`, `prototype`, `slice`, `release`, `work`, `resume`, `front`).
56
56
 
57
57
  ### `/opsx:*` — pipeline OpenSpec
58
58
 
@@ -117,6 +117,12 @@ El canal CLI namespacea por subcarpeta: `.claude/commands/opsx/` → `/opsx:*` y
117
117
  |---|---|
118
118
  | `/build:front` | Abre y coordina un **front paralelo** de épicas NO fundacionales y disjuntas en archivos, cada una en su propio worktree/rama/PR. Delega en la skill `managing-parallel-front`: verifica precondiciones (scaffold confirmado, sin épica foundational abierta), selecciona el conjunto disjunto (`scripts/lib/front-plan.py`) y mergea en orden con re-smoke. Úsalo solo con ≥2 épicas no fundacionales disjuntas listas; para una sola épica, usa `/build:slice`. |
119
119
 
120
+ ### `/build:prototype` — prototipo HTML de referencia (fuente de diseño)
121
+
122
+ | Slash command | Propósito |
123
+ |---|---|
124
+ | `/build:prototype` | Genera o amplía el **prototipo HTML de referencia** (el `DESIGN_SOURCE`) en `docs/05-prototipo/` (`DESIGN.md` + `tokens.css` + `manifest.json` + un HTML autocontenido por pantalla). Adaptador delgado: **delega** en la skill `prototyping-screens`. Dos modos — **greenfield** (`/build:prototype`): inventario de pantallas desde PRD/mapa/historias → confirmación humana → dirección estética (manual de marca o 2-3 variantes a elección humana) → generación por lotes con auto-verificación visual; **feature** (`/build:prototype <épica>`): pantallas nuevas coherentes con el UX/UI **ya implementado**, con **precondición dura** (app corriendo + MCP de inspección de UI: extrae CSS computado real, screenshots en 3 viewports y estructura; sin degradación estática). Es **outer-loop** (antes de abrir slices). **La skill genera; el humano aprueba**: las pantallas nacen `borrador`, solo las `aprobada` son fuente de verdad (las lee `ux-fidelity-reviewer` vía `manifest.json`) y `design_source.confirmed` sigue siendo humano. |
125
+
120
126
  ---
121
127
 
122
128
  ## 3. Caveat de canales (CLI vs. plugin)
@@ -126,7 +132,7 @@ El arnés se distribuye por **dos canales** que coexisten, pero **namespacean di
126
132
  | Aspecto | Canal **CLI** (canónico) | Canal **Plugin** nativo |
127
133
  |---|---|---|
128
134
  | 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` |
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) |
135
+ | Namespace de comandos | Por subcarpeta: `/opsx:*` y los 9 `/build:*` (`onboard`, `reflect`, `architect`, `prototype`, `slice`, `release`, `work`, `resume`, `front`) | Por nombre del plugin: `/trycore-spec-build-harness:*` (por diseño de Claude Code) |
130
136
  | Referencia a agentes | Por su nombre (p. ej. `build-orchestrator`) | Bajo el nombre del plugin |
131
137
  | Cross-references internas | ✔ Escritas para este canal (skills invocan `/opsx:*`, agentes por nombre) | Pueden no resolver según están escritas |
132
138
  | 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: **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.
51
+ Desde la raíz de tu proyecto. Es **idempotente** (re-correrlo es seguro) y siembra: **14 agentes**, **16 skills** (`building-a-slice`, `building-a-micro-change`, `releasing-a-version`, `managing-parallel-front`, `setup-architecture`, `prototyping-screens` + 10 `openspec-*`), **10 comandos `/opsx:*`** + **9 comandos `/build:*`** (`onboard`, `reflect`, `architect`, `prototype`, `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
package/docs/hooks.md CHANGED
@@ -93,7 +93,7 @@ Cierra el **ciclo autocorrectivo**. Al terminar el turno, si en `history[]` hay
93
93
 
94
94
  ### 9. `design-source-guard.sh` — `PreToolUse` · Write/Edit/MultiEdit · **bloqueante** (desde v0.5.0)
95
95
 
96
- Refuerza el **seguro de fuente de diseño** (espejo de `scaffold-guard`, para slices con UI). Bloquea con `exit 2` la escritura de **código de un slice con UI** —cuando `active_slice.phase` ∈ `red`/`green`/`refactor`/`smoke`/`api`/`data` **y** `active_slice.gates.fidelity === false` (marcado UI-pendiente por la DoR)— mientras el proyecto tenga UI (`design_source.applies === true`) y `design_source.confirmed` no sea `true`. **Permite** todo lo demás: slices sin UI (`gates.fidelity === null` o ausente), proyectos sin UI (`applies !== true`), fases de planificación (`dor`/`change`), o fuente ya confirmada. El arnés **exige** la fuente de diseño pero **no genera** el prototipo; la confirmación es **explícita** (vía `building-a-slice` Fase 0-bis / `dor-dod-gatekeeper`), nunca auto-detectada. Guarda `python3` fail-closed dirigido. En la práctica, como `design_source` es gate de proyecto, solo muerde la **primera** construcción de UI sin fuente declarada.
96
+ Refuerza el **seguro de fuente de diseño** (espejo de `scaffold-guard`, para slices con UI). Bloquea con `exit 2` la escritura de **código de un slice con UI** —cuando `active_slice.phase` ∈ `red`/`green`/`refactor`/`smoke`/`api`/`data` **y** `active_slice.gates.fidelity === false` (marcado UI-pendiente por la DoR)— mientras el proyecto tenga UI (`design_source.applies === true`) y `design_source.confirmed` no sea `true`. **Permite** todo lo demás: slices sin UI (`gates.fidelity === null` o ausente), proyectos sin UI (`applies !== true`), fases de planificación (`dor`/`change`), o fuente ya confirmada. El arnés **exige** la fuente de diseño y puede **generarla** vía `/build:prototype` (skill `prototyping-screens`; el mensaje de bloqueo lo sugiere); la confirmación sigue siendo **explícita y humana** (vía `building-a-slice` Fase 0-bis / `dor-dod-gatekeeper`), nunca auto-detectada. Guarda `python3` fail-closed dirigido. En la práctica, como `design_source` es gate de proyecto, solo muerde la **primera** construcción de UI sin fuente declarada.
97
97
 
98
98
  ### 10. `release-gate-nudge.sh` — `Stop` · no bloqueante (desde v0.7.0)
99
99
 
@@ -46,7 +46,7 @@ PY
46
46
  if [ "$VERDICT" = "BLOCK" ]; then
47
47
  echo "⛔ design-source-guard: el slice con UI está en fase de código pero la fuente de diseño NO está confirmada." >&2
48
48
  echo " Declara y confirma primero el DESIGN_SOURCE del proyecto (ver building-a-slice Fase 0-bis / DoR)." >&2
49
- echo " El arnés NO genera el prototipo: declara la fuente (prototipo/export) y confírmala." >&2
49
+ echo " Genera el prototipo con /build:prototype o declara una fuente existente (prototipo/export), y confírmala." >&2
50
50
  exit 2
51
51
  fi
52
52
  exit 0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trycore/spec-build-harness",
3
- "version": "0.8.4",
3
+ "version": "0.8.5",
4
4
  "description": "Arnés agéntico de construcción de Trycore para Claude Code: pipeline de dos loops (slice por épica + release gate) con gates de calidad, estado compartido y OpenSpec. Compañero de @trycore/spec-product-flow. Agnóstico al proyecto.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -105,8 +105,9 @@ Espejo de la Fase 0, para proyectos **con UI**. Antes de abrir el primer slice c
105
105
  - `confirmed === true` → continúa.
106
106
  2. `applies===true && confirmed===false` → **pregunta explícita** (AskUserQuestion): *"¿Existe una
107
107
  fuente de diseño declarada (prototipo/export) para la UI de este proyecto?"*
108
- - **No** → **STOP**. Indica declararla (ruta/URL del prototipo o export). El arnés **NO la genera**.
109
- No abras el slice con UI.
108
+ - **No** → **STOP**. Ofrece dos salidas: **generarla con `/build:prototype`** (skill
109
+ `prototyping-screens`; la confirmación sigue siendo humana) o declarar una fuente externa
110
+ (ruta/URL del prototipo o export). No abras el slice con UI sin fuente confirmada.
110
111
  - **Sí** → registra `design_source.source`, `confirmed=true`, `confirmed_by`, `confirmed_at`, `notes`.
111
112
  3. Lo respalda el hook determinista `design-source-guard.sh` (bloquea código de slice UI sin fuente
112
113
  confirmada) y lo valida el `dor-dod-gatekeeper` (criterio duro de DoR).
@@ -33,7 +33,10 @@ la épica; lo de abajo aplica a la épica y a **cada HU** que cubre (`hus[]`). L
33
33
  - [ ] **Datos de prueba disponibles** o identificables (p.ej. los datos de ejemplo / fixtures sintéticos del dominio del consumidor).
34
34
  - [ ] **Fuente de diseño identificada (slices con UI)**: la fuente visual de verdad del slice
35
35
  (el `DESIGN_SOURCE` del dominio) está declarada y confirmada (`design_source.confirmed`), y este
36
- slice apunta a la(s) pantalla(s) equivalente(s). No se construye UI fuera de la fuente declarada.
36
+ slice apunta a la(s) pantalla(s) equivalente(s). Si la fuente es un prototipo generado
37
+ (`docs/05-prototipo/`), esas pantallas existen en `manifest.json` con `estado: "aprobada"`
38
+ (un `borrador` no satisface el criterio; genera/aprueba primero con `/build:prototype`).
39
+ No se construye UI fuera de la fuente declarada.
37
40
  - [ ] **Clasificación `layer`**: `foundational` (auth/datos/design-system/arquitectura base) | `business`. Se escribe en `active_slice.layer`. Gatea el front paralelo (foundational nunca en paralelo).
38
41
  - [ ] **`files_scope`**: globs de los archivos que la épica tocará (p.ej. `src/reports/**`). Fuente de la disjunción inter-épica. Se escribe en `active_slice.files_scope`.
39
42
 
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: prototyping-screens
3
+ description: Use when generating or extending the HTML reference prototype (the DESIGN_SOURCE) — the visual source of truth screens are built against. Two modes — greenfield (full initial prototype from discovery docs + human-chosen aesthetic direction) and feature (new-epic screens extracted live from the already-implemented UI so they look native to the app). Self-verifies visually; human approval gates everything.
4
+ ---
5
+
6
+ # Prototipar pantallas de referencia (outer-loop)
7
+
8
+ Genera el **prototipo HTML de referencia** del consumidor: la fuente de verdad visual
9
+ (`DESIGN_SOURCE`) contra la que después se construyen y verifican los slices con UI
10
+ (gate `fidelity`, `ux-fidelity-reviewer`). Si algo aquí contradice `METODOLOGIA.md`,
11
+ **gana la metodología**.
12
+
13
+ **Invariantes:**
14
+ - La skill **genera**; el humano **aprueba**. `design_source.confirmed` y el `estado: "aprobada"`
15
+ del manifest son **siempre** decisiones humanas — esta skill jamás los auto-marca.
16
+ - Es **outer-loop**: se corre antes de abrir slices (como `/build:architect`), nunca dentro del
17
+ inner loop de una épica.
18
+ - Escribe **solo** en `docs/05-prototipo/` (carve-out §9.2 de METODOLOGIA) y, con aprobación
19
+ humana, en `design_source` de `build-state.json` (protocolo de `state/README.md`).
20
+
21
+ ## Artefactos que produce (repo del consumidor)
22
+
23
+ ```
24
+ docs/05-prototipo/
25
+ ├── DESIGN.md ← tokens + reglas visuales en prosa (assets/DESIGN.md.template)
26
+ ├── tokens.css ← los mismos tokens como CSS custom properties (fuente única)
27
+ ├── manifest.json ← pantalla ↔ épica/HU ↔ archivo ↔ estado (assets/manifest.schema.json)
28
+ └── pantallas/
29
+ └── <slug>.html ← un HTML autocontenido por pantalla (assets/screen.template.html)
30
+ ```
31
+
32
+ **Reglas duras del artefacto:**
33
+ - HTML **autocontenido**: cero dependencias externas (sin CDNs, frameworks, fetch ni JS); única
34
+ importación permitida: `tokens.css`; renderiza en `file://` indefinidamente; datos ilustrativos
35
+ estáticos.
36
+ - Cero valores visuales fuera de tokens (color/fuente/spacing/radio/sombra → `var(--token)`).
37
+ - Estados relevantes (vacío, error, cargando…) que la HU exija → **variantes de pantalla**
38
+ (`<slug>--<estado>.html`, campo `variante_de` en el manifest), no interacciones.
39
+ - Solo pantallas `estado: "aprobada"` son fuente de verdad (las lee `ux-fidelity-reviewer`); el
40
+ resto son `borrador`.
41
+
42
+ ## Detección de modo
43
+
44
+ 1. No existe `docs/05-prototipo/` ni hay `design_source.confirmed` → **greenfield**.
45
+ 2. Se pide pantallas para una épica y existe app implementada (o prototipo previo) → **feature**.
46
+ 3. Ambigüedad → pregunta al humano antes de tocar nada.
47
+
48
+ ## Modo greenfield — prototipo inicial completo
49
+
50
+ 1. **Inventario de pantallas**: lee PRD, user story map/flows e historias de discovery; deriva la
51
+ lista pantalla ↔ épica/HU (esqueleto del `manifest.json`) y **preséntala para confirmación
52
+ humana** antes de generar nada.
53
+ 2. **Dirección estética**: sigue `references/aesthetic-directions.md` (¿manual de marca? → destilar
54
+ tokens; si no → 2-3 direcciones visuales de una pantalla clave, elección humana en navegador).
55
+ Salida: `DESIGN.md` + `tokens.css`.
56
+ 3. **Generación por lotes**: pantallas en orden de flow, cada una desde su HU + tokens, sobre
57
+ `assets/screen.template.html`. Tras cada lote: auto-verificación (`references/self-check.md`)
58
+ y **pausa** para revisión humana en navegador. Registra cada pantalla en el manifest como
59
+ `borrador`.
60
+
61
+ ## Modo feature — pantallas de una épica nueva (el caso brownfield)
62
+
63
+ 1. **Precondición dura**: la app implementada **corriendo** + un MCP de inspección de UI habilitado
64
+ (p.ej. chrome-devtools para web). Si falta cualquiera → **STOP** con instrucciones (levantar la
65
+ app / habilitar el MCP). **Sin degradación a extracción estática**: el CSS computado real es el
66
+ factor decisivo de fidelidad (misma postura que el gate `fidelity`, donde INCONCLUSO bloquea).
67
+ 2. **Extracción viva**: sigue `references/extraction.md` (CSS computado + screenshots en 3 viewports
68
+ + árbol de componentes de 2-3 pantallas representativas; reconciliación de `tokens.css`: la app
69
+ real gana, las divergencias se reportan como drift).
70
+ 3. **Generación**: las pantallas nuevas de la épica usan los tokens reconciliados y los screenshots
71
+ de la app como referencia de composición. Criterio de éxito: la pantalla nueva parece
72
+ **"una pantalla más"** de la app existente.
73
+ 4. **Registro**: entradas nuevas en `manifest.json` como `borrador` (con `epica`/`historias`).
74
+
75
+ ## Auto-verificación (ambos modos)
76
+
77
+ Sigue `references/self-check.md`: renderizado real de cada HTML (`file://`), screenshot en
78
+ 3 viewports + snapshot estructural, comparación (feature → contra lo extraído de la app;
79
+ greenfield → contra tokens + consistencia del lote), corrección y re-render con **máximo
80
+ 3 iteraciones**; si no converge, reporte al humano con el delta. Sin pixel-diff.
81
+
82
+ ## Aprobación humana → estado
83
+
84
+ 1. Abre las pantallas en el navegador del usuario y pide aprobación explícita (por pantalla o por
85
+ lote). Aprobada → `manifest.json` pasa esa entrada a `"aprobada"`.
86
+ 2. **Greenfield** con ≥1 pantalla aprobada: ofrece registrar la fuente en `build-state.json` —
87
+ `design_source.source: "docs/05-prototipo/"`, `confirmed: true`, `confirmed_by`, `confirmed_at`,
88
+ `notes` — siguiendo el protocolo de escritura de `state/README.md`. Solo con el **sí** explícito
89
+ del humano.
90
+ 3. **Feature**: `design_source` ya está confirmado; solo se amplía el manifest.
91
+
92
+ ## Qué NO hace esta skill
93
+
94
+ - **No** hace pixel-diff (comparación estructural/semántica, como el resto del arnés).
95
+ - **No** genera código de producción: eso es el slice normal (`building-a-slice`) con su gate
96
+ `fidelity`; el prototipo es su entrada, no su salida.
97
+ - **No** prototipa interacciones/animaciones (HTML estático; estados como variantes).
98
+ - **No** integra plataformas de diseño externas (exports no navegables ya tienen su rama en
99
+ `ux-fidelity-reviewer`).
100
+ - **No** escribe en `docs/01-…04-…` ni toca otros campos del estado.
@@ -0,0 +1,55 @@
1
+ # DESIGN.md — reglas visuales del producto
2
+
3
+ > Fuente de verdad **en prosa** de la identidad visual. Los mismos valores viven como CSS custom
4
+ > properties en `tokens.css` (fuente única que importan todos los prototipos). Si este archivo y
5
+ > `tokens.css` divergen, gana `tokens.css` y la divergencia se reporta como drift.
6
+
7
+ ## Identidad
8
+
9
+ {{DIRECCION_ELEGIDA}} — dirección visual elegida y por qué (elección humana, ver Procedencia).
10
+
11
+ ## Paleta
12
+
13
+ | Token | Valor | Uso |
14
+ |---|---|---|
15
+ | `--color-primary` | {{HEX}} | {{USO}} |
16
+ | `--color-surface` | {{HEX}} | {{USO}} |
17
+ | `--color-text` | {{HEX}} | {{USO}} |
18
+ | … | … | … |
19
+
20
+ ## Tipografía
21
+
22
+ - **Familias**: {{FAMILIA_TITULARES}} (titulares) · {{FAMILIA_CUERPO}} (cuerpo).
23
+ - **Escala**: {{ESCALA}} (p.ej. 12/14/16/20/24/32).
24
+ - **Pesos**: {{PESOS}} y dónde se usa cada uno.
25
+
26
+ ## Espaciado y radios
27
+
28
+ - **Spacing scale**: {{SPACING_SCALE}} (todos los márgenes/paddings son múltiplos de la escala).
29
+ - **Radios**: {{RADIOS}} por tipo de componente.
30
+
31
+ ## Sombras
32
+
33
+ | Token | Valor | Uso |
34
+ |---|---|---|
35
+ | `--shadow-1` | {{VALOR}} | {{USO}} |
36
+
37
+ ## Componentes
38
+
39
+ Reglas por componente (densidad, alineación, jerarquía) que los prototipos deben respetar:
40
+
41
+ - {{COMPONENTE}}: {{REGLA}}
42
+
43
+ ## Don'ts (lista explícita)
44
+
45
+ - No inventar colores, fuentes, spacing ni radios fuera de los tokens.
46
+ - No introducir dependencias externas en los prototipos (CDNs, frameworks, fuentes remotas).
47
+ - No "interpretar" el diseño al construir: copiar valores exactos.
48
+ - {{DONT_ESPECIFICO_DEL_PRODUCTO}}
49
+
50
+ ## Procedencia
51
+
52
+ - **Origen de los tokens**: {{ORIGEN}} (manual de marca / extracción viva de la app / dirección
53
+ elegida por el humano entre variantes).
54
+ - **Fecha**: {{FECHA_ISO}}.
55
+ - **Reconciliaciones**: {{NOTAS_DE_DRIFT}} (cuándo la app real corrigió lo declarado).
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "trycore-build/prototype-manifest",
4
+ "title": "Manifest del prototipo de referencia (docs/05-prototipo/manifest.json)",
5
+ "description": "Mapa determinista pantalla ↔ épica/HU ↔ archivo HTML ↔ estado. Solo las pantallas con estado 'aprobada' son fuente de verdad visual (las lee ux-fidelity-reviewer y resuelven el puntero por-slice de la DoR).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["version", "pantallas"],
9
+ "properties": {
10
+ "version": {
11
+ "type": "integer",
12
+ "description": "Versión del formato del manifest (hoy: 1)."
13
+ },
14
+ "pantallas": {
15
+ "type": "array",
16
+ "items": { "$ref": "#/$defs/pantalla" }
17
+ }
18
+ },
19
+ "$defs": {
20
+ "pantalla": {
21
+ "type": "object",
22
+ "additionalProperties": false,
23
+ "required": ["slug", "archivo", "estado"],
24
+ "properties": {
25
+ "slug": {
26
+ "type": "string",
27
+ "pattern": "^[a-z0-9]+(-[a-z0-9]+)*(--[a-z0-9]+(-[a-z0-9]+)*)?$",
28
+ "description": "Identificador kebab-case de la pantalla. Las variantes de estado usan sufijo doble guion (p.ej. <slug>--vacio)."
29
+ },
30
+ "archivo": {
31
+ "type": "string",
32
+ "description": "Ruta relativa al directorio del prototipo (p.ej. pantallas/<slug>.html)."
33
+ },
34
+ "epica": {
35
+ "type": "string",
36
+ "pattern": "^EP-[0-9]{3}$",
37
+ "description": "Épica a la que pertenece la pantalla (puntero por-slice de la DoR)."
38
+ },
39
+ "historias": {
40
+ "type": "array",
41
+ "items": { "type": "string", "pattern": "^HU-[0-9]{3}$" },
42
+ "description": "Historias de usuario que la pantalla cubre."
43
+ },
44
+ "estado": {
45
+ "type": "string",
46
+ "enum": ["borrador", "aprobada"],
47
+ "description": "borrador = generada, pendiente de aprobación humana; aprobada = fuente de verdad visual (la aprobación es SIEMPRE humana)."
48
+ },
49
+ "generada_en": {
50
+ "type": "string",
51
+ "format": "date-time",
52
+ "description": "Cuándo se generó/regeneró (ISO-8601 UTC)."
53
+ },
54
+ "viewports_verificados": {
55
+ "type": "array",
56
+ "items": { "type": "string", "enum": ["desktop", "tablet", "mobile"] },
57
+ "description": "Viewports en los que el self-check renderizó y verificó la pantalla."
58
+ },
59
+ "variante_de": {
60
+ "type": "string",
61
+ "description": "Slug de la pantalla base si esta entrada es una variante de estado (vacío, error, cargando…)."
62
+ },
63
+ "notas": {
64
+ "type": "string",
65
+ "description": "Nota libre (p.ej. desviaciones intencionales aceptadas por el humano)."
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,34 @@
1
+ <!doctype html>
2
+ <!--
3
+ Prototipo de referencia — pantalla {{SLUG}}
4
+ Reglas duras del artefacto (NO negociables):
5
+ - AUTOCONTENIDO: cero dependencias externas (sin CDNs, sin frameworks, sin fetch, sin JS).
6
+ Única importación permitida: ../tokens.css. Debe renderizar en file:// indefinidamente.
7
+ - TOKENS: todo color, fuente, spacing, radio y sombra sale de las custom properties de
8
+ ../tokens.css. Cero valores mágicos fuera de tokens.
9
+ - DATOS ILUSTRATIVOS ESTÁTICOS: contenido de ejemplo neutro, embebido en el HTML.
10
+ - ESTADOS: los estados relevantes (vacío, error, cargando) que la HU exija son VARIANTES
11
+ de pantalla en archivos propios ({{SLUG}}--<estado>.html), no interacciones.
12
+ Trazabilidad: épica {{EPICA}} · historias {{HISTORIAS}} · registrada en ../manifest.json
13
+ -->
14
+ <html lang="es">
15
+ <head>
16
+ <meta charset="utf-8">
17
+ <meta name="viewport" content="width=device-width, initial-scale=1">
18
+ <title>{{TITULO_PANTALLA}} — prototipo</title>
19
+ <link rel="stylesheet" href="../tokens.css">
20
+ <style>
21
+ /* Estilos propios de esta pantalla: SOLO composición/layout.
22
+ Valores visuales (color, fuente, spacing, radio, sombra) → var(--token). */
23
+ </style>
24
+ </head>
25
+ <body>
26
+ <!-- región: navegación / cabecera -->
27
+
28
+ <!-- región: contenido principal (composición según la HU y el patrón de layout del sistema) -->
29
+
30
+ <!-- región: paneles secundarios / laterales (si el diseño los declara) -->
31
+
32
+ <!-- región: pie / acciones globales (si el diseño lo declara) -->
33
+ </body>
34
+ </html>
@@ -0,0 +1,42 @@
1
+ # Dirección estética (modo greenfield)
2
+
3
+ Protocolo para fijar la identidad visual **antes** de generar pantallas, cuando discovery solo
4
+ entrega docs de texto. La decisión estética es **humana**; la skill produce opciones y destila.
5
+
6
+ ## 1. ¿Hay manual de marca?
7
+
8
+ Pregunta primero si el consumidor tiene manual de marca / brand guidelines / design system previo.
9
+
10
+ - **Sí** → destila los tokens directamente de ese insumo (paleta exacta, tipografías, reglas de
11
+ uso) a `DESIGN.md` + `tokens.css`, con **Procedencia: manual de marca**. **No** generes
12
+ variantes: la identidad ya está decidida. Salta al paso 4.
13
+ - **No** → continúa con variantes (pasos 2-3).
14
+
15
+ ## 2. Elegir la pantalla clave
16
+
17
+ Una sola pantalla para el ejercicio: la más **representativa del journey** (la que un usuario ve
18
+ más tiempo o la que concentra más componentes distintos — típicamente la pantalla principal de
19
+ trabajo tras entrar). Evita pantallas triviales: no discriminan entre direcciones.
20
+
21
+ ## 3. Generar 2-3 direcciones y someterlas a elección humana
22
+
23
+ 1. Genera la pantalla clave en **2-3 direcciones visuales genuinamente distintas** — que difieran
24
+ en paleta, tipografía y densidad/tono (p.ej. sobria-densa · aireada-amable · contrastada-enérgica),
25
+ no tres matices del mismo gris. Cada dirección respeta el mismo contenido y la misma HU.
26
+ 2. Móntalas **lado a lado en un único HTML comparador** autocontenido (una columna por dirección,
27
+ con nombre y rasgos clave de cada una) y ábrelo en el navegador del usuario.
28
+ 3. El humano elige. Se permite **mezclar** ("la paleta de A con la tipografía de B") si lo pide.
29
+ 4. El comparador es un artefacto de trabajo: puede guardarse en `docs/05-prototipo/` como
30
+ `_direcciones.html` para la trazabilidad de la decisión, pero **no** entra al manifest.
31
+
32
+ ## 4. Destilar `DESIGN.md` + `tokens.css`
33
+
34
+ De la dirección elegida (o del manual de marca):
35
+ - `tokens.css` — custom properties: paleta completa (con variantes de énfasis/estado), familias y
36
+ escala tipográfica, spacing scale, radios, sombras.
37
+ - `DESIGN.md` (`assets/DESIGN.md.template`) — la prosa: identidad y por qué se eligió, tablas de
38
+ tokens con uso, reglas de componentes, **Don'ts** explícitos y **Procedencia** (dirección elegida
39
+ + fecha).
40
+
41
+ A partir de aquí, **toda** pantalla del prototipo importa `tokens.css` y no introduce valores
42
+ fuera de tokens; el self-check (`self-check.md`) lo verifica.
@@ -0,0 +1,57 @@
1
+ # Extracción viva del UX/UI implementado (modo feature)
2
+
3
+ Protocolo para capturar el **contexto rico real** de la app implementada antes de generar
4
+ pantallas nuevas. La lección de fondo: la fidelidad no sale de "mirar un screenshot", sale de
5
+ **CSS computado real + capturas multi-viewport + estructura**. Todo esto exige la app corriendo
6
+ y un MCP de inspección de UI habilitado (p.ej. chrome-devtools para web); sin ellos, la skill
7
+ ya hizo STOP antes de llegar aquí.
8
+
9
+ ## 1. Elegir pantallas representativas (2-3)
10
+
11
+ Criterio: cubrir los patrones que la pantalla nueva va a necesitar —
12
+ - la pantalla de **navegación/layout principal** (caparazón: menús, cabecera, panel central);
13
+ - una pantalla del **mismo tipo** que la que se va a generar (listado si va a haber listado,
14
+ formulario si va a haber formulario, detalle si detalle);
15
+ - si existe, una pantalla ya validada como fiel (`gates.fidelity: true` en `history[]`).
16
+
17
+ ## 2. Capturar por cada pantalla
18
+
19
+ 1. **Screenshots en 3 viewports** — desktop, tablet y mobile (redimensionar la página antes de
20
+ cada captura). Guardan la referencia de composición y densidad.
21
+ 2. **CSS computado de elementos clave** — vía el MCP (evaluar `getComputedStyle` sobre):
22
+ - tipografía real: `font-family`, `font-size`, `font-weight`, `line-height` de titular
23
+ principal, titular secundario, cuerpo y etiquetas;
24
+ - color real: `color`, `background-color`, `border-color` de superficie, texto, acción
25
+ primaria, acción secundaria y estados de énfasis;
26
+ - espaciado real: `padding`/`margin`/`gap` de los contenedores estructurales y de los
27
+ componentes repetidos (tarjetas, filas, campos);
28
+ - `border-radius` y `box-shadow` de los componentes elevados.
29
+ 3. **Árbol estructural** — snapshot del árbol accesible/DOM de la pantalla: número y disposición
30
+ de paneles, orden de secciones, jerarquía. Es la referencia de **composición** (estructura >
31
+ píxeles).
32
+
33
+ ## 3. Destilar y reconciliar tokens
34
+
35
+ 1. Consolida lo capturado en un conjunto de tokens (paleta, tipografía, spacing scale, radios,
36
+ sombras). Los valores repetidos entre pantallas son los tokens; los valores únicos son ruido.
37
+ 2. **Si `docs/05-prototipo/tokens.css` ya existe → reconciliar**:
38
+ - **La app real gana** sobre lo declarado: si el token declarado dice un valor y el CSS
39
+ computado dice otro de forma consistente, actualiza el token al valor real.
40
+ - Cada divergencia se **reporta al humano como drift** (tabla token → declarado → real →
41
+ pantallas donde se observó). El drift es señal de que prototipo viejo y app se separaron:
42
+ el humano decide si además hay que corregir la app (fuera del alcance de esta skill).
43
+ 3. Si no existe `tokens.css`, créalo desde lo extraído y genera/actualiza `DESIGN.md`
44
+ (`assets/DESIGN.md.template`) con **Procedencia: extracción viva** y la fecha.
45
+
46
+ ## 4. Empaquetar el contexto para la generación
47
+
48
+ Antes de generar, deja explícito el paquete de referencia que usará la pantalla nueva:
49
+ - `tokens.css` reconciliado;
50
+ - screenshots de referencia (composición/densidad) de las pantallas capturadas;
51
+ - el árbol estructural del layout principal (dónde vive el contenido en el caparazón);
52
+ - las reglas de componentes observadas (densidad de tablas, anatomía de formularios, etc.),
53
+ anotadas en `DESIGN.md` si no estaban.
54
+
55
+ La generación no "interpreta" este paquete: **copia valores exactos**. Toda desviación deliberada
56
+ se anota como desviación intencional en `notas` del manifest para que `ux-fidelity-reviewer` no
57
+ la penalice después.
@@ -0,0 +1,40 @@
1
+ # Auto-verificación visual del prototipo (ambos modos)
2
+
3
+ El prototipo no se da por bueno porque "se escribió bien": se **renderiza de verdad y se observa
4
+ la salida real** antes de presentarlo al humano. Misma filosofía que el gate `fidelity`
5
+ (verificación visual real, no best-effort), aplicada en dirección inversa: aquí lo verificado es
6
+ el prototipo recién generado.
7
+
8
+ ## Protocolo por pantalla generada
9
+
10
+ 1. **Renderizar**: abrir el HTML vía `file://` con el MCP de inspección de UI (nueva página).
11
+ Si el archivo no renderiza limpio (recursos rotos, consola con errores), corregir antes de
12
+ comparar nada.
13
+ 2. **Capturar**: screenshot en **3 viewports** (desktop, tablet, mobile) + snapshot del árbol
14
+ accesible/DOM.
15
+ 3. **Comparar** según el modo:
16
+ - **Feature** — contra el paquete de extracción (`extraction.md`): ¿la tipografía computada
17
+ coincide token a token? ¿la paleta usada es la reconciliada, sin colores fuera? ¿la densidad
18
+ (spacing computado) y el patrón de layout replican los de las pantallas capturadas? ¿la
19
+ pantalla "parece una más" de la app?
20
+ - **Greenfield** — contra `DESIGN.md`/`tokens.css`: **cero valores visuales fuera de tokens**
21
+ (inspeccionar computed styles de los elementos clave); y **consistencia del lote**: mismas
22
+ resoluciones de componente (el mismo tipo de elemento se ve igual) entre las pantallas
23
+ generadas en esta tanda.
24
+ 4. **Corregir y re-renderizar** cada divergencia encontrada. **Máximo 3 iteraciones** por
25
+ pantalla; si a la tercera no converge, **parar y reportar al humano** el delta restante
26
+ (qué difiere, dónde, valor esperado vs observado) — nunca presentar como buena una pantalla
27
+ que no pasó su self-check.
28
+ 5. **Registrar**: anotar en `manifest.json` los `viewports_verificados` de la pantalla. El
29
+ `estado` sigue siendo `borrador`: el self-check **no aprueba** — aprobar es del humano.
30
+
31
+ ## Reglas
32
+
33
+ - **Sin pixel-diff**: la comparación es estructural/semántica (composición, tokens computados,
34
+ densidad, jerarquía), igual que `ux-fidelity-reviewer`. El pixel-diff es frágil y no discrimina
35
+ desviaciones que importan de ruido de render.
36
+ - **Estructura > píxeles**: una columna de más o un panel ausente pesa más que 2px de padding.
37
+ - Las **variantes de estado** (`<slug>--<estado>.html`) pasan el mismo protocolo (suelen ser más
38
+ baratas: heredan la composición de la base).
39
+ - El self-check corre **por lote** en greenfield (tras generar cada tanda) y **por pantalla** en
40
+ feature (pocas pantallas, más exigencia de encaje con la app).
package/state/README.md CHANGED
@@ -56,8 +56,9 @@ slice (fases `red…data`) mientras `confirmed` no sea `true`. El arnés **no ge
56
56
  ### `design_source` (gate de proyecto, slices con UI)
57
57
 
58
58
  Espejo de `scaffold` para la UI: `applies` (¿el proyecto tiene UI?), `confirmed` (humano confirmó que
59
- existe una fuente de diseño declarada), `source` (puntero al prototipo/export). El arnés NO genera el
60
- prototipo. Lo respalda `design-source-guard.sh`.
59
+ existe una fuente de diseño declarada), `source` (puntero al prototipo/export). El prototipo puede
60
+ **generarse** con `/build:prototype` (skill `prototyping-screens`, salida en `docs/05-prototipo/`);
61
+ `confirmed` sigue siendo exclusivamente humano. Lo respalda `design-source-guard.sh`.
61
62
 
62
63
  ### `foundation` (gate de proyecto, solo greenfield) + `project_kind`
63
64
 
@@ -124,3 +125,4 @@ El razonamiento vive en el modelo; el hook solo es un recordatorio determinista.
124
125
  | `foundation` (`required`, `checklist[]`, `epic`) | `/build:onboard` Fase 2c | una vez (greenfield) |
125
126
  | `foundation.checklist[].evidence` | `build-orchestrator` (durante la construcción de la caparazón) | al construir la caparazón |
126
127
  | `foundation.completed_at` | `dor-dod-gatekeeper` (al cerrar el DoD de la épica caparazón) | al archivar la caparazón |
128
+ | `design_source` (`source`, `confirmed`, `confirmed_by/at`, `notes`) | `building-a-slice` Fase 0-bis · `/build:onboard` Fase 3c · `prototyping-screens` (greenfield, solo tras aprobación humana de ≥1 pantalla; `confirmed` humano siempre) | una vez (proyecto) |
@@ -64,7 +64,7 @@
64
64
  "design_source": {
65
65
  "type": "object",
66
66
  "additionalProperties": false,
67
- "description": "Gate de PROYECTO para slices con UI: existe una fuente de diseño declarada (prototipo/export). Espejo de scaffold: confirmed pasa a true SOLO por confirmación humana, nunca por auto-detección. El arnés NO genera el prototipo. applies=false apaga todo el mecanismo (proyecto sin UI).",
67
+ "description": "Gate de PROYECTO para slices con UI: existe una fuente de diseño declarada (prototipo/export). Espejo de scaffold: confirmed pasa a true SOLO por confirmación humana, nunca por auto-detección. El prototipo puede generarse con /build:prototype (skill prototyping-screens); confirmed sigue siendo exclusivamente humano. applies=false apaga todo el mecanismo (proyecto sin UI).",
68
68
  "required": ["applies", "confirmed"],
69
69
  "properties": {
70
70
  "applies": { "type": "boolean", "description": "¿el proyecto tiene UI / hay diseño que respetar? false → mecanismo N/A." },
@@ -51,7 +51,7 @@ Estos puntos de extensión los leen los agentes `security-reviewer`, `stack-guar
51
51
  - **Categorías de datos sensibles / PII reguladas**: {{SENSITIVE_DATA_CATEGORIES}}
52
52
  - **Secretos server-side**: {{SERVER_SIDE_SECRETS}}
53
53
  - **Decisiones de alto impacto que exigen explicabilidad UX**: {{HIGH_STAKES_DECISIONS}}
54
- - **Fuente de diseño / referencia visual**: {{DESIGN_SOURCE}}
54
+ - **Fuente de diseño / referencia visual**: {{DESIGN_SOURCE}} (si no existe fuente aún, `/build:prototype` puede generarla en `docs/05-prototipo/`; la confirmación sigue siendo humana)
55
55
 
56
56
  (Si aparecen como `{{...}}`, ejecuta `/build:onboard` para parametrizarlos.)
57
57