# task-1766.1 완료 보고서

## SCQA

**S**: 대시보드(`/home/jay/workspace/dashboard/server.py`)의 정제 시작 API(`/api/wiki/refine/start`)와 resume API(`/api/wiki/refine/resume`)가 `subprocess.Popen()`으로 정제 프로세스를 생성하여 운영 중이다.

**C**: `subprocess.Popen()`이 부모 프로세스 그룹에 속하므로, `systemctl --user restart dashboard` 시 정제 subprocess가 같이 종료된다. 또한 `stdout=subprocess.PIPE, stderr=subprocess.PIPE`를 사용하면서 파이프를 읽지 않아 버퍼 가득 참 → 프로세스 행(hang) 위험이 있다.

**Q**: 대시보드 재시작 시 정제 프로세스가 독립적으로 생존하도록 세션을 분리할 수 있는가?

**A**: 2곳의 `subprocess.Popen()` 호출에 `start_new_session=True`를 추가하여 자식 프로세스를 독립 세션으로 분리하고, 사용하지 않는 `stdout/stderr=subprocess.PIPE`를 `subprocess.DEVNULL`로 변경하여 버퍼 행 위험을 제거했다. 취소 API는 `os.kill(pid, signal.SIGTERM)`으로 PID 직접 지정 방식이므로 독립 세션에서도 정상 동작한다.

## 수정 내역

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

### 변경 사항 (2곳)

**1. 정제 시작 API (5807~5814줄)**
- `stdout=subprocess.PIPE` → `stdout=subprocess.DEVNULL`
- `stderr=subprocess.PIPE` → `stderr=subprocess.DEVNULL`
- `start_new_session=True` 추가

**2. Resume API (6179~6186줄)**
- `stdout=subprocess.PIPE` → `stdout=subprocess.DEVNULL`
- `stderr=subprocess.PIPE` → `stderr=subprocess.DEVNULL`
- `start_new_session=True` 추가

## 셀프 QC

- [x] 1. 영향 파일: server.py 1개만 수정. 취소 API(`/api/wiki/refine/cancel`)는 `os.kill(pid, SIGTERM)` 방식으로 독립 세션에도 정상 전달 — 변경 불필요.
- [x] 2. 엣지 케이스: (a) 파이프 버퍼 오버플로우 → DEVNULL로 해소, (b) 취소 시 SIGTERM 전달 → PID 직접 지정이므로 영향 없음, (c) `_is_process_alive(pid)` → `os.kill(pid, 0)` 사용하므로 세션 무관 정상 동작
- [x] 3. 작업 지시서 일치 확인: `start_new_session=True` + `DEVNULL` 변경 — 지시대로 정확히 수정
- [x] 4. 에러 처리/보안: 기존 try/except 구조 변경 없음
- [x] 5. 테스트: 서버 코드이므로 관련 단위 테스트 없음 (검증 시나리오는 수동 확인 필요)
- [x] 6. 발견 이슈 모두 해결 (아래 참조)
- [x] 7. 아키텍처 원칙 확인: 최소 변경, SOLID/DRY 위반 없음
- [x] 8. 인터페이스 변경 없음 (API 시그니처 동일)

## 발견 이슈 및 해결

### 자체 해결 (1건)
1. **stdout/stderr PIPE 미소비 행 위험** — `subprocess.DEVNULL`로 변경하여 해소 (server.py:5810-5811, 6182-6183)

### 범위 외 미해결 (2건)
1. **pyright: Import "dashboard.data_loader/helpers" could not be resolved** — 기존 이슈. 모듈 경로 설정 문제로 본 작업 범위 외
2. **pyright: Code is too complex to analyze (line 1569, 5308)** — 기존 이슈. server.py의 구조적 복잡도 문제로 본 작업 범위 외

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

## 수정 후 조치
- `systemctl --user restart dashboard`

## QC 검증 결과
- **전체**: WARN (7 PASS, 6 SKIP, 1 WARN)
- **test_runner**: PASS — pytest 15건 전체 통과 (2.45s)
- **tdd_check**: SKIP — Lv.1 작업 (TDD 적용 대상 아님)
- **pyright_check**: SKIP — 기존 복잡도 에러 2건 (line 1568, 5307), 본 작업 미도입
- **style_check**: PASS — black/isort OK
- **claude_md_check**: WARN — design/CLAUDE.md 310줄 (다른 팀 소관)
- **TRUST 5**: T✓ R✓ U✓ S✓ T✓ (5/5)

## 모델 사용 기록
- 팀원: 스바로그 / 작업 내용: subprocess.Popen 2곳 수정 / 사용 모델: haiku / 정당성: 2줄 변경의 단순 편집 작업 (판단 불필요)

## 세션 통계
- 총 도구 호출: 5회

### 수정 파일 목록
- /home/jay/workspace/dashboard/server.py: 2회 (Edit)
- /home/jay/workspace/memory/reports/task-1766.1.md: 2회 (Edit, Write)
- /home/jay/workspace/memory/tasks/task-1766.1.md: 1회 (dispatch)

### 도구 사용 현황
- Edit: 3회
- Write: 1회
- dispatch: 1회

