# task: 위스퍼 봇 트래킹 수정 — stuck processing 자동 복구

## 문제
bot-activity.json에서 봇 상태가 "processing"으로 영구 고정되는 버그.
원인: 팀이 작업 완료 후 finish-task.sh를 호출하지 않으면 set_bot_idle()이 실행되지 않아 상태가 영원히 "processing"으로 남음.

## 현재 구조
- dispatch.py (line 499): set_bot_status("dev1-team", "processing") → 작업 시작 시 processing으로 설정
- finish-task.sh → notify-completion.py → set_bot_idle(team_id) → 작업 완료 시 idle로 복귀
- 문제: finish-task.sh가 호출 안 되면 idle 복귀 경로가 없음

## 파일 위치
- bot-activity.json: `/home/jay/workspace/memory/events/bot-activity.json`
- activity-watcher: `/home/jay/workspace/scripts/activity-watcher.py`
- notify-completion: `/home/jay/workspace/scripts/notify-completion.py`
- finish-task.sh: `/home/jay/workspace/scripts/finish-task.sh`
- done-watcher: `/home/jay/workspace/scripts/done-watcher.py` (또는 유사 스크립트)

## 작업 내용

### 1. 워치독 스크립트 생성
- 파일: `/home/jay/workspace/scripts/bot-status-watchdog.py`
- 기능:
  1. bot-activity.json 읽기
  2. 각 봇의 status가 "processing"인데 since가 30분 이상 경과한 경우 → "idle"로 자동 전환
  3. 전환 시 로그 기록: `[WATCHDOG] dev2: processing → idle (timeout 35m)`
  4. 로그 파일: `/home/jay/workspace/logs/bot-watchdog.log`
- 단독 실행 가능: `python3 bot-status-watchdog.py` (1회 실행)
- --daemon 모드: 5분마다 반복 체크 (`python3 bot-status-watchdog.py --daemon`)

### 2. activity-watcher.py에 워치독 로직 통합
- activity-watcher.py의 메인 루프에 워치독 체크 추가
- 매 루프마다 stuck 상태 확인 + 자동 복구
- 기존 activity-watcher가 이미 데몬으로 돌고 있으므로, 별도 데몬 불필요하게 통합

### 3. notify-completion.py 방어 코드 강화
- set_bot_idle() 호출을 try/except로 감싸서 실패해도 로그 남기기
- .done 파일 생성 직후에도 set_bot_idle() 호출 (현재는 맨 끝에서만 호출)

### 4. finish-task.sh 미호출 시 대비
- DIRECT-WORKFLOW.md에서 finish-task.sh 호출은 이미 지시되어 있음
- 추가 방어: notify-completion.py가 .done 파일 감지 시에도 set_bot_idle() 호출하도록
- done-watcher가 .done 파일을 감지하면 해당 팀의 bot-activity를 idle로 갱신

## 검증
- bot-activity.json에서 dev1을 수동으로 "processing" + 40분 전 시간으로 설정
- watchdog 실행 → "idle"로 자동 전환 확인
- 로그에 [WATCHDOG] 기록 확인
- activity-watcher 통합 시 기존 기능(전환 감지, telegram 알림) 정상 동작 확인

## 주의사항
- bot-activity.json 파일 잠금(lock) 고려 — 여러 프로세스가 동시에 쓸 수 있음
- 워치독이 정상 작업 중인 봇을 강제 idle로 바꾸면 안 됨 → 30분 타임아웃은 충분히 보수적
- 기존 activity-watcher.py 구조를 최대한 유지하고 워치독 로직만 추가