sdd-es 2.0.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/.claude/settings.json +21 -45
  2. package/LICENSE +21 -0
  3. package/README.md +51 -21
  4. package/agents/architecture-designer.md +174 -0
  5. package/agents/arquitecto.md +16 -1
  6. package/agents/asesor-datos.md +15 -1
  7. package/agents/critico.md +37 -1
  8. package/agents/desarrollador-backend.md +3 -1
  9. package/agents/desarrollador-frontend.md +3 -1
  10. package/agents/disenador-api.md +13 -1
  11. package/agents/documentador.md +3 -1
  12. package/agents/investigador.md +3 -1
  13. package/agents/operaciones.md +3 -1
  14. package/agents/product-designer.md +232 -0
  15. package/agents/revisor.md +25 -1
  16. package/agents/seguridad.md +5 -1
  17. package/agents/tester.md +3 -1
  18. package/claude-hooks/agent-memory.js +154 -0
  19. package/cli/index.js +1 -2
  20. package/commands/sdd.analizar.md +23 -2
  21. package/commands/sdd.compliance.md +516 -0
  22. package/commands/sdd.configurar.md +33 -0
  23. package/commands/sdd.constitucion.md +198 -23
  24. package/commands/sdd.construir.md +210 -0
  25. package/commands/sdd.dise/303/261ar.md +188 -0
  26. package/commands/sdd.estado.md +68 -1
  27. package/commands/sdd.exportar.md +344 -0
  28. package/commands/sdd.implementar.md +203 -23
  29. package/commands/sdd.interpretar.md +239 -0
  30. package/commands/sdd.md +70 -1
  31. package/commands/sdd.optimizar.md +164 -0
  32. package/commands/sdd.planificar.md +64 -0
  33. package/commands/sdd.verificar.md +10 -0
  34. package/craft/accessibility-baseline.md +216 -0
  35. package/craft/anti-ai-slop.md +158 -0
  36. package/craft/color.md +160 -0
  37. package/craft/typography.md +121 -0
  38. package/design-systems/bold-brutalist/DESIGN.md +239 -0
  39. package/design-systems/editorial-minimal/DESIGN.md +205 -0
  40. package/design-systems/neutral-modern/DESIGN.md +227 -0
  41. package/design-systems/vibrant-consumer/DESIGN.md +257 -0
  42. package/design-systems/warm-editorial/DESIGN.md +221 -0
  43. package/docs/AGENTES.md +4 -1
  44. package/docs/FABRICA.md +164 -115
  45. package/docs/MEMORIA-Y-OBSERVABILIDAD.md +237 -0
  46. package/docs/MODELOS.md +3 -0
  47. package/docs/QUE-PASA-SI-FALLA.md +404 -0
  48. package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
  49. package/package.json +5 -3
  50. package/skills/cache-audit/SKILL.md +163 -0
  51. package/skills/critica-diseno/SKILL.md +193 -0
  52. package/skills/descubrir-idea/SKILL.md +133 -0
  53. package/skills/effort-router/SKILL.md +128 -0
  54. package/skills/elegir-direccion/SKILL.md +184 -0
  55. package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
  56. package/skills/github-connect/INDEX.md +223 -0
  57. package/skills/github-connect/INTEGRATION.md +361 -0
  58. package/skills/github-connect/QUICK-START.md +168 -0
  59. package/skills/github-connect/README.md +414 -0
  60. package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
  61. package/skills/github-connect/SKILL.md +343 -0
  62. package/skills/github-connect/STRUCTURE.txt +252 -0
  63. package/skills/github-connect/example-config.yaml +41 -0
  64. package/skills/github-connect/github-connect.sh +419 -0
  65. package/skills/interpretar-idea/SKILL.md +254 -0
  66. package/skills/memory-compactor/SKILL.md +114 -0
  67. package/skills/modo-guiado/SKILL.md +12 -2
  68. package/skills/observabilidad-consumo/SKILL.md +164 -0
  69. package/skills/token-budget/SKILL.md +154 -0
  70. package/skills/vercel-deploy/00-START-HERE.txt +364 -0
  71. package/skills/vercel-deploy/CHECKLIST.md +205 -0
  72. package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
  73. package/skills/vercel-deploy/FLOW.txt +334 -0
  74. package/skills/vercel-deploy/INDEX.md +276 -0
  75. package/skills/vercel-deploy/INTEGRATION.md +328 -0
  76. package/skills/vercel-deploy/MANIFEST.md +310 -0
  77. package/skills/vercel-deploy/README.md +65 -0
  78. package/skills/vercel-deploy/SKILL.md +356 -0
  79. package/skills/vercel-deploy/deploy.sh +298 -0
  80. package/skills/vercel-deploy/estado.json.example +205 -0
  81. package/skills/vercel-deploy/skill.yaml +323 -0
  82. package/skills/vercel-deploy/vercel-deploy.sh +216 -0
  83. package/skills/wireframe-mvp/SKILL.md +157 -0
  84. package/.claude-plugin/marketplace.json +0 -31
  85. package/.claude-plugin/plugin.json +0 -97
  86. package/docs/EJEMPLO-PRACTICA.md +0 -383
  87. package/docs/EJEMPLOS.md +0 -212
  88. /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
  89. /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
  90. /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
  91. /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
  92. /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
  93. /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
  94. /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
  95. /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
