---
task_id: task-2399
type: plan
scope: task
created: 2026-05-03
updated: 2026-05-03
status: completed
---

# 계획서: task-2399 — Watchdog 노이즈 제거 + 죽음 판정 정밀화

**task**: task-2399
**목표**: false stalled 알람 0건. "있는 그대로" 죽음 판정 (PID + 단계 마커 + PR 상태 + worktree 교차)
**승인**: 제이회장 2026-05-03 "심층분석해서 개선해! 개판칠거면 하지마"
**근거**: memory/tasks/task-2399.md (회장 명시 9건 버그 진단)

---

## 목표

1. **false alert 0건**: heartbeat 노후만으로 stalled 판정 금지. AND 조건 (PID + 마커 + events mtime + PR/worktree).
2. **알람 통합**: 한 task = 한 알람 (no-taskfile + stalled-alert-only 중복 push 차단).
3. **escalate 마커 존중**: `<task>.escalate` 존재 시 알람 억제. `.escalate.acked` 시 정상 처리 재개.
4. **task 종류 차등 heartbeat**: design=30분, code=10분.
5. **알람 본문 디버깅 정보 필수**: task_file 존재/escalate 상태/heartbeat last 포함.
6. **장기실행 화이트리스트**: codex-gate, qc-done, done.merging, pr-creating(신규), external-running(신규) 마커 존재 시 stalled 절대 금지.

## 범위

### 포함
- `scripts/session-watchdog.sh` 수정 (1개 파일)
- `tests/test_watchdog_noise_elimination.py` 신규 (12+ 시나리오)
- `memory/reports/task-2399.md` 신규 (보고서)

### 제외 (다음 페이즈 이후)
- forbidden_paths(dispatch.py/bot_status_resolver.py/done-watcher.py/finish-task.sh 등) 절대 미수정
- 새로운 watchdog 도입 X
- bot_status*.json 직접 수정 X (resolver 호출만)

## 위임 계획

- 분석/설계: **이참나** (팀장 직접) — 9 root-cause 검증, 3문서, Codex 사전 검증
- 코드 수정: **쿠쿨칸** (백엔드) — session-watchdog.sh 수정
- 테스트 작성: **카마소츠** (테스터) — pytest + bash 회귀 12+
- 통합 검증: **이참나** (팀장) — L1 30분 모니터링 + 보고서 + finish-task

## 검증 기준

- pytest tests/test_watchdog_noise_elimination.py: 12+ PASS
- shellcheck scripts/session-watchdog.sh: 0 error
- L1: bash session-watchdog.sh 1회 실행 → false alert 0건
- L1: 30분 모니터링 (15 사이클) → false alert 0건
- 기존 tests/test_session_watchdog.py 회귀: 0
