# 인슈위키 정제 이력 동적 연동 + stuck 원인 분석/개선

## 배경
대시보드 InsuWiki 탭 정제 이력에서 2가지 문제 발생. 제이회장님 직접 확인.

## 문제 1: 정제 이력 status가 동적으로 갱신되지 않음

**증상**: 정제 프로세스를 kill하거나 비정상 종료해도 이력의 status가 "running"으로 남아있음.
현재 이력 상태:
- 14:45 → running (프로세스 종료됨)
- 14:20 → running (프로세스 종료됨)
- 14:03 → running (프로세스 종료됨)
- 이전 건들 → failed

**원인**: `routes_post.py`에서 정제 시작 시 이력에 `"status": "running"`으로 기록한 뒤, 프로세스 종료 시 이력 status를 업데이트하지 않음.

**수정 방안**:
1. `/api/wiki/refine/history` GET 응답 시 각 이력의 status를 동적 판단:
   - lock 파일의 PID와 이력의 PID 비교
   - 해당 PID 프로세스가 살아있으면 → running
   - 프로세스가 죽었고 progress < 100% → failed (또는 cancelled)
   - 프로세스가 죽었고 progress >= 100% → completed
   - 또는: refine-status.json의 현재 status를 가장 최근 이력에 반영

2. 이력 데이터 파일 위치 확인: `dashboard/data/refine-history.json`
3. `routes_get.py`의 `handle_get_wiki_refine_history()` 함수에서 반환 전 status 동적 보정

4. 기존 "running" 상태 이력 정리:
   - 현재 진행 중인 정제가 없으면(lock 파일 없음 또는 PID 죽음) running → failed/cancelled 로 일괄 업데이트

## 문제 2: LLM 스레드 정밀 분리에서 stuck

**증상**: 정제 시작 후 5%에서 8분 이상 멈춤. "LLM 스레드 정밀 분리 중 (218개 스레드)" 단계.
프로세스 상태: sleeping, 1 thread. 로그 갱신 없음.

**원인 분석 필요**:
1. LLM API 호출 타임아웃 설정 확인
   - `knowledge_extractor_v2.py`에서 LLM 호출 시 timeout 파라미터 존재 여부
   - API 키 만료 또는 rate limit 가능성
2. `_split_threads_v2()` 함수의 LLM 정밀 분리 로직 확인
   - 218개 스레드를 한 번에 보내는지, 배치로 나누는지
   - 진행 로그가 왜 안 찍히는지 (try/except에서 예외 삼킴?)
3. stderr/stdout 확인 (subprocess PIPE)

**수정 방안**:
1. LLM 호출에 timeout 추가 (없으면): 60초 timeout
2. LLM 정밀 분리 단계에서도 progress 업데이트 + 로그 기록
   - 현재: 분리 시작 로그만 있고 진행 로그 없음
   - 수정: 각 LLM 호출마다 로그 추가 ("LLM 분리 응답 대기 중...", "LLM 분리 완료: N개 스레드 재분류")
3. LLM 호출 실패 시 graceful fallback (규칙 기반 분리로 대체)
4. stuck 감지: 일정 시간(5분) progress 변화 없으면 자동 스킵 또는 경고

## 영향 파일
- `/home/jay/workspace/dashboard/routes_get.py` — 수정 (이력 status 동적 보정)
- `/home/jay/projects/insuwiki/scripts/kakao_knowledge/knowledge_extractor_v2.py` — 수정 (LLM timeout + 진행 로그)

## 검증 시나리오
1. 프로세스 없는 상태에서 `/api/wiki/refine/history` → 모든 이력 status가 running이 아닌 적절한 상태
2. 정제 실행 중 `/api/wiki/refine/history` → 가장 최근 이력만 running
3. LLM 정밀 분리 단계에서 로그가 갱신되는지 확인
4. LLM 호출 타임아웃 시 graceful fallback 동작 확인
5. 서버 재시작 후 동작 확인

## 주의
- routes_get.py 대용량 (~93KB) — offset/limit
- knowledge_extractor_v2.py는 insuwiki 프로젝트 (`/home/jay/projects/insuwiki/scripts/`)
- insuwiki 수정 시 worktree 사용, 머지 필요
- 수정 후 즉시 커밋
- 서버 재시작 필요
