# task-1303.1 완료 보고서

## S - Situation
`tests/test_dispatch.py`에 141개 테스트가 있으며, `.env.keys` 파일이 존재하는 개발 환경에서는 전체 통과한다.

## C - Complication
`.env.keys` 파일이 없는 CI/CD 환경에서 51건 테스트가 `OSError: COKACDIR_KEY_ANU 환경변수가 설정되지 않았습니다`로 실패한다. `team_prompts.py`의 `_get_anu_key()`가 빈 `ANU_KEY`에 대해 fail-fast 예외를 발생시키기 때문이다.

## Q - Question
`.env.keys` 파일 없이도 `pytest tests/test_dispatch.py` 141건 전체 통과가 가능한가?

## A - Answer
`tests/conftest.py`의 autouse fixture를 강화하여 11개 COKACDIR 환경변수를 `monkeypatch.setenv()`로 더미 값 주입하고, 이미 임포트된 `team_prompts.ANU_KEY` 모듈 변수도 `monkeypatch.setattr()`로 패치하여 해결. `.env.keys` 없이 141건 전체 통과 확인, `.env.keys` 있는 환경에서도 회귀 없음.

## 작업 내용

### 수정 파일
- `/home/jay/workspace/tests/conftest.py`

### 변경 사항
- fixture 이름: `_set_anu_key_global` → `_set_test_env_keys` (포괄적 이름)
- `monkeypatch.setenv()` 11개 환경변수 주입 추가:
  - `COKACDIR_KEY_ANU`, `COKACDIR_KEY_DEV1` ~ `COKACDIR_KEY_DEV8` (9개 봇 키)
  - `ANU_BOT_TOKEN` (봇 토큰)
  - `COKACDIR_CHAT_ID` (채팅 ID)
- 기존 `monkeypatch.setattr(tp, "ANU_KEY", "test-anu-key")` 유지 (모듈 캐싱 대응)
- 모든 값은 더미 값 (`test-key-xxx`) 사용, 실제 키 하드코딩 없음

### 수정하지 않은 파일
- `dispatch.py` (본체 코드 수정 불필요)
- `test_dispatch.py` (개별 테스트 수정 불필요)

## 테스트 결과

| 시나리오 | 결과 |
|----------|------|
| `.env.keys` 있음 + conftest.py 있음 | 141 passed (0.83s) |
| `.env.keys` 없음 + conftest.py 있음 | 141 passed (0.85s) |
| `.env.keys` 없음 + conftest.py 없음 | 51 failed, 90 passed (대조군) |

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **작업 지시서 44건 vs 실제 51건 불일치** — 작업 지시 이후 신규 테스트 7건 추가로 실패 수 증가. 51건 모두 동일 원인(`_get_anu_key()` EnvironmentError)이므로 동일 fix로 해결됨.
2. **monkeypatch.setenv() vs monkeypatch.setattr() 이중 패치 필요** — dispatch 모듈 재임포트 시 `os.environ.get()`이 호출되므로 환경변수 레벨 세팅 필수. 이미 임포트된 `team_prompts.ANU_KEY`는 모듈 변수 직접 패치 필요. 이중 전략 적용.
3. **pyright false positive 2건** — `reportMissingImports`(runtime sys.path 추가 미인식), `not accessed`(pytest autouse fixture 미인식). 기존 코드에도 동일 패턴, 실행에 영향 없음.

## QC 검증 결과

- pyright_check: PASS (0 errors, 0 warnings)
- style_check: PASS (black OK, isort OK)
- spec_compliance: PASS
- test_runner: SKIP (conftest.py 자체에 대한 테스트 파일 없음, 정당한 SKIP)
