emil-design-eng (emilkowalski/skills)
emil-design-eng:对照组 3.33、一句话提示 4.5、装 skill 4.75(0–5 分,Codex 实测,n=2/任务/组)。结论:推荐,相对不装 skill +1.42。
26.2 / 30
相对不装 skill 的提升:+1.42
推荐:总分 26.2/30 不低于 22,产出质量 4.8 不低于 3.5,提升 +1.42 不低于 +1.0。
前沿
通过使用 Codex 测试。
覆盖 Codex, Claude Code
Codex CLI 0.166(SOTA 档):18 次评分运行。按我们的分档规则,这档通过同时覆盖 Claude Code;它不代表第二档的结果。
分数
每一维 0 到 5 分,六维相加是满分 30 的总分。每一维都是 5 更好。成本 5 表示又便宜又快。安装 5 表示容易。
- 触发可靠性
- 5.0
- 相对不装的提升
- 3.4
- 产出质量
- 4.8
- 令牌与时间成本
- 4.0
- 安装与可移植性
- 4.0
- 安全
- 5.0
安全审查
安全静态扫描:0 CRITICAL / 0 HIGH / 0 MEDIUM。人工审查:可在断网沙箱中运行。扫描没有命中不等于绝对安全。
安装
npx skills@latest add emilkowalski/skills --skill emil-design-eng
固定提交: a81dbca07f2217b7103e510c0f13f8d5b017afc9
测试日期: 2026-11-02
我们测了什么
- New landing page from a brief — Create a single-page landing site for Tidepool, a small-batch seaweed snack brand that sells by subscription (three flavours, $14/box, ships monthly). Write one self-contained index.html with inline CSS and minimal JS only if needed. No frameworks, no build st…
- Data-dense dashboard UI — Build a dashboard page for a municipal water-quality monitoring team: current readings for 6 stations (pH, turbidity, chlorine, temperature), a 7-day trend for each, and an alerts panel. Single self-contained dashboard.html with inline CSS/JS and hard-coded re…
- Reshape an existing bland page — old.html is the current homepage of Granite Peak Climbing Gym (Boulder, CO). Redesign it into new.html: keep all of its real content (pricing, classes, hours, address) but make the page look like it belongs to this specific gym. Self-contained HTML/CSS, no fra…
优点
- 平均分从不装时的 3.33 提到 4.75(+1.42)。
- 不点名也会被触发:Skill file read in 6/6 treatment runs.
- 装 skill 后绝对质量高:4.75 / 5。
缺点
- 测试说明:动效检查是基于规则的,和 skill 自带的规则有部分循环;静态截图分不出各组。
- 每个任务每组 n=2,差距在 1 分以内属于噪声。
评测
在 Codex CLI(SOTA 档)上跑 3 个任务、对照、一句话提示、装 skill 三组,共 18 次运行,由规则脚本打分(没有 LLM 评委),断网沙箱、每次运行独立临时目录。具体做法见下方英文评测原文。
三组对比
| 组别 | 平均分(0–5) | 每次 token |
|---|---|---|
| 不装 skill | 3.33 | 133k |
| 一句话提示 | 4.5 | 127k |
| 装了 skill | 4.75 | 149k |
Codex CLI 实测,18 次运行,规则脚本打分,没有 LLM 评委。总分 26.2 / 30,结论 推荐。
测试披露: 动效检查是基于规则的,和 skill 自带的规则有部分循环;静态截图分不出各组。
下面是评测原文,英文。
Verdict: Recommended (26.2 / 30). Source: emilkowalski/skills, skills/emil-design-eng, pinned at commit a81dbca. Install: npx skills@latest add emilkowalski/skills --skill emil-design-eng. Licence: MIT (repo LICENSE).
What it is
The emil-design-eng skill from emilkowalski/skills: Emil Kowalski's design-engineering rules for UI polish, about 4,000 words in one SKILL.md. It covers when to animate at all, custom ease-out curves instead of the defaults, 150-300 ms durations, animating only transform and opacity, press feedback (scale(0.97) on :active), never animating from scale(0), stagger, gating hover with (hover: hover), reduced motion and invisible details like hit targets. No scripts.
How we tested
Codex CLI 0.166 (gpt-6-astra, low reasoning) on a dedicated Windows test PC, a fresh temporary project and temporary HOME/TMPDIR/caches per run, skill installed (treatment) or absent (control) or absent with the skill's core requirement squeezed into one sentence appended to the prompt (one-liner group), 2 runs per group per task, network off, /tmp writes blocked. The prompts never mention the skill (except the wording noted below).
Same three brief as the frontend-design test (a Tidepool landing page, a water-quality dashboard, a redesign of a climbing-gym homepage), written as single self-contained HTML files. The prompts do not mention animation or the skill; the skill group simply has the skill installed.
- New landing page from a brief — Create a single-page landing site for Tidepool, a small-batch seaweed snack brand that sells by subscription (three flavours, $14/box, ships monthly). Write one self-contained index.html with inline CSS and minimal JS only if needed. No frameworks, no build st…
- Data-dense dashboard UI — Build a dashboard page for a municipal water-quality monitoring team: current readings for 6 stations (pH, turbidity, chlorine, temperature), a 7-day trend for each, and an alerts panel. Single self-contained dashboard.html with inline CSS/JS and hard-coded re…
- Reshape an existing bland page — old.html is the current homepage of Granite Peak Climbing Gym (Boulder, CO). Redesign it into new.html: keep all of its real content (pricing, classes, hours, address) but make the page look like it belongs to this specific gym. Self-contained HTML/CSS, no fra…
Scoring is programmatic (hidden tests / planted-issue recall / constraint checks / render+OCR where relevant), 0–5 per run. No LLM judge decided any score. Because this skill is about motion and interaction details that a screenshot cannot show, the score is a rule-based checklist run over the generated CSS (10 checks: :active press feedback, custom cubic-bezier, no ease-in/linear/default ease, no transition: all, only transform/opacity/colour animated, durations <= 300 ms, reduced motion, stagger, no scale(0), hover gated by (hover: hover)), 0-5 per run. This is closely aligned with the skill's own rules, so it measures 'did it follow the skill', not 'is the page better'.
Results
The one-liner given to the third group: "Polish like a design engineer: custom easing curves (ease-out for entrances, never the default or ease-in), 150-300 ms durations, animate only transform and opacity, press feedback such as scale(0.97) on :active, never animate from scale(0), stagger entrances, honour prefers-reduced-motion, and sweat the invisible details (hover, active and focus states, 44 px hit targets)."
| Task | Control score | One-liner | With skill | Control tokens | One-liner tokens | With-skill tokens | Skill read |
|---|---|---|---|---|---|---|---|
| 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 |
Mean score: 3.33 without vs 4.75 with the skill (delta +1.42). Tokens per run: 133k vs 149k (1.12x); time 178s vs 163s. One-liner group: 4.5 (the skill's gain over the one-liner: +0.25; one-liner's own gain over no skill: +1.17); one-liner tokens 127k per run, so the skill costs 1.17x the one-liner.
What happened
- Plain Codex never writes press feedback or a custom easing curve: 0/6 control pages have an
:activescale rule or acubic-bezier, against 6/6 for the one-sentence group and 6/6 (press) and 5/6 (curve) with the skill. Score 3.33 control, 4.50 one-sentence, 4.75 skill. - The only rule the one-sentence prompt did not carry, gating hover styles with
@media (hover: hover), was followed by 5/6 skill pages and 0/12 of the other pages. That is the skill's whole margin over the sentence (+0.25). - Already-good habits were common everywhere: no
transition: all, only transform/opacity/colour animated, reduced-motion support, no scale(0). Controls got these right 6/6 times, so the skill adds the specific polish rules, not the basics. - Looking at the pages blind (desktop screenshots, shuffled), all 18 are polished and none is broken; the static design quality of the three groups is indistinguishable. The skill changes behaviour you feel, not what a screenshot shows.
- Cost: 149k tokens per run against 133k (1.12x) and 127k for the one-sentence group, the cheapest skill overhead we have measured among design skills.
Dimension scores
| Dimension | Score | Why |
|---|---|---|
| 1_output_quality | 4.75 | Mean score 4.75/5 with the skill (programmatic checks, see per-task table). |
| 2_lift_vs_no_skill | 3.42 | +1.42 points vs 3.33 without the skill (n=2 per task; under ~1 point is noise). |
| 3_trigger | 5.0 | Skill file read in 6/6 treatment runs. |
| 4_instructions_portability | 4 | Plain prose with CSS/React snippets; assumes a web UI project; valid frontmatter with trigger wording. |
| 5_efficiency | 4 | 1.12x tokens (149k vs 133k per run) and 0.92x time (163s vs 178s). |
| 6_safety_hygiene | 5 | Single Markdown file, no scripts, scanner clean, MIT. |
Limits of this test
- The motion rules are checked from CSS text, not by watching the page; a transition can exist and still feel wrong.
- The checklist is derived from the skill's own rules, and the one-sentence prompt states most of them, so the one-sentence arm is an upper bound for a short prompt.
- Only three static page briefs; interactive components (dropdowns, toasts, drawers), which the skill spends most words on, were not requested.
- n = 2 per group per task: differences under about 1 point are noise.
- Rule-based scoring measures what the checks can see; it cannot judge taste or whether a result is the best possible.
Security
See security.md. Scan: 0 CRITICAL / 0 HIGH / 0 MEDIUM. Verdict: safe to run (no-network sandbox). A clean scan does not prove a skill safe.
Bottom line
If you want pages that have press feedback, ease-out curves and hover gating without asking for them, the skill delivers it at almost no token cost. A sentence that lists the same rules gets 94% of the way there, so the skill's value is that you do not have to know the rules.
记录
Run log for emil-design-eng: Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run. Columns: task, arm-run, score (0-5), tokens, seconds, checks passed, skill files the agent opened. t1-landing control-1: score 3.0, tokens 87031, secs 180.3, checks 5/5, opened nothing t1-landing control-2: score 3.5, tokens 91542, secs 176.7, checks 5/5, opened nothing t1-landing oneliner-1: score 4.5, tokens 124122, secs 175.9, checks 5/5, opened nothing t1-landing oneliner-2: score 4.5, tokens 82163, secs 143.1, checks 5/5, opened nothing t1-landing treatment-1: score 5.0, tokens 132827, secs 151.2, checks 5/5, opened emil-design-eng t1-landing treatment-2: score 5.0, tokens 128585, secs 170.2, checks 5/5, opened emil-design-eng t2-dashboard control-1: score 3.5, tokens 270891, secs 204.0, checks 5/5, opened nothing t2-dashboard control-2: score 3.5, tokens 134118, secs 172.6, checks 5/5, opened nothing t2-dashboard oneliner-1: score 4.5, tokens 154395, secs 240.7, checks 5/5, opened nothing
18 次运行、3 个产物
样例产物
前沿 · 装了 skill:index.html(t1-landing,第 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]