---
task_id: task-2056
type: context
scope: task
created: 2026-04-21
updated: 2026-04-25
status: in-progress
---

# 맥락 노트: task-2056

**task**: task-2056

---

## 결정 근거

### 핵심 결정 1: 프롬프트 전달을 CLI arg에서 stdin으로 전환
- docstring에는 "stdin으로 전달"이라 되어있지만 실제 코드는 `-p prompt` CLI arg로 전달
- 20개 스레드 × 메시지 내용을 포함한 프롬프트는 수십~수백KB에 달함
- CLI arg로 전달하면 OS의 ARG_MAX 제한에 걸리거나 claude CLI 내부에서 파싱 문제 발생 가능
- stdin 전달은 크기 제한 없이 안정적

### 핵심 결정 2: CLAUDECODE 환경변수 제거
- routes_post.py의 handle_post_wiki_refine_start()에서는 `env.pop("CLAUDECODE", None)` 처리하지만,
  _call_claude() 내부에서는 `{**os.environ, ...}`로 CLAUDECODE가 그대로 전달됨
- CLAUDECODE가 설정되면 claude CLI가 비정상 모드로 동작할 수 있음
- 부모 프로세스(dashboard server)에서 CLAUDECODE가 설정되어 있을 때만 발생하는 조건부 버그

### 3 Step Why 자문
1st Why: "왜 프로세스가 5%에서 crash 되는가?"
→ A: `_call_claude()`가 대용량 프롬프트를 CLI arg로 전달하면서 OS/Claude CLI 레벨에서 실패. 에러 핸들링은 있지만, 부모 프로세스 환경(CLAUDECODE 등) 문제가 겹쳐 crash.

2nd Why: "왜 stdin 전달이 최선의 접근인가?"
→ B: CLI arg는 OS ARG_MAX (2MB) 제한이 있고, 프롬프트 크기가 가변적. stdin은 크기 제한 없고, claude CLI가 `-p -` 또는 stdin 입력을 기본 지원. docstring과 실제 구현 일치도 해소.

3rd Why: "왜 B가 다른 대안(예: 파일로 프롬프트 전달)보다 나은가?"
→ C: stdin은 임시 파일 생성/삭제 부담 없이 pipe로 바로 전달. claude CLI의 기본 인터페이스이므로 추가 구현 불필요. 파일 기반은 디스크 I/O + 정리 로직이 필요하고 race condition 위험.

A-B-C 논리적 일관성 확인: ✅

## 참조 자료

- 대시보드 정제 API: `/home/jay/workspace/dashboard/routes_post.py:794-932`
- 정제 엔진: `/home/jay/projects/insuwiki/scripts/kakao_knowledge/knowledge_extractor_v2.py`
- 실패 status: `/home/jay/workspace/dashboard/data/refine-status.json`
- 입력 파일: 10MB, 133K 줄, 3059개 메시지 → 149개 스레드

## 주의사항

- insuwiki 프로젝트 코드 수정이므로 worktree에서 작업 필수
- claude CLI의 `-p` 플래그가 stdin도 받는지 확인 필요 (pipe로 전달)
- 테스트 시 subprocess.run mock 필요