@@ -0,0 +1,164 @@
1
+ ---
2
+ description: Ciclo completo de optimización de tokens para la sesión actual — detecta fan-out, recomienda modelos por fase, comprime memoria si supera umbral, audita oportunidades de caché y proyecta presupuesto. Punto de entrada unificado para uso eficiente de tokens en FORGE.
3
+ allowed-tools: Read, Bash
4
+ ---
5
+
6
+ # /sdd.optimizar — Optimización de Tokens
7
+
8
+ ## Subcomandos disponibles
9
+
10
+ | Subcomando | Qué ejecuta |
11
+ |---|---|
12
+ | `/sdd.optimizar` | Ciclo completo (PASOes 1-6) |
13
+ | `/sdd.optimizar tokens` | Solo effort-router + cache-audit |
14
+ | `/sdd.optimizar memoria` | Solo memory-compactor |
15
+ | `/sdd.optimizar presupuesto` | Solo token-budget |
16
+
17
+ ---
18
+
19
+ ## PASO 1 — Verificar que el proyecto está inicializado
20
+
21
+ ```bash
22
+ [ ! -d .sdd ] && echo "NO_INICIALIZADO" && exit 0
23
+ [ ! -f .sdd/estado.json ] && echo "SIN_ESTADO" && exit 0
24
+ cat .sdd/estado.json
25
+ ```
26
+
27
+ Si no está inicializado: mostrar `🚫 SDD-ES no inicializado. Ejecuta: /sdd.constitucion` y terminar.
28
+
29
+ ---
30
+
31
+ ## PASO 2 — Leer ledger de consumo (observabilidad)
32
+
33
+ ```bash
34
+ if [ -f .sdd/observabilidad/consumo.jsonl ]; then
35
+ wc -l .sdd/observabilidad/consumo.jsonl
36
+ cat .sdd/observabilidad/consumo.jsonl
37
+ else
38
+ echo "SIN_LEDGER"
39
+ fi
40
+ ```
41
+
42
+ Si `SIN_LEDGER`: marcar PASO 2 como "Sin datos de sesión — ledger vacío" y continuar.
43
+
44
+ Si hay datos: invocar la skill `observabilidad-consumo` para obtener:
45
+ - Tabla por agente (invocaciones, bytes, archivos únicos)
46
+ - Alertas de fan-out (>5 agentes distintos, >20 invocaciones de un agente, >500KB total)
47
+
48
+ ---
49
+
50
+ ## PASO 3 — Routing de effort (si hay fase activa o alertas de fan-out)
51
+
52
+ Invocar la skill `effort-router` con la fase del `estado.json`.
53
+
54
+ Si el subcomando es `/sdd.optimizar presupuesto` o `/sdd.optimizar memoria`, saltar este paso.
55
+
56
+ Mostrar la tabla de modelos recomendados y el ahorro estimado.
57
+
58
+ ---
59
+
60
+ ## PASO 4 — Comprimir memoria si supera umbral
61
+
62
+ ```bash
63
+ # Verificar tamaño de archivos de memoria
64
+ for f in .sdd/memoria/agente-*.md; do
65
+ [ -f "$f" ] || continue
66
+ entradas=$(grep -c "^## " "$f" 2>/dev/null || echo 0)
67
+ bytes=$(wc -c < "$f" 2>/dev/null || echo 0)
68
+ echo "MEMORIA:$f:$entradas:$bytes"
69
+ done
70
+ ```
71
+
72
+ Si algún archivo supera **80 entradas** o **50 000 bytes**: invocar la skill `memory-compactor`.
73
+
74
+ Si el subcomando es `/sdd.optimizar tokens` o `/sdd.optimizar presupuesto`, saltar este paso.
75
+
76
+ Si ningún archivo supera el umbral: marcar "✅ Memoria dentro del umbral".
77
+
78
+ ---
79
+
80
+ ## PASO 5 — Auditar oportunidades de caché
81
+
82
+ ```bash
83
+ # Detectar agentes instalados en el proyecto
84
+ ls .claude/agents/ 2>/dev/null || echo "SIN_AGENTES_LOCALES"
85
+
86
+ # Detectar patterns que invalidan caché silenciosamente
87
+ grep -rn "$(date +%Y-%m-%d)\|[0-9a-f]\{8\}-[0-9a-f]\{4\}\|consumo\.jsonl" .claude/agents/ 2>/dev/null || echo "SIN_INVALIDADORES"
88
+ ```
89
+
90
+ Invocar la skill `cache-audit` con los resultados.
91
+
92
+ Si el subcomando es `/sdd.optimizar memoria` o `/sdd.optimizar presupuesto`, saltar este paso.
93
+
94
+ ---
95
+
96
+ ## PASO 6 — Proyectar presupuesto de fases restantes
97
+
98
+ ```bash
99
+ # Tareas pendientes de la spec activa
100
+ SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
101
+ if [ -n "$SPEC_ID" ]; then
102
+ cat ".sdd/especificaciones/${SPEC_ID}/.estado-tareas.json" 2>/dev/null || echo "SIN_TAREAS"
103
+ fi
104
+ ```
105
+
106
+ Invocar la skill `token-budget` con el estado, tareas pendientes y datos del ledger.
107
+
108
+ Si el subcomando es `/sdd.optimizar tokens` o `/sdd.optimizar memoria`, saltar este paso.
109
+
110
+ ---
111
+
112
+ ## PASO 7 — Reporte unificado
113
+
114
+ Generar el reporte final ordenando las acciones por impacto decreciente:
115
+
116
+ ```
117
+ ╔══════════════════════════════════════════════════════════════════╗
118
+ ║ ⚡ SDD.OPTIMIZAR — Reporte de Eficiencia ║
119
+ ╠══════════════════════════════════════════════════════════════════╣
120
+ ║ Proyecto: {nombre} | Fase: {fase} | {fecha} ║
121
+ ╠══════════════════════════════════════════════════════════════════╣
122
+ ║ 📊 CONSUMO DE SESIÓN ║
123
+ ║ ║
124
+ ║ {tabla por agente o "Sin datos de sesión"} ║
125
+ ║ {alertas de fan-out o "✅ Sin alertas"} ║
126
+ ╠══════════════════════════════════════════════════════════════════╣
127
+ ║ 🎯 ROUTING DE MODELOS (fase: {fase}) ║
128
+ ║ ║
129
+ ║ {tabla effort-router} ║
130
+ ║ Ahorro estimado vs. Opus-en-todo: ~{%}% ║
131
+ ╠══════════════════════════════════════════════════════════════════╣
132
+ ║ 🧠 MEMORIA DE AGENTES ║
133
+ ║ ║
134
+ ║ {estado por agente: OK / comprimido / pendiente} ║
135
+ ╠══════════════════════════════════════════════════════════════════╣
136
+ ║ 🔄 CACHÉ ║
137
+ ║ ║
138
+ ║ {oportunidades detectadas o "✅ Sin invalidadores detectados"} ║
139
+ ╠══════════════════════════════════════════════════════════════════╣
140
+ ║ 💰 PRESUPUESTO DE FASES RESTANTES ║
141
+ ║ ║
142
+ ║ {tabla por fase: costo estimado y recomendación PTC} ║
143
+ ╠══════════════════════════════════════════════════════════════════╣
144
+ ║ 🚀 ACCIONES RECOMENDADAS (por impacto) ║
145
+ ║ ║
146
+ ║ 1. {acción de mayor impacto con comando concreto} ║
147
+ ║ 2. {segunda acción} ║
148
+ ║ 3. {tercera acción} ║
149
+ ╚══════════════════════════════════════════════════════════════════╝
150
+ ```
151
+
152
+ ### Lógica de priorización de acciones
153
+
154
+ Ordenar las recomendaciones así:
155
+ 1. **Fan-out activo** (>5 agentes o >20 invocaciones) → acción inmediata con `effort-router`
156
+ 2. **Memoria sobre umbral** (>50KB) → `memory-compactor`
157
+ 3. **Invalidadores de caché detectados** → `cache-audit` con fix sugerido
158
+ 4. **Fases costosas por delante** → `token-budget` + sugerencia de PTC
159
+
160
+ Si no hay ninguna de estas condiciones:
161
+ ```
162
+ ✅ La sesión está optimizada. No se detectan acciones de alto impacto.
163
+ Próximo paso sugerido según fase: {COMANDO_SDD}
164
+ ```
@@ -21,6 +21,8 @@ Eres el **Orquestador del Plan**. Coordinas a los agentes especializados configu
21
21
 
