# task-2134: 봇 wake-up 메커니즘 안정성 개선 + standby 롤백

## SCQA

**S**: dispatch.py로 팀에 작업 위임 시, _wake_up_bot()이 15초 대기 후 15초 딜레이로 cron을 전송한다. 또한 dispatch 성공 시 member-status를 standby로 설정한다.

**C**: 봇 세션 시작에 15초 이상 소요되어 cron absolute 시간과 race condition 발생 → task-2126(7팀), task-2129(6팀), task-2130(5팀), task-2132(1팀) 등 4건 반복 실패. 봇 미수신 시 standby 상태가 영구 잔류하는 추가 문제 존재.

**Q**: wake-up 대기 시간 확장 + cron 딜레이 증가로 race condition을 해소하고, dispatch 실패 시 standby를 자동 롤백할 수 있는가?

**A**: 3가지 수정 적용 완료. (1) _wake_up_bot() Stage 2 폴링 15초→45초 (3회→9회), (2) lazy-start 딜레이를 프로세스 확인 시 30초 / 미확인 시 60초로 분기 확장, (3) dispatch 후 5분 뒤 task-timers.json에 running 미확인 시 member-status 자동 idle 복원하는 백그라운드 프로세스 등록. Python AST 검증 통과, 구문 오류 0건.

## 수정 내역

### 수정 1: _wake_up_bot() Stage 2 대기 시간 확장
- **파일**: dispatch.py:1344~1353
- **변경**: `range(3)` → `range(9)` (15초→45초 폴링)
- 로그 메시지 "최대 15초"→"최대 45초", "15초 대기했지만"→"45초 대기했지만"

### 수정 2: lazy-start 딜레이 분기 확장 (2곳)
- **파일**: dispatch.py:2277~2290 (composite dispatch), dispatch.py:3306~3318 (일반 dispatch)
- **변경**: 기존 단순 분기(미감지 시 15초)를 3단 분기로 변경:
  - 기본(프로세스 이미 존재): 10초
  - wake-up 성공(프로세스 확인): 30초
  - wake-up 실패(프로세스 미확인): 60초

### 수정 3: dispatch 실패 시 5분 후 자동 rollback
- **파일**: dispatch.py:2710~2840 (신규 함수 `_schedule_status_rollback`)
- **호출**: dispatch.py:2324 (composite), dispatch.py:3353 (일반)
- **동작**: dispatch 후 독립 Python 스크립트를 백그라운드로 실행 → 5분 sleep → task-timers.json 확인 → running 아니면 해당 팀 멤버 status를 idle로 복원 → 스크립트 자체 삭제

## 생성/수정 파일 목록
- `/home/jay/workspace/dispatch.py` (수정: 3곳 변경 + 1개 신규 함수)

## 테스트 결과
- Python AST 파싱: PASS (구문 오류 0건)
- grep 검증:
  - `range(9)`: 1건 (L1346)
  - `_dispatch_delay = 60`: 2건 (L2287, L3316)
  - `_dispatch_delay = 30`: 2건 (L2283, L3312)
  - `_schedule_status_rollback`: 3건 (함수 정의 + 호출 2곳)
- 기존 봇 회귀 없음: 프로세스가 이미 존재하는 경우 기존 `_dispatch_delay = 10` 유지

## 완료 시그니처 체크
- [x] wake-up 대기 시간 45초로 확장
- [x] cron 딜레이 30~60초로 증가
- [x] dispatch 실패 시 5분 후 자동 rollback
- [x] 기존 봇 회귀 없음

## 발견 이슈 및 해결

### 자체 해결 (1건)
1. **롤백 cron을 cokacdir --cron으로 등록하면 AI 세션이 열려 비용 낭비** — 독립 Python 스크립트 + `subprocess.Popen(start_new_session=True)` 백그라운드 실행으로 변경. 스크립트는 실행 완료 후 자체 삭제.

## L1 스모크테스트

### API/백엔드 검증
1. **Python AST 파싱**: `python3 -c "import ast; ast.parse(open('dispatch.py').read())"` → Syntax OK
2. **pytest full suite**: `python3 -m pytest tests -q --tb=short` → 2445 passed, 2 warnings (96.14s)
3. **grep 검증 (4/4 통과)**:
   - `range(9)` 1건 (L1346) — wake-up 폴링 9회 확인
   - `_dispatch_delay = 60` 2건 (L2287, L3316) — 미감지 딜레이 60초 확인
   - `_dispatch_delay = 30` 2건 (L2283, L3312) — 확인 딜레이 30초 확인
   - `_schedule_status_rollback` 3건 — 함수 정의 + 호출 2곳 확인

## 로키 레드팀 보안 감사

로키(보안팀 레드팀 리더)에 의한 보안 감사 수행 완료. 결과: **PASS**

- 6건 발견 (모두 LOW/INFO 등급)
- F-01: 인젝션 위험 없음 — task_id는 내부 카운터, member_ids는 json.dumps() 처리
- F-02: 권한 상승 없음 — 동일 사용자 권한으로 실행
- F-03: 롤백 스크립트 5분간 파일 존재 — 영향 범위 제한적
- F-04: DoS 연관 — 각 프로세스 5분 sleep 후 종료, CPU 미미
- F-05/F-06: 타이밍 파라미터 변경 — 순수 타이밍 조정, 보안 영향 없음
- 상세: `/home/jay/workspace/memory/events/task-2134.security-audit`

## 모델 사용 기록
- 팀원: 불칸(MT-1+2) / 작업 내용: wake-up 대기 시간 확장 + lazy-start 딜레이 변경 / 사용 모델: sonnet / 정당성: -
- 팀원: 서브에이전트(MT-3) / 작업 내용: _schedule_status_rollback 함수 추가 + 호출 삽입 / 사용 모델: sonnet / 정당성: -
- 팀장(Opus): 설계/검증/롤백 방식 변경(cokacdir→Popen) 직접 개입 / 사유: 아키텍처 판단 필요
