@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.
- package/.claude-plugin/plugin.json +1 -1
- package/GOVERNANCE.md +17 -2
- package/INSTALL.md +2 -2
- package/METODOLOGIA.md +10 -5
- package/README.md +4 -3
- package/VERSION +1 -1
- package/agents/build/dor-dod-gatekeeper.md +4 -1
- package/agents/build/ux-fidelity-reviewer.md +4 -1
- package/commands/build/onboard.md +6 -2
- package/commands/build/prototype.md +22 -0
- package/docs/commands.md +9 -3
- package/docs/getting-started.md +1 -1
- package/docs/hooks.md +1 -1
- package/hooks/build/design-source-guard.sh +1 -1
- package/package.json +1 -1
- package/skills/building-a-slice/SKILL.md +3 -2
- package/skills/building-a-slice/references/dor.md +4 -1
- package/skills/prototyping-screens/SKILL.md +100 -0
- package/skills/prototyping-screens/assets/DESIGN.md.template +55 -0
- package/skills/prototyping-screens/assets/manifest.schema.json +70 -0
- package/skills/prototyping-screens/assets/screen.template.html +34 -0
- package/skills/prototyping-screens/references/aesthetic-directions.md +42 -0
- package/skills/prototyping-screens/references/extraction.md +57 -0
- package/skills/prototyping-screens/references/self-check.md +40 -0
- package/state/README.md +4 -2
- package/state/build-state.schema.json +1 -1
- package/templates/CLAUDE.md.template +1 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "trycore-spec-build-harness",
|
|
4
4
|
"displayName": "Trycore — Spec & Build Harness",
|
|
5
|
-
"version": "0.8.
|
|
5
|
+
"version": "0.8.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/` (
|
|
91
|
-
- `.claude/skills/` —
|
|
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 **
|
|
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),
|
|
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
|
|
502
|
-
|
|
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/ ←
|
|
146
|
-
├── skills/ ←
|
|
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.
|
|
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". 4º 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.
|
|
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
|
|
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".
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 |
|
package/docs/getting-started.md
CHANGED
|
@@ -48,7 +48,7 @@ npm i -g @fission-ai/openspec @trycore/spec-build-harness
|
|
|
48
48
|
|
|
49
49
|
## 2 · `trycore-build init` (terminal)
|
|
50
50
|
|
|
51
|
-
Desde la raíz de tu proyecto. Es **idempotente** (re-correrlo es seguro) y siembra: **14 agentes**, **
|
|
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
|
|
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 "
|
|
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.
|
|
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**.
|
|
109
|
-
|
|
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).
|
|
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
|
|
60
|
-
|
|
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
|
|
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
|
|