# 정제 subprocess 독립 세션 분리 (대시보드 재시작 시 자식 프로세스 사망 방지)

## Lv.1 작업

## 문제
대시보드(`systemctl --user restart dashboard`) 재시작 시 정제 subprocess가 같이 죽음.
`subprocess.Popen()`이 부모 프로세스 그룹에 속해있어 부모 SIGTERM 시 자식도 종료.

## 수정
`/home/jay/workspace/dashboard/server.py`

정제 시작 API(`/api/wiki/refine/start`)와 resume API(`/api/wiki/refine/resume`)의 `subprocess.Popen()` 호출에 `start_new_session=True` 추가.

### 정제 시작 (약 5656줄)
현재:
```python
proc = subprocess.Popen(
    cmd,
    env=env,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    cwd="/home/jay/projects/insuwiki/scripts",
)
```

변경:
```python
proc = subprocess.Popen(
    cmd,
    env=env,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    cwd="/home/jay/projects/insuwiki/scripts",
    start_new_session=True,
)
```

### resume API (약 6024줄)
동일하게 `start_new_session=True` 추가.

### stdout/stderr 처리 주의
`start_new_session=True` + `stdout=subprocess.PIPE` 조합에서 파이프를 읽지 않으면 버퍼 가득 참 → 프로세스 행(hang) 위험.
현재 코드에서 stdout/stderr를 읽지 않으므로 `subprocess.DEVNULL`로 변경:
```python
proc = subprocess.Popen(
    cmd,
    env=env,
    stdout=subprocess.DEVNULL,
    stderr=subprocess.DEVNULL,
    cwd="/home/jay/projects/insuwiki/scripts",
    start_new_session=True,
)
```

## 검증 시나리오
1. 대시보드에서 정제 시작 → PID 확인 → `systemctl --user restart dashboard` → PID가 여전히 살아있는지 `ps aux | grep <PID>` 확인
2. 정제 시작 후 `ps -o pid,pgid,sid,args -p <PID>` → SID가 대시보드와 다른지 확인 (독립 세션)
3. 정상 정제 진행 → progress 파일 업데이트 정상 동작 확인
4. 정제 취소 API → 독립 세션 프로세스에 SIGTERM 정상 전달 확인

## 수정 후
- 대시보드 재시작: `systemctl --user restart dashboard`

## 보고서
`/home/jay/workspace/memory/reports/task-{TASK_ID}.md`