22
22
  **Si el usuario escribió `/sdd.planificar revisar`**: muestra el plan actual y pide cambios específicos.
23
23
 
24
+ **Si el usuario escribió `/sdd.planificar cambios [descripción]`**: registra feedback específico, edita el plan, y regresa al PASO 9 (aprobación explícita).
25
+
24
26
  ## VERIFICACIONES PRE-EJECUCIÓN
25
27
 
26
28
  ```bash
@@ -296,6 +298,68 @@ EOF
296
298
  # Actualizar entrada de INDICE.md: "plan: ✅"
297
299
  ```
298
300
 
301
+ ## PASO 8 — Presentar el plan (resumen ejecutivo)
302
+
303
+ No muestres el plan técnico completo. En su lugar, presenta un **resumen ejecutivo** adaptado al perfil:
304
+
305
+ **Si perfil == "guiado":**
306
+
307
+ ```
308
+ ✅ PLAN LISTO PARA CONSTRUIR
309
+
310
+ Lo que voy a hacer:
311
+ → [3-5 frases en lenguaje simple de lo que se construye]
312
+
313
+ Tecnología que usaré:
314
+ → [stack elegido, explicado sin jerga. Ej: "JavaScript (lenguaje web), SQLite (base de datos simple y gratis), Node.js (servidor web)"]
315
+
316
+ Tiempo aproximado:
317
+ → [estimación legible: "unos 30-45 minutos"]
318
+
319
+ Archivos que cambiarán:
320
+ → [lista simple de carpetas/conceptos afectados, no rutas técnicas]
321
+
322
+ Lo que queda por hacer después:
323
+ → [QA, deploy, etc.]
324
+ ```
325
+
326
+ **Si perfil == "experto":**
327
+
328
+ Muestra el plan técnico completo (todas las 17 secciones) con decisiones, riesgos y justificaciones.
329
+
330
+ ## PASO 9 — Solicitar aprobación EXPLÍCITA
331
+
332
+ **Gate humano:** No avances a tareas sin aprobación clara.
333
+
334
+ ```
335
+ ¿Está bien este plan?
336
+
337
+ Responde:
338
+ ✅ "sí" → Avanzamos con /sdd.tareas
339
+ 🔄 "cambio [descripción]" → Edito el plan y pregunto de nuevo
340
+ ❌ "rechazar" → Abortamos y revisamos la especificación
341
+ ```
342
+
343
+ Si usuario responde "cambio X":
344
+ 1. Edita solo la sección relevante del plan
345
+ 2. Vuelve al PASO 8 (resumen ejecutivo)
346
+ 3. Solicita aprobación explícita nuevamente
347
+
348
+ **Guardar aprobación:**
349
+
350
+ ```bash
351
+ # Si aprobación == "sí"
352
+ cat >> .sdd/estado.json << 'EOF'
353
+ "plan_aprobado": true,
354
+ "plan_aprobacion_timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
355
+ "plan_aprobacion_usuario": "usuario",
356
+ EOF
357
+
358
+ # Mensaje de confirmación
359
+ echo "✅ Plan aprobado. Siguiente: /sdd.tareas"
360
+ echo "💾 Tu aprobación se guardó automáticamente."
361
+ ```
362
+
299
363
  ## PASO 8 — Pedir aprobación del plan
