# Watchdog 회장 정의 재정의 — TRUE positive 전용 ★ Lv.3 critical

## 작업 레벨: Lv.3 critical (회장 명시 승인)

## 회장 명시 정의 (2026-05-03)
> "실제로 의도된, 오류중인 것만 와치독 발생하면 문제삼지 않아.
> 작업이 진행되고 있거나, 다 완료했다고 하는데 오작동하는게 싫은거야."

## 핵심 원칙 (절대 의무)

### OK 알람 (TRUE positive — 발생해도 됨)
- 봇 진짜 죽음 + 후속 처리 없음 + 회장 인지 안 됨
- = 진짜 stalled (누구도 모르는 죽음)

### NG 알람 (FALSE positive — 절대 금지)
1. **진행 중 작업** (정상 long-running): PR 생성 / G3 검증 / Codex CLI / QC 진행 / 외부 도구 호출
2. **완료된 작업**: `.done` 또는 `.done.acked` 발급됨
3. **회장 인지된 작업**: `.escalate.acked` 발급됨 (= "회장 봤음 + 알람 그만")
4. **후속 처리 위임된 작업**: 재작업 task 생성됨 (예: task-2389 → task-2401, task-2390 → task-2402)
5. **보고서 존재 + 산출물 git 적용**: 검증 통과 (verifier false positive로 .done 막혀도)

## 진단 (현 코드의 회장 정의 위반 4건)

