# task-438.1: .done 자동감지 데몬 개발

## 배경
현재 자율 체이닝(한시적 승인 작업)은 아누 세션이 살아있어야 .done 감지 → 다음 Phase 위임이 가능하다.
아누 세션이 컨텍스트 소진 등으로 종료되면 체이닝이 끊긴다.
이를 해결하기 위해 **독립 데몬 프로세스**로 .done 감지 + 자동 dispatch를 구현한다.

## 구현 위치
- `/home/jay/workspace/daemons/done_watcher.py`

## 핵심 기능

### 1. .done 파일 감시
- `memory/events/` 디렉토리를 감시 (inotify 또는 polling)
- `*.done` 파일 생성 감지 (`.done.clear`는 무시)
- 감지 간격: 30초 polling (inotify 가능하면 inotify 우선)

### 2. 체이닝 메타데이터 확인
- .done 감지 시, 해당 task의 체이닝 정보를 확인
- 체이닝 정보 저장 위치: `memory/tasks/chain-<task_id_prefix>.json`
- 체이닝 JSON 구조:
```json
{
  "task_prefix": "task-436",
  "current_phase": 1,
  "max_phase": 4,
  "team": "dev1",
  "scoped_approval": true,
  "phases": {
    "2": {"task_file": "memory/tasks/dispatch-remotion-phase2.md"},
    "3": {"task_file": "memory/tasks/dispatch-remotion-phase3.md"},
    "4": {"task_file": "memory/tasks/dispatch-remotion-phase4.md"}
  }
}
```
- 체이닝 JSON이 없으면 → 일반 작업이므로 무시 (아누에게 통보만)

### 3. 자동 dispatch
- 체이닝 JSON이 있고, 다음 phase의 task_file이 존재하면:
  1. task-timer start 실행
  2. dispatch.py 호출 (팀, task-file 전달)
  3. 체이닝 JSON의 current_phase 업데이트
  4. 로그 기록

### 4. 아누 통보
- 체이닝 여부와 관계없이, .done 감지 시 아누에게 cokacdir --cron으로 통보
- 통보 프롬프트: "task-XXX.X 완료됨. 보고서: memory/reports/task-XXX.X.md 확인하고 제이회장님께 보고할 것."
- 체이닝 자동 dispatch한 경우: "task-XXX.X 완료, Phase N+1 자동 위임됨" 추가

### 5. 로깅
- `/home/jay/workspace/logs/done_watcher.log`
- 각 이벤트: 타임스탬프, 감지 파일, 처리 액션, 결과

## 설정 파일
- `/home/jay/workspace/daemons/done_watcher_config.json`
```json
{
  "watch_dir": "/home/jay/workspace/memory/events/",
  "chain_dir": "/home/jay/workspace/memory/tasks/",
  "poll_interval": 30,
  "log_file": "/home/jay/workspace/logs/done_watcher.log",
  "anu_chat_id": "6937032012",
  "enabled": true
}
```

## 실행 방법
- `python3 /home/jay/workspace/daemons/done_watcher.py` (포그라운드)
- `nohup python3 /home/jay/workspace/daemons/done_watcher.py &` (백그라운드)
- systemd service로 등록은 Phase 2에서 (이번엔 스크립트만)

## 안전장치
1. **중복 실행 방지**: PID 파일 (`/home/jay/workspace/daemons/done_watcher.pid`)
2. **이미 처리된 .done 무시**: .done 파일 내용에 `claimed_by` 필드가 있으면 스킵
3. **.done → .done.clear rename은 아누만**: 데몬은 .done을 읽기만 하고, rename하지 않음. 아누가 확인 후 clear.
4. **dispatch 실패 시**: 로그 기록 + 아누에게 에러 통보, 재시도 안 함
5. **max_phase 초과 방지**: current_phase >= max_phase면 체이닝 종료

## 테스트
- 단위 테스트: `daemons/tests/test_done_watcher.py`
- 테스트 시나리오:
  1. .done 파일 생성 → 감지 확인
  2. 체이닝 JSON 있을 때 → dispatch 호출 확인
  3. 체이닝 JSON 없을 때 → 통보만 확인
  4. .done.clear → 무시 확인
  5. 중복 실행 방지 확인

## 참고
- dispatch.py 위치: `/home/jay/workspace/dispatch.py`
- dispatch.py 사용법: `python3 dispatch.py --team <team> --task-file <path> --level <level>`
- cokacdir 사용법: `cokacdir --cron "<prompt>" --at "<time>" --chat 6937032012 --key <key>`
- task-timer: `python3 /home/jay/workspace/memory/task-timer.py start/end <task_id>`
- 환경변수: `source /home/jay/workspace/.env.keys` 필수 (BOT_KEYS 등)