# task-930.3: output-review.py Phase 2 — AI 비교 판정 + 초회 강화 프로세스 (한정위임)

## 배경
- task-930.1에서 output-review.py + output_review_helpers.py 구현 완료
- compare_outputs()가 **스텁 상태** (길이 기반 더미 비교)
- 설계서 v1.2 Section 3, 4, 5, 6에 정의된 전체 파이프라인을 연동해야 함

## 선행 산출물 (반드시 읽고 시작)
1. **설계서**: `/home/jay/workspace/memory/specs/skill-eval-self-learning-design.md` (v1.2)
2. **기존 코드**: `/home/jay/workspace/scripts/output-review.py`, `/home/jay/workspace/scripts/output_review_helpers.py`
3. **기존 테스트**: `/home/jay/workspace/scripts/tests/test_output_review.py`
4. **평가 축**: `/home/jay/.claude/skills/shared/eval-axes.json` (83개 스킬별 3~5개 축)
5. **스킬 레지스트리**: `/home/jay/.claude/skills/shared/skill-registry.json` (business/system 분류, benchmark_method)
6. **learnings 인프라**: `/home/jay/workspace/scripts/learnings_archiver.py`

## 작업 범위 (한정위임 — 끝까지 진행)

### Phase 1: compare_outputs() AI 비교 판정 구현

**현재 스텁** (output_review_helpers.py):
```python
def compare_outputs(output_a, output_b, eval_axes, skill_name):
    # 스텁: 길이 기반 비교
    ...
```

**구현할 내용:**
1. eval-axes.json에서 해당 스킬의 평가 축 로드
2. 두 아웃풋을 AI에게 비교 판정 요청하는 프롬프트 구성
   - 평가 축별 점수 (1~5)
   - 종합 판정 (winner: "a" 또는 "b")
   - 판정 근거 (reason)
3. AI 호출 방식: **Claude API 직접 호출** (anthropic SDK 사용)
   - API 키는 환경변수 `ANTHROPIC_API_KEY`에서 로드
   - 모델: `claude-sonnet-4-6` (비교 판정은 Sonnet으로 충분)
4. 비교 순서 랜덤화 (설계서 3-4): 매 비교 시 A/B 순서를 랜덤 셔플, 결과 매핑 복원
5. 반환 구조: `{"winner": "a"|"b", "reason": "...", "scores": {"axis1": [a_score, b_score], ...}}`

### Phase 2: 초회 강화 프로세스 (--init 모드 확장)

현재 --init은 A/B 비교만 수행. 설계서 3-1의 전체 프로세스를 구현:

**사업용 스킬 (benchmark_method == "online_expert"):**
1. A, B 비교 → 나은 쪽 선택 (Phase 1의 compare_outputs 활용)
2. **온라인 전문가 벤치마킹**: WebSearch로 같은 주제 전문가 아웃풋 검색
   - 검색 쿼리: 스킬명 + 토픽 기반 자동 생성
   - 검색 결과에서 관련 아웃풋 추출
   - AI가 자기 아웃풋과 전문가 아웃풋 비교 → 부족점 식별
3. 개선점 반영한 최종 아웃풋 생성
4. **Delta 검증**: 개선 전 vs 개선 후 비교 → 역행 시 fallback
5. 챔피언 등극 + learnings 저장

**시스템용 스킬 (benchmark_method == "cross_model"):**
1. A, B 비교 → 나은 쪽 선택
2. **Cross-model 검증**: 스텁으로 구현 (실제 Venus/Atlas 연동은 별도 Phase)
   - 현재는 self-review로 대체 (cross-model 연동 전까지)
   - 인터페이스만 확정: `cross_model_verify(output, skill_name) -> {"verdict": "pass"|"improve", "suggestions": [...]}`
3. 이하 동일 (개선 → Delta → 챔피언 → learnings)

**Graceful Degradation (설계서 3-1 하단):**
- WebSearch 결과 부실 시 (0건, 관련성 낮음) → A/B 선택본 그대로 챔피언
- Cross-model 호출 실패 시 → self-review로 대체

### Phase 3: Delta 검증 로직

- v1 (개선 전 선택본) vs v2 (개선 후 최종본)을 compare_outputs()로 비교
- v2가 v1보다 낮으면 → v1을 챔피언으로 (fallback)
- v2가 v1보다 높으면 → v2를 챔피언으로 + "어떤 점이 개선됐는가" learnings 저장
- Delta 결과를 champion JSON의 `init_process` 필드에 기록

### Phase 4: 테스트 업데이트

기존 test_output_review.py에 새 테스트 추가:
- compare_outputs AI 호출 모킹 테스트
- 초회 강화 프로세스 전체 플로우 테스트 (mock AI 응답)
- Delta 검증 pass/fail 케이스
- Graceful degradation 케이스
- 비교 순서 랜덤화 검증

## 제약사항
- **기존 파일만 수정** (output-review.py, output_review_helpers.py, test_output_review.py)
- 새 파일 생성 최소화 (필요시 output_review_helpers.py 내 함수 추가)
- eval-axes.json, skill-registry.json은 **읽기 전용**
- learnings.jsonl은 learnings_archiver.py의 add_learning() 함수로만 쓰기
- 모듈화: 200줄/파일 제한 유지. 초과 시 별도 모듈 분리
- WebSearch 구현: `scripts/utils/` 아래에 웹검색 헬퍼가 있으면 활용, 없으면 간단한 함수로 구현
- ANTHROPIC_API_KEY 환경변수 필수. 없으면 에러 + 명확한 메시지

## 산출물
1. 수정된 output-review.py, output_review_helpers.py
2. 업데이트된 test_output_review.py
3. 보고서: `memory/reports/task-930.3.md`
