하네스 자가 회복 — dispatch stale 자동 감지 + 재dispatch + 보고 채널

상태 CANCELLED
담당 ([])
팀 nexai
생성일 2026-05-07T12:05:06
마감일 미정
출처 cc_unstuck_pipeline
생성자 CC

의사결정

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 — 미완료 전체 폐기 (시스템 재구축 전 청산)"

체이닝 타임라인

자동 체이닝 이력이 없습니다

산출물

아직 산출물이 없습니다

수정

관련 로그

관련 봇 로그 없음

위험 구역