advisory HAN-322 raphael final 2026-05-23

[자문] Spec Gate 24h 에스컬레이션 흐름 설계

TL;DR

check_timeouts() 단일 함수 확장 + 배치 DM + mark 선행. PR #122 구현 완료.

질문 / 결정 사항

Spec Gate 48h ON_HOLD 전 24h 시점에 Jarvis DM 경보를 보내는 에스컬레이션 흐름 설계. 타이머 등록/취소 메커니즘과 트리거 조건 결정.

전제 (사용자 확인)

옵션 비교

Option A: `check_timeouts()` 단일 함수 확장

장점

단점

트레이드오프

---

Option B: 별도 `check_escalation()` + 데몬 스레드

장점

단점

트레이드오프

권장안

선택: Option A

근거:

맹점 / 리스크

DM 발송 실패 시 escalated_at 불일치

봇 다운타임 Skip 케이스

구현 변경 요약

변경내용
`SpecGatePendingStore.write()``escalated_at: null` 명시 추가
`SpecGatePendingStore.mark_escalated()`Lock 내 RMW로 escalated_at 기록
`_make_deeplink()``archives/{channel}/p{ts_nodot}` 딥링크 생성
`_send_escalation_dm()`배치 DM: 건수 + 딥링크 + 남은 시간
`check_timeouts()``escalation_hours` 파라미터 추가, elif 분기 추가
`SPEC_GATE_ESCALATION_HOURS`환경변수 (기본 24)

참고 자료