# task-1104.1 완료 보고서: Autoresearch OAuth 인증 전환 + 비용 계산 정확도 수정

## SCQA

**S**: Autoresearch 모듈이 `ANTHROPIC_API_KEY`로만 인증하여, Claude Max OAuth 기반 환경에서 실행 불가. 또한 비용 계산이 모든 토큰을 Sonnet 단가로 합산하여 judge(Haiku) 비용이 과대 추정되는 상태.

**C**: 키가 없는 환경에서 autoresearch를 실행하려면 OAuth 토큰 지원이 필수이며, 비용 리포트의 정확도가 낮아 의사결정에 부적합.

**Q**: OAuth 인증 전환과 비용 계산 세분화를 하위호환을 유지하면서 구현할 수 있는가?

**A**: 6개 파일 수정으로 OAuth 우선 인증 + Sonnet/Haiku 비용 분리 계산 구현 완료. 기존 167개 테스트 전체 PASS, pyright 에러 0건. OAuth 토큰으로 클라이언트 생성 동작 확인.

---

## 작업 내역

### 작업 1: OAuth 인증 전환

- `skill_executor.py`: `load_auth()` 함수 추가 (ANTHROPIC_AUTH_TOKEN → credentials.json → ANTHROPIC_API_KEY → .env 순서), `_create_client()` 함수 추가, `execute_skill()` 시그니처에 `auth` 파라미터 추가
- `mutator.py`: `generate_mutation()` → `_create_client(auth=auth, api_key=api_key)` 사용, `import os` 제거
- `judge.py`: `judge_output()` → `_create_client(auth=auth, api_key=api_key)` 사용, `import os` 제거
- `runner.py`: `run()` 시작 시 `load_auth()` 1회 호출 → `auth` dict를 모든 모듈에 전파

### 작업 2: 비용 계산 정확도 수정

- `changelog.py`: `add_round()`에 6개 토큰 세분화 파라미터 추가 (`mutation_input_tokens`, `mutation_output_tokens`, `execution_input_tokens`, `execution_output_tokens`, `judge_input_tokens`, `judge_output_tokens`)
- `runner.py`: `run_round()` → `add_round()` 호출 시 세분화 토큰 전달
- `reporter.py`: Sonnet(mutation+execution) / Haiku(judge) 분리 비용 계산, 하위호환 폴백 포함

---

## 생성/수정 파일 목록

- `scripts/autoresearch/skill_executor.py` — load_auth(), _create_client(), execute_skill(auth=) 추가
- `scripts/autoresearch/mutator.py` — generate_mutation(auth=) 추가, _create_client 사용
- `scripts/autoresearch/judge.py` — judge_output(auth=) 추가, _create_client 사용
- `scripts/autoresearch/runner.py` — load_auth() 전파, 토큰 세분화 전달
- `scripts/autoresearch/changelog.py` — add_round() 6개 토큰 필드 추가
- `scripts/autoresearch/reporter.py` — Sonnet/Haiku 분리 비용 계산
- `scripts/autoresearch/tests/test_skill_executor.py` — TestLoadAuth(5개), TestCreateClient(4개) 추가
- `scripts/autoresearch/tests/test_mutator.py` — _create_client mock 기반으로 전환
- `scripts/autoresearch/tests/test_judge.py` — _create_client mock 기반으로 전환
- `scripts/autoresearch/tests/test_runner.py` — TestRunRoundAuth(1개), TestRunRoundTokenBreakdown(1개) 추가
- `scripts/autoresearch/tests/test_changelog.py` — TestAddRoundTokenBreakdown(3개) 추가
- `scripts/autoresearch/tests/test_reporter.py` — TestGenerateReportCostBreakdown(3개) 추가

---

## 검증 결과

- pytest: **167 passed**, 3 warnings (기존 150 + 신규 17)
- pyright: **0 errors**, 0 warnings, 0 informations
- black: 6 files unchanged (포매팅 준수)
- OAuth 인증: `load_auth()` → type=oauth, credentials.json에서 토큰 로드 확인
- 클라이언트 생성: `_create_client()` → `anthropic.Anthropic` 인스턴스 생성, auth_token 설정 확인
- 하위호환: 기존 `api_key` 파라미터 사용 테스트 전체 PASS
- 토큰 만료 체크: expiresAt < 현재시간(ms) → 건너뛰기 동작 확인 (테스트 PASS)

---

## 발견 이슈 및 해결

### 자체 해결 (3건)

1. **changelog.py `add_round()`가 kwargs 미지원** — 6개 명시적 파라미터로 추가하여 해결 (기본값 0)
2. **mutator.py/judge.py에서 `import os` 잔류** — `_create_client` 전환 후 os 미사용이므로 제거
3. **TestRun 클래스에서 `load_auth()` mock 필요** — `run()` 내부에서 `load_auth()` EnvironmentError → pass 로직이 동일하므로 기존 테스트 영향 없음 확인. 단 일부 테스트에 `@patch("autoresearch.runner.load_auth")` 추가하여 안전성 확보

### 범위 외 미해결 (0건)
없음.

---

## 셀프 QC 체크리스트

- [x] 1. 다른 파일 영향 확인: scripts/autoresearch/ 내 파일만 변경, 다른 디렉토리 미접촉
- [x] 2. 엣지 케이스: 만료 토큰 건너뛰기, credentials.json 없는 경우, api_key fallback
- [x] 3. 작업 지시 일치: OAuth 전환 + 비용 계산 모두 구현
- [x] 4. 에러 처리/보안: EnvironmentError 처리, 토큰 마스킹(prefix만 노출)
- [x] 5. 테스트 커버리지: 신규 17개 테스트로 모든 경로 커버
- [x] 6. 이슈 전부 해결: 3건 자체 해결, 미해결 0건
- [x] 7. 코드 아키텍처: DRY(_create_client 공유), SOLID(단일 책임)
- [x] 8. 인터페이스 변경 문서: 함수 시그니처 변경 docstring 갱신 완료
