# task-2324 보고서: Playwright 좀비 Chrome 프로세스 근본 해결

## SCQA

### S - Situation
팀 봇이 E2E/스모크테스트 시 Playwright MCP로 Chrome을 띄워 테스트를 수행한다.

### C - Complication
테스트 완료 후 browser_close를 호출하지 않아 좀비 Chrome renderer 프로세스가 CPU 150~220%를 점유하며 서버 CPU가 98%까지 치솟는 장애가 2026-04-29, 04-30 연속 발생했다. 자동 정리 메커니즘이 전무했다.

### Q - Question
좀비 Chrome 프로세스를 근본적으로 방지하고 자동 정리하여 서버 장애를 재발 방지할 수 있는가?

### A - Answer
4가지 원인(finish-task.sh 미정리, workflow 미의무화, 자동 정리 부재, 타임아웃 부재) 중 3가지를 해결하여 3중 방어 체계를 구축했다.

---

## 수행 내용

### 1. finish-task.sh에 Chrome 정리 로직 추가
- 위치: `# 2.6.9` (팀원 idle 복원 직전)
- 동작: SIGTERM → 1초 대기 → SIGKILL (graceful + force)
- 패턴: `ms-playwright.*chromium.*chrome`, `ms-playwright.*chrome-headless-shell`

### 2. DIRECT-WORKFLOW.md에 browser_close 의무화
- Step 4.8 L1 스모크테스트 섹션에 "★ Playwright 브라우저 정리 (필수)" 체크리스트 추가
- 체크리스트: 스크린샷 완료 → browser_close → ps aux 잔존 확인

### 3. cleanup-zombie-chrome.sh 자동 정리 스크립트 생성
- CPU 100%+ renderer 즉시 kill
- 60분 이상 실행 프로세스 자동 kill
- /tmp, .cache 임시 파일 정리

### 4. systemd timer 등록
- 5분 간격 자동 실행
- `systemctl --user enable --now cleanup-zombie-chrome.timer`

---

## 생성/수정 파일 목록

- `/home/jay/workspace/scripts/finish-task.sh` (수정 — 354~362줄 Chrome 정리 추가)
- `/home/jay/workspace/prompts/DIRECT-WORKFLOW.md` (수정 — 326~333줄 browser_close 의무화)
- `/home/jay/workspace/scripts/cleanup-zombie-chrome.sh` (신규 — 자동 정리 스크립트)
- `/home/jay/.config/systemd/user/cleanup-zombie-chrome.service` (신규)
- `/home/jay/.config/systemd/user/cleanup-zombie-chrome.timer` (신규)
- `/home/jay/workspace/memory/events/task-2324.security-audit` (신규 — 보안 감사 결과)

---

## L1 스모크테스트 결과

- L1-1: cleanup-zombie-chrome.sh 수동 실행 — **PASS** (에러 없이 완료)
- L1-2: systemd timer active — **PASS** (`active (waiting)`)
- L1-3: finish-task.sh 문법 검사 — **PASS** (`bash -n` 통과)
- L1-4: DIRECT-WORKFLOW.md browser_close 존재 — **PASS** (2건)
- L1-5: 좀비 Chrome 프로세스 0건 — **PASS**

### 테스트 실행 결과

```
$ bash /home/jay/workspace/scripts/cleanup-zombie-chrome.sh
(정상 완료 — exit 0, 좀비 프로세스 없으므로 출력 없음)

$ systemctl --user is-active cleanup-zombie-chrome.timer
active

$ bash -n /home/jay/workspace/scripts/finish-task.sh
(문법 검사 통과 — exit 0)

$ grep -c "browser_close" /home/jay/workspace/prompts/DIRECT-WORKFLOW.md
2

$ ps aux | grep -E 'ms-playwright.*chrome' | grep -v grep | wc -l
0

$ pytest tests/ -q --tb=short
2524 passed, 2 warnings
```

---

## 보안 감사 (로키)

- **감사자**: 로키 (opus)
- **결과**: PASS (조건부)
- **MEDIUM 1건**: `chrome-headless-shell` 패턴 광범위 → **수용**: `ms-playwright.*chrome-headless-shell`로 한정 (2차 커밋)
- **LOW 4건**: 경쟁 조건(단일유저 환경 무방), 디스크 정리(안전), 권한 상승 없음, 시스템 부하 없음
- 감사 결과 파일: `/home/jay/workspace/memory/events/task-2324.security-audit`

---

## 발견 이슈 및 해결

- **MEDIUM 이슈 (해결)**: `chrome-headless-shell` pkill 패턴이 Playwright 외 프로세스를 오살할 수 있음 → `ms-playwright.*` 접두사 추가로 해결
- **범위 외**: MCP 레이어 자체 타임아웃 설정(원인 4)은 playwright-mcp 래퍼 수정이 필요하여 별도 작업으로 분리 권장

---

## 모델 사용 기록

- **불칸(sonnet)**: MT-1 finish-task.sh 수정, MT-2 DIRECT-WORKFLOW.md 수정, MT-3 cleanup-zombie-chrome.sh 생성
- **로키(opus)**: Lv.4 보안 감사 — 5개 취약점 분석, MEDIUM 1건 + LOW 4건 발견
- **팀장(opus)**: MT-4 systemd 등록, 전체 통합/검증/보고서 작성

---

## 미구현 사항 (선택/권장)

- Telegram 알림 연동: 좀비 kill 발생 시 알림 (task 명세에서 선택사항)
- MCP 레이어 타임아웃: playwright-mcp 래퍼에 자동 정리 설정 (별도 작업 필요)