| 위반 | 현 코드 | 회장 의도 |
|---|---|---|
| **A. acked 의미 반전** | `.escalate.acked` 있으면 정상 처리 재개 → **알람 다시** | acked = "회장 인지 = 알람 그만" → **계속 skip** |
| **B. 완료 인식 미흡** | `.done` 발급돼도 status=running이면 검사 | `.done`/`.done.acked`/보고서 존재 → 자동 status 박제 → 검사 제외 |
| **C. 후속 task 미연결** | 원본 task status=running 그대로 → 알람 계속 | 후속 task 위임 시 원본 자동 `status=escalated` 박제 |
| **D. 진행 마커 화이트리스트 미완** | 일부만 적용 (이참나 fix#7) | 전체 진행 마커 (`.codex-gate`, `.qc-done`, `.done.merging`, `.pr-creating`, `.external-running`) 어느 하나라도 있으면 알람 X |

## 작업 범위

### Fix A — `.escalate.acked` 의미 반전 (line 196-200)
**현재**:
```bash
should_skip_for_escalate() {
    local esc="${EVENTS_DIR}/${task_id}.escalate"
    local acked="${EVENTS_DIR}/${task_id}.escalate.acked"
    if [[ -f "$esc" && ! -f "$acked" ]]; then
        return 0  # skip
    fi
    return 1
}
```
**변경**:
```bash
should_skip_for_escalate() {
    local esc="${EVENTS_DIR}/${task_id}.escalate"
    local acked="${EVENTS_DIR}/${task_id}.escalate.acked"
    # 회장 정의: escalate 또는 acked 어느 하나라도 있으면 skip (회장 인지 = 알람 그만)
    if [[ -f "$esc" || -f "$acked" ]]; then
        return 0  # skip
    fi
    return 1
}
```

### Fix B — 완료 인식 자동 박제 (RUNNING_TASKS 필터 강화, line 219 부근)
- 검사 진입 시점에 추가 체크:
  - `<task>.done` 존재 → status 자동 escalated 박제 + skip
  - `<task>.done.acked` 존재 → 위와 동일
  - `<task>.done.notified` 존재 → 위와 동일
- 이 박제는 watchdog가 직접 수행 (dispatch나 finish-task 의존 X)

### Fix C — 후속 task 자동 박제 (신규 함수)
- task md에 `## 배경` 또는 `## 진단`에 다른 task ID 언급 시 (예: "task-2389 재작업", "task-2390 후속") → 원본 task 자동 escalated 박제
- 또는 별도 마커: `<task_orig>.superseded_by` 파일에 후속 task ID 저장 → 원본 자동 박제
- 위임 시 dispatch.py에서 자동 생성 권고 (단, dispatch.py forbidden — task md에 명시만)

### Fix D — 진행 마커 화이트리스트 완전 적용 (이참나 #7 마무리)
- 다음 마커 어느 하나라도 존재 시 stalled 판정 절대 금지:
  - `<task>.codex-gate`
  - `<task>.qc-done`
  - `<task>.done.merging`
  - `<task>.pr-creating` ← 신규 마커
  - `<task>.external-running` ← 신규 마커
- ACTIVE_MARKERS 변수에 `git rev-parse --is-inside-work-tree` 등 long-running 도구 호출 PID 검사 추가

## 회귀 테스트 (15+ 시나리오)
**파일**: `tests/test_watchdog_chairman_definition.py` (신규)

1. `.escalate.acked` 발급 → skip (Fix A)
2. `.escalate` 단독 → skip (acked 없어도)
3. `.escalate` 둘 다 부재 → 정상 검사
4. `.done` 발급 → 자동 박제 + skip (Fix B)
5. `.done.acked` 발급 → skip
6. `.done.notified` 발급 → skip
7. 후속 task md에 원본 task ID 언급 → 원본 자동 박제 (Fix C)
8. `<task>.superseded_by` 마커 → skip
9. `.codex-gate` 마커 → skip (Fix D)
10. `.qc-done` 마커 → skip
11. `.done.merging` 마커 → skip
12. `.pr-creating` 마커 → skip (신규)
13. `.external-running` 마커 → skip (신규)
14. **TRUE stalled 시나리오**: 봇 죽음 + 마커 0 + 후속 task 0 + .escalate 부재 → 정상 알람 1건
15. **FALSE positive 차단 종합**: 회장 정의 5 NG 케이스 모두 0 알람 검증
16. 기존 14 회귀 테스트 (이참나 작품) PASS 유지

## 검증 시나리오 (회장 정의 직접)
1. 15+/PASS (pytest)
2. **L1 30분 실 운영**: 현 task 상태 (task-2389/2390/2391/2392/2394/2396/2399 모두 escalated 박제됨) → false alert **0건** 확인
3. 회귀 0: dispatch.py / done-watcher.py / finish-task.sh / 다른 watchdog 미수정
4. mypy/pyright 0 + shellcheck 0
5. 보고서에 회장 정의 OK/NG 매트릭스 + L1 30분 결과 의무

## affected_files

### 수정 (1개)
- `scripts/session-watchdog.sh`

### 신규 (2개)
- `tests/test_watchdog_chairman_definition.py`
- `memory/reports/task-XXXX-watchdog-chairman.md`

### 변경 금지
- `dispatch.py`, `scripts/auto_merge.py`, `scripts/done-watcher.py`, `scripts/finish-task.sh`
- `scripts/whisper-compile.py`, `scripts/bot_status_resolver.py`
- `scripts/worktree_manager.py`, `scripts/cleanup_stale_task_counter.py`
- `scripts/auto_e2e_gate.py`, `scripts/motion_render_queue.py`, `scripts/ids_phase_monitor.py`
- `scripts/session_watchdog.py`, `scripts/orphan-watchdog.py`, `scripts/bot-status-watchdog.py`
- `skills/**`, `resources/design-md/**`, `teams/shared/**`, `CLAUDE.md`
- `memory/capabilities/**`, `memory/audit/**`, `memory/state/**`, `.github/**`
- `memory/events/**` (90일 미만)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "scripts/session-watchdog.sh"
    - "tests/test_watchdog_chairman_definition.py"
    - "memory/plans/tasks/task-XXXX/**"
    - "memory/reports/task-XXXX-watchdog-chairman.md"
  forbidden_paths:
    - "dispatch.py"
    - "scripts/auto_merge.py"
    - "scripts/done-watcher.py"
    - "scripts/finish-task.sh"
    - "scripts/whisper-compile.py"
    - "scripts/bot_status_resolver.py"
    - "scripts/worktree_manager.py"
    - "scripts/cleanup_stale_task_counter.py"
    - "scripts/auto_e2e_gate.py"
    - "scripts/motion_render_queue.py"
    - "scripts/ids_phase_monitor.py"
    - "scripts/session_watchdog.py"
    - "scripts/orphan-watchdog.py"
    - "scripts/bot-status-watchdog.py"
    - "scripts/ids_natural_routing.py"
    - "skills/**"
    - "resources/design-md/**"
    - "teams/shared/**"
    - "CLAUDE.md"
    - "memory/capabilities/**"
    - "memory/audit/**"
    - "memory/state/**"
    - ".github/**"
  commands:
    - "pytest"
    - "bash"
    - "shellcheck"
    - "python3"
    - "git log"
    - "git diff"
    - "ls"
    - "stat"
    - "test"
  merge_policy: "tiered"
  ttl_hours: 24
```

## 작업 원칙
- **회장 정의 절대 의무**: TRUE positive만 알람, FALSE positive 0
- **3 Step Why**:
  - 1st: 왜 acked 의미 반전이 필요한가? → 회장 정의 "acked = 알람 그만"과 코드 정의 "acked = 처리 재개" 충돌
  - 2nd: 왜 이참나 fix가 부족한가? → fix#3은 acked 없을 때만 skip (= 회장 정의의 절반만)
  - 3rd: 왜 4 fix가 모두 필요한가? → A/B/C/D 어느 하나라도 빠지면 회장 NG 5 케이스 중 일부 발생
- **Surgical**: session-watchdog.sh 1개만 수정
- **재발 방지**: 회귀 15개로 회장 정의 5 OK/NG 매트릭스 모두 카바
- 이참나 fix 위에 **추가 보강**, 덮어쓰기 X (line 196 함수 변경 + 진입 필터 추가)

## 운영
- ★ Lv.3 critical (회장 정의 명시)
- TTL 24h
- 위임: dev2-team (오딘, E2E 게이트 컨텍스트, 안정적)
- finish-task.sh 누락 금지

## 참조
- 회장 명시 2026-05-03 정의: TRUE positive 전용
- 이참나 task-2399 fix (`c3fd704c`) 위 보강
- 회장 메모리 `bug_dispatch_after_reboot.md`
- 회장 4 목표 #1 무오류 (시스템 인프라 직접)