# CI-4 — is_blocked 보험 도메인 정책 계약 테스트 강화

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

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

## ★ 회장 결정 (2026-07-19) — 이것이 authoritative
**`server/scripts/keyword_pool_refresh.py:119-127` 의 "보험 포함 키워드 면제"는 의도된 보험 도메인 정책이다. 소스를 유지하고 테스트를 수정한다.**

## ⚠️ 단순 기대값 뒤집기 금지 (회장 명시)
현재 실패 4건의 `True`→`False` 만 바꾸면 **정책이 무엇인지 문서화되지 않고, 면제 규칙이 전체 차단을 우회해도 잡히지 않는다.**
→ **정책 계약 테스트로 강화**할 것. 아래 3종을 **전부** 포함한다.

### ① 유효 보험 주제 = blocked **false**
`보험 채용` · `보험 시험` · `보험 사기` · `대출 보험`

### ② 보험 문맥 없는 기존 차단 패턴 = blocked **true**
기존 블록리스트 패턴 중 **보험 문구가 없는** 케이스가 **계속 차단**됨을 증명(회귀 방지).

### ③ ★ negative control — 보험 문구가 **절대 금지 규칙 전체를 무조건 우회하지 않음**
"보험"만 붙이면 무엇이든 통과하는지 확인하는 반례를 둔다. 어떤 케이스를 절대 금지로 볼지는 **소스의 실제 규칙을 읽고 확정**하고 근거를 보고에 남길 것.
→ 소스상 그런 케이스가 **존재하지 않으면** "면제 규칙이 무제한임"을 **GAP 으로 정직 보고**하라(테스트를 지어내지 말 것).

## 완료 판정
- `python3 -m pytest server/tests/test_keyword_pool_refresh.py -q -p no:randomly` → 전부 PASS
- 위 ①②③ 각각이 **실제 assert 로 존재**
- 테스트 개수 **감소 0**(강화이므로 증가는 허용) · skip/xfail 증가 0
- ⚠️ `server/scripts/keyword_pool_refresh.py` **수정 금지**

## ★ 절대 제약 (전 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)

