# CI-2b — conftest limiter reset 을 fail-closed 로 전환 (회장 지시)

## worktree / branch
- `/home/jay/projects/InsuRo/.worktrees/ci-2` · `task/ci-2-260719` (**기존 브랜치에 이어서 커밋**)
- 현재 head `a95972e` (CI-2 결과물). 그 위에 **추가 커밋 1개**.

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

## 문제 (ANU 지적 → 회장 확정)
현재 `_reset_rate_limiter_storage()` 가 **fail-open** 이다:
```python
try:
    _rate_limiter.reset()
except Exception:
    pass          # ← 실패를 조용히 삼킨다
```
그리고 `from main import limiter` 실패 시 `_rate_limiter = None` 으로 **no-op fixture** 가 된다.

→ slowapi/limits 버전이 바뀌어 `reset()` 이 깨지면 **아무도 모른 채 429 누수가 부활**하고, 테스트는 다시 조용히 flaky 해진다. 우리 원칙은 **fail-closed** 다.

## 수정 요구
1. **`except Exception: pass` 제거.** reset 실패 시 **테스트 세션이 명시적으로 실패**해야 한다(오류를 그대로 전파하거나 명확한 메시지로 raise).
2. **`_rate_limiter is None` 무음 통과도 제거.** limiter 를 가져오지 못하면 그 자체가 **명시적 실패**여야 한다(rate limit 격리를 보장할 수 없는 상태에서 스위트를 진행하면 안 됨).
3. 실패 메시지에 **원인과 조치 방향**을 담을 것(어떤 API 가 깨졌는지 알 수 있게).
4. ⚠️ negative control fixture 는 **유지**한다. 그 동작을 약화시키지 말 것.

## 검증 (전부 ANU 재실행 대상)
- `python3 -m pytest server/tests -q -p no:randomly` → **0 failed** (CI-4 축 제외 상태 기준: 현재 r2 는 keyword_pool 4건이 남아 있으므로 **그 4건 외 0**)
- `TestCostCircuitBreaker` + `TestGenerateStubEndpoint` 단독·전체 순서 모두 PASS
- **negative control 여전히 동작**: 5/minute 초과 시 429 관측 assert 유지
- **fail-closed 증명**: reset 이 실패하는 상황을 인위적으로 만들었을 때 **세션이 실패**함을 보일 것(일시적 로컬 실험으로 확인하고 원문 출력을 보고에 첨부. 실험 코드는 커밋에 남기지 말 것)
- 테스트 개수 감소 0 · skip/xfail 증가 0

## ★ 절대 제약
- **PR 생성 0 · main merge 0.** 브랜치 커밋만.
- **추가 커밋 정확히 1개.**
- **금지**: 테스트 skip · required check 해제 · assertion 완화 · 429 기대값화 · 다른 로컬 절대경로 · retry 증설 · `server/main.py` 수정
- expected_files 밖 수정 0. 위반 시 STOP_REPORT.

## 보고
- `/home/jay/workspace/memory/reports/ci-2b-260719.md` (저장소 밖 · git stage 0)
- diff / fail-closed 전환 근거 / **인위적 실패 실험 원문 출력** / 테스트 카운트 전후 / MATCH·GAP
- 봇 종료 전 ANU callback(envelope만·UTF-8 ≤3900B, collector=ANU key c119085addb0f8b7)

## goal_assertions (auto-generated)
- `python3 -m pytest server/tests -q -p no:randomly`
