---
task_id: task-2333
type: context
scope: task
created: 2026-04-30
updated: 2026-04-30
status: completed
---

# 맥락 노트: task-2333 — InsuRo 복합설계 AI 계산기 Phase 1

---

## 결정 근거 (Codex 게이트 보강)

### 1. ohmy_premiums 중복 적재 방지
- **결정**: 부분 unique 인덱스 `idx_ohmy_prem_active`
  (`plan_id, coverage_cd, age, gender, insurer_code WHERE is_active = true`)
- **대안 기각**: 단순 unique → 이력 추적 불가. 풀 unique + collected_at → 동일 시점 재실행 시 충돌.
- **수집 시 UPSERT 패턴**: 기존 `is_active=true` 행을 `false`로 마킹 후 새 행 INSERT.

### 2. 가입금액 처리
- **결정**: Phase 1은 1000만원 기준 보험료만 저장 + 선형 비례 환산 (`stored × amount/1000`).
- **면책**: "1천만원 기준 비례 환산 — 실제 비선형 가능" 화면 명시.
- **Phase 2 로드맵**: 비선형 담보(예: 암진단비) 가입금액별 별도 수집.

### 3. 인카 가드
- **결정**: API 레벨 검증 (`profiles.organization_id`). RLS 정책 별도 미생성.
- **이유**: 기존 `premium-chat` 패턴과 일관성. ohmy_* 테이블은 전역 캐시.
- **환경변수**: `INCA_ORG_ID` (백엔드), `VITE_INCA_ORG_ID` (프론트). 미설정 시 organization_id 존재만 검사 (개발 폴백).

### 4. Phase 1 IP 분산
- **결정**: 단일 서버. Tailscale exit node Phase 2.
- **이유**: 평균 9분 간격 + 3패턴 시간대 분산만으로도 1438건 / 3일 분산 가능.

### 5. 5세 단위 → 32개 담보
- **task의 33개 중 1개("뇌출혈입원일자진단비")는 실제 ohmymanager API에 매칭 항목 없음**.
- 32개로 진행. 추후 제이회장님 확인.

## 3 Step Why 자문

**1st**: 왜 이 설계(C(N,3) 조합 열거 + 그리디 + 캐시)가 필요한가?
→ **A**: FA 고객 대면 30분 수작업 → 3초 단축 + 결정론적 결과 + ohmymanager 부하 분리.

**2nd**: 왜 A가 LLM/실시간 프록시보다 최선인가?
→ **B**: LLM은 비결정적·느림(수초)·비용 발생. 실시간 프록시는 ohmymanager 응답시간 + 약관 위반.
조합 열거는 N≤10에서 120ms, 캐시는 면책 문구로 약관 리스크 완화.

**3rd**: 왜 B가 MILP/메타휴리스틱보다 나은가?
→ **C**: MILP는 N=10 오버엔지니어링. GA/SA는 최적해 보장 못함. 조합 열거는 단순+최적해 보장.

→ A-B-C 일관 ✅

## 발견 이슈 및 해결

### 이슈 1: 3사 조합에서 0원 배분 보험사 포함됨
- **재현**: plan=000000111041, age=60, gender=F → triple_best에 DB(0원) + 롯데(141050) + 삼성(18340)
- **원인**: 1만원 제약이 2사에만 적용됨
- **해결**: `combo_size == 2` 조건부 분기 제거 → 모든 조합 크기에 통합 적용
- **회귀 테스트**: `test_triple_excludes_zero_allocation` 추가
- **사후 결과**: 동일 시나리오에서 triple_best=None 반환 (1만원 제약 미충족 시)

### 이슈 2: ohmymanager API 응답 구조 미확정 → 실 1건 호출로 확인
- **사실 확인**: `coverage_premiums[].detailList[].{coverage_cd, premium}` + `company_code/company_name`
- **collector 파서 갱신**: 임시 가정 구조 → 실제 구조 반영
- **0원 담보 저장 제외**: `prem_int <= 0` 케이스는 미가입으로 간주

### 이슈 3: TBD coverage_cd → 실제 매핑
- task의 33개 한글명 → 실제 32개 coverage_cd 매핑 (a001~e039)
- 기존 TBD_001~033 행 DELETE 후 신규 32개 INSERT

## 참조 자료

- 마스터 계획서: `/home/jay/workspace/memory/plans/insuro-composite-design/plan.md`
- 마스터 맥락노트: `/home/jay/workspace/memory/plans/insuro-composite-design/context-notes.md`
- 미팅 기록: `/home/jay/workspace/memory/meetings/2026-04-30-composite-design-calculator.md`
- Codex 게이트 결과: 5 risks (critical 1 — 미생성 파일 → 구현으로 해결, high 3 → 위 결정 근거 1-3, medium 1 → 결정 근거 4)

## 주의사항

- ohmymanager 약관 "데이터 재활용 금지" — 인카 내부 한정 + 캐시로 리스크 수용 (제이회장님 판단)
- JWT 토큰 .env.keys만 사용 (코드 하드코딩 금지)
- INCA_ORG_ID 환경변수 미설정 시 개발 폴백 동작 — 프로덕션 배포 전 반드시 설정
- 74개 플랜 등록은 별도 dispatch 필요 (현재 1개 placeholder)
