# 세션 자동 이어가기 Watchdog — Phase 2 구현

## Lv.2 작업

## 배경
Phase 1 완료 (task-1710.1): heartbeat hook, session-watchdog.sh, systemd timer 구현.
실동작 검증 완료 — 2분 주기로 running 태스크 heartbeat 체크 정상 동작.

설계 문서:
- 체크리스트: `/home/jay/workspace/memory/plans/session-watchdog/checklist.md` (Phase 2 섹션)
- 맥락노트: `/home/jay/workspace/memory/plans/session-watchdog/context-notes.md`

Phase 1 산출물:
- `/home/jay/workspace/scripts/session-watchdog.sh` (182줄)
- `/home/jay/workspace/scripts/tests/test_session_watchdog.sh`

## 구현 범위

### 1. Circuit Breaker 세밀화
현재 session-watchdog.sh의 재위임 로직에 circuit breaker 패턴 추가:

**빠른 재실패 감지:**
- 재위임 후 **다음 watchdog 사이클(2분)에서 또 stalled** → usage limit 의심
- 이때 즉시 재위임하지 말고 **30분 백오프**
- 백오프 상태 기록: `memory/heartbeats/{task_id}.backoff` 파일에 백오프 만료 시각 기록
- watchdog이 .backoff 파일의 만료 시각 확인 → 미만료 시 스킵

**구현 위치:** session-watchdog.sh의 stalled 판정 후 분기

### 2. 동시 재위임 상한
- 1회 watchdog 사이클에서 **최대 3건**만 재위임
- 4건째부터는 알림만 발송, 다음 사이클로 미룸
- 이유: 8팀 동시 stalled 시 dispatch.py 16건 연속 호출 방지

### 3. 집계 알림
- 여러 팀 동시 stalled 시 개별 알림 대신 **1건으로 집계**
- 형식: "⚠️ [Watchdog] 3팀 stalled: task-1710.1(4팀), task-1711.1(5팀), task-1712.1(6팀)"
- 현재는 stalled 1건마다 curl 개별 호출

### 4. 대시보드 재위임 이력 표시
- server.py에 `/api/watchdog/history` 엔드포인트 추가
- watchdog 로그(`logs/session-watchdog.log`)를 파싱하여 최근 재위임/에스컬레이션 이력 반환
- 대시보드 조직뷰 또는 별도 탭에 표시 (간단하게)

### 5. 테스트 강화
- 기존 test_session_watchdog.sh에 추가:
  - TC: 빠른 재실패 → backoff 동작 확인
  - TC: 동시 3건 상한 초과 → 4번째 스킵 확인
  - TC: backoff 만료 후 재위임 재개 확인

## 참조
- Phase 1 보고서: `/home/jay/workspace/memory/reports/task-1710.1.md`
- circuit_breaker.py 패턴: `/home/jay/workspace/utils/circuit_breaker.py` (HALF_OPEN 참고)

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