# task-1784 완료 보고서: All Stop API 자기 프로세스 kill 방지 버그 수정

## S - Situation
`POST /api/system/all-stop` API가 구현되어 대시보드 SystemView에서 모든 Claude 프로세스를 강제 종료하는 기능으로 운영 중이다.

## C - Complication
All Stop API 호출 시 `dashboard/server.py` 프로세스와 `cokacdir` 서비스까지 함께 kill되어, 호출한 대시보드 자체와 봇 관리 서비스가 비정상 종료(exit code 143, SIGTERM)되는 버그가 1팀 curl 테스트에서 발견되었다. 기존 필터링은 `my_pid`와 `"server.py"` 문자열 매칭만 수행하여 cokacdir, systemd, grep 프로세스를 제외하지 못했다.

## Q - Question
EXCLUDE_PATTERNS 기반 필터링으로 대시보드/cokacdir/systemd 프로세스의 안전성을 보장할 수 있는가?

## A - Answer
EXCLUDE_PATTERNS 5개(`dashboard/server.py`, `cokacdir`, `systemd`, `grep`, 자기PID)를 도입하여 프로세스 필터링 로직을 교체했다. 제외된 프로세스는 사유와 함께 `logs/all-stop.log`에 기록되고, API 응답에 `excluded` 카운트가 추가된다. pytest 9건 전체 통과(test_all_stop.py), pyright 에러 0건, 기존 test_server.py 15건 전체 통과(회귀 없음).

---

## 수정 내역

### 변경 파일
- `/home/jay/workspace/dashboard/server.py` (line 5824~5871, 5940)
  - `EXCLUDE_PATTERNS` 상수 추가 (5개 패턴)
  - 프로세스 필터링 루프에 `excluded` 리스트 + `exclude_reason` 판별 로직 추가
  - 로그에 제외 프로세스 기록 (`제외됨: PID=XXX reason=YYY`)
  - API 응답에 `"excluded": len(excluded)` 필드 추가

### 신규 파일
- `/home/jay/workspace/dashboard/tests/test_all_stop.py`
  - 프로세스 필터링 로직 단위 테스트 9건

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **cokacdir 하위 프로세스 미제외** — `"cokacdir"` 패턴을 cmd 문자열 매칭에 추가하여 cokacdir가 실행하는 claude 에이전트도 제외
2. **제외 프로세스 로깅 부재** — `excluded` 리스트를 수집하고 kill 전에 로그 파일에 사유 포함 기록
3. **테스트 파일 미사용 import 경고** — `os`, `pytest` 미사용 import 제거

---

## 테스트 결과

- test_all_stop.py: **9 passed** (0.08s)
  - dashboard 프로세스 제외, cokacdir 제외, systemd 제외, grep 제외, self PID 제외
  - 빈 출력, claude 미포함, 복수 제외, kill 대상 정상 수집
- test_server.py: **15 passed** (2.49s) — 기존 테스트 회귀 없음
- pyright: 에러 0건, 경고 0건 (check-files 대상)

---

## QC 자동 검증 결과

- **Overall**: WARN (5 PASS, 6 SKIP, 3 WARN)
- **TRUST 5차원**: T(Tested) PASS, R(Readable) PASS, U(Unified) PASS, S(Secured) PASS, T(Trackable) PASS
- WARN 사유:
  - `data_integrity`: task-timer 아직 running 상태 (finish-task.sh에서 정리 예정)
  - `tdd_check`: 구현-테스트 순서 (Lv.1 단순 버그 수정으로 TDD 미적용 정당)
  - `style_check`: server.py black 포맷 — 7484줄 기존 파일 포맷 이슈, 본 작업 범위 외

---

## 검증 시나리오 대응

1. All Stop 호출 후 대시보드 응답 — EXCLUDE_PATTERNS에 `"dashboard/server.py"` 포함으로 보장
2. cokacdir 서비스 유지 — `"cokacdir"` 패턴 제외로 보장
3. 제외 프로세스 로그 기록 — `logs/all-stop.log`에 `제외됨: PID=XXX reason=YYY` 포맷으로 기록
4. claude 프로세스 없을 때 `{"status":"ok","killed":0}` — 기존 로직 유지
5. SystemView 기존 기능 — 하위호환 유지 (`excluded` 필드 추가만, 기존 필드 변경 없음)

---

## 모델 사용 기록
- 토르(백엔드): dashboard/server.py all-stop 핸들러 수정 / sonnet
- 헤임달(테스터): test_all_stop.py 테스트 작성 / sonnet

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

### 수정 파일 목록
- /home/jay/workspace/dashboard/tests/test_all_stop.py: 4회 (Edit, Write)
- /home/jay/workspace/dashboard/server.py: 3회 (Edit)
- bash_cmd: 2회 (Bash)
- /home/jay/workspace/memory/reports/task-1784.md: 1회 (Write)
- /home/jay/workspace/memory/tasks/task-1784.md: 1회 (dispatch)

### 도구 사용 현황
- Edit: 6회
- Bash: 2회
- Write: 2회
- dispatch: 1회

