# 260304 51124 먹통 근본원인 해결계획

**작성일**: 2026-03-04
**상태**: 미구현
**목표**: 51124 먹통의 근본 원인(의도분류 재진입 루프)을 제거하고 restart loop 재발을 차단한다.

---

## 1. 기준 문서
- [51124 먹통 원인 확정 리서치](../research/260304_51124_먹통_48시간_코드차분_원인확정_리서치.md)
- [51124 먹통 사용자 시나리오](../scenarios/260304_아침브리핑_지연_먹통_복구_사용자시나리오.md)
- [51123 임시복구 조치내역](../troubleshooting/260304_51123_임시복구_서비스연속성_조치내역.md)
- [문서 작성 원칙](../../book/300_architecture/312_writing-principles.md)

## 2. 근본 원인(확정)
- `INTENT_ENGINE=graph` + `INTENT_USE_LANGGRAPH=true`에서
- `IntentGraph.detect_with_workflow()` -> `classify_intent_node()` -> `IntentGraph.detect()` 재진입 루프가 발생한다.
- 이 재진입 루프가 `Restarting` 반복과 CPU 폭주의 직접 원인이다.

## 3. 범위 고정
### 포함
- 51124 실환경 설정값 확인
- 재진입 루프 차단 코드 수정
- 회귀 테스트 추가
- 51124 재배포 및 재발 판정

### 제외
- 23/24 자동 전환(페일오버)
- 스케줄러 구조 개선
- DB 풀 일반 튜닝
- 타 서비스 기능 개선

## 4. 실행 계획
1. 51124 실환경 값 확정
- 51124에서 `INTENT_ENGINE`, `INTENT_USE_LANGGRAPH` 실제 값을 확인한다.
- 확인 증적(명령 출력)을 남긴다.
- 값 미확정 상태에서는 다음 단계를 진행하지 않는다.

2. 재진입 차단 코드 수정
- 파일: `robeing/rb8001/app/services/brain/intent_graph.py`
- `detect()`에 내부 호출 가드를 추가한다.
- workflow 내부 호출이면 `detect_with_workflow()`를 금지하고 `_detect_traditional()`만 실행한다.

- 파일: `robeing/rb8001/app/services/brain/intent_langgraph_workflow.py`
- `classify_intent_node()`의 `IntentGraph.detect()` 호출에 내부 호출 가드를 명시한다.
- classify 단계는 단일 분류 실행으로 종료한다.

3. 운영 기본값 안전화
- 파일: `robeing/rb8001/docker-compose.yml`
- 기본값을 아래로 고정한다.
- `INTENT_USE_LANGGRAPH=${INTENT_USE_LANGGRAPH:-false}`
- `INTENT_ENGINE=${INTENT_ENGINE:-v1}`

4. 회귀 테스트 추가
- 파일: `robeing/rb8001/tests/test_intent_workflow_no_reentry.py`
- 검증 항목:
- workflow classify 단계에서 `detect_with_workflow()` 재호출 0회
- `INTENT_ENGINE=graph` + `INTENT_USE_LANGGRAPH=true`에서도 단일 요청 정상 종료

5. 51124 배포 및 검증
- 배포: `docker compose down && docker compose up -d --build`
- 검증은 실도메인(`https://ro-being.com`) 기준으로만 수행한다.
- 30분 관찰 구간을 고정한다.

## 5. 완료 판정
- `rb8001` 컨테이너 `Restarting` 0회
- `RecursionError` 0건
- `GRAPH_RECURSION_LIMIT` 0건
- `https://ro-being.com/api/message` 3회 연속 성공
- 30분 관찰 동안 운영자 조작 불가 구간 0회

## 6. 실패 시 처리
- 완료 판정 1개라도 미달이면 미완료로 유지한다.
- 실패 원인과 증적을 troubleshooting 문서로 분리 기록한다.
- 본 문서에는 troubleshooting 링크만 추가한다.

## 7. 문서 상태 전환
- 위 완료 판정 전부 충족 시 본 문서를 `plans/archive/`로 이동한다.
- 이동과 동시에 완료 troubleshooting 문서를 연결한다.
