---
task_id: task-2057
type: context
scope: task
created: 2026-04-21
updated: 2026-04-21
status: completed
---

# 맥락 노트: task-2057

**task**: task-2057

---

## 결정 근거

### 근본 원인: output_dir 디렉토리 미생성 상태에서 파일 쓰기 시도

- `_split_threads_v2()` 함수 391-396행에서 체크포인트 파일을 저장할 때 `output_dir`이 존재하지 않으면 `FileNotFoundError` 발생
- `_save_batch()` 함수(263행)에서는 `path.parent.mkdir(parents=True, exist_ok=True)`로 디렉토리를 생성하지만, 체크포인트 저장 코드에서는 이 처리가 누락됨
- 이 에러는 subprocess 내부에서 발생하여 프로세스가 종료되고, 대시보드에서는 "프로세스 비정상 종료"로 표시됨

### 재현 경로
1. 대시보드에서 "카카오톡 정제" 시작 → `handle_post_wiki_refine_start` → subprocess 실행
2. subprocess 내부: `cmd_pipeline_v2` → `extract_knowledge_v2` → `_split_threads_v2`
3. 스레드 분리 완료 후 LLM 정밀 분리 진입 시 체크포인트 저장 → output_dir 미존재 → crash

### 3 Step Why 자문
1st Why: "왜 이 수정이 필요한가?"
→ 체크포인트 저장 시 디렉토리가 없으면 프로세스 전체가 crash하여 정제 기능이 사용 불가능하다.

2nd Why: "왜 mkdir 추가가 최선의 접근인가?"
→ output_dir은 배치 저장에도 쓰이는 디렉토리로, 이미 _save_batch에서 mkdir 패턴이 사용되고 있다. 체크포인트도 동일한 패턴을 적용하면 일관성이 유지된다.

3rd Why: "왜 다른 대안(output_dir을 상위에서 미리 생성)보다 나은가?"
→ _save_batch와 동일한 위치(사용 직전)에서 생성하면, output_dir이 없을 때도 graceful하게 동작한다. 상위에서 미리 생성하면 불필요한 빈 디렉토리가 남을 수 있고, 호출 경로마다 mkdir을 보장해야 해서 유지보수 부담이 증가한다.

## 참조 자료

- 크래시 로그: `dashboard/data/refine-status.json` — progress 5%에서 "프로세스 비정상 종료"
- 실패 이력: `dashboard/data/refine-history.json` — 최근 9건 중 7건 failed
- 소스 코드: `/home/jay/projects/insuwiki/scripts/kakao_knowledge/knowledge_extractor_v2.py:391-396`

## 주의사항

- insuwiki 프로젝트의 코드를 수정해야 함 (dashboard가 아닌 insuwiki/scripts)
- subprocess가 Claude CLI를 호출하므로, CLAUDECODE 환경변수 관련 주의 필요
