# task: 워치독 프로세스 생존 체크 추가

## 목표
bot-status-watchdog.py가 idle 전환 전에 실제 claude 프로세스 생존 여부를 확인하도록 수정.
현재는 30분 타임아웃만 보고 무조건 idle로 바꾸는데, 프로세스가 살아있으면 idle로 바꾸면 안 됨.

## 파일
`/home/jay/workspace/scripts/bot-status-watchdog.py`

## 수정 내용

### 1. 봇별 프로세스 존재 확인 함수 추가
각 봇(anu, dev1, dev2, dev3)에 대응하는 claude 프로세스가 살아있는지 확인:
- `ps aux`에서 해당 봇의 workspace 경로로 claude 프로세스 검색
  - anu: `/home/jay/.cokacdir/workspace/autoset` 포함
  - dev1: `teams/dev1` 또는 workspace 경로에 dev1 관련 포함
  - dev2: `teams/dev2` 또는 workspace 경로에 dev2 관련 포함
  - dev3: `teams/dev3` 또는 workspace 경로에 dev3 관련 포함
- 또는 dispatch.py가 생성한 세션의 claude 프로세스 검색

### 2. idle 전환 조건 변경 (핵심)
기존: 30분 초과 → 즉시 idle
변경:
```
if 30분 초과:
    if 해당 봇 claude 프로세스 존재:
        로그: "still_running - 프로세스 살아있음 (PID: xxx), idle 전환 보류"
        idle 전환 안 함
    elif .done 파일 존재:
        로그: "completed - .done 발견, idle 전환"
        idle 전환
    elif 보고서 파일 존재 (memory/reports/):
        로그: "completed - 보고서 발견, idle 전환"
        idle 전환
    else:
        로그: "timeout - 프로세스 없음, 30분 초과, idle 전환"
        idle 전환
```

### 3. 프로세스 검색 방법
```python
import subprocess

def find_bot_process(bot_name: str) -> list[int]:
    """해당 봇의 claude 프로세스 PID 목록 반환"""
    # 봇별 workspace 경로 매핑
    workspace_patterns = {
        "anu": "workspace/autoset",
        "dev1": "teams/dev1",
        "dev2": "teams/dev2",
        "dev3": "teams/dev3",
    }
    pattern = workspace_patterns.get(bot_name, "")
    if not pattern:
        return []

    result = subprocess.run(
        ["pgrep", "-f", f"claude.*{pattern}"],
        capture_output=True, text=True
    )
    pids = [int(p) for p in result.stdout.strip().split('\n') if p.strip()]
    return pids
```

### 4. 로그 포맷
워치독 로그에 판단 근거를 남길 것:
```
[2026-03-17 18:30:00] dev2: 30분 초과 (since 17:48) — 프로세스 살아있음 (PID: 782526), idle 전환 보류
[2026-03-17 19:00:00] dev2: 30분 초과 (since 17:48) — 프로세스 없음, idle 전환
```

## 테스트
- 프로세스 살아있을 때 idle 전환 안 되는지 확인
- 프로세스 없을 때 idle 전환 되는지 확인
- .done 파일 있을 때 idle 전환 되는지 확인

## 주의
- 기존 워치독 로직(30분 타임아웃, 데몬 모드 등) 유지
- idle 전환 조건만 강화
- 프로세스 체크 실패 시(pgrep 에러 등) 안전하게 idle 전환 (기존 동작 유지)