모든 스킬

emil-design-eng (emilkowalski/skills)

Emil Kowalski의 원칙에 따라 UI 다듬기, 컴포넌트 설계, 애니메이션 결정을 안내합니다.

emil-design-eng: 스킬 없는 Codex가 전혀 쓰지 않던 눌림 피드백과 커스텀 이징을 추가하지만(0/6에서 6/6), 한 문장 버전이 거의 다 해냅니다

추천안전

Codex CLI · gpt-6-astra

26.2 / 30

스킬 없이 대비 향상폭: +1.42 · 추천 · 18회 실행

추천: 총점 26.2/30이 22점 이상, 출력 품질 4.8가 3.5 이상, 향상폭 +1.42가 +1.0 이상입니다.

SOTA

통과

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

보안 리뷰

안전

정적 스캔: CRITICAL 0 / HIGH 0 / MEDIUM 0. 수동 검토: 네트워크가 차단된 샌드박스에서 실행 안전(발견 사항 없음). 스캔이 깨끗하다고 해서 스킬이 안전하다는 증거는 아닙니다.

설치

npx skills@latest add emilkowalski/skills --skill emil-design-eng

출처

고정 커밋: a81dbca07f2217b7103e510c0f13f8d5b017afc9

테스트일: 2026-11-02

테스트한 과제

  • 브리프로 새 랜딩 페이지 만들기 — 정기 구독으로 판매하는 소규모 해조 스낵 브랜드 Tidepool의 한 페이지짜리 랜딩 사이트를 만드세요(세 가지 맛, 상자당 $14, 매월 배송). 인라인 CSS를 넣은 단일 index.html 파일로 작성하고, 꼭 필요할 때만 최소한의 JS를 쓰세요. 프레임워크와 빌드 단계는 쓰지 않습니다…
  • 데이터 밀도 높은 대시보드 UI — 지방자치단체 수질 모니터링 팀을 위한 대시보드 페이지를 만드세요: 6개 관측소의 현재 수치(pH, 탁도, 염소, 수온), 관측소별 7일 추이, 경보 패널이 필요합니다. 인라인 CSS/JS와 하드코딩된 데이터를 넣은 단일 dashboard.html 파일로 작성하세요…
  • 밋밋한 기존 페이지 재디자인 — old.html은 Granite Peak Climbing Gym(콜로라도 볼더)의 현재 홈페이지입니다. 이를 new.html로 리디자인하세요: 실제 콘텐츠(가격, 수업, 운영 시간, 주소)는 모두 유지하되, 이 클라이밍 짐의 페이지처럼 보이게 만드세요. 외부 의존성 없는 HTML/CSS로, 프레임워크 없이…

장점

  • 스킬 없이보다 평균 점수를 3.33에서 4.75로 끌어올렸습니다(+1.42).
  • 스킬 이름을 언급하지 않았는데도 적용되었습니다. 스킬 사용군 실행 6/6회에서 스킬 파일을 읽었습니다.
  • 스킬 사용 시 높은 절대 품질: 4.75/5.

단점

  • 테스트 참고: 모션 체크리스트는 규칙 기반이고 스킬 자체 규칙과 부분적으로 순환 논리입니다. 정적 스크린샷으로는 그룹을 구분할 수 없었습니다.
  • 과제·그룹당 n=2이며, 약 1점 미만의 차이는 노이즈입니다.

리뷰

Codex CLI 0.166 (gpt-6-astra, low reasoning)을 전용 Windows 테스트 PC에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬 설치(스킬 사용군), 미설치(대조군), 미설치 상태에서 스킬의 핵심 요구사항만 한 문장으로 압축해 프롬프트에 덧붙인 경우(한 문장 프롬프트군)로 나눴으며, 과제·그룹당 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 언급하지 않았습니다(아래에 적은 경우 제외). frontend-design 테스트와 같은 세 가지 브리프를 썼습니다(Tidepool 랜딩 페이지, 수질 대시보드, 클라이밍 짐 홈페이지 리디자인). 각각 외부 의존성 없는 HTML 파일 하나로 작성했습니다. 프롬프트에는 애니메이션이나 스킬을 언급하지 않았고, 스킬 사용군은 그저 스킬이 설치된 상태였습니다.

