# 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_문서_작성_원칙.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 문서를 연결한다.