# 소식지 보험사 감지 생보/손보 오매핑 교정 (#task-2923) — ANU 독립검증 완료·머지HOLD (260806)

- 프로젝트: InsuRo (`/home/jay/projects/InsuRo`)
- 팀: dev1-team (헤르메스/불칸). 레벨 Lv.1 데이터 정비.
- 브랜치: `task/task-2923-dev1` head `eaad4c3` (원격 일치). base=origin/main `cc59a02`.
- 워크트리: `/home/jay/projects/InsuRo/.worktrees/task-2923-dev1`
- merge_policy=none → 머지·재배포 ANU 소유.

## 무엇
task-2918(파일명 우선)이 머지됐어도 `COMPANY_PATTERNS`에 생보 문자열이 손보 키 패턴값으로 등록돼 있어 회장 예시 "DB생명 위드유매거진 26.08.pdf"가 `DB손해보험`으로 오검출되던 잔여버그(task-2918 HOLD #2)를 **데이터만 교정**(로직 무변경)으로 해소.
- 손보 키에서 생명 패턴 제거(DB손보/삼성화재/KB손보에서 DB생명·삼성생명·KB생명 삭제).
- 생보 독립키 10종 추가(한화생명·삼성생명·교보생명·DB생명·NH농협생명·KB라이프생명(KB생명/KB라이프)·신한라이프·흥국생명·미래에셋생명·동양생명).
- 그룹명 단독 패턴(한화·교보·농협·NH농협·롯데·흥국 bare) 제거 → 업권약칭만 유지. 첫매칭 substring 상호오매칭 원천차단.
- 수정 2파일: `server/main.py`(dict 리터럴 4891~만) + `server/tests/test_detect_company_filename.py`(16케이스 재작성). forbidden_paths 무변경.

## ANU 독립검증 (clean /tmp 워크트리 eaad4c3, CI parity)
- diff = main.py dict + 테스트파일 2개만(79+/23-). 로직 diff 없음.
- 실함수 `_detect_company` 10/10 PASS: **DB생명 파일명→DB생명(회장 예시 해소)**, 삼성생명↔삼성화재 분리, KB생명→KB라이프생명, 손보 유지, 한화 그룹명단독→무매칭, NH농협생명→NH농협생명.
- 스코프 테스트: `test_detect_company_filename.py` 16 passed / `test_main.py -k detect_company` 3 passed.
- 유일 실패 = pre-existing CORS(`test_cors_fail_closed_when_ext_origin_unset`) — 워크트리 .env 오염, base 재현, 본건 무관.
- **판정: MERGE-READY (저위험 데이터 교정, 회귀0)**.

## HOLD (회장 go 대기)
- 머지는 소식지 파이프라인 스택 HOLD(task-2916 `8e2c17e`·task-2921 `f26e50b`·task-2918 배포·task-2914/2915 등)와 함께 **coordinated 단일 재배포**(systemd insuro-api)로 완결 권장. main push는 ruleset 보호 가능성 → 별도 머지경로 필요.
- 참고: 프론트 `classifyInsurer` 생보목록과 키명칭 일관성(validation.py·insurerType.ts 3중복 단일소스화)은 범위 밖 별도 task.

관련: [[project_insuro_newsletter_detect_company_filename_priority_task2918_merged_260806]]
