하네스 자가 회복 — dispatch stale 자동 감지 + 재dispatch + 보고 채널
의사결정
bulk_cancel_2026-05-09_pre_rebuild
내용
[배경]
2026-05-07 정밀 진단 결과, 하네스가 안 도는 이유 4계층:
1. blacklist 게이트 — 정상 키워드 오탐 (5/2 wbs sub-ticket 차단 사고, 5/3~5/7 credential 오탐 5일 stuck) → 5/7 keywords=[] 비움 처치 완료
2. dispatched_at 게이트 — 한 번 dispatch된 티켓은 결과 미수신 시 재dispatch 메커니즘 없음. 1주일간 OPEN 8건 lost
3. status='OPEN' 게이트 — IN_PROGRESS stale (봇 죽었어도 status 안 바뀜) heartbeat/timeout 가드 없음. 5건 1~2일 idle
4. 보고 침묵 4중 구조:
- blacklist 매칭 시 alert 0줄
- dispatch=0이면 sweep_done 로그 누락 (`if dispatched > 0`)
- daily summary는 dispatch만 보고, skip 누락
- daily summary 자체 5/6 19시부터 AttributeError 폭발 (line 1121 it.get이 str을 받음)
→ 1주일 중 daily summary 발송 단 2일
[요구사항 — Acceptance Criteria]
A. STALE 자동 감지
- IN_PROGRESS && updated_at < NOW() - INTERVAL 24 hours → STALE 판정
- OPEN && dispatched_at IS NOT NULL && dispatched_at < NOW() - INTERVAL 12 hours → LOST_DISPATCH 판정
- 환경변수로 임계 시간 조정 가능: NEXAI_STALE_INPROGRESS_HOURS(기본 24), NEXAI_STALE_DISPATCH_HOURS(기본 12)
B. 자동 복구 트리거
- STALE → 자동 OPEN 전환 + dispatched_at NULL + resolution 로그 append
- LOST_DISPATCH → dispatched_at NULL reset (재dispatch 활성화)
- 단, dispatch_count >= 5인 티켓은 자동 reset 제외 (HOLD로 전환 + 텔레그램 알림)
C. 보고 채널 — 침묵 제거
- C1. autopilot_skip_blacklist 발생 시 새 티켓에 한해 텔레그램 1줄 (ticket_id 단위 24h dedup)
- C2. sweep_done 로그를 dispatched 값과 무관하게 항상 찍기. 형식: dispatched=N candidates=M skipped_blacklist=X skipped_hold=Y skipped_cooldown=Z
- C3. autopilot_daily_summary 함수에 sections 추가: dispatched / skipped_blacklist / skipped_stale / lost_recovered. line 1121 AttributeError fix (isinstance(it, dict) 가드)
- C4. 새로 STALE/LOST_DISPATCH 감지 시 즉시 텔레그램 1줄 + 24h 누적 텔레그램 요약
D. nexai_daemon.py 통합
- 새 함수 sweep_stale_tickets() — 5분 주기, sweep_open_tickets와 같은 LOOP_SLEEP cycle에 piggyback
- 호출 위치: autopilot sweep 직전 (stale → OPEN 전환 후 같은 사이클에 재dispatch)
- state/autopilot_state.json에 _stale_recovered 키 추가 (24h 카운터)
E. 테스트
- test_stale_detection.py: pytest 테스트 케이스 — 25h idle IN_PROGRESS / 13h dispatched OPEN / dispatch_count=5 등 경계값
- 통합 테스트: SET 임계 1분 후 stale 티켓 1건 만들고 sweep 후 OPEN 전환 확인
[제약]
- DB 스키마 변경 금지 (기존 컬럼 사용)
- chain_orchestrator.py 손대지 말 것 (별개 라인)
- credential/메일/배포 등 외부 액션 트리거 추가 금지
- correctness-reviewer + testing-reviewer 통과 필수 (CLAUDE.md 룰)
[증거 산출물]
outputs/OPS-0507-AUTOPILOT-STALE-RECOVERY/
├ devpl/work_breakdown.json (sub-ticket 분해)
├ analysis/before_after.md (실증 — 25건 stuck → N건 회복)
├ tests/test_stale_detection.py
└ qa_review.md (correctness-reviewer + testing-reviewer 결과)
[관련 사고 기록]
- 5/1~5/2: depends_on/chain/compound 키워드 false positive로 41건 차단 — daily summary 미발송으로 인지 못 함
- 5/3~5/7: credential 키워드로 OPS-0502, OPS-MIG-05 5일 stuck — 알림 없음
- 5/5~5/6: lost dispatch 8건 발생, 결과 미수신 — 자동 복구 메커니즘 부재
- 5/6 19시~ daily summary AttributeError 매 5분 폭발 — autopilot 자체 부분 마비
핸드오프 체인
1.
2026-05-09 07:35
ceo → system
"bulk_cancel — 미완료 전체 폐기 (시스템 재구축 전 청산)"
체이닝 타임라인
자동 체이닝 이력이 없습니다
산출물
아직 산출물이 없습니다
수정
관련 로그
관련 봇 로그 없음