300
364
 
301
365
  Si `comportamiento.requerir_aprobacion_plan: true` en config:
@@ -237,3 +237,13 @@ ACCIONES REQUERIDAS:
237
237
  Vuelve a:
238
238
  /sdd.implementar — completar tareas pendientes
239
239
  ```
240
+
241
+ ## PASO 13 — Output styles (adaptar el PASO 12 según modo)
242
+
243
+ Si el argumento contiene `pm`, `arq` o `dev`, adapta el reporte final:
244
+
245
+ **Modo `pm`:** Muestra solo el veredicto, el % de cobertura y los bloqueos en lenguaje de negocio. Omite tablas de CA y rutas de archivo.
246
+
247
+ **Modo `arq`:** Enfatiza el cumplimiento de constitución, los ADRs afectados y los requisitos no funcionales. Incluye la tabla de CAs con archivos.
248
+
249
+ **Modo `dev`:** El reporte completo del PASO 10 con todas las tablas y rutas (comportamiento actual).
@@ -0,0 +1,216 @@
1
+ # Accessibility Baseline — FORGE Craft
2
+
3
+ Adoptado de open-design (nexu-io). Referencia para agentes de diseño.
4
+
5
+ ---
6
+
7
+ ## Principio fundamental
8
+
9
+ **Accesibilidad no es una feature extra — es la calidad mínima.**
10
+
11
+ Un wireframe inaccesible no es un MVP funcional. Estas reglas se aplican a todos los artefactos HTML generados por FORGE, sin excepción.
12
+
13
+ ---
14
+
15
+ ## Checklist de accesibilidad mínima (WCAG AA)
16
+
17
+ ### Estructura semántica
18
+
19
+ - [ ] `<html lang="es">` — idioma declarado
20
+ - [ ] Un solo `<h1>` por página — el título principal
21
+ - [ ] Jerarquía de headings sin saltos: h1 → h2 → h3 (no saltar de h1 a h3)
22
+ - [ ] `<main>`, `<header>`, `<nav>`, `<footer>` — landmarks semánticos
23
+ - [ ] `<button>` para acciones, `<a>` para navegación — nunca `<div onclick>`
24
+ - [ ] Formularios con `<label>` asociado a cada `<input>` (via `for` + `id`)
25
+
26
+ ### Contraste de color
27
+
28
+ - [ ] Texto normal (< 18px no bold): ratio ≥ 4.5:1
29
+ - [ ] Texto grande (≥ 18px o ≥ 14px bold): ratio ≥ 3:1
30
+ - [ ] Iconos y bordes de UI: ratio ≥ 3:1
31
+ - [ ] Texto desactivado (disabled): puede tener ratio menor — es intencional
32
+
33
+ ### Teclado
34
+
35
+ - [ ] Todos los elementos interactivos son alcanzables con Tab
36
+ - [ ] El foco visible es obvio (no eliminar `outline: none` sin reemplazarlo)
37
+ - [ ] Los dropdowns y modales son navegables con teclado (Enter/Escape/Flechas)
38
+ - [ ] El orden de Tab sigue el flujo visual de izquierda a derecha, arriba a abajo
39
+
40
+ ### Imágenes y medios
41
+
42
+ - [ ] `<img alt="descripción">` — siempre, aunque sea vacío (`alt=""`) para imágenes decorativas
43
+ - [ ] Iconos SVG con `aria-hidden="true"` si son decorativos, o `aria-label` si comunican algo
44
+ - [ ] No usar solo color para comunicar estado (agregar texto o icono también)
45
+
46
+ ### Formularios
47
+
48
+ - [ ] Mensajes de error junto al campo (no solo cambio de color del borde)
49
+ - [ ] `required` en campos obligatorios + indicación visual (asterisco + leyenda)
50
+ - [ ] `autocomplete` en campos comunes: `name`, `email`, `tel`, `current-password`
51
+
52
+ ---
53
+
54
+ ## HTML semántico en wireframes FORGE
55
+
56
+ ### Estructura base de cada wireframe
57
+
58
+ ```html
59
+ <!DOCTYPE html>
60
+ <html lang="es">
61
+ <head>
62
+ <meta charset="UTF-8">
63
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
64
+ <title>[Nombre del producto] — [Nombre de pantalla]</title>
65
+ </head>
66
+ <body>
67
+ <header>
68
+ <nav aria-label="Navegación principal">...</nav>
69
+ </header>
70
+ <main>
71
+ <h1>[Título principal de la pantalla]</h1>
72
+ <!-- contenido -->
73
+ </main>
74
+ </body>
75
+ </html>
76
+ ```
77
+
78
+ ### Botones correctos vs incorrectos
79
+
80
+ ```html
81
+ <!-- ✅ Correcto -->
82
+ <button type="button" class="btn-primary">Crear cita</button>
83
+ <button type="submit" class="btn-primary">Guardar cambios</button>
84
+
85
+ <!-- ❌ Incorrecto — div no es interactivo por defecto -->
86
+ <div class="btn-primary" onclick="...">Crear cita</div>
87
+ ```
88
+
89
+ ### Labels de formularios
90
+
91
+ ```html
92
+ <!-- ✅ Correcto — label asociado por for/id -->
93
+ <label for="paciente-nombre">Nombre del paciente</label>
94
+ <input id="paciente-nombre" type="text" autocomplete="name" required>
95
+
96
+ <!-- ✅ Correcto — label envolvente -->
97
+ <label>
98
+ Nombre del paciente
99
+ <input type="text" autocomplete="name" required>
100
+ </label>
101
+
102
+ <!-- ❌ Incorrecto — placeholder no reemplaza el label -->
103
+ <input type="text" placeholder="Nombre del paciente">
104
+ ```
105
+
106
+ ### Foco visible
107
+
108
+ ```css
109
+ /* ✅ Foco visible con el color de acento */
110
+ :focus-visible {
111
+ outline: 2px solid var(--accent);
112
+ outline-offset: 2px;
113
+ border-radius: 2px;
114
+ }
115
+
116
+ /* ❌ Nunca eliminar el foco sin reemplazarlo */
117
+ * { outline: none; }
118
+ ```
119
+
120
+ ### Iconos SVG
121
+
122
+ ```html
123
+ <!-- ✅ Icono decorativo (acompañado de texto) -->
124
+ <button>
125
+ <svg aria-hidden="true" focusable="false">...</svg>
126
+ Crear cita
127
+ </button>
128
+
129
+ <!-- ✅ Icono solo (sin texto) -->
130
+ <button aria-label="Cerrar menú">
131
+ <svg aria-hidden="true" focusable="false">...</svg>
132
+ </button>
133
+
134
+ <!-- ❌ Icono sin descripción -->
135
+ <button>
136
+ <svg>...</svg>
137
+ </button>
138
+ ```
139
+
140
+ ---
141
+
142
+ ## Estado de elementos interactivos
143
+
144
+ Cada elemento interactivo debe tener estilos para 4 estados:
145
+
146
+ | Estado | CSS | Cuándo |
147
+ |--------|-----|--------|
148
+ | Normal | (base) | Sin interacción |
149
+ | Hover | `:hover` | Ratón encima (desktop) |
150
+ | Focus | `:focus-visible` | Navegación por teclado |
151
+ | Disabled | `[disabled]`, `aria-disabled="true"` | No disponible |
152
+ | Active | `:active` | Click/tap en progreso |
153
+
154
+ ```css
155
+ .btn-primary { background: var(--accent); color: var(--text-inverse); }
156
+ .btn-primary:hover { background: var(--accent-hover); }
157
+ .btn-primary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
158
+ .btn-primary:disabled { opacity: 0.45; cursor: not-allowed; }
159
+ .btn-primary:active { transform: translateY(1px); }
160
+ ```
161
+
162
+ ---
163
+
164
+ ## ARIA mínimo necesario
165
+
166
+ No sobrecargar con ARIA. La regla: **si el HTML semántico ya lo comunica, no añadir ARIA**.
167
+
168
+ ```html
169
+ <!-- Necesario: nav con múltiples navs en la página -->
170
+ <nav aria-label="Navegación principal">...</nav>
171
+ <nav aria-label="Breadcrumb">...</nav>
172
+
173
+ <!-- Necesario: estado de un componente dinámico -->
174
+ <button aria-expanded="false" aria-controls="menu-id">Menú</button>
175
+ <div id="menu-id" hidden>...</div>
176
+
177
+ <!-- Necesario: live regions para notificaciones -->
178
+ <div role="status" aria-live="polite" id="notifications"></div>
179
+
180
+ <!-- No necesario: botón ya tiene rol button -->
181
+ <button role="button">No necesario</button>
182
+ ```
183
+
184
+ ---
185
+
186
+ ## Responsive mínimo
187
+
188
+ ```css
189
+ /* Viewport meta — siempre */
190
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
191
+
192
+ /* Tamaño de tap target mínimo — 44x44px */
193
+ button, a, input[type="checkbox"], input[type="radio"] {
194
+ min-height: 44px;
195
+ min-width: 44px;
196
+ }
197
+
198
+ /* Texto legible en mobile */
199
+ body { font-size: 16px; } /* evita zoom automático en iOS */
200
+ input, textarea, select { font-size: 16px; } /* evita zoom en focus en iOS */
201
+ ```
202
+
203
+ ---
204
+
205
+ ## Referencia rápida para agentes
206
+
207
+ Antes de cerrar el `<artifact>`, verificar:
208
+
209
+ 1. `<html lang="es">` presente
210
+ 2. Un solo `<h1>` en la página
211
+ 3. Todos los `<input>` tienen `<label>` asociado
212
+ 4. Todos los `<button>` tienen texto o `aria-label`
213
+ 5. Imágenes tienen `alt`
214
+ 6. `:focus-visible` definido con `outline` visible
215
+ 7. No usar `<div>` para elementos clicables — usar `<button>` o `<a>`
216
+ 8. Contraste de texto verificado mentalmente (colores del DESIGN.md tienen ratio ≥ 4.5:1)
@@ -0,0 +1,158 @@
1
+ # Anti-AI-Slop Rules
2
+
3
+ > Reglas cardinales para evitar patrones visuales genéricos de IA. Adoptado de open-design (nexu-io).
4
+ > **P0 = bloqueante**: si el artefacto viola estas reglas, la crítica automática lo rechaza (score < 4).
5
+
6
+ ---
7
+
8
+ ## Las 7 Reglas Cardinales
9
+
10
+ ### Regla 1 — Prohibido el índigo default de Tailwind
11
+
12
+ ❌ **Nunca usar**: `#6366F1`, `#4F46E5`, `#7C3AED`, `#8B5CF6`, `#6D28D9`
13
+
14
+ Estos colores son la firma del "AI-generated UI" sin dirección. Si el DESIGN.md activo no especifica morado/índigo, no lo uses. Si lo especifica, usa el valor exacto del DESIGN.md.
15
+
16
+ ✅ **En su lugar**: el color de acento definido en el DESIGN.md activo.
17
+
18
+ ---
19
+
20
+ ### Regla 2 — Prohibido el gradiente "trust" de 2 paradas
21
+
22
+ ❌ **Nunca usar en heroes o CTAs**:
23
+ - `linear-gradient(135deg, #6366F1, #2563EB)` (purple → blue)
24
+ - `linear-gradient(135deg, #667EEA, #764BA2)` (lavender → purple)
25
+ - `linear-gradient(90deg, #00B4D8, #90E0EF)` (blue → cyan)
26
+ - Cualquier gradiente de 2 colores en una dirección diagonal sobre el hero
27
+
28
+ ✅ **En su lugar**: fondo sólido del color base del DESIGN.md. Si el diseño requiere gradiente, que tenga intención editorial (ej: warm-editorial puede usar un gradiente de tonos tierra muy sutil).
29
+
30
+ ---
31
+
32
+ ### Regla 3 — Prohibidos los emojis como iconos de features
33
+
34
+ ❌ **Nunca hacer esto**:
35
+ ```html
36
+ <div class="feature">
37
+ <span class="icon">⚡</span>
38
+ <h3>Rápido y confiable</h3>
39
+ </div>
40
+ ```
41
+
42
+ ✅ **En su lugar**: SVG monoline simple, o ningún icono. Si no hay icono SVG disponible, usar texto puro o un elemento decorativo del DESIGN.md.
43
+
44
+ ---
45
+
46
+ ### Regla 4 — Respetar la fuente del DESIGN.md activo
47
+
48
+ ❌ **Nunca mezclar**: si el DESIGN.md dice `font-display: 'Playfair Display'`, no usar sans-serif para headings.
49
+
50
+ ✅ **Regla**: las fuentes del artefacto deben coincidir exactamente con las del DESIGN.md activo. No "mejorar" con fuentes propias.
51
+
52
+ Si el DESIGN.md no especifica una fuente (raro), usar `system-ui, sans-serif`.
53
+
54
+ ---
55
+
56
+ ### Regla 5 — Prohibido el patrón "AI dashboard tile"
57
+
58
+ ❌ **Nunca hacer esto**:
59
+ ```html
60
+ <div style="border-left: 4px solid #6366F1; border-radius: 8px; background: #F9FAFB;">
61
+ <span>10x más rápido</span>
62
+ </div>
63
+ ```
64
+
65
+ Este patrón — card redondeada con borde izquierdo de color + métrica — es el sello del UI genérico de IA.
66
+
67
+ ✅ **En su lugar**: el estilo de card definido en el DESIGN.md activo. Las métricas deben ser reales o no aparecer.
68
+
69
+ ---
70
+
71
+ ### Regla 6 — Prohibidas las métricas inventadas
72
+
73
+ ❌ **Nunca usar**:
74
+ - "10x más rápido"
75
+ - "99.9% de uptime"
76
+ - "2 millones de usuarios satisfechos"
77
+ - "50% de ahorro de tiempo garantizado"
78
+
79
+ ...a menos que el usuario haya provisto esos números en el IR o el contexto.
80
+
81
+ ✅ **En su lugar**: si se necesita una métrica de ejemplo, usar un placeholder explícito como `[X]% de mejora` o omitirla.
82
+
83
+ ---
84
+
85
+ ### Regla 7 — Prohibido el copy de relleno
86
+
87
+ ❌ **Nunca usar**:
88
+ - Lorem ipsum o variantes
89
+ - "Feature One", "Feature Two", "Feature Three"
90
+ - "Descripción de la feature aquí"
91
+ - "Título del beneficio"
92
+ - "Texto placeholder"
93
+
94
+ ✅ **En su lugar**: copy derivado del IR del proyecto. Si no hay copy real, usar `[Nombre de la feature]` con corchetes para marcar que es un placeholder explícito.
95
+
96
+ ---
97
+
98
+ ## Patrones Adicionales a Evitar (P1 — no bloqueante pero penaliza el score)
99
+
100
+ ### P1-A: Hero con imagen de stock genérica
101
+ - Personas sonriendo frente a pantallas
102
+ - Oficinas modernas con plantas
103
+ - Manos sobre teclados
104
+
105
+ ✅ En su lugar: sin imagen, color de fondo sólido del DESIGN.md, o SVG ilustrativo relacionado al producto.
106
+
107
+ ### P1-B: Navbar con logo "Empresa" y menú genérico
108
+ ```html
109
+ <!-- Evitar -->
110
+ <nav>
111
+ <div class="logo">Empresa</div>
112
+ <a href="#">Inicio</a>
113
+ <a href="#">Características</a>
114
+ <a href="#">Precios</a>
115
+ <a href="#">Blog</a>
116
+ <button>Empieza Gratis</button>
117
+ </nav>
118
+ ```
119
+ ✅ El nombre de la navbar debe venir del `product.name` del IR.
120
+
121
+ ### P1-C: Footer con 4 columnas de links vacíos
122
+ El footer de "AI-slop" tiene 4 columnas (Producto, Empresa, Recursos, Legal) con links que no llevan a ningún lado.
123
+ ✅ Si el MVP no tiene esas secciones, el footer es mínimo: copyright + link principal.
124
+
125
+ ### P1-D: Sección "Como funciona" con 3 pasos numerados + iconos genéricos
126
+ El patrón de "1. Regístrate → 2. Configura → 3. Disfruta" con íconos de rocket/check/star es omnipresente.
127
+ ✅ Si el producto tiene un flujo real, muéstralo. Si no, omite esta sección.
128
+
129
+ ### P1-E: Testimonials inventados
130
+ ```html
131
+ <!-- Evitar -->
132
+ <blockquote>
133
+ "Este producto cambió mi vida."
134
+ — María García, CEO de Empresa S.A.
135
+ </blockquote>
136
+ ```
137
+ ✅ Si no hay testimonials reales del IR, omitir la sección completamente.
138
+
139
+ ---
140
+
141
+ ## Cómo aplicar estas reglas
142
+
143
+ Los agentes **product-designer** y **wireframe-mvp** deben:
144
+
145
+ 1. Antes de generar cualquier UI, leer este archivo
146
+ 2. Generar el artefacto
147
+ 3. Hacer auto-checklist: ¿viola alguna de las 7 reglas cardinales?
148
+ 4. Si viola alguna P0: corregir antes de entregar
149
+ 5. Si viola P1: mencionar en el output y decidir si corregir
150
+
151
+ La skill **critica-diseno** evalúa explícitamente "Ausencia de AI-slop" como una de sus 5 dimensiones.
152
+
153
+ ---
154
+
155
+ ## Origen
156
+
157
+ Estas reglas están adaptadas de `open-design` (nexu-io/open-design), proyecto Apache-2.0.
158
+ La lista de colores prohibidos y los patrones fueron identificados por análisis de outputs de modelos de lenguaje entre 2023–2025.