# task-1059.1: 동적 회귀 테스트(LLM 실행 기반 evals) 시스템 구축

## 배경
task-1054.1에서 8개 마케팅 스킬에 56개 evals.json을 생성했으나, 이는 정적 스키마 검증까지만 완료된 상태.
실제 LLM을 호출하여 eval을 실행하고 스킬 품질을 측정하는 "동적 회귀 테스트" 시스템이 아직 없음.

## 참고 자료
- task-1048.1 보고서: `memory/reports/task-1048.1.md` — coreyhaines31/marketingskills의 evals 구조 분석
- 기존 evals.json 위치: `/home/jay/.claude/skills/{스킬명}/evals/evals.json` (8개 스킬)
- 기존 검증 스크립트: `/home/jay/workspace/teams/dev2/validate_marketing_upgrade.py`

## evals.json 구조 (현재)
```json
[
  {
    "input": "사용자 프롬프트 (테스트 입력)",
    "expected_output": "기대하는 출력 패턴/키워드",
    "boundary": "경계 케이스 설명 (있을 경우)"
  }
]
```

## 작업 내용

### Phase 1: eval runner 스크립트 개발
1. `workspace/tools/eval-runner/run_evals.py` 생성
2. 기능:
   - evals.json을 읽어 각 eval의 input을 LLM에 전달
   - LLM 응답을 expected_output과 비교 (키워드 매칭 / semantic similarity)
   - 각 eval의 PASS/FAIL 판정
   - 결과 요약 (스킬별 pass rate, 전체 pass rate)
3. CLI 인터페이스:
   - `python3 run_evals.py --skill ad-creative` (단일 스킬)
   - `python3 run_evals.py --all` (전체 스킬)
   - `python3 run_evals.py --skill ad-creative --verbose` (상세 출력)
4. LLM 호출:
   - Anthropic Claude API 사용 (ANTHROPIC_API_KEY 환경변수)
   - 모델: claude-haiku (비용 최소화)
   - 각 eval당 1회 호출
   - rate limit 고려 (1초 간격)

### Phase 2: 평가 기준 설계
1. **키워드 매칭**: expected_output에 포함된 핵심 키워드가 LLM 응답에 존재하는지
2. **금지어 체크**: 스킬 boundary에 명시된 "이 스킬이 하면 안 되는 것"이 응답에 없는지
3. **라우팅 정확성**: boundary에 "→다른스킬"이 명시된 경우, LLM이 적절히 거부/위임하는지
4. 판정 로직을 모듈화하여 향후 확장 가능하게

### Phase 3: 결과 보고서 생성
1. 실행 결과를 `memory/reports/eval-results-{날짜}.md`에 저장
2. 스킬별 pass rate 테이블
3. FAIL 케이스 상세 (input, expected, actual, 판정 사유)
4. 전체 요약 (총 eval 수, pass 수, fail 수, pass rate %)

### Phase 4: 실제 실행 + 결과 보고
1. 8개 스킬 56개 eval을 실제 실행
2. 결과를 보고서에 기록
3. FAIL 케이스 분석 및 원인 파악

## 주의사항
- API 키는 환경변수에서 로드 (하드코딩 금지)
- 비용 최소화: haiku 모델 사용, 불필요한 재실행 방지
- eval runner는 `/home/jay/workspace/tools/eval-runner/`에 배치
- 기존 evals.json 파일은 수정 금지 (읽기 전용)
- 실행 시 `--dry-run` 옵션으로 API 호출 없이 구조 검증 가능하게

## 산출물
- eval runner 스크립트: `workspace/tools/eval-runner/run_evals.py`
- 실행 결과 보고서: `memory/reports/eval-results-2026-03-26.md`
- 완료 보고서: `memory/reports/task-1059.1.md`