3개 그룹 비교

그룹평균 점수 (0-5)실행당 토큰
스킬 없음3.33133k
한 문장 프롬프트4.5127k
스킬 사용4.75149k

Codex CLI에서 18회 실행해 측정했고, LLM 심사 없이 규칙 기반 검사로 채점했습니다. 총점 26.2 / 30, 판정 추천.

참고: 모션 체크리스트는 규칙 기반이며 스킬 자체 규칙과 일부 순환 관계에 있습니다. 정적 스크린샷으로는 그룹을 구분할 수 없었습니다.

판정: 추천 (26.2 / 30). 출처: emilkowalski/skills, skills/emil-design-eng, 커밋 a81dbca에 고정. 설치: npx skills@latest add emilkowalski/skills --skill emil-design-eng. 라이선스: MIT(저장소 LICENSE).

무엇인가

emilkowalski/skills의 emil-design-eng 스킬은 UI 다듬기를 위한 Emil Kowalski의 디자인 엔지니어링 규칙으로, SKILL.md 하나에 약 4,000단어 분량입니다. 언제 애니메이션을 쓸지, 기본값 대신 사용자 정의 ease-out 곡선을 쓸지, 150~300 ms 길이, transform과 opacity만 애니메이션하기, 눌림 피드백(:active에서 scale(0.97)), scale(0)에서 시작하는 애니메이션 금지, 스태거, (hover: hover)로 hover 제한, 모션 줄이기, 히트 영역처럼 눈에 보이지 않는 세부 사항을 다룹니다. 스크립트는 없습니다.

테스트 방법

전용 Windows 테스트 PC에서 Codex CLI 0.166(gpt-6-astra, 낮은 추론)을 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬을 설치한 경우(스킬 사용군), 설치하지 않은 경우(대조군), 스킬 없이 스킬의 핵심 요구사항을 한 문장으로 압축해 프롬프트 끝에 붙인 경우(한 문장 프롬프트군)로 나눴고, 작업마다 각 군 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 전혀 언급하지 않았습니다(아래에 적은 표현은 예외).

frontend-design 테스트와 같은 브리프 세 가지(Tidepool 랜딩 페이지, 수질 대시보드, 클라이밍 짐 홈페이지 재디자인)를 사용했고, 모두 자체 완결형 HTML 파일 하나로 작성했습니다. 프롬프트에는 애니메이션이나 스킬을 언급하지 않았고, 스킬 군은 그저 스킬을 설치한 상태였습니다.

  1. 브리프로 새 랜딩 페이지 만들기 — 소량 생산 김 스낵 브랜드 Tidepool의 원페이지 랜딩 사이트를 만드세요. 구독으로 판매하며(맛 3종, 상자당 $14, 매월 배송) 합니다. 인라인 CSS를 사용한 자체 완결형 index.html 하나를 작성하고, 필요한 경우에만 최소한의 JS를 쓰세요. 프레임워크와 빌드 도구는 사용하지 마세요…
  2. 데이터 밀도 높은 대시보드 UI — 지방자치단체 수질 모니터링 팀을 위한 대시보드 페이지를 만드세요. 6개 관측소의 현재 수치(pH, 탁도, 염소, 수온), 각 관측소의 7일 추세, 경보 패널이 포함되어야 합니다. 인라인 CSS/JS와 하드코딩된 판독값으로 구성된 자체 완결형 dashboard.html 하나를 작성하세요.
  3. 기존의 밋밋한 페이지 재구성 — old.html은 Granite Peak Climbing Gym(콜로라도주 볼더)의 현재 홈페이지입니다. 실제 콘텐츠(요금, 수업, 운영 시간, 주소)는 모두 유지하면서 이 특정 암장에 어울리는 페이지로 new.html을 새로 디자인하세요. 프레임워크 없이 자체 완결형 HTML/CSS로 작성하세요…

