animate (emilkowalski/skills)
목적, 속성, 곡선, 시간, 중단, 종료 방식을 순서대로 정하며 애니메이션을 처음부터 구현합니다.
animate: Codex가 생성한 UI 애니메이션이 디자인 엔지니어의 모션 규칙을 따르도록 만들지만(대조군 3.7, 스킬 사용군 4.4, 한 문장 프롬프트군 5.0) 토큰을 1.7배 사용합니다. 같은 규칙을 한 문장으로 적은 프롬프트가 더 좋은 결과를 더 적은 비용으로 냅니다.
Codex CLI · gpt-6-astra
22.0 / 30
스킬 없이 대비 향상폭: +0.64 · 상황에 따라 · 18회 실행
상황에 따라: 향상폭 +0.64가 +1.0 미만. 추천이 되려면 총점 22/30, 출력 품질 3.5, 향상폭 +1.0이 필요합니다.
SOTA
통과Codex로 테스트
커버 대상 Codex, Claude Code
Codex CLI 0.166 (SOTA 티어): 채점된 실행 18회. 여기서 통과하면 티어 규칙에 따라 Claude Code도 커버되지만, 두 번째 티어에 대해서는 아무것도 말해주지 않습니다.
점수
각 차원은 0~5점이며 여섯 차원을 더하면 30점 만점의 총점이 됩니다. 모든 차원에서 5가 가장 좋습니다. 비용 5는 저렴하고 빠름, 설치 5는 쉬움을 뜻합니다.
- 트리거 신뢰도
- 5.0
- 스킬 없이 대비 향상폭
- 2.6
- 출력 품질
- 4.4
- 토큰 및 시간 비용
- 2.0
- 설치 및 이식성
- 4.0
- 안전성
- 4.0
보안 리뷰
안전정적 스캔: CRITICAL 0 / HIGH 0 / MEDIUM 0. 수동 검토: 네트워크가 차단된 샌드박스에서 실행 안전(발견 사항 없음). 스캔이 깨끗하다고 해서 스킬이 안전하다는 증거는 아닙니다.
설치
npx skills@latest add emilkowalski/skills --skill animate
고정 커밋: a81dbca07f2217b7103e510c0f13f8d5b017afc9
테스트일: 2026-11-02
테스트한 과제
- 애니메이션 드롭다운 메뉴 — menu.html을 만드세요: 5개 항목이 있는 드롭다운 메뉴를 여는 버튼이며, 열기와 닫기 애니메이션이 있어야 합니다. 자체 완결형 HTML 파일 하나로 작성하세요(인라인 CSS와 JS, 라이브러리 없음).
- 애니메이션 모달 대화상자 — modal.html을 만드세요: 어두운 배경과 함께 모달 대화상자를 여는 버튼이며, 열기와 닫기 애니메이션이 있어야 합니다. 자체 완결형 HTML 파일 하나로 작성하세요(인라인 CSS와 JS, 라이브러리 없음).
- 토스트 알림 — toasts.html을 만드세요: 각각 토스트 알림을 표시하는 버튼 세 개가 있고, 토스트는 쌓였다가 스스로 사라지며, 등장과 퇴장 애니메이션이 있어야 합니다. 자체 완결형 HTML 파일 하나로 작성하세요(인라인 CSS와 JS, 라이브러리 없음).
장점
- 스킬 없이보다 평균 점수를 3.71에서 4.36으로 끌어올렸습니다(+0.64).
- 스킬 이름을 언급하지 않았는데도 적용되었습니다. 스킬 사용군 실행 6/6회에서 스킬 파일을 읽었습니다.
단점
- 한 문장 프롬프트는 5.0점, 스킬 사용은 4.36점(-0.64).
- 스킬 없이보다 토큰을 1.68배 사용합니다.
- 과제·그룹당 n=2이며, 약 1점 미만의 차이는 노이즈입니다.
리뷰
Codex CLI 0.166 (gpt-6-astra, low reasoning)을 전용 Windows 테스트 PC에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬 설치(스킬 사용군), 미설치(대조군), 미설치 상태에서 스킬의 핵심 요구사항만 한 문장으로 압축해 프롬프트에 덧붙인 경우(한 문장 프롬프트군)로 나눴으며, 과제·그룹당 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 언급하지 않았습니다(아래에 적은 경우 제외). 세 가지 빌드 과제를 사용했으며, 각 과제는 인라인 CSS와 JS를 포함한 자체 완결형 HTML 파일 하나를 작성하는 것입니다. 드롭다운 메뉴, 어두운 배경의 모달, 쌓이는 토스트이며, 모두 열기/닫기 또는 등장/퇴장 애니메이션이 있습니다. 프롬프트에는 모션 규칙을 언급하지 않았습니다. 한 문장 프롬프트군은 규칙을 한 문장으로 나열합니다.
3개 그룹 비교
| 그룹 | 평균 점수 (0-5) | 실행당 토큰 |
|---|---|---|
| 스킬 없음 | 3.71 | 78k |
| 한 문장 프롬프트 | 5.0 | 105k |
| 스킬 사용 | 4.36 | 132k |
Codex CLI에서 18회 실행해 측정했고, LLM 심사 없이 규칙 기반 검사로 채점했습니다. 총점 22.0 / 30, 판정 상황에 따라.
판정: 상황에 따라 다름 (22.0 / 30). 출처: emilkowalski/skills, skills/animate, 커밋 a81dbca에 고정. 설치: npx skills@latest add emilkowalski/skills --skill animate. 라이선스: MIT (저장소 LICENSE).
어떤 스킬인가
animate 스킬(emilkowalski/skills)은 UI 애니메이션을 만들 때 따르는 모션 규칙을 담고 있습니다. 목적이 있는 곳에만 애니메이션을 적용하고, 사용자 정의 ease-out 큐빅 베지어를 쓰며(절대 ease-in이나 기본값은 쓰지 않음), 150-300 ms, transform과 opacity만 사용하고, 눌림 피드백은 scale(0.97)로 주고, scale(0)에서 시작하지 않으며, 등장은 스태거로, 전환은 중단 가능하게, prefers-reduced-motion을 존중하고, hover는 (hover: hover)로 제한합니다.
테스트 방법
Codex CLI 0.166(gpt-6-astra, 낮은 추론)을 전용 Windows 테스트 PC에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬을 설치한 경우(스킬 사용군), 설치하지 않은 경우(대조군), 스킬의 핵심 요구사항을 한 문장으로 압축해 프롬프트 끝에 붙인 경우(한 문장 프롬프트군)로 나눴고, 작업마다 각 군 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 전혀 언급하지 않았습니다(아래에 적은 표현은 예외).
빌드 작업은 세 가지로, 각각 인라인 CSS와 JS를 넣은 단일 HTML 파일을 만드는 과제입니다. 드롭다운 메뉴, 어두운 배경을 깐 모달, 겹쳐 쌓이는 토스트이며, 모두 열기/닫기 또는 등장/퇴장 애니메이션이 필요합니다. 프롬프트에는 모션 규칙이 없습니다. 한 문장 프롬프트는 그 규칙을 한 문장으로 나열합니다.
- 애니메이션 드롭다운 메뉴 — menu.html을 만드세요: 버튼을 누르면 5개 항목이 있는 드롭다운 메뉴가 열리고, 열기와 닫기 애니메이션이 있어야 합니다. 인라인 CSS와 JS만 사용하는 단일 HTML 파일로 작성하세요(라이브러리 사용 금지).
- 애니메이션 모달 대화상자 — modal.html을 만드세요: 버튼을 누르면 어두운 배경을 깐 모달 대화상자가 열리고, 열기와 닫기 애니메이션이 있어야 합니다. 인라인 CSS와 JS만 사용하는 단일 HTML 파일로 작성하세요(라이브러리 사용 금지).
- 토스트 알림 — toasts.html을 만드세요: 버튼 세 개가 각각 토스트 알림을 띄우고, 토스트는 겹쳐 쌓였다가 스스로 사라지며, 등장과 퇴장 애니메이션이 있어야 합니다. 인라인 CSS와 JS만 사용하는 단일 HTML 파일로 작성하세요(라이브러리 사용 금지).
채점은 프로그램 방식(숨은 테스트, 심어 둔 문제 탐지, 제약 조건 검사, 해당되는 경우 렌더링+OCR)으로 실행당 0~5점입니다. 점수를 결정한 LLM 심사자는 없습니다.
결과
세 번째 군에 전달한 한 문장 프롬프트: "디자인 엔지니어처럼 애니메이션을 만드세요. 목적이 있는 것만 애니메이션하고, 사용자 정의 ease-out 큐빅 베지어를 쓰며(절대 ease-in이나 기본값은 쓰지 않음), 150-300 ms, transform과 opacity만 사용하고, 눌림 피드백은 scale(0.97), scale(0)에서 시작하지 말고, 등장은 스태거로, 전환은 중단 가능하게, prefers-reduced-motion을 존중하고 hover는 (hover: hover)로 제한하세요."
| 작업 | 대조군 점수 | 한 문장 프롬프트 | 스킬 사용 | 대조군 토큰 | 한 문장 프롬프트 토큰 | 스킬 사용 토큰 | 스킬 읽음 |
|---|---|---|---|---|---|---|---|
| t1-dropdown | 3.5 | 5.0 | 4.14 | 81k | 100k | 163k | 2/2 |
| t2-modal | 3.5 | 5.0 | 4.57 | 61k | 100k | 110k | 2/2 |
| t3-toasts | 4.14 | 5.0 | 4.36 | 93k | 114k | 121k | 2/2 |
평균 점수: 스킬 없이 3.71, 스킬 사용 시 4.36(델타 +0.64). 실행당 토큰: 78k 대 132k(1.68배), 시간 82초 대 81초. 한 문장 프롬프트군: 5.0(한 문장 프롬프트 대비 스킬의 이득: -0.64, 스킬 없는 경우 대비 한 문장 프롬프트의 이득: +1.29). 한 문장 프롬프트는 실행당 105k 토큰을 쓰므로, 스킬은 한 문장 프롬프트의 1.25배 비용입니다.
실제로 있었던 일
- 대조군 3.71, 스킬 4.36, 한 문장 프롬프트 5.0(각 n=6). 규칙 기반 모션 검사는 페이지가 10개 규칙 중 몇 개를 따르는지 셉니다. 대조군은 10개 중 6〜8개, 스킬은 8〜9개에 도달했고, 한 문장 프롬프트는 6회 실행 모두에서 모든 검사를 통과했습니다.
- 대조군이 가장 자주 놓친 규칙은 눌림 피드백(:active scale)으로 6회 중 3회에서 빠졌고, 일부 실행에서는 스태거 등장과 비기본 이징도 빠졌습니다. 스킬도 2회 실행에서 눌림 피드백을 놓쳤고 여러 실행에서 스태거 등장이나 이징을 놓쳤습니다. 토스트 작업에서는 점수가 4.14와 4.57로, 대조군 4.14와 비슷했습니다.
- 토큰: 스킬 132k, 한 문장 프롬프트 105k, 대조군 78k(실행당). 대조군의 1.7배, 한 문장 프롬프트의 1.3배입니다. 스킬은 스킬 사용군 6/6 실행에서 읽혔고, 명령을 더 많이 씁니다(실행당 9.3회 대 4.7회).
- 스킬 사용군은 실행마다 작업 폴더에 스킬 사본을 포함해 약 3개의 파일을 추가로 만듭니다.
항목별 점수
| 항목 | 점수 | 이유 |
|---|---|---|
| 1_output_quality | 4.36 | 스킬 사용 시 평균 4.36/5점(프로그램 검사, 작업별 표 참조). |
| 2_lift_vs_no_skill | 2.64 | 스킬 없이 3.71점 대비 +0.64점(작업당 n=2, 약 1점 미만의 차이는 노이즈). |
| 3_trigger | 5.0 | 스킬 사용군 6/6 실행에서 스킬 파일이 읽힘. |
| 4_instructions_portability | 4 | SKILL.md 규칙과 참고 텍스트. |
| 5_efficiency | 2 | 토큰 1.68배(실행당 132k 대 78k), 시간 0.99배(81초 대 82초). |
| 6_safety_hygiene | 4 | 산문만 포함. security.md 참조. |
이 테스트의 한계
- HTML 파일 하나의 코드 텍스트를 대상으로 한 규칙 기반 검사입니다. 애니메이션을 브라우저에서 렌더링하거나 시간을 재지 않았으므로 부드러움과 시각적 품질은 평가하지 않았습니다.
- 한 문장 프롬프트는 스킬 자체 체크리스트를 거의 그대로 옮긴 것이고, 검사도 같은 규칙 목록을 따릅니다.
- 셀당 n=2.
- 작업·군당 n = 2: 약 1점 미만의 차이는 노이즈입니다.
- 규칙 기반 채점은 검사가 볼 수 있는 것만 측정합니다. 취향이나 결과가 최선인지는 판단할 수 없습니다.
보안
security.md를 참조하세요. 스캔: CRITICAL 0 / HIGH 0 / MEDIUM 0. 판정: 실행해도 안전(네트워크 비활성 샌드박스). 깨끗한 스캔 결과가 스킬의 안전성을 증명하지는 않습니다.
결론
이 스킬은 아무 안내도 없을 때보다 모션 규칙 준수를 개선하지만, 같은 규칙을 한 문장으로 주면 더 적은 토큰으로 완벽한 점수를 얻습니다. 따라서 이득은 맨 프롬프트에 비할 때만 있습니다.
트랜스크립트
실행 로그: animate (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) 열: 작업, 그룹-회차, 점수(0-5), 토큰, 초, 통과한 검사, 에이전트가 연 스킬 파일. t1-dropdown control-1: 점수 3.71, 토큰 52757, 초 64.6, 검사 1/2, 연 파일 없음 t1-dropdown control-2: 점수 3.29, 토큰 109744, 초 78.3, 검사 1/2, 연 파일 없음 t1-dropdown oneliner-1: 점수 5.0, 토큰 90139, 초 90.1, 검사 2/2, 연 파일 없음 t1-dropdown oneliner-2: 점수 5.0, 토큰 110798, 초 84.6, 검사 2/2, 연 파일 없음 t1-dropdown treatment-1: 점수 4.14, 토큰 162460, 초 70.2, 검사 2/2, 연 파일 animate t1-dropdown treatment-2: 점수 4.14, 토큰 165193, 초 85.1, 검사 2/2, 연 파일 animate t2-modal control-1: 점수 3.71, 토큰 69259, 초 69.5, 검사 1/2, 연 파일 없음 t2-modal control-2: 점수 3.29, 토큰 52805, 초 73.9, 검사 1/2, 연 파일 없음 t2-modal oneliner-1: 점수 5.0, 토큰 110675, 초 103.1, 검사 2/2, 연 파일 없음
18회 실행, 아티팩트 3개
샘플 출력
SOTA · With the skill: menu.html (t1-dropdown, run 1, Codex)
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Workspace menu</title> <style> :root { font-family: system-ui, sans-serif; color: #252c39; background: #f4f5f7; --ease-out: cubic-bezier(0.23, 1, 0.32, 1); } * { box-sizing: border-box; } body { margin: 0; min-height: 100svh; display: grid; place-items: center; padding: 24px; } main { width: min(100%, 400px); min-height: 440px; } .eyebrow { color: #687183; font-size: 11px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase; } h1 { margin: 12px 0 8px; font-size: 30px; letter-spacing: -.04em; } .description { margin: 0 0 28px; color: #687183; font-size: 14px; line-height: 1.6; } .dropdown { position: relative; width: min(100%, 280px); } button { font: inherit; cursor: pointer; } .trigger { display: flex; align-items: center; justify-content: space-between; gap: 32px; border: 1px solid #303a4e; border-radius: 12px; background: #293448; color: white; padding: 14px 18px; font-size: 14px; font-weight: 600; box-shadow: 0 3px 5px #20293b15; } .chevron { width: 16px; height: 16px; transition: transform 200ms var(--ease-out); } [aria-expanded="true"] .chevron { transform: rotate(180deg); } .menu { position: absolute; top: calc(100% + 10px); left: 0; width: 100%; padding: 6px; border: 1px solid #e1e4eb; border-radius: 14px; background: white; box-shadow: 0 16px 36px -12px #27324a30, 0 3px 8px #27324a08; opacity: 0; transform: scale(.95); transform-origin: top left; pointer-events: none; transition: opacity 200ms var(--ease-out), transform 200ms var(--ease-out); } .dropdown.open .menu { opacity: 1; transform: scale(1); pointer-events: auto; } .item { width: 100%; display: flex; align-items: center; gap: 12px; border: 0; border-radius: 8px; background: transparent; color: #394256; padding: 12px; text-align: left; font-size: 14px; } .icon { width: 20px; text-align: center; color: #738098; font-size: 18px; line-height: 1; } .item:last-child { margin-top: 5px; border-top: 1px solid #edf0f5; border-radius: 0 0 8px 8px; } button:focus-visible { outline: 2px solid #657cf0; outline-offset: 3px; } .item:focus-visible { outline-offset: -2px; background: #f0f3fa; } @media (hover: hover) and (pointer: fine) { .trigger:hover { background: #36435b; } .item:hover { background: #f0f3fa; } } .dropdown.instant .menu, .dropdown.instant .chevron { transition: none; } @media (prefers-reduced-motion: reduce) { .menu, .dropdown.open .menu { transform: none; } .chevron { transition: none; } } .status { margin-top: 300px; font-size: 13px; color: #687183; min-height: 20px; } </style> </head> <body> <main> <div class="eyebrow">Your workspace</div> <h1>A little room for everything.</h1> <p class="description">Your everyday essentials, one click away.</p> <div class="dropdown" id="dropdown"> <button class="trigger" id="trigger" type="button" aria-haspopup="menu" aria-expanded="false" aria-controls="menu"> Workspace <svg class="chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-wid [... excerpt: first 3200 of 7249 characters]