sdd-es 2.0.0 → 2.6.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.
- package/.claude/settings.json +29 -29
- package/.claude/settings.local.json +10 -0
- package/.claude-plugin/marketplace.json +10 -7
- package/.claude-plugin/plugin.json +59 -37
- package/.gitignore +20 -0
- package/.mcp.json +8 -0
- package/LICENSE +21 -0
- package/README.md +77 -40
- package/agents/architecture-designer.md +211 -0
- package/agents/arquitecto.md +16 -1
- package/agents/asesor-datos.md +15 -1
- package/agents/critico.md +37 -1
- package/agents/desarrollador-backend.md +3 -1
- package/agents/desarrollador-frontend.md +11 -16
- package/agents/disenador-api.md +13 -1
- package/agents/documentador.md +3 -1
- package/agents/investigador.md +3 -1
- package/agents/operaciones.md +3 -1
- package/agents/product-designer.md +268 -0
- package/agents/revisor.md +25 -1
- package/agents/seguridad.md +5 -1
- package/agents/tester.md +3 -1
- package/claude-hooks/agent-memory.js +288 -0
- package/claude-hooks/pre-tool-guard.js +61 -9
- package/cli/index.js +1 -2
- package/commands/sdd.adr.md +196 -0
- package/commands/sdd.analizar.md +23 -2
- package/commands/sdd.ayuda.md +13 -0
- package/commands/sdd.compliance.md +521 -0
- package/commands/sdd.configurar.md +34 -1
- package/commands/sdd.constitucion.md +198 -23
- package/commands/sdd.construir.md +210 -0
- package/commands/sdd.crear-mcp.md +2 -0
- package/commands/sdd.defect-report.md +134 -0
- package/commands/sdd.descubrir.md +19 -0
- package/commands/sdd.dise/303/261ar.md +188 -0
- package/commands/sdd.estado.md +120 -3
- package/commands/sdd.exportar.md +344 -0
- package/commands/sdd.implementar.md +272 -52
- package/commands/sdd.interpretar.md +239 -0
- package/commands/sdd.md +93 -4
- package/commands/sdd.optimizar-memoria.md +47 -0
- package/commands/sdd.optimizar.md +164 -0
- package/commands/sdd.planificar.md +64 -0
- package/commands/sdd.retro.md +74 -0
- package/commands/sdd.verificar.md +81 -0
- package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
- package/configuracion-ejemplo/sdd.config.yaml +10 -0
- package/craft/accessibility-baseline.md +216 -0
- package/craft/anti-ai-slop.md +158 -0
- package/craft/color.md +160 -0
- package/craft/typography.md +121 -0
- package/design-systems/bold-brutalist/DESIGN.md +239 -0
- package/design-systems/editorial-minimal/DESIGN.md +205 -0
- package/design-systems/neutral-modern/DESIGN.md +227 -0
- package/design-systems/vibrant-consumer/DESIGN.md +257 -0
- package/design-systems/warm-editorial/DESIGN.md +221 -0
- package/docs/AGENTES.md +4 -1
- package/docs/CASO-COMPLETO.md +206 -0
- package/docs/EJEMPLOS.md +61 -185
- package/docs/FABRICA.md +163 -115
- package/docs/INICIO-RAPIDO.md +27 -79
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +239 -0
- package/docs/MODELOS.md +3 -0
- package/docs/QUE-PASA-SI-FALLA.md +404 -0
- package/docs/README.md +43 -0
- package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
- package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
- package/package.json +15 -10
- package/plantillas/job-story-mejorar-prompt.md +107 -0
- package/presets/enterprise.yaml +6 -0
- package/presets/lean.yaml +4 -0
- package/presets/startup.yaml +6 -0
- package/skills/adr-indexer/SKILL.md +181 -0
- package/skills/cache-audit/SKILL.md +163 -0
- package/skills/critica-diseno/SKILL.md +193 -0
- package/skills/descubrir-idea/SKILL.md +133 -0
- package/skills/effort-router/SKILL.md +128 -0
- package/skills/elegir-direccion/SKILL.md +184 -0
- package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
- package/skills/github-connect/INDEX.md +223 -0
- package/skills/github-connect/INTEGRATION.md +361 -0
- package/skills/github-connect/QUICK-START.md +168 -0
- package/skills/github-connect/README.md +414 -0
- package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
- package/skills/github-connect/SKILL.md +343 -0
- package/skills/github-connect/STRUCTURE.txt +252 -0
- package/skills/github-connect/example-config.yaml +41 -0
- package/skills/github-connect/github-connect.sh +419 -0
- package/skills/interpretar-idea/SKILL.md +254 -0
- package/skills/mejorar-prompt/SKILL.md +237 -0
- package/skills/memory-compactor/SKILL.md +68 -0
- package/skills/modo-guiado/SKILL.md +12 -2
- package/skills/mutation-detector/SKILL.md +134 -0
- package/skills/observabilidad-consumo/SKILL.md +164 -0
- package/skills/token-budget/SKILL.md +177 -0
- package/skills/vercel-deploy/00-START-HERE.txt +364 -0
- package/skills/vercel-deploy/CHECKLIST.md +205 -0
- package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
- package/skills/vercel-deploy/FLOW.txt +334 -0
- package/skills/vercel-deploy/INDEX.md +276 -0
- package/skills/vercel-deploy/INTEGRATION.md +328 -0
- package/skills/vercel-deploy/MANIFEST.md +310 -0
- package/skills/vercel-deploy/README.md +65 -0
- package/skills/vercel-deploy/SKILL.md +356 -0
- package/skills/vercel-deploy/deploy.sh +298 -0
- package/skills/vercel-deploy/estado.json.example +205 -0
- package/skills/vercel-deploy/skill.yaml +323 -0
- package/skills/vercel-deploy/vercel-deploy.sh +216 -0
- package/skills/wireframe-mvp/SKILL.md +157 -0
- package/docs/EJEMPLO-PRACTICA.md +0 -383
- package/mcp-figma/README.md +0 -158
- package/mcp-figma/package.json +0 -7
- package/mcp-figma/src/component-generator.js +0 -162
- package/mcp-figma/src/design-system-analyzer.js +0 -247
- package/mcp-figma/src/figma-client.js +0 -75
- package/mcp-figma/src/index.js +0 -114
- package/mcp-figma/src/mcp.js +0 -97
- package/mcp-figma/src/style-mapper.js +0 -85
- /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
- /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
- /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
- /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
- /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
- /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
- /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
- /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
package/commands/sdd.retro.md
CHANGED
|
@@ -55,6 +55,80 @@ Si un aprendizaje implica un **principio nuevo** del proyecto, sugiere actualiza
|
|
|
55
55
|
|
|
56
56
|
> Este aprendizaje parece una regla general del proyecto. ¿Lo elevo a la constitución con `/sdd.constitucion`?
|
|
57
57
|
|
|
58
|
+
## PASO 3.5 — Resumen de calidad al cierre
|
|
59
|
+
|
|
60
|
+
Al final de cada sesión de implementación, antes del resumen de retro, FORGE genera automáticamente un **resumen de calidad en lenguaje de producto** (~5 líneas, sin jerga técnica). El objetivo es que el usuario entienda qué se hizo y en qué estado quedó sin leer tablas ni logs.
|
|
61
|
+
|
|
62
|
+
### Cómo construirlo
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Recopilar señales objetivas del ciclo
|
|
66
|
+
TAREAS_OK=$(grep -c '"estado": "completada"' "$DIR/.estado-tareas.json" 2>/dev/null || echo "?")
|
|
67
|
+
TAREAS_TOTAL=$(grep -c '"estado"' "$DIR/.estado-tareas.json" 2>/dev/null || echo "?")
|
|
68
|
+
|
|
69
|
+
# Tests: buscar resultado en verificacion.md o qa.md
|
|
70
|
+
TESTS_RESULTADO=$(grep -oE "Pasados: [0-9]+" "$DIR/verificacion.md" 2>/dev/null | head -1)
|
|
71
|
+
TESTS_FALLIDOS=$(grep -oE "Fallidos: [0-9]+" "$DIR/verificacion.md" 2>/dev/null | head -1)
|
|
72
|
+
COBERTURA=$(grep -oE "Cobertura: [0-9]+%" "$DIR/verificacion.md" 2>/dev/null | head -1)
|
|
73
|
+
|
|
74
|
+
# Seguridad: ¿se invocó el agente seguridad?
|
|
75
|
+
SEGURIDAD=$(grep -q "Gate de seguridad activado\|agente seguridad" "$DIR/verificacion.md" 2>/dev/null \
|
|
76
|
+
&& echo "revisión de seguridad incluida" || echo "sin revisión de seguridad (no aplica)")
|
|
77
|
+
|
|
78
|
+
# Feature principal: título de la spec
|
|
79
|
+
TITULO=$(grep -m1 "^# " "$DIR/spec.md" 2>/dev/null | sed 's/# //')
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Formato del resumen (adaptar al perfil)
|
|
83
|
+
|
|
84
|
+
**Perfil `guiado`** (lenguaje de producto, sin jerga):
|
|
85
|
+
```
|
|
86
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
87
|
+
📦 Resumen de lo que se hizo
|
|
88
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
89
|
+
Hiciste [TÍTULO en lenguaje natural].
|
|
90
|
+
Pruebas: [✓ N/N pasaron | ✗ N fallaron | no hay pruebas aún].
|
|
91
|
+
[Si hubo seguridad]: Se revisó la seguridad — sin problemas encontrados.
|
|
92
|
+
[Si hay cobertura]: Cobertura: N%.
|
|
93
|
+
Listo para [usar / probar / desplegar].
|
|
94
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Ejemplo concreto:
|
|
98
|
+
```
|
|
99
|
+
Hiciste el login con email.
|
|
100
|
+
Pruebas: ✓ 12/12 pasaron.
|
|
101
|
+
Se revisó la seguridad — sin vulnerabilidades.
|
|
102
|
+
Cobertura: 87%.
|
|
103
|
+
Listo para usar.
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Perfil `profesional`** (lenguaje técnico compacto):
|
|
107
|
+
```
|
|
108
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
109
|
+
📊 Quality Summary — {SPEC_ID}
|
|
110
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
111
|
+
Feature: [TÍTULO]
|
|
112
|
+
Tareas: [N/M completadas]
|
|
113
|
+
Tests: [✓ N pasaron | ✗ N fallaron] · Cobertura: [N% | N/A]
|
|
114
|
+
Seguridad: [Auditada — APROBADO | No aplica (sin keywords sensibles)]
|
|
115
|
+
Estado: [APROBADA | APROBADA CON OBSERVACIONES | RECHAZADA]
|
|
116
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Cuándo se genera
|
|
120
|
+
|
|
121
|
+
Este resumen se emite **siempre** al ejecutar `/sdd.retro`, independientemente de si la sesión terminó bien o mal. Si la sesión terminó con tareas bloqueadas o tests fallando, el resumen lo refleja honestamente:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
Hiciste el login con email (en progreso).
|
|
125
|
+
Pruebas: ✗ 2 fallaron (ver verificacion.md).
|
|
126
|
+
No se revisó seguridad.
|
|
127
|
+
Pendiente: corregir errores antes de entregar.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
El resumen se incluye también en la entrada que se escribe en `.sdd/SNAPSHOT.md` (paso 3).
|
|
131
|
+
|
|
58
132
|
## PASO 4 — Resumen
|
|
59
133
|
|
|
60
134
|
```
|
|
@@ -66,6 +66,77 @@ Lee el código encontrado. ¿Realmente implementa lo que pide el CA?
|
|
|
66
66
|
|
|
67
67
|
Repite el proceso para cada RF-XXX de la spec.
|
|
68
68
|
|
|
69
|
+
## PASO 4.5 — Gate de seguridad automático
|
|
70
|
+
|
|
71
|
+
**Antes de continuar con los requisitos no funcionales**, escanea la spec y las tareas en busca de keywords sensibles. Si se detecta alguna, invoca al agente `seguridad` automáticamente sin esperar a que el usuario lo solicite.
|
|
72
|
+
|
|
73
|
+
### Keywords que activan el gate de seguridad
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
KEYWORDS_AUTH:
|
|
77
|
+
auth, login, logout, signin, signup, registro, sesión, session,
|
|
78
|
+
password, contraseña, credenciales, credentials
|
|
79
|
+
|
|
80
|
+
KEYWORDS_TOKENS:
|
|
81
|
+
token, jwt, bearer, oauth, api_key, apikey, secret, secreto
|
|
82
|
+
|
|
83
|
+
KEYWORDS_DATOS:
|
|
84
|
+
base de datos, bd, database, sql, query, consulta, migration, migracion,
|
|
85
|
+
postgres, mysql, sqlite, mongodb, redis
|
|
86
|
+
|
|
87
|
+
KEYWORDS_CONFIG:
|
|
88
|
+
config, configuracion, .env, environment, variable de entorno,
|
|
89
|
+
settings, dotenv
|
|
90
|
+
|
|
91
|
+
KEYWORDS_PAGOS:
|
|
92
|
+
pago, payment, stripe, checkout, factura, invoice, tarjeta, card,
|
|
93
|
+
billing, cobro, precio, price
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Lógica de detección
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
SPEC_CONTENT=$(cat "${SPEC_DIR}/spec.md" "${SPEC_DIR}/tareas.md" 2>/dev/null | tr '[:upper:]' '[:lower:]')
|
|
100
|
+
|
|
101
|
+
KEYWORDS="auth|login|logout|signin|signup|registro|sesión|session|\
|
|
102
|
+
password|contraseña|credenciales|credentials|\
|
|
103
|
+
token|jwt|bearer|oauth|api_key|apikey|secret|secreto|\
|
|
104
|
+
base de datos| bd |database|sql|migration|migracion|\
|
|
105
|
+
postgres|mysql|sqlite|mongodb|redis|\
|
|
106
|
+
config|configuracion|\.env|environment|dotenv|\
|
|
107
|
+
pago|payment|stripe|checkout|factura|tarjeta|billing"
|
|
108
|
+
|
|
109
|
+
if echo "$SPEC_CONTENT" | grep -qiE "$KEYWORDS"; then
|
|
110
|
+
KEYWORD_DETECTADA=$(echo "$SPEC_CONTENT" | grep -oiE "$KEYWORDS" | head -1)
|
|
111
|
+
echo "🔒 Gate de seguridad activado automáticamente (keyword detectada: '$KEYWORD_DETECTADA')"
|
|
112
|
+
echo " Invocando agente seguridad..."
|
|
113
|
+
# → Task("seguridad", prompt_seguridad(spec, plan, diff, keyword))
|
|
114
|
+
GATE_SEGURIDAD_EJECUTADO=true
|
|
115
|
+
else
|
|
116
|
+
echo "✅ Gate de seguridad: sin keywords sensibles detectadas. Omitiendo."
|
|
117
|
+
GATE_SEGURIDAD_EJECUTADO=false
|
|
118
|
+
fi
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Qué hace el agente `seguridad` en este contexto
|
|
122
|
+
|
|
123
|
+
Recibe: spec completa + plan + diff de archivos modificados + keyword que activó el gate.
|
|
124
|
+
|
|
125
|
+
Verifica mínimamente:
|
|
126
|
+
- Ausencia de secretos hardcodeados en el diff
|
|
127
|
+
- Validación/sanitización de inputs sensibles
|
|
128
|
+
- Ausencia de SQL dinámico sin parametrizar
|
|
129
|
+
- Tokens/passwords no logueados ni expuestos en respuestas
|
|
130
|
+
- Configuraciones sensibles gestionadas via variables de entorno
|
|
131
|
+
|
|
132
|
+
Retorna: `APROBADO` | `OBSERVACIONES` | `RECHAZADO` + lista de hallazgos.
|
|
133
|
+
|
|
134
|
+
Si retorna `RECHAZADO` → la verificación global queda `RECHAZADA` independientemente de los CAs.
|
|
135
|
+
Si retorna `OBSERVACIONES` → se documentan en el reporte de verificación bajo "Hallazgos 🟡 Importantes".
|
|
136
|
+
Si retorna `APROBADO` → continúa normalmente.
|
|
137
|
+
|
|
138
|
+
> **Nota**: si el agente `seguridad` ya fue invocado durante `sdd.implementar` (paso 6.3 o revisión paralela del paso 4.5), sus resultados se reutilizan y no se invoca de nuevo — se indica en el reporte: `"Seguridad: resultado reutilizado de implementación (fecha/hora)"`.
|
|
139
|
+
|
|
69
140
|
## PASO 5 — Verificar requisitos no funcionales
|
|
70
141
|
|
|
71
142
|
Estos requieren validación específica:
|
|
@@ -237,3 +308,13 @@ ACCIONES REQUERIDAS:
|
|
|
237
308
|
Vuelve a:
|
|
238
309
|
/sdd.implementar — completar tareas pendientes
|
|
239
310
|
```
|
|
311
|
+
|
|
312
|
+
## PASO 13 — Output styles (adaptar el PASO 12 según modo)
|
|
313
|
+
|
|
314
|
+
Si el argumento contiene `pm`, `arq` o `dev`, adapta el reporte final:
|
|
315
|
+
|
|
316
|
+
**Modo `pm`:** Muestra solo el veredicto, el % de cobertura y los bloqueos en lenguaje de negocio. Omite tablas de CA y rutas de archivo.
|
|
317
|
+
|
|
318
|
+
**Modo `arq`:** Enfatiza el cumplimiento de constitución, los ADRs afectados y los requisitos no funcionales. Incluye la tabla de CAs con archivos.
|
|
319
|
+
|
|
320
|
+
**Modo `dev`:** El reporte completo del PASO 10 con todas las tablas y rutas (comportamiento actual).
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Proyecto SDD — Instrucciones para Claude Code
|
|
2
|
+
|
|
3
|
+
Este proyecto usa el flujo **SDD-ES** (Spec-Driven Development).
|
|
4
|
+
El estado vive en `.sdd/` y se sincroniza con cada comando `/sdd.*`.
|
|
5
|
+
|
|
6
|
+
## Recuperación de contexto al inicio
|
|
7
|
+
|
|
8
|
+
Al comenzar cada sesión, antes de pedir nada al usuario:
|
|
9
|
+
|
|
10
|
+
1. Si existe `.sdd/estado.json`, cárgalo y léelo.
|
|
11
|
+
2. Muestra un resumen breve (máx. 3 líneas) con la fase actual, feature activa y tareas pendientes.
|
|
12
|
+
3. Si no existe, sugiere escribir `/sdd` para empezar.
|
|
13
|
+
|
|
14
|
+
Ejemplo de resumen:
|
|
15
|
+
```
|
|
16
|
+
Estás en: implementar · feature activa: login con email · 3 pasos pendientes.
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Reglas del proyecto
|
|
20
|
+
|
|
21
|
+
@.sdd/memoria/constitucion.md
|
|
22
|
+
@.sdd/memoria/reglas-proyecto.md
|
|
23
|
+
|
|
24
|
+
- No edites `.sdd/estado.json` manualmente; los comandos `/sdd.*` lo gestionan.
|
|
25
|
+
- Respeta la spec activa: no implementes fuera de ella sin avisar.
|
|
26
|
+
- La memoria de cada agente vive en `.sdd/memoria/agente-{nombre}.md`.
|
|
27
|
+
|
|
28
|
+
## Hooks activos
|
|
29
|
+
|
|
30
|
+
| Hook | Archivo | Cuándo se ejecuta |
|
|
31
|
+
|------|---------|-------------------|
|
|
32
|
+
| PreToolUse | `claude-hooks/pre-tool-guard.js` | Antes de cada comando Bash/PowerShell |
|
|
33
|
+
| PostToolUse | `claude-hooks/agent-memory.js` | Al finalizar cada herramienta (guarda memoria de agentes) |
|
|
34
|
+
|
|
35
|
+
Los hooks bloquean operaciones destructivas y protegen secretos automáticamente.
|
|
36
|
+
No es necesario configurarlos — ya están activos.
|
|
37
|
+
|
|
38
|
+
## Convención de commits
|
|
39
|
+
|
|
40
|
+
Formato: `[LAYER] ACTION: descripción breve`
|
|
41
|
+
|
|
42
|
+
| Capa | Cuándo usarla |
|
|
43
|
+
|------|---------------|
|
|
44
|
+
| `[SPEC]` | Cambios en especificaciones o plan |
|
|
45
|
+
| `[IMPL]` | Código de implementación |
|
|
46
|
+
| `[TEST]` | Tests nuevos o modificados |
|
|
47
|
+
| `[INFRA]` | Configuración, CI, dependencias |
|
|
48
|
+
| `[DOCS]` | Documentación |
|
|
49
|
+
|
|
50
|
+
Ejemplos:
|
|
51
|
+
```
|
|
52
|
+
[IMPL] ADD: login con magic link
|
|
53
|
+
[TEST] FIX: corrige test flaky de autenticación
|
|
54
|
+
[SPEC] UPDATE: aclara criterios de aceptación del módulo de pagos
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Comandos clave
|
|
58
|
+
|
|
59
|
+
- `/sdd` — punto de entrada: detecta contexto y te guía al siguiente paso.
|
|
60
|
+
- `/sdd.especificar` — define o refina una feature.
|
|
61
|
+
- `/sdd.implementar` — ejecuta las tareas de la feature activa.
|
|
62
|
+
- `/sdd.comprimir aplicar` — reduce el contexto en sesiones largas.
|
|
63
|
+
- `/mejorar-prompt "texto"` — transforma un prompt vago en versión profesional.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Metodología de prompts
|
|
68
|
+
|
|
69
|
+
Antes de ejecutar cualquier instrucción del usuario que modifique archivos o inicie
|
|
70
|
+
una tarea nueva, comprueba que la petición tiene al menos **3 de los 5 componentes**
|
|
71
|
+
de un prompt profesional:
|
|
72
|
+
|
|
73
|
+
| Componente | Descripción | Señal de que falta |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| **Contexto** | Qué proyecto/stack/estado existe ya | El usuario no menciona el proyecto |
|
|
76
|
+
| **Tarea** | Qué hay que hacer exactamente | La instrucción es de 1-2 palabras |
|
|
77
|
+
| **Restricciones** | Qué no tocar, qué no instalar | No se especifica qué preservar |
|
|
78
|
+
| **Formato** | Cómo quiere el resultado | No aplica a todos los casos |
|
|
79
|
+
| **Verificación** | Cómo confirmar que funcionó | No hay criterio de éxito |
|
|
80
|
+
|
|
81
|
+
Si el prompt tiene **menos de 3 componentes**, responde así:
|
|
82
|
+
|
|
83
|
+
1. El componente más crítico que falta (solo uno, no todos).
|
|
84
|
+
2. Una pregunta concreta para obtenerlo.
|
|
85
|
+
3. Un ejemplo de cómo quedaría el prompt con ese componente añadido.
|
|
86
|
+
|
|
87
|
+
**No inicies la implementación sin la respuesta.**
|
|
88
|
+
|
|
89
|
+
Ejemplo de respuesta cuando falta contexto:
|
|
90
|
+
> "Para implementar esto con precisión necesito saber: ¿qué stack usa el proyecto
|
|
91
|
+
> (Express, FastAPI, Rails...)? Por ejemplo: *'Contexto: Express + TypeScript, ya tiene
|
|
92
|
+
> autenticación JWT, falta el módulo de perfiles de usuario.'*"
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Guardia de spec activa
|
|
97
|
+
|
|
98
|
+
Si existe `.sdd/estado.json` y el usuario pide algo que **no está en el alcance de la
|
|
99
|
+
feature activa**, advierte antes de proceder:
|
|
100
|
+
|
|
101
|
+
> "⚠️ Esto parece estar fuera de la spec activa (**{feature}**, fase: **{fase}**).
|
|
102
|
+
> ¿Quieres abrir una spec nueva con `/sdd.especificar`, o confirmas que esto sí
|
|
103
|
+
> forma parte de esta feature?"
|
|
104
|
+
|
|
105
|
+
**No ejecutes sin confirmación explícita.** La spec activa es la fuente de verdad del
|
|
106
|
+
alcance; salir de ella sin avisar introduce deuda técnica invisible.
|
|
@@ -34,6 +34,16 @@ agentes:
|
|
|
34
34
|
modelo: opus # Recomendado: opus (decisiones difíciles de revertir)
|
|
35
35
|
descripcion: "Toma decisiones de arquitectura del sistema y diseño técnico de alto nivel."
|
|
36
36
|
|
|
37
|
+
architecture-designer:
|
|
38
|
+
activo: true
|
|
39
|
+
modelo: sonnet # Recomendado: sonnet (stack técnico para MVPs)
|
|
40
|
+
descripcion: "Recomienda el stack técnico más simple viable: frontend, backend, BD, deploy."
|
|
41
|
+
|
|
42
|
+
product-designer:
|
|
43
|
+
activo: true
|
|
44
|
+
modelo: opus # Recomendado: opus (decisiones de producto son difíciles de revertir)
|
|
45
|
+
descripcion: "Genera el ProductDesign completo: pantallas P0/P1/P2, user flow, mvp_scope."
|
|
46
|
+
|
|
37
47
|
disenador-api:
|
|
38
48
|
activo: true
|
|
39
49
|
modelo: sonnet # Recomendado: sonnet (contratos estructurados)
|
|
@@ -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.
|