채점은 프로그램 방식(숨은 테스트, 심어 둔 문제 탐지, 제약 조건 검사, 해당되는 경우 렌더링+OCR)으로 실행당 0~5점입니다. 점수를 결정한 LLM 심사자는 없습니다. 이 스킬은 스크린샷으로 보이지 않는 모션과 상호작용 세부 사항을 다루므로, 생성된 CSS에 대해 규칙 기반 체크리스트를 실행해 채점했습니다(검사 10개: :active 눌림 피드백, 사용자 정의 cubic-bezier, ease-in/linear/기본 ease 사용 안 함, transition: all 사용 안 함, transform/opacity/색상만 애니메이션, 길이 300 ms 이하, 모션 줄이기, 스태거, scale(0) 사용 안 함, (hover: hover)로 hover 제한). 실행당 0~5점입니다. 이는 스킬 자체 규칙과 밀접하게 맞춰져 있어 '페이지가 더 나아졌는가'가 아니라 '스킬을 따랐는가'를 측정합니다.

결과

세 번째 군에 전달한 한 문장 프롬프트: "디자인 엔지니어처럼 다듬으세요. 사용자 정의 이징 곡선(등장에는 ease-out, 기본값이나 ease-in은 절대 사용 금지), 150~300 ms 길이, transform과 opacity만 애니메이션, :active에서 scale(0.97) 같은 눌림 피드백, scale(0)에서 애니메이션 시작 금지, 등장에 스태거 적용, prefers-reduced-motion 존중, 그리고 보이지 않는 세부 사항(hover, active, focus 상태, 44 px 히트 영역)까지 신경 쓰세요."

작업대조군 점수한 문장 프롬프트스킬 사용대조군 토큰한 문장 프롬프트 토큰스킬 사용 토큰스킬 읽음
t1-landing3.254.55.089k103k130k2/2
t2-dashboard3.54.54.25202k145k135k2/2
t3-redesign3.254.55.0106k133k181k2/2

평균 점수: 스킬 없음 3.33, 스킬 사용 4.75(차이 +1.42). 실행당 토큰: 133k 대 149k(1.12배), 시간: 178초 대 163초. 한 문장 프롬프트 군: 4.5(한 문장 프롬프트 대비 스킬의 이득 +0.25, 스킬 없음 대비 한 문장 프롬프트의 이득 +1.17). 한 문장 프롬프트의 실행당 토큰은 127k이므로 스킬은 한 문장 프롬프트의 1.17배 비용을 씁니다.

무슨 일이 있었나

  • 순수 Codex는 눌림 피드백이나 사용자 정의 이징 곡선을 전혀 작성하지 않았습니다. 대조군 페이지 0/6에 :active scale 규칙이나 cubic-bezier가 있었고, 한 문장 프롬프트 군은 6/6, 스킬 사용군은 눌림 6/6, 곡선 5/6이었습니다. 점수는 대조군 3.33, 한 문장 4.50, 스킬 4.75입니다.
  • 한 문장 프롬프트가 담지 못한 유일한 규칙인 @media (hover: hover)로 hover 스타일 제한은 스킬 페이지 5/6이 지켰고, 다른 페이지는 0/12였습니다. 이것이 한 문장 대비 스킬의 이점 전체(+0.25)입니다.
  • 이미 좋은 습관은 모든 곳에서 흔했습니다. transition: all 없음, transform/opacity/색상만 애니메이션, 모션 줄이기 지원, scale(0) 없음. 대조군도 6/6회 이 항목들을 지켰으므로, 스킬은 기본이 아니라 구체적인 다듬기 규칙을 더합니다.
  • 페이지를 블라인드로 살펴보면(데스크톱 스크린샷, 순서 섞음) 18장 모두 다듬어져 있고 망가진 페이지는 없습니다. 세 군의 정적 디자인 품질은 구별되지 않습니다. 스킬이 바꾸는 것은 스크린샷에 보이는 모습이 아니라 체감되는 동작입니다.
  • 비용: 실행당 149k 토큰으로 133k(1.12배)와 한 문장 프롬프트 군의 127k에 비해, 디자인 스킬 중 측정한 가장 저렴한 스킬 오버헤드입니다.

항목별 점수

항목점수근거
1. 출력 품질4.75

스킬 사용 시 평균 4.75/5(프로그램 검사, 작업별 표 참조).

2. 스킬 없음 대비 향상3.42

스킬 없음 3.33 대비 +1.42점(작업당 n=2, 약 1점 미만은 노이즈).

3. 트리거5.0스킬 사용군 6/6회 실행에서 스킬 파일을 읽었습니다.
4. 지침 이식성4

CSS/React 스니펫이 섞인 평범한 산문입니다. 웹 UI 프로젝트를 전제로 하며, 트리거 문구가 포함된 유효한 frontmatter를 갖춥니다.

5. 효율성4

토큰 1.12배(실행당 149k 대 133k), 시간 0.92배(163초 대 178초).

6. 안전성·위생5Markdown 파일 하나, 스크립트 없음, 스캐너 이상 없음, MIT.

이 테스트의 한계

  • 모션 규칙은 페이지를 보는 것이 아니라 CSS 텍스트에서 검사합니다. 전환이 존재해도 어색하게 느껴질 수 있습니다.
  • 체크리스트는 스킬 자체 규칙에서 도출했고 한 문장 프롬프트가 그 대부분을 담고 있으므로, 한 문장 프롬프트 군은 짧은 프롬프트의 상한선입니다.
  • 정적 페이지 브리프 세 개만 사용했습니다. 스킬이 가장 많은 분량을 할애하는 상호작용 컴포넌트(드롭다운, 토스트, 드로어)는 요청하지 않았습니다.
  • 작업·군당 n = 2: 약 1점 미만의 차이는 노이즈입니다.
  • 규칙 기반 채점은 검사가 볼 수 있는 것만 측정합니다. 취향이나 결과가 최선인지는 판단할 수 없습니다.

보안

security.md를 참조하세요. 스캔: CRITICAL 0 / HIGH 0 / MEDIUM 0. 판정: 실행해도 안전(네트워크 차단 샌드박스). 깨끗한 스캔 결과가 스킬의 안전성을 증명하지는 않습니다.

결론

눌림 피드백, ease-out 곡선, hover 제한을 따로 요청하지 않아도 갖춘 페이지를 원한다면, 이 스킬은 거의 추가 토큰 비용 없이 이를 제공합니다. 같은 규칙을 나열한 한 문장만으로도 94%까지 도달하므로, 스킬의 가치는 규칙을 몰라도 된다는 데 있습니다.

트랜스크립트

실행 로그: emil-design-eng (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.)
열: 작업, 그룹-회차, 점수(0-5), 토큰, 초, 통과한 검사, 에이전트가 연 스킬 파일.

t1-landing control-1: 점수 3.0, 토큰 87031, 초 180.3, 검사 5/5, 연 파일 없음
t1-landing control-2: 점수 3.5, 토큰 91542, 초 176.7, 검사 5/5, 연 파일 없음
t1-landing oneliner-1: 점수 4.5, 토큰 124122, 초 175.9, 검사 5/5, 연 파일 없음
t1-landing oneliner-2: 점수 4.5, 토큰 82163, 초 143.1, 검사 5/5, 연 파일 없음
t1-landing treatment-1: 점수 5.0, 토큰 132827, 초 151.2, 검사 5/5, 연 파일 emil-design-eng
t1-landing treatment-2: 점수 5.0, 토큰 128585, 초 170.2, 검사 5/5, 연 파일 emil-design-eng
t2-dashboard control-1: 점수 3.5, 토큰 270891, 초 204.0, 검사 5/5, 연 파일 없음
t2-dashboard control-2: 점수 3.5, 토큰 134118, 초 172.6, 검사 5/5, 연 파일 없음
t2-dashboard oneliner-1: 점수 4.5, 토큰 154395, 초 240.7, 검사 5/5, 연 파일 없음

18회 실행, 아티팩트 3개

샘플 출력

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]

Pro 보기