# Task-1068.1: Eval Runner OAuth 전환 (API Key → Claude CLI)

**작업일:** 2026-03-26 | **팀:** dev8-team | **작업자:** GLM-5 (코딩), Ra (검토)

---

## S — Situation

`/home/jay/workspace/tools/eval-runner/run_evals.py`의 `call_llm()` 함수(line 407-441)가 `anthropic` SDK + `ANTHROPIC_API_KEY` 환경변수를 사용하여 LLM을 호출하고 있었다. 기존 33개 테스트가 통과하는 상태.

## C — Complication

시스템 전체가 API Key가 아닌 OAuth 인증으로 전환되어, API Key 방식의 `call_llm()`이 운영 환경에서 동작하지 않는다. `anthropic` SDK 의존성도 불필요하게 유지되고 있었다.

## Q — Question

`call_llm()`을 Claude CLI subprocess 방식으로 전환하면서, 기존 테스트 33개와 dry-run 기능을 유지할 수 있는가?

## A — Answer

`call_llm()` 함수를 `subprocess.run(["claude", "-p", prompt, "--model", "claude-haiku-4-5-20251001"])` 방식으로 교체 완료. `anthropic` SDK import 완전 제거, `import subprocess` 추가. 기존 33개 + 신규 11개 = **총 44개 테스트 100% 통과**. pyright 에러 0건, black/isort 준수.

---

## 수정 파일

- `/home/jay/workspace/tools/eval-runner/run_evals.py` — `call_llm()` 함수 교체, import 정리
- `/home/jay/workspace/tools/eval-runner/test_task_1068_1_cli_integration.py` — 신규 11개 테스트 (CLI 통합, API Key 미사용, 후방호환성)

## 스펙 전수 체크

- [x] `call_llm()` 함수를 Claude CLI subprocess로 변경
- [x] `import anthropic` 완전 제거
- [x] `import subprocess` 추가 (파일 상단)
- [x] `ANTHROPIC_API_KEY` 관련 코드 제거
- [x] `time.sleep(1)` rate limit 유지
- [x] `timeout=120` 설정
- [x] 에러 메시지에 `stderr[:500]` 포함
- [x] 기존 평가 로직(evaluate_response, keyword_match 등) 변경 없음
- [x] 테스트 수정/추가
- [x] dry-run 정상 작동 확인

## 발견 이슈 및 해결

### 자체 해결 (3건)

1. **GLM 1차 호출 타임아웃** — 2차 재호출로 성공 (GLM-5 600s timeout → 재시도 후 213s에 완료)
2. **GLM 보고서 SCQA 포맷 미준수** — QC WARN 감지, SCQA 포맷으로 보고서 재작성
3. **QC test_runner SKIP** — `--check-files` 자동 추론에서 관련 테스트 0개로 판정. 수동으로 `pytest test_run_evals.py test_task_1068_1_cli_integration.py -v` 실행하여 44/44 통과 확인

### 범위 외 미해결 (0건)

없음.

## 검증 증거

**pytest 결과**: 44 passed in 6.12s (기존 33 + 신규 11)
```
test_run_evals.py: 33 passed
test_task_1068_1_cli_integration.py: 11 passed
```

**black/isort**: 2 files would be left unchanged (PASS)

**pyright**: 0 errors, 0 warnings, 0 informations

**dry-run**: `python3 run_evals.py --skill ad-creative --dry-run` → eval_count: 7, 정상 반환

**claude CLI 확인**: `/home/jay/.local/bin/claude` 존재

## QC 자동 검증 결과

```json
{
  "task_id": "task-1068.1",
  "overall": "WARN",
  "checks": {
    "api_health": "SKIP (서버 작업 아님)",
    "file_check": "WARN (SCQA 포맷 누락 → 본 보고서로 해결)",
    "data_integrity": "PASS (completed ↔ .done 일치)",
    "test_runner": "SKIP (자동 추론 0개, 수동 검증 완료)",
    "pyright_check": "PASS (0 errors)",
    "style_check": "PASS (black OK, isort OK)"
  },
  "summary": "6 PASS, 5 SKIP, 1 WARN"
}
```

## 소요 시간

18분 55초 (GLM-5 1차 타임아웃 포함)
