# CI-2 — rate limiter 상태 누수 제거 (테스트 격리)

## worktree / branch
- `/home/jay/projects/InsuRo/.worktrees/ci-2` · `task/ci-2-260719` · base `cc7476bfbd9f6b3ae3c99f9a7136cc9f94cd3ada`

## expected_files (정확히 1파일)
```yaml
allowed_resources:
  paths: ["server/tests/conftest.py"]
  new_file_limit: 0
  commands: ["git","python3","pytest"]
  merge_policy: "none"
```

## 문제 (ANU 재현 확인)
- `server/main.py:287-289` 전역 `Limiter` 가 같은 프로세스의 여러 `TestClient(app)` 간 상태 공유 → `/api/insuro/ai/generate` 의 `5/minute` 버킷 누수
- **단독 실행 시 전부 PASS**(`TestCostCircuitBreaker` 3 passed · `TestGenerateStubEndpoint` 2 passed), **전체 스위트에서만 429**
- 즉 429 는 비즈니스 로직이 아니라 **테스트 상태 오염**이다.

## 수정 요구
- `server/tests/conftest.py` 에 **autouse fixture** 로 각 테스트 전후 **limiter 버킷 reset**(필요 시 메모리 storage reset 포함).
- ⚠️ **`server/main.py` 수정 금지**(expected_files 밖). 프로덕션 rate limit 동작 자체를 바꾸지 말 것.
- ⚠️ **429 를 정상 기대값으로 바꾸지 말 것.**

## ★ 2중 증명 필수 (회장 지시)
1. **테스트 간 격리** — 전체 스위트에서 대상 4건이 429 없이 기대 status(200/503/401) 반환
2. **한 테스트 안의 실제 rate-limit 동작 유지** — **negative control 추가**: 동일 테스트 내에서 제한 초과 호출 시 **여전히 429 발생**함을 assert
   → 이게 없으면 "reset 이 rate limit 자체를 무력화했는지" 구분 불가

## 완료 판정
- 대상 4건: 단독 실행 PASS **그리고** 전체 스위트 순서 포함 PASS
- negative control PASS(429 발생 확인)
- 테스트 개수 감소 0 · skip/xfail 증가 0

## ★ 절대 제약 (전 task 공통 — 회장 확정)
- **child PR 생성 0 · main merge 0.** 브랜치 커밋만. 수거는 ANU 가 parent 로 한다.
- **커밋 정확히 1개.**
- **금지**: 테스트 skip · required check 해제 · assertion 완화 · 429 를 정상 기대값으로 변경 · **다른 로컬 절대경로로 치환** · retry 증설 · admin override
- **expected_files 밖 수정 0.** 위반 시 STOP_REPORT.
- 대상 저장소 = **InsuRo**. 작업 디렉토리는 아래 worktree **안에서** 수행.

## 보고
- 보고서: `/home/jay/workspace/memory/reports/<task>.md` (**저장소 밖 · git stage 0**)
- 내용: diff / 근거 / 실행한 명령과 원문 출력 / 테스트 카운트(전후) / MATCH·GAP
- 봇 종료 전 ANU callback(envelope만·UTF-8 ≤3900B, collector=ANU key c119085addb0f8b7)

