# rb8001 콜드메일 요약: 밸류에이션 고정 표기 및 UNKNOWN 라우팅 개선

**날짜**: 2025-10-23  
**작성자**: admin  
**관련 파일**: `rb8001/app/services/startup_valuation.py:433-456`, `rb8001/app/services/workflows/coldmail_workflow.py:124-127`, `rb8001/app/services/coldmail_processor.py:444-452`, `rb8001/app/brain/decision_engine.py:105-120`

---

## 문제 상황
- 콜드메일 요약 메시지에 “IR자료: 30.0억원 (신뢰도 60%)”로 표기되어 밸류에이션이 ‘고정’처럼 인지됨.  
  - 증거: `rb8001/logs/rb8001.log:66827-66830` — seed prior(30)만으로 Posterior 산출, IR 지표 없음 → `Insufficient IR metrics; ... HOLD` 로 기록.  
  - 원인: `startup_valuation.py:433-456` — 증거 0개면 DB 저장을 보류(HOLD)하되 결과 수치 자체는 prior 기반으로 남음. 요약 메시지(`workflows/coldmail_workflow.py:124-127`)는 HOLD/근거 부재를 표시하지 않음.

- 스레드 후속 질문(“지에프 솔루션 … 설명해줘”, “30억 고정 이유”)이 UNKNOWN 의도로 처리되어 일반 답변으로 하향.  
  - 증거: `rb8001/logs/rb8001.log:66861, 66916, 66920` — DecisionEngine UNKNOWN.  
  - 원인: `decision_engine.py:114-120` — 웹검색/설명 패턴에 `.*대해서.*설명`은 있으나 “에 대해 설명해줘”/“설명해줘”/“이유”/“기업가치|밸류에이션|30억” 조합이 부재.

---

## 해결 방안
1) 표시 개선(오해 방지)  
   - `coldmail_processor.py:444-452`: 반환 dict에 `valuation_result.metadata`의 핵심 키를 포함하도록 확장: `status`(hold), `missing_fields`, `prior_components.stage_prior.median` 등.  
   - `workflows/coldmail_workflow.py:124-127`: HOLD이면 “초안(HOLD·사전값 seed 30)”로 라벨링하고 범위(하한~상한)와 누락지표를 함께 표기. 예) `- 지에프솔루션: 초안(HOLD·seed 30) [필요: revenue, growth_rate, team_size]`.

2) 라우팅 보강(의도 인식 향상)  
   - `decision_engine.py:114-120`(WEB_SEARCH) 및/또는 `decision_engine.py:105-109`(DOCUMENT_ANALYSIS) 패턴에 다음 추가:  
     - `.*에 대해.*설명해줘`, `설명해줘`, `이유`, `(기업가치|밸류에이션|valuation|30억)`  
   - 선택: 별도 Intent(예: `valuation_explain`)를 도입해 최근 평가 메타데이터를 근거로 “왜 30억인가(HOLD·seed prior)”를 설명하도록 연결.

3) 데이터 수집 루프(정확도 개선)  
   - HOLD 시 누락 지표(revenue, growth_rate, team_size, tech_advantage)를 안내하고 입력(또는 파일 보강) 후 재평가를 트리거. Slack 버튼/모달은 향후 작업으로 분리 문서화.

---

## 재현/검증 절차
- HOLD 확인: `rb8001/logs/rb8001.log`에서 `Insufficient IR metrics` 검색.  
  - 예: `rg -n "Insufficient IR metrics" rb8001/logs/rb8001.log`
- UNKNOWN 확인: 동일 로그에서 `의도 매칭 실패 - UNKNOWN` 검색.  
  - 예: `rg -n "의도 매칭 실패 - UNKNOWN" rb8001/logs/rb8001.log`
- 코드 기준선:  
  - HOLD 라벨 미표시: `workflows/coldmail_workflow.py:124-127`  
  - 설명/이유 패턴 부재: `decision_engine.py:114-120`

---

## 검증(테스트)
- 테스트 위치: `rb8001/tests/`
  - `test_coldmail_display_and_routing.py` — 기존 동작 재현(UNKNOWN, HOLD=seed 30, 요약에 HOLD 미표시)
  - `test_acceptance_proposed_improvements.py` — 개선 기대 동작(요약 HOLD/누락지표 표기, 설명/이유/밸류/30억 질의 UNKNOWN 아님)
- 실행 명령: `cd rb8001 && pytest -q tests/test_coldmail_display_and_routing.py tests/test_acceptance_proposed_improvements.py`
- 결과: 5 passed  
  - 표시 개선: HOLD/누락지표 표기 확인  
  - 라우팅 보강: “설명/이유/밸류/30억” 질의가 UNKNOWN이 아닌 적절 라우팅으로 분류 확인

---

## 배포/사후 점검
- 서비스 코드 변경: 
  - `app/services/workflows/coldmail_workflow.py`: HOLD(초안) 라벨·누락지표 표기 추가
  - `app/brain/decision_engine.py`: 설명/이유/밸류/30억 패턴 추가(UNKNOWN 방지)
  - `app/services/coldmail_processor.py`: processed_results에 `valuation_result.metadata` 포함 (HOLD/누락지표 전달)
- 커밋: `c8026b1`, `d166743` (main) — Gitea Actions 자동 배포 트리거
- 서비스 헬스체크: `curl -sf http://192.168.219.52:8001/health` → healthy 확인  
  - 서버 내 점검 가이드(51124): `curl -sf http://localhost:8001/health`, `docker compose ps`, `docker logs rb8001 --tail 100`

---

## 교훈
- 지표 부재(HOLD) 상태의 수치 표기는 ‘초안’/‘사전값’/‘근거’와 함께 명시해 오해를 방지해야 한다.  
- 사용자 표현(“설명해줘/이유/30억/밸류에이션”)을 패턴에 반영하지 않으면 의도 인식 실패로 품질이 하락한다.  
- 로그 근거(KST, 파일/라인)와 코드 기준선을 함께 정리하면 재현/수정/검증 사이클이 빨라진다.
