# 콜드메일 다중 확인 루프 및 요약 메시지 개선 **날짜**: 2026-01-21 **작성자**: happybell80 **관련 파일**: `rb8001/app/services/workflows/coldmail_workflow.py` --- ## 문제 상황 1. **다중 이메일 확인 시 1개만 처리**: 오다가다, 에듀온 2개 모두 "맞음" 클릭 → 에듀온만 처리됨 2. **요약 메시지 부적절**: `None억원 (신뢰도 0%)` 표시 → IR 분석 안 된 건 의미 없는 정보 --- ## 원인 분석 ### 문제 1: 워크플로우 종료 - `confirm → send` 고정 엣지로 인해 첫 확인 후 바로 요약 전송 → 종료 - 나머지 `waiting_confirmation` 유실 ### 문제 2: median None 처리 누락 - `send_node`에서 `median`이 None인 경우 처리 로직 없음 - `f"- {company}: {median}억원"` → `None억원` 표시 --- ## 해결 방법 ### Phase 1: 다중 확인 루프 ```python # route_after_confirm() 함수 추가 def route_after_confirm(state: ColdmailState) -> str: if state.get("waiting_confirmation"): return "wait_confirmation" else: return "send" # confirm → send 고정 엣지를 조건부 엣지로 변경 workflow.add_conditional_edges( "confirm", route_after_confirm, { "wait_confirmation": "wait_confirmation", "send": "send" } ) ``` ### Phase 2: 요약 메시지 개선 ```python # median이 None이면 IR 분석 대기 표시 if median is None: summary_lines.append(f"- {company}: 등록 완료 (IR 분석 대기)") elif is_hold: ... else: summary_lines.append(f"- {company}: {median}억원 (신뢰도 {conf_pct}%)") ``` --- ## 변경 내용 | 파일 | 변경 | |------|------| | coldmail_workflow.py L311-325 | `route_after_confirm()` 함수 추가 | | coldmail_workflow.py L365-372 | `confirm → send` 조건부 엣지로 변경 | | coldmail_workflow.py L267-269 | `send_node` median None 처리 추가 | | tests/test_coldmail_workflow_multi_confirm.py | 5개 테스트 케이스 추가 | --- ## 검증 ### 단위 테스트 ```bash docker exec rb8001 pytest tests/test_coldmail_workflow_multi_confirm.py -v # 5 passed ``` ### 배포 - `git push origin main` → Gitea Actions 자동 배포 - `docker ps | grep rb8001` → 재시작 확인 완료 --- ## 교훈 1. **LangGraph 루프 패턴**: 조건부 엣지로 동일 노드 재진입 가능 (고정 엣지 대신 `route_after_*` 함수 사용) 2. **None 값 처리 필수**: 외부 데이터(IR 분석 결과 등)는 None 가능성 항상 고려 3. **테스트 컨테이너 반영**: tests 디렉토리는 볼륨 마운트 아님 → `docker cp` 또는 재빌드 필요