33427d4a42
A. services/alerts.py 신설 — send_alert(title, message): ALERT_WEBHOOK_URL 미설정=no-op(프로세스당 1회 INFO), ALERT_WEBHOOK_KIND synochat(기본)|ntfy, httpx 5s, 실패=WARNING만(절대 raise 금지). deep_summary HOLD/override 거부 시 발화 — 문서 id·제목·tier·over%·토큰· 초과 섹션 상위3·재개 예정시각·유인 분할 힌트. dedupe=payload.presegment .alerted_at(7일) — 매 24h 재보류마다 재알람 방지. B. units_override 재개 — payload.presegment.units_override 존재 시 tier 재판정·HOLD 없이 (start,end,title) 문자 오프셋 경계로 유닛 구성 후 기존 PR2 map-reduce 그대로(유닛 단위 멱등 commit·reduce·doc 기록). 방어: source_len 불일치·형식 오류·유닛 추정토큰 > CAP*1.1 이면 실패 대신 재-HOLD + 알람(잘못된 override 의 900s 콜 재생산 차단). override 없는 문서는 기존 경로 무회귀. summarize_units 에 공용 순수함수 추가: choose_override_source(md_content 우선)·validate_override_boundaries(단조·비중첩·범위·커버리지 90%·유닛 캡)· units_from_boundaries·leaf_spans + greedy_pack 유닛에 leaf_indexes 기록 (export CLI 스팬 계산용). plan ds-presegment-mapreduce-2 / env DEEP_SUMMARY_HOLD_RETRY_MINUTES 유지. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>