# task-2966 · InsuRo 증권분석 결함 A 수정 (다중사 합산 실패 + Python 예외 원문 노출)

## 배경 (task-2964 스모크 발견)
- 프로덕션 스모크에서 재현된 결함: 증권분석 `analyze-policy` **간헐 예외**.
- 원인 추정: AI 추출 결과 중 숫자여야 할 필드가 `None`인데 후속 코드가 None 체크 없이 덧셈 → `unsupported operand type(s) for +: 'int' and 'NoneType'` 류 예외.
- 영향 2가지:
  1. **다중사 합산 깨짐**: 증권 여러 장 업로드 시 한 건(Policy B)이 예외로 실패 → 표에 **1개사만 반영**(스모크에서 삼성화재 1개만).
  2. **UX 결함**: 사용자에게 **Python 예외 원문이 그대로 노출**.
- repo `/home/jay/projects/InsuRo`, origin/main 최신. 담당 dev1. **Phase 2(task-2965)와 병행**.

## 작업
1. **원인 코드 특정**: analyze-policy 파이프라인에서 None 필드 덧셈 지점 grep/추적(`server/policy_analyzer.py`·`policy_normalizer.py`·`main.py` analyze-policy 경로).
2. **None 가드**: 숫자 필드 None 안전 처리(0 대체가 아니라 **UNKNOWN/미집계**로 — 금소법, 억지 0 금지). 계산 불가 항목은 표기.
3. **격리 처리**: 한 증권 실패가 **전체를 중단시키지 않고 해당 건만 스킵**하고 나머지 계속(다중사 합산 복구). 실패 건은 "분석 실패" 로 명시.
4. **예외 원문 은닉**: 사용자에게 Python 예외 원문 대신 **친화 메시지**("이 증권은 분석에 실패했습니다" 등), 상세는 서버 로그로만.

## 검증
- 재현 테스트: None 필드 포함 증권 → 예외 없이 처리(해당 건 스킵/UNKNOWN, 나머지 정상).
- **다중사(2개사) 합산 산술 재확인**(스모크에서 못 한 부분).
- 회귀 통과.

## 원칙
- Surgical. 정상 경로 무변경, None 가드·격리·메시지만 추가. 금소법(억지 수치 금지).

## 완료 조건
- **PR** + 회귀 + 다중사 합산 재현 테스트 + `memory/reports/task-2966.md` + `.done` + ANU 콜백. **머지 HOLD**.