# task-619.1: bot-activity.json 실시간 감시 → 완료 즉시 감지 시스템

## 배경
.done 프로토콜이 4번(607.1, 609.1, 613.1, 616.1) 수정에도 완료 감지 신뢰성 문제가 반복됨.
- Pull 모델(616.1)은 위스퍼가 대화 시작 시에만 체크 → **실시간이 아님**
- done-watcher.sh(5분 cron)은 30분 후 에스컬레이션 → **너무 느림**
- 반면 **대시보드 초록불(bot-activity.json)은 실시간으로 정확하게 작동 중**

## 핵심 아이디어 (제이회장님 직접 제안)
> "작업중 초록불 꺼지면 위스퍼가 너한테 푸시"

bot-activity.json의 `processing → idle` 전환을 실시간 감지하여:
1. .done 파일이 존재하면 → 즉시 텔레그램 알림
2. 위스퍼 다음 브리핑에 "긴급" 태그 추가
3. 전체 과정을 done-protocol.log에 기록

## 작업 범위

### 1. activity-watcher.py (신규)
경로: `/home/jay/workspace/scripts/activity-watcher.py`

**동작 방식** (inotifywait 미설치이므로 polling 방식):
```
while True:
    1. bot-activity.json 읽기
    2. 이전 상태와 비교
    3. processing → idle 전환 감지 시:
       a. 해당 봇의 팀 식별 (dev1/dev2/dev3)
       b. memory/events/*.done 파일 검색
       c. .done 존재 시:
          - 텔레그램 알림 전송 (cokacdir --cron "✅ {task_id} 완료. 보고서: memory/reports/{task_id}.md" --at "1m" --chat ... --once)
          - done-protocol.log에 "activity-watcher: {task_id} 완료 감지 (bot={bot}, idle 전환)" 기록
       d. .done 미존재 시:
          - done-protocol.log에 "activity-watcher: {bot} idle 전환, .done 없음 (비정상 종료?)" 기록
    4. 현재 상태를 이전 상태로 저장
    5. 3초 sleep (bot-activity.json은 PostToolUse hook이 수시 갱신하므로 3초면 충분)
```

**주의사항**:
- bot-activity.json 파일 경로: `/home/jay/workspace/memory/events/bot-activity.json`
- 봇 키: anu, dev1, dev2, dev3
- 아누(anu)의 상태 변화는 무시 (자기 자신)
- 알림에 사용할 chat_id와 key는 환경변수에서: `source /home/jay/workspace/.env.keys`
  - COKACDIR_CHAT_ID, COKACDIR_KEY_ANU
- **데몬으로 실행**: `nohup python3 scripts/activity-watcher.py &`
- PID 파일: `/home/jay/workspace/logs/activity-watcher.pid`
- 로그: `/home/jay/workspace/logs/activity-watcher.log` (stdout/stderr 리다이렉트)
- 시작 시 bot-activity.json의 현재 상태를 "이전 상태"로 초기화 (시작 즉시 오알림 방지)

### 2. done-protocol.log 통합
모든 .done 관련 이벤트를 `/home/jay/workspace/logs/done-protocol.log`에 기록:
- `[activity-watcher]` 접두사로 기록
- 기존 `[notify-completion]`, `[done-watcher]` 로그와 통합
- 포맷: `[ISO타임스탬프] [activity-watcher] task-XXX: 메시지`

### 3. done-watcher.sh 조정
- 현행 30분 stale 감지 유지 (activity-watcher의 백업 역할)
- `[done-watcher]` 로그에 "activity-watcher가 이미 감지했는지" 체크 추가 (중복 알림 방지)
  - done-protocol.log에서 해당 task_id로 "activity-watcher: 완료 감지" 로그 있으면 skip

### 4. systemd 또는 시작 스크립트
- `scripts/start-activity-watcher.sh`: 시작/상태확인/중지 스크립트
  ```bash
  #!/bin/bash
  case "$1" in
    start)
      source /home/jay/workspace/.env.keys
      nohup python3 /home/jay/workspace/scripts/activity-watcher.py \
        >> /home/jay/workspace/logs/activity-watcher.log 2>&1 &
      echo $! > /home/jay/workspace/logs/activity-watcher.pid
      ;;
    stop)
      kill $(cat /home/jay/workspace/logs/activity-watcher.pid 2>/dev/null) 2>/dev/null
      ;;
    status)
      pid=$(cat /home/jay/workspace/logs/activity-watcher.pid 2>/dev/null)
      [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null && echo "running (PID $pid)" || echo "stopped"
      ;;
  esac
  ```

### 5. 테스트
- `scripts/tests/test_activity_watcher.py`
- 테스트 케이스:
  1. processing→idle 전환 감지 정상 동작
  2. idle→idle (변화 없음) 시 알림 안 보냄
  3. .done 파일 존재 시 알림 전송
  4. .done 파일 미존재 시 로그만 기록
  5. anu 봇 상태 변화 무시
  6. JSON 파싱 에러 시 크래시 안 남
  7. 시작 시 초기 상태 로딩 (오알림 방지)

## 참조 파일
1. `/home/jay/workspace/memory/events/bot-activity.json` — 감시 대상
2. `/home/jay/workspace/scripts/done-watcher.sh` — 기존 stale 감지 (백업)
3. `/home/jay/workspace/scripts/notify-completion.py` — 기존 알림 (참고)
4. `/home/jay/workspace/hooks/post-tool-use.sh` — bot-activity.json 갱신 주체

## 완료 기준
- [ ] activity-watcher.py 작성 및 정상 동작
- [ ] start-activity-watcher.sh 시작/중지/상태 스크립트
- [ ] 테스트 전체 통과
- [ ] done-watcher.sh 중복 알림 방지 로직 추가
- [ ] activity-watcher 데몬 실행하여 실제 작동 확인
- [ ] done-protocol.log에 이벤트 기록 확인

## 보고서
- 경로: `/home/jay/workspace/memory/reports/task-619.1.md`
- 완료: `bash /home/jay/workspace/scripts/finish-task.sh task-619.1`
