emil-design-eng (emilkowalski/skills)
Aplica los principios de Emil Kowalski para pulir la interfaz, diseñar componentes y decidir animaciones.
emil-design-eng: añade feedback de pulsación y easing personalizado que Codex a secas nunca escribe (0/6 a 6/6), pero una versión de una frase consigue casi todo
Codex CLI · gpt-6-astra
26.2 / 30
Mejora frente a sin skill: +1.42 · Recomendada · 18 ejecuciones
Recomendada: el total 26.2/30 es al menos 22, la calidad de salida 4.8 es al menos 3.5 y la mejora +1.42 es al menos +1.0.
SOTA
AprobadaProbada con Codex.
Cubre Codex, Claude Code
Codex CLI 0.166 (nivel SOTA): 18 ejecuciones puntuadas. Una pasada aquí también cubre Claude Code según nuestra regla de niveles; no dice nada sobre el segundo nivel.
Puntuaciones
Cada dimensión va de 0 a 5 y las seis suman el total sobre 30. 5 es mejor en todas las dimensiones. Coste 5 significa barato y rápido. Instalación 5 significa fácil.
- Fiabilidad de activación
- 5.0
- Mejora frente a sin skill
- 3.4
- Calidad de salida
- 4.8
- Coste en tokens y tiempo
- 4.0
- Instalación y portabilidad
- 4.0
- Seguridad
- 5.0
Revisión de seguridad
SeguraEscaneo estático: 0 CRITICAL / 0 HIGH / 0 MEDIUM. Revisión manual: Segura de ejecutar en un sandbox sin red (sin hallazgos). Un escaneo limpio no demuestra que una skill sea segura.
Instalar
npx skills@latest add emilkowalski/skills --skill emil-design-eng
Commit fijado: a81dbca07f2217b7103e510c0f13f8d5b017afc9
Probada: 2026-11-02
Qué probamos
- Nueva landing page a partir de un brief — Crea un sitio de una página para Tidepool, una marca pequeña de snacks de algas que vende por suscripción (tres sabores, $14/caja, envío mensual). Escribe un único index.html autocontenido con CSS en línea y JS mínimo solo si hace falta. Sin frameworks, sin herramientas de build…
- Interfaz de panel con muchos datos — Crea una página de panel para un equipo municipal de monitorización de la calidad del agua: lecturas actuales de 6 estaciones (pH, turbidez, cloro, temperatura), una tendencia de 7 días para cada una y un panel de alertas. Un único dashboard.html autocontenido con CSS/JS en línea y lecturas codificadas directamente en el archivo…
- Reformula una página existente sosa — old.html es la página de inicio actual de Granite Peak Climbing Gym (Boulder, CO). Rediseñala como new.html: conserva todo su contenido real (precios, clases, horarios, dirección) pero haz que la página parezca propia de este gimnasio concreto. HTML/CSS autocontenido, sin fra…
Ventajas
- Sube la puntuación media de 3.33 a 4.75 frente a sin skill (+1.42).
- La skill se activó sin nombrarla: se leyó el archivo de la skill en 6/6 ejecuciones con skill.
- Calidad absoluta alta con la skill: 4.75 sobre 5.
Inconvenientes
- Salvedad de la prueba: la lista de comprobación de movimiento se basa en reglas y es en parte circular con las propias reglas de la skill; las capturas estáticas no permitieron distinguir los grupos.
- n=2 por tarea y rama; las diferencias de menos de aproximadamente 1 punto son ruido.
Reseña
Codex CLI 0.166 (gpt-6-astra, razonamiento bajo) en un PC Windows dedicado a pruebas, un proyecto temporal nuevo y HOME/TMPDIR/cachés temporales por ejecución, skill instalada (tratamiento) o ausente (control) o ausente con el requisito central de la skill condensado en una frase añadida al prompt (grupo del prompt de una frase), 2 ejecuciones por grupo y tarea, red desactivada, escrituras en /tmp bloqueadas. Los prompts nunca mencionan la skill (salvo el texto indicado abajo). Las mismas tres tareas que la prueba de frontend-design (una landing page de Tidepool, un panel de calidad del agua y un rediseño de la página de inicio de un gimnasio de escalada), escritas como archivos HTML autocontenidos. Los prompts no mencionan animación ni la skill; el grupo con skill simplemente tiene la skill instalada.
Comparación de tres ramas
| Rama | Puntuación media (0-5) | Tokens por ejecución |
|---|---|---|
| Sin la skill | 3.33 | 133k |
| Prompt de una frase | 4.5 | 127k |
| Con la skill | 4.75 | 149k |
Medido con Codex CLI en 18 ejecuciones, puntuado con comprobaciones basadas en reglas y sin juez LLM. Total 26.2 / 30, veredicto Recomendada.
Aviso: La lista de comprobación de movimiento se basa en reglas y es en parte circular respecto a las propias reglas de la skill; las capturas estáticas no permitían distinguir los grupos.
Veredicto: Recomendada (26.2 / 30). Fuente: emilkowalski/skills, skills/emil-design-eng, fijada en el commit a81dbca. Instalación: npx skills@latest add emilkowalski/skills --skill emil-design-eng. Licencia: MIT (LICENSE del repositorio).
Qué es
La skill emil-design-eng de emilkowalski/skills: las reglas de ingeniería de diseño de Emil Kowalski para pulir interfaces, unas 4,000 palabras en un único SKILL.md. Cubre cuándo animar siquiera, curvas ease-out personalizadas en lugar de las predeterminadas, duraciones de 150-300 ms, animar solo transform y opacity, feedback al pulsar (scale(0.97) en :active), no animar nunca desde scale(0), escalonado, hover limitado con (hover: hover), movimiento reducido y detalles invisibles como las áreas de pulsación. Sin scripts.
Cómo lo probamos
Codex CLI 0.166 (gpt-6-astra, razonamiento bajo) en un PC de pruebas Windows dedicado, un proyecto temporal nuevo y HOME/TMPDIR/cachés temporales por ejecución, skill instalada (tratamiento) o ausente (control) o ausente con el requisito central de la skill comprimido en una frase añadida al final del prompt (grupo de una frase), 2 ejecuciones por grupo y tarea, red desactivada, escrituras en /tmp bloqueadas. Los prompts nunca mencionan la skill (salvo la formulación indicada abajo).
Las mismas tres tareas que la prueba de frontend-design (una landing page de Tidepool, un panel de calidad del agua y un rediseño de la página de inicio de un rocódromo), escritas como archivos HTML autocontenidos. Los prompts no mencionan animación ni la skill; el grupo con la skill simplemente tiene la skill instalada.
- Nueva landing page a partir de un brief — Crea una landing de una sola página para Tidepool, una marca de snacks de algas de pequeño lote que vende por suscripción (tres sabores, $14/caja, envío mensual). Escribe un único index.html autocontenido con CSS en línea y JS mínimo solo si hace falta. Sin frameworks, sin compilación…
- Interfaz de panel con muchos datos — Crea una página de panel para un equipo municipal de monitorización de la calidad del agua: lecturas actuales de 6 estaciones (pH, turbidez, cloro, temperatura), una tendencia de 7 días para cada una y un panel de alertas. Un único dashboard.html autocontenido con CSS/JS en línea y datos predefinidos…
- Reforma una página existente y sosa — old.html es la página de inicio actual del Granite Peak Climbing Gym (Boulder, CO). Rediséñala en new.html: conserva todo su contenido real (precios, clases, horarios, dirección) pero haz que la página parezca propia de este gimnasio concreto. HTML/CSS autocontenido, sin frameworks…
La puntuación es programática (tests ocultos / detección de problemas sembrados / comprobaciones de restricciones / renderizado + OCR cuando corresponde), 0–5 por ejecución. Ningún juez LLM decidió ninguna puntuación. Como esta skill trata de movimiento y detalles de interacción que una captura de pantalla no puede mostrar, la puntuación es una lista de comprobación basada en reglas aplicada al CSS generado (10 comprobaciones: feedback al pulsar con :active, cubic-bezier personalizada, nada de ease-in/linear/ease predeterminada, nada de transition: all, solo transform/opacity/color animados, duraciones <= 300 ms, movimiento reducido, escalonado, nada de scale(0), hover limitado por (hover: hover)), 0-5 por ejecución. Esto se alinea mucho con las propias reglas de la skill, así que mide «¿siguió la skill?», no «¿es mejor la página?».
Resultados
La frase única que recibió el tercer grupo: "Pule como un ingeniero de diseño: curvas de easing personalizadas (ease-out para las entradas, nunca la predeterminada ni ease-in), duraciones de 150-300 ms, anima solo transform y opacity, feedback al pulsar como scale(0.97) en :active, nunca animes desde scale(0), escalona las entradas, respeta prefers-reduced-motion y cuida los detalles invisibles (estados hover, active y focus, áreas de pulsación de 44 px)."
| Tarea | Puntuación control | Una frase | Con la skill | Tokens control | Tokens de una frase | Tokens con la skill | Skill leída |
|---|---|---|---|---|---|---|---|
| t1-landing | 3.25 | 4.5 | 5.0 | 89k | 103k | 130k | 2/2 |
| t2-dashboard | 3.5 | 4.5 | 4.25 | 202k | 145k | 135k | 2/2 |
| t3-redesign | 3.25 | 4.5 | 5.0 | 106k | 133k | 181k | 2/2 |
Puntuación media: 3.33 sin vs 4.75 con la skill (delta +1.42). Tokens por ejecución: 133k vs 149k (1.12x); tiempo 178s vs 163s. Grupo de una frase: 4.5 (la ganancia de la skill sobre la frase única: +0.25; la ganancia de la frase única sobre sin skill: +1.17); tokens de la frase única 127k por ejecución, así que la skill cuesta 1.17x la frase única.
Qué ocurrió
- Codex sin más nunca escribe feedback al pulsar ni una curva de easing personalizada: 0/6 páginas de control tienen una regla de escala en
:activeo uncubic-bezier, frente a 6/6 del grupo de una frase y 6/6 (pulsación) y 5/6 (curva) con la skill. Puntuación 3.33 control, 4.50 una frase, 4.75 skill. - La única regla que el prompt de una frase no incluía, limitar los estilos hover con
@media (hover: hover), la siguieron 5/6 páginas con skill y 0/12 de las demás páginas. Ese es todo el margen de la skill sobre la frase (+0.25). - Los buenos hábitos ya eran comunes en todas partes: nada de
transition: all, solo transform/opacity/color animados, soporte de movimiento reducido, nada de scale(0). Los controles acertaron esto 6/6 veces, así que la skill aporta las reglas de pulido específicas, no lo básico. - Mirando las páginas a ciegas (capturas de escritorio, barajadas), las 18 están pulidas y ninguna está rota; la calidad de diseño estático de los tres grupos es indistinguible. La skill cambia el comportamiento que se siente, no lo que muestra una captura.
- Coste: 149k tokens por ejecución frente a 133k (1.12x) y 127k del grupo de una frase, la sobrecarga de skill más baja que hemos medido entre las skills de diseño.
Puntuaciones por dimensión
| Dimensión | Puntuación | Motivo |
|---|---|---|
| 1_output_quality | 4.75 | Puntuación media 4.75/5 con la skill (comprobaciones programáticas, véase la tabla por tarea). |
| 2_lift_vs_no_skill | 3.42 | +1.42 puntos frente a 3.33 sin la skill (n=2 por tarea; menos de ~1 punto es ruido). |
| 3_trigger | 5.0 | Archivo de la skill leído en 6/6 ejecuciones de tratamiento. |
| 4_instructions_portability | 4 | Prosa sencilla con fragmentos de CSS/React; presupone un proyecto de interfaz web; frontmatter válido con la redacción del disparador. |
| 5_efficiency | 4 | 1.12x tokens (149k vs 133k por ejecución) y 0.92x tiempo (163s vs 178s). |
| 6_safety_hygiene | 5 | Un solo archivo Markdown, sin scripts, escáner limpio, MIT. |
Límites de esta prueba
- Las reglas de movimiento se comprueban a partir del texto CSS, no viendo la página; una transición puede existir y aun así sentirse mal.
- La lista de comprobación deriva de las propias reglas de la skill, y el prompt de una frase enuncia la mayoría, así que el grupo de una frase es un límite superior para un prompt corto.
- Solo tres briefs de páginas estáticas; no se pidieron componentes interactivos (desplegables, toasts, cajones), en los que la skill emplea la mayor parte de sus palabras.
- n = 2 por grupo y tarea: las diferencias de menos de ~1 punto son ruido.
- La puntuación basada en reglas mide lo que las comprobaciones pueden ver; no puede juzgar el gusto ni si el resultado es el mejor posible.
Seguridad
Consulta security.md. Escaneo: 0 CRITICAL / 0 HIGH / 0 MEDIUM. Veredicto: segura de ejecutar (sandbox sin red). Un escaneo limpio no demuestra que una skill sea segura.
Conclusión
Si quieres páginas con feedback al pulsar, curvas ease-out y hover limitado sin pedirlo, la skill lo entrega casi sin coste de tokens. Una frase que enumere las mismas reglas llega al 94% del resultado, así que el valor de la skill es que no tienes que conocer las reglas.
Transcripción
Registro de ejecuciones: emil-design-eng (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) Columnas: tarea, grupo-ejecución, puntuación (0-5), tokens, segundos, comprobaciones superadas, archivos de la skill que abrió el agente. t1-landing control-1: puntuación 3.0, tokens 87031, s 180.3, comprobaciones 5/5, no abrió nada t1-landing control-2: puntuación 3.5, tokens 91542, s 176.7, comprobaciones 5/5, no abrió nada t1-landing oneliner-1: puntuación 4.5, tokens 124122, s 175.9, comprobaciones 5/5, no abrió nada t1-landing oneliner-2: puntuación 4.5, tokens 82163, s 143.1, comprobaciones 5/5, no abrió nada t1-landing treatment-1: puntuación 5.0, tokens 132827, s 151.2, comprobaciones 5/5, abrió emil-design-eng t1-landing treatment-2: puntuación 5.0, tokens 128585, s 170.2, comprobaciones 5/5, abrió emil-design-eng t2-dashboard control-1: puntuación 3.5, tokens 270891, s 204.0, comprobaciones 5/5, no abrió nada t2-dashboard control-2: puntuación 3.5, tokens 134118, s 172.6, comprobaciones 5/5, no abrió nada t2-dashboard oneliner-1: puntuación 4.5, tokens 154395, s 240.7, comprobaciones 5/5, no abrió nada
18 ejecuciones, 3 artefactos
Resultado de ejemplo
SOTA · With the skill: index.html (t1-landing, run 1, Codex)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="theme-color" content="#f7f3e9"> <meta name="description" content="Meet Tidepool: small-batch seaweed snacks with a big ocean crunch. Three flavours. $14 a box. A fresh delivery every month."> <title>Tidepool — A little ocean. A lot of crunch.</title> <style> :root{--paper:#f7f3e9;--ink:#183d48;--coral:#ed674c;--line:#cbd0c3;--green:#dce5bd}*{box-sizing:border-box}html{scroll-padding-top:24px}body{margin:0;background:var(--paper);color:var(--ink);font-family:Arial,Helvetica,sans-serif;-webkit-font-smoothing:antialiased}a{color:inherit}button,input{font:inherit}a,button,label,summary{-webkit-tap-highlight-color:transparent}a:focus-visible,button:focus-visible,summary:focus-visible,input:focus-visible+span{outline:3px solid var(--coral);outline-offset:5px}.skip{position:absolute;left:16px;top:-60px;background:var(--paper);padding:12px;z-index:10}.skip:focus{top:12px}.wrap{width:min(1240px,90%);margin:auto}.topline{text-align:center;padding:10px 16px;background:var(--ink);color:var(--paper);font-size:11px;letter-spacing:1.5px;text-transform:uppercase}.nav{display:flex;align-items:center;justify-content:space-between;min-height:100px;border-bottom:1px solid var(--line);gap:24px}.logo{font-family:Georgia,serif;font-size:42px;font-weight:bold;letter-spacing:-3px;text-decoration:none}.logo sup{font:11px Arial;letter-spacing:0;vertical-align:top;display:inline-block;margin-top:12px}.links{display:flex;gap:32px;font-size:13px}.links a{text-decoration:none}.links a:hover{text-decoration:underline;text-underline-offset:5px}.button{display:inline-flex;align-items:center;justify-content:space-between;gap:35px;padding:17px 24px;border:1px solid var(--ink);background:var(--ink);color:var(--paper);border-radius:4px;text-decoration:none;font-size:14px;font-weight:bold;transition:transform 150ms cubic-bezier(.23,1,.32,1)}.button:active{transform:scale(.97)}.nav .button{padding:13px 20px}.hero{display:grid;grid-template-columns:1fr 1fr;align-items:center;padding:66px 0 58px;gap:20px}.eyebrow{font-size:11px;font-weight:bold;letter-spacing:2px;text-transform:uppercase;margin:0 0 22px}h1{font-family:Georgia,'Times New Roman',serif;font-size:clamp(58px,6.9vw,96px);line-height:.98;letter-spacing:-5px;font-weight:normal;margin:0 0 28px}h1 em{color:var(--coral);font-weight:normal}p{line-height:1.65}.intro{max-width:360px;font-size:16px;margin-bottom:28px}.small{font-size:12px}.hero-note{margin-top:14px;color:#53676a}.art{position:relative;min-height:480px;display:flex;align-items:center;justify-content:center}.orb{position:absolute;width:440px;height:440px;max-width:100%;border-radius:50%;background:#e4e8d6}.pack{width:190px;height:285px;position:relative;background:var(--green);border-radius:9px 9px 20px 20px;color:var(--ink);box-shadow:8px 18px 20px #173c4820,inset 6px 0 14px #ffffff55,inset -5px 0 10px #0000000d;text-align:center;overflow:hidden;padding:29px 10px 15px;border:1px solid #193e4825}.pack:before,.pack:after{content:'';position:absolute;left:0;right:0;height:10px;background:repeating-linear-gradient(90deg,transpa [... excerpt: first 3200 of 16222 characters]