# Session Watchdog Phase 3 — 초기 유예 + /stop 정리 + 서브넘버링

## Lv.2 작업

## Phase 1-2 산출물
- `/home/jay/workspace/scripts/session-watchdog.sh` (234줄)
- Phase 1 보고서: `/home/jay/workspace/memory/reports/task-1710.1.md`
- Phase 2 보고서: `/home/jay/workspace/memory/reports/task-1715.1.md`

## 실전 운영에서 발견된 3가지 미구현 항목

### 1. dispatch 후 초기 유예 기간
**문제**: dispatch 직후 heartbeat 파일이 아직 생성되기 전에 watchdog이 실행되면 STALLED로 오판.
**실제 사례**: task-1736.1(3팀)이 정상 작동 중인데 watchdog이 재위임 시도.

**수정**: session-watchdog.sh에서 running 작업 검사 시, task-timers.json의 `start_time`을 확인하여 **시작 후 10분 이내 작업은 스킵**.
```bash
# start_time과 현재 시간 차이가 600초 미만이면 스킵
START_EPOCH=$(date -d "$START_TIME" +%s 2>/dev/null)
NOW_EPOCH=$(date +%s)
ELAPSED=$((NOW_EPOCH - START_EPOCH))
if [ "$ELAPSED" -lt 600 ]; then
    echo "task $TASK_ID: 시작 ${ELAPSED}초 전 (유예 기간) → 스킵"
    continue
fi
```

### 2. 재위임 전 /stop 정리
**문제**: 죽은 세션의 cokacdir 스케줄이 정리되지 않으면 같은 봇에 새 작업 충돌.
**실제 사례**: task-1731.1 프로세스가 남아있어서 새 위임이 충돌.

**수정**: 재위임 전에:
1. schedule_id로 cokacdir 스케줄 제거 시도: `cokacdir --cron-remove $SCHEDULE_ID`
2. 프로세스가 남아있으면 kill: `kill $PID 2>/dev/null`
3. task-timer end 호출: `python3 task-timer.py end $TASK_ID`
4. 그 후 재위임

### 3. 재위임 시 서브넘버링
**문제**: watchdog 재위임 시 task-1736.1 → task-1736.2가 아닌 새 번호(task-1740.1 등) 부여.

**수정**: 재위임 시 `--task-id` 옵션으로 서브넘버 지정.
```bash
# 기존 task_id에서 서브넘버 증가
# task-1736.1 → task-1736.2
BASE=$(echo "$TASK_ID" | sed 's/\.[0-9]*$//')
CURRENT_SUB=$(echo "$TASK_ID" | grep -o '\.[0-9]*$' | tr -d '.')
NEXT_SUB=$((CURRENT_SUB + 1))
NEW_TASK_ID="${BASE}.${NEXT_SUB}"
# dispatch.py --task-id $NEW_TASK_ID 로 재위임
```

## 테스트
- TC1: dispatch 직후 5분 내 watchdog 실행 → 해당 작업 스킵 확인
- TC2: 죽은 세션 감지 → schedule 제거 + process kill + timer end → 재위임 성공
- TC3: 재위임 시 task-1736.1 → task-1736.2 서브넘버링 확인

## 보고서
`/home/jay/workspace/memory/reports/task-{TASK_ID}.md`
