Skill Optimizer — 세션 복기 & 최적화 제안
Overview
현재 대화 기록을 분석하여:
- 각 단계의 실행 흐름과 소요 시간을 재구성
- 비효율 패턴(에러 재시도, 중복 호출, 직렬→병렬화 가능 등)을 탐지
- Before/After 예시와 함께 구체적인 개선안을 제안
- 관련 스킬 파일이 있다면 수정 포인트까지 제안
스킬/워크플로우 종류를 불문하고 범용적으로 사용할 수 있다.
Usage
/skill-optimizer
인자 없음. 현재 대화 기록 전체를 분석 대상으로 한다.
Critical Rules
날짜 처리 (필수)
- 현재 날짜/시간은 반드시 Bash 커맨드로 얻는다. 절대 추론하거나 추정하지 않는다.
출력 언어
- 분석 결과는 항상 한국어로 작성한다.
시간 추정 원칙
- 실측값이 있으면 실측값을 우선한다 (tool output의 duration, 타이머 결과 등).
- 실측값이 없으면 추정임을 명시한다:
~Xs (추정). - 추정 근거를 간략히 표시한다 (예: "yt-dlp 네트워크 호출 평균", "LLM 토큰 생성 속도").
분석 범위
- 현재 대화에서 실제로 실행된 tool call만 분석한다.
- 사용자의 질문/답변은 분석 대상이 아니다.
탐지할 비효율 패턴
아래 패턴을 대화 기록에서 탐색한다. 해당 없는 패턴은 생략한다.
| 패턴 | 탐지 기준 | 예시 |
|---|---|---|
| 에러 재시도 | 동일/유사 tool call이 실패 후 재실행 | 경로 오류로 Python 스크립트 3회 실행 |
| 중복 외부 호출 | 같은 URL/API에 2회 이상 요청 | yt-dlp를 메타데이터·자막 따로 호출 |
| 직렬→병렬화 가능 | 독립적 작업이 순차 실행됨 | 날짜 확인 + yt-dlp 버전 확인 순차 실행 |
| 불필요한 파일 I/O | 메모리에서 처리 가능한 데이터를 파일로 중계 | 변수 → 파일 저장 → Read 도구로 재읽기 |
| 서브에이전트 오버헤드 | Task agent 실행 시간 중 실제 작업 비중이 낮음 | agent 초기화 3s + 파일 읽기 1s + 생성 55s |
| 불필요한 block 대기 | background agent인데 어차피 결과를 기다림 | run_in_background=true 후 즉시 TaskOutput block=true |
| 인코딩/경로 오류 | Windows 환경 특유의 cp949·경로 문제로 재시도 | /c/Users/... vs C:/Users/... |
| 과도한 중간 파일 | tmp 파일이 여러 단계에 걸쳐 생성되고 순차 전달됨 | script → file → read → agent → file → read |
| skill.md 인라인 코드 과다 | skill.md에 실행 가능한 코드 블록이 대량 포함됨 | 50줄 이상 Python이 skill.md에 인라인으로 존재 |
Workflow
1. 타임라인 재구성
대화 기록의 tool call을 순서대로 나열하고, 각 단계에 소요 시간을 붙인다.
출력 형식:
### 단계별 타임라인
| # | 단계 | 도구 | 소요 시간 | 비고 |
|---|------|------|----------|------|
| 1 | 날짜 확인 | Bash | ~0.1s | |
| 2 | yt-dlp 메타데이터 | Bash(Python) | ~3s | |
| 3 | yt-dlp 자막 | Bash(Python) | ~3s | 중복 → 통합 가능 |
| 4 | 요약 에이전트 | Task(background) | 62s (실측) | 전체의 80% |
| ... | | | | |
| | **합계** | | **~Xs** | |
2. 비효율 패턴 분류
탐지된 패턴을 영향도 순(시간 절약 큰 것부터)으로 나열한다.
각 패턴마다:
- 무엇이 문제인가 (1~2문장)
- 얼마나 낭비됐나 (시간/호출 횟수)
- Before/After 코드 또는 플로우
출력 형식:
### 발견된 비효율 패턴
#### 🔴 1. [패턴명] — 절약 가능: ~Xs
**문제**: ...
**낭비**: 약 Xs, N회 불필요 호출
Before:
step A (Xs) → step B (Xs) = 합계 Xs
After:
step A+B 통합 (Xs) = 합계 Xs
---
#### 🟡 2. [패턴명] — 절약 가능: ~Xs
...
영향도 기호:
- 🔴 큰 영향 (전체의 20% 이상 또는 10초 이상)
- 🟡 중간 영향 (5
10초 또는 재시도 12회) - 🟢 작은 영향 (5초 미만, 코드 품질/안정성 개선)
3. 최적화 요약
### 최적화 요약
- 현재 총 소요 시간: ~Xs
- 최적화 후 예상: ~Xs
- 단축 가능: ~Xs (~X%)
핵심 개선 포인트:
1. ...
2. ...
4. 스킬 파일 수정 제안 (해당 시)
세션에서 스킬이 사용된 경우, 스킬 파일에 반영할 구체적 수정안을 제시한다.
### 스킬 업데이트 제안: {skill-name}
파일: ~/.claude/skills/{skill-name}/skill.md
**수정 1**: {섹션명}
- 현재: `...`
- 변경: `...`
- 이유: ...
**수정 2**: ...
5. 스킬 구조 최적화 제안 (해당 시)
세션에서 사용된 스킬의 skill.md에 실행 가능한 코드 블록이 대량 포함된 경우, 스크립트 분리를 제안한다.
탐지 기준: skill.md 내 코드 블록 합계가 50줄 이상이거나, 동일 스크립트가 세션마다 반복 출력됨.
왜 문제인가:
- skill.md는 스킬이 로드될 때마다 컨텍스트에 전부 올라온다.
- 인라인 코드가 많을수록 매 세션 시작 시 토큰 낭비가 발생한다.
- 코드 수정 시 skill.md 안에서 찾아야 하므로 유지보수도 불편하다.
개선 방향: 스크립트를 별도 파일로 분리
Before (skill.md 인라인):
~/.claude/skills/my-skill/
skill.md ← Python 100줄 포함
After (분리):
~/.claude/skills/my-skill/
skill.md ← 경로 참조 한 줄만
scripts/
download.py ← yt-dlp 호출 + 자막 파싱
parse.py ← 텍스트 변환
skill.md에는 아래처럼만 남긴다:
### 2. 메타데이터 + 자막 다운로드
아래 스크립트를 실행한다:
\```bash
python ~/.claude/skills/my-skill/scripts/download.py {vid} {lang} {tmp_dir}
\```
stdout: meta JSON / 자막 json3 → tmp_dir 저장
트레이드오프 명시: 스크립트 분리 시 디버깅이 필요한 경우 Claude가 Read로 파일을 별도 로드해야 하므로, 자주 수정되는 스크립트라면 인라인 유지가 나을 수 있다. 안정적으로 동작하는 스크립트에만 분리를 권장한다.
출력 형식:
### 스킬 구조 최적화 제안: {skill-name}
현재 skill.md 코드 블록: 약 N줄
분리 권장 대상:
- scripts/download.py (현재 Workflow 2~3 섹션, 약 N줄)
- scripts/parse.py (현재 Workflow 4 섹션, 약 N줄)
분리 후 skill.md 절약: 약 N줄 → 토큰 N개
인자 없이 실행 시 동작
동일하게 동작한다. 인자가 없어도 현재 대화 기록을 분석 대상으로 삼는다.
단, 대화 기록에 tool call이 없으면:
분석할 실행 기록이 없습니다.
이 스킬은 tool call이 포함된 세션에서 사용해주세요.
Error Handling
- 실측 시간 없음: 모든 시간을 추정으로 표시하고 추정 근거 명시.
- tool call이 적음 (3개 미만): "분석할 단계가 충분하지 않습니다"와 함께 있는 내용만 분석.
- 패턴 미탐지: "이 세션에서 명확한 비효율 패턴은 발견되지 않았습니다"로 종료.