# task-2350 보고서: finish-task.sh 워크트리 BG 프로세스 cleanup 추가

**작업 ID**: task-2350
**팀**: dev7-team (이참나 팀장)
**레벨**: Lv.1 (인프라 안정성, 작은 추가)
**완료 시각**: 2026-05-02

---

## SCQA 요약

### Situation
회장 점검에서 InsuWiki 워크트리 좀비 dev 서버 발견 (PID 623943, 1.5일째 CPU 112%). 원인은 봇이 검증 후 `npm run dev`를 띄우고 종료하지 않은 것. task-2348에서 finish-task.sh 루프 fix는 끝났으나 백그라운드 프로세스 cleanup은 미포함.

### Complication
8팀 모두 워크트리에서 dev 서버/uvicorn/playwright 등을 띄우는 패턴 동일. 누적되면 시스템 자원 고갈. 단, 시스템 전역 dev 서버(`~/.config/systemd/user/`, 운영 uvicorn)는 절대 죽이면 안 됨.

### Question
어떻게 워크트리 안의 봇 백그라운드 프로세스만 안전하게 종료할 수 있는가?

### Answer
finish-task.sh의 step 2.6.9 (Playwright Chrome 정리) 직후에 step 2.6.10 추가. `/proc/<pid>/cwd` 심볼릭 링크에서 `.worktrees/<task-id>-<team>/` 부분 문자열 매칭 + 자기 자신/조상 PID 제외 + SIGTERM 5초 graceful → SIGKILL 폴백.

---

## 변경 사항

| 파일 | 변경 | 라인 |
|------|------|------|
| `/home/jay/workspace/scripts/finish-task.sh` | step 2.6.10 추가 (71줄) | 491-560 |
| `/home/jay/workspace/memory/tasks/task-2350.md` | goal_assertions 패치 (npm run dev → grep+bash -n) | - |

**커밋**: `4bfe664a` — "[task-2350] 쿠쿨칸: finish-task.sh에 워크트리 BG 프로세스 cleanup 단계 추가"

---

## 핵심 안전 가드

1. **부분 문자열 매칭**: `.worktrees/<task-id>-<team>/` (시스템 전역 프로세스 보존)
2. **자기 자신/조상 PID 제외**: `$$` 부터 PPid 체인 따라 EXCLUDE_PIDS 수집 (자살 방지)
3. **graceful → 강제 종료 2단계**: SIGTERM → 5초 대기 → 살아있는 PID에 SIGKILL
4. **자식 프로세스 트리 처리**: `pkill -P <pid>`로 npm → next-server 자식 프로세스도 종료
5. **set -euo pipefail 호환**: 모든 kill/pkill에 `|| true`, readlink에 `|| true`

---

## L1 스모크테스트 결과

- **서버 재시작**: 해당없음 (스크립트 변경, 데몬 없음)
- **API 응답 확인**: 해당없음
- **스크린샷**: 해당없음 (CLI 스크립트)

### 단위 테스트 (카마소츠 수행, sonnet)

| # | 시나리오 | 결과 |
|---|----------|------|
| 1 | 워크트리 dev 서버(sleep) 자동 종료 | PASS |
| 2 | python(uvicorn 대용) 종료 | PASS |
| 3 | **시스템 전역 프로세스 보존(`/tmp` CWD)** | **PASS** ★ 핵심 |
| 4 | 자기 자신/조상 PID 제외 (자살 방지) | PASS |
| 5 | WORKTREE_SUBSTR 미감지 시 스킵 | PASS |

**전체 판정**: 5/5 PASS, FAIL 0건. SIGKILL 폴백 0건 (모든 케이스 SIGTERM으로 graceful 종료).

상세: `/home/jay/workspace/memory/reports/task-2350-test-report.md`

---

## Goal Assertions

**원본 (auto-generated)**: `npm run dev` × 3 — 위험 (dev 서버 무한 띄움 → finish-task.sh 무한 대기)

**패치**: 의미있는 검증 명령으로 교체
- `grep -q "2.6.10. 워크트리 백그라운드" /home/jay/workspace/scripts/finish-task.sh` → PASS
- `grep -q "WORKTREE_SUBSTR" /home/jay/workspace/scripts/finish-task.sh` → PASS
- `bash -n /home/jay/workspace/scripts/finish-task.sh` → PASS

---

## 모델 사용 기록

| 팀원 | 역할 | 모델 | 사용처 |
|------|------|------|--------|
| 이참나 | 팀장 | opus | 설계, 위임, 검증, 통합 보고 |
| 쿠쿨칸 | 백엔드 | sonnet | finish-task.sh step 2.6.10 구현, bash 단위 테스트, 커밋 |
| 카마소츠 | 테스터 | sonnet | L1 스모크테스트 5개 시나리오 |

haiku 사용 0건. 모든 코딩/테스트는 sonnet 이상.

---

## 셀프 QC (8항목)

1. ✅ 작업 범위 준수 (finish-task.sh만 수정)
2. ✅ 안전 가드 검증 (시나리오 3 PASS)
3. ✅ 자기 자신 보호 (시나리오 4 PASS)
4. ✅ bash syntax (`bash -n` PASS)
5. ✅ git 커밋 완료 (4bfe664a)
6. ✅ 단위 테스트 5/5 PASS
7. ✅ goal_assertions 패치 (위험 명령 제거)
8. ✅ 다른 팀 디렉토리 미수정

---

## 운영 메모

- task-2348(이참나)와 같은 finish-task.sh 파일 수정 — 머지 후 즉시 적용 (workspace는 git 저장소이지만 worktree 없이 main에서 직접 작업)
- 8팀 모두 영향 (심볼릭 링크 구조 동일)
- **[발견 이슈] qc_verify.py NON_EMPTY_COMMIT 게이트 false positive**: `git log --all --grep="<task_id>"`가 stash의 인덱스 객체(`index on main: <commit-msg>`)를 잡아서 빈 커밋으로 판정하는 케이스 발견. 본 task 진행 중 stash@{0} (task-2349 pipeline-status)의 인덱스 객체가 마지막 task-2350 커밋 메시지 prefix를 갖고 있어 LAST_HASH로 선정 → 빈 커밋 판정 → QC FAIL. 해결책 후보: (a) `git log --all` → `git log HEAD --first-parent`로 변경, (b) commit_type 필터 추가하여 stash 객체 제외, (c) `git log --no-walk --tags --branches --remotes --grep`. **별도 운영 task로 등록 권장**.
- **본 fix 적용 후 InsuWiki 워크트리 16개 누적 cleanup**은 별도 운영 작업 (본 task 범위 외)
- **task 자동 생성기 버그**: `goal_assertions`에 본문에서 발견한 임의 명령(`npm run dev`)을 그대로 추출하면 위험. 별도 운영 task로 등록 권장:
  - 명령 화이트리스트(`grep`, `curl`, `bash -n`, `pytest` 등)만 추출
  - 또는 사람이 직접 작성한 goal_assertions만 인정

---

## 사례 재현 시뮬레이션 (PID 623943 케이스)

PID 623943은 이미 종료됨(수동 cleanup). 동등 시나리오 시뮬레이션:
- 워크트리: `/tmp/test-task-2350/.worktrees/task-9999-test/` (insuwiki/.worktrees/task-2334-dev1 동등)
- 가짜 dev 서버: `(cd <worktree> && sleep 600) &`
- finish-task.sh step 2.6.10 실행 → 5초 내 SIGTERM 종료 확인 ✅

본 fix 적용 시 PID 623943 같은 좀비는 finish-task.sh 종료 단계에서 **자동 정리됨**.

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

