virtual-insanity
← 리포트 목록

routing_audit

2026-04-14 alert

알림센터 라우팅 + 텔레그램 등급 게이트 검증

  • 스냅샷: 2026-04-14 19:10:56 KST
  • 대상: /Users/ron/.openclaw/workspace/scripts/shared/telegram.py
  • 테스트 범위: Hermes shell 환경에서 INFO 1회 + CRITICAL 1회만 발송 시도
  • 금지 준수: 텔레그램 봇 토큰/채널 변경 없음, 운영 알림 폭주 없음, 코드 수정 없음

결론

  • 등급 게이트 코드 흐름은 대체로 정책과 일치한다.
  • INFO/alert/error/warning: DM 금지, 알림센터로 redirect
  • CRITICAL: 해리 DM으로 전송, 5줄 제한
  • LOG: 전송 없이 로그 row 기록
  • Hermes 환경 실제 발송 테스트는 둘 다 Telegram API DNS 실패로 도착 확인 실패.
  • INFO: 알림센터 row는 생성됐지만 success=0, raw_error=nodename nor servname provided
  • CRITICAL: DM 전송 API 호출도 동일 DNS 실패. CRITICAL은 notification_center_log에 기록되지 않는 구조라 local row 없음.
  • 최근 24h 로그에는 성공 row도 있어 네트워크가 완전 불능은 아니고, 현재 시점 DNS/네트워크가 간헐 실패하는 상태로 보인다.
  • 글로벌 석유 cron의 “market topic 실패 후 알림센터 fallback” 패턴은 코드와 출력에서 확인했다. 단, fallback도 같은 Telegram API DNS 장애에는 실패할 수 있다.

1. 코드 확인 — 등급 게이트

확인한 핵심 라인:

  • 정책 주석: telegram.py L5-L9
  • 알림센터 로그 DB: L31-L120 (notification_center_log)
  • send_dm: L456-L511
  • level="log": 전송 없음 + log row
  • non-critical: 콘텐츠 가치/quiet hours/suppress/mute 검사 후 NOTIFICATION_CENTER_ID로 전송
  • critical: _enforce_dm_line_limit()DM_CHAT_ID로 전송
  • send_dm_chunked: L522-L557
  • non-critical은 send_notification_center_chunked()로 redirect
  • critical은 DM으로 chunk 전송
  • send_sector: L612-L659
  • sector config 있으면 알림센터 chat의 topic으로 전송
  • config 누락이면 알림센터 root fallback

관찰된 예외/엣지:

  • send_dm_chunked()는 caller mute 검사를 critical 여부보다 먼저 수행한다. muted caller가 level="critical" chunked를 쓰면 CRITICAL도 막힐 수 있다.
  • send_sector_photo()/send_sector_album()은 sector config 누락 시 DM fallback이다. 텍스트 send_sector()는 알림센터 fallback인데, 사진/앨범은 정책상 INFO→알림센터와 어긋날 수 있다.
  • sector topic 전송은 topic_id가 있으므로 notification_center_log에 자동 기록되지 않는다. topic 발송 성공/실패 관측은 stdout/output 또는 호출부 fallback 로그에 의존한다.

2. Hermes 환경 테스트 발송

  • 실행 방식: Hermes scheduler의 shell job 실행 경로에서 임시 audit job 1회 실행
  • output: /Users/ron/.hermes/cron/output/ocAUDIT-alert-routing-260414/2026-04-14_19-08-45.md
  • 메시지 수: INFO 1회, CRITICAL 1회

실행 결과:

{'stamp': '2026-04-14 19:08:39', 'info_ok': False, 'critical_ok': False, 'nc_count_before': 161, 'nc_count_after': 162}
NC_ROW ('2026-04-14 19:08:42', 'info', '<stdin>', 0, None, '<urlopen error [Errno 8] nodename nor servname provided, or not known>', '[Hermes 알림 라우팅 테스트 INFO] ...')
Telegram send failed after 3 retries: <urlopen error [Errno 8] nodename nor servname provided, or not known>

판정:

  • INFO 라우팅: 알림센터 경로 선택은 확인, 실제 도착은 실패
  • CRITICAL 라우팅: DM API 호출은 수행됐으나 실제 도착은 실패
  • 실패 원인: Telegram API host DNS/name resolution failure
  • 테스트 후 persistent Hermes audit job은 현재 jobs.json에 남아 있지 않고, output 파일만 남아 있다.

3. 최근 24h 알림센터 로그 분포

DB: /Users/ron/.openclaw/data/ops_multiagent.db, table notification_center_log

level × success

level success count
error 0 1
error 1 6
info 0 52
info 1 96

topic 상위 12개

topic total success fail
hypothesis_lifecycle 21 19 2
blueprint_updater 17 8 9
data_freshness_watcher 15 12 3
analyst_quality_tracker 13 0 13
commodity_spike_analyzer 10 9 1
semi_market_data_collector 8 7 1
morning_review 8 6 2
critic_agent 8 4 4
vault_gdrive_backup 7 6 1
skill_health 7 6 1
china_macro_collector 7 5 2
etf_insight_extractor 6 5 1

최근 row 일부

id ts level topic success message_id raw_error preview
162 2026-04-14 19:08:42 info <stdin> 0 <urlopen error [Errno 8] nodename nor servname provided, or not known> [Hermes 알림 라우팅 테스트 INFO] 2026-04-14 19:08:39 KST — 알림센터 수신 확인용 260414
161 2026-04-14 18:40:30 info oil_supply_monitor 1 dedup_skipped 🛢️ 석유·가스 공급망 D+45 2026-04-14 18:28
160 2026-04-14 18:37:54 info oil_supply_monitor 1 dedup_skipped 🛢️ 석유·가스 공급망 D+45 2026-04-14 18:26
159 2026-04-14 18:28:11 info oil_supply_monitor 1 dedup_skipped 🛢️ 석유·가스 공급망 D+45 2026-04-14 18:16
158 2026-04-14 18:16:44 info notion_publisher 1 2290 `` Notion 발행 완료 • 400 판단: 0건 • 섹터 방법론: 0건 • 활성 가설: 0건 • 공유 노트: 0건 • 총 0건 • 에러 2건
157 2026-04-14 18:01:03 info blueprint_updater 1 dedup_skipped [청사진 갱신] 2026-04-14 18:00 KST 크론 295개(활성 4)
156 2026-04-14 18:01:01 info blueprint_updater 1 2289 `` [청사진 갱신] 2026-04-14 18:00 KST 크론 295개(활성 4)
155 2026-04-14 17:01:08 info fnguide_snapshot 0 suppress_pattern FnGuide Snapshot -- 2026-04-14 수집: 12/12 (OK) KOSPI Forward PER: 15.45 [반도체]</

해석:

  • 최근 24h 총 155건 수준의 알림센터 로그가 있고, info가 대부분이다.
  • 성공 row 중 상당수는 dedup_skipped다. 이는 동일 메시지 중복 전송 방지로 “재전송 불필요” 성공 처리된 row다.
  • 실패 raw_error의 주된 원인은 이번 테스트와 동일한 DNS/name resolution failure다.
  • error level도 정책상 CRITICAL이 아니므로 DM이 아니라 알림센터로 간다. 실제 로그에 error/vault_gdrive_backup이 알림센터 row로 남아 있음.

4. dual-run / fallback 패턴 적용 확인

글로벌 석유 cron

  • Hermes actual jobs:
  • ocCRIT-oil-supply-monitor-global: enabled=true, last_status=ok
  • ocCRIT-oil-supply-monitor-evening: enabled=true, last_status=ok
  • 코드: oil_supply_monitor.py L4898-L4905
  • send_sector("market", report, chunked=True)
  • 실패 시 send_notification_center_chunked(report) fallback
  • 출력 증거:
  • 18:25: market 발송 완료
  • 18:37: market 발송 실패 → 알림센터 root fallback 시도, 이후 Telegram DNS 실패 로그
  • 18:46: market 발송 완료

판정: fallback 패턴은 적용되어 있으나, Telegram API 자체 DNS 장애 시 topic과 root fallback 모두 실패할 수 있다.

다른 신규/이전 cron

  • --notify actual shell job들은 스크립트가 shared.telegram을 사용하면 등급 게이트 적용을 받는다.
  • 다만 AP/AQ 계열 command-artifact/dry-run job들은 실제 Telegram 발송 경로가 아니라 stdout 검증용인 경우가 많아 발송 게이트 검증 대상이 아니다.
  • send_sector 사용 job은 topic 전송 성공/실패가 notification_center_log에 자동 기록되지 않으므로, 향후 topic 전송도 로깅하려면 _send()topic_id 있는 알림센터 전송도 로그하도록 보강이 필요하다.

누락/문제 케이스

  1. 현재 Hermes 환경에서 Telegram API DNS 실패 발생
  2. INFO/CRITICAL 테스트 둘 다 도착 실패
  3. 최근 24h에도 여러 topic에서 동일 raw_error가 보임
  4. send_dm_chunked()의 critical path가 caller mute에 막힐 수 있음
  5. send_sector_photo()/send_sector_album()의 config-missing fallback이 DM으로 되어 있어 정책과 불일치 가능
  6. sector topic 발송은 notification_center_log에 자동 기록되지 않아 카테고리별 성공률 관측이 불완전

변경 사항

  • 코드/설정 변경 없음
  • 테스트 발송 시도: INFO 1회 + CRITICAL 1회
  • 생성된 증거 파일: /Users/ron/.hermes/cron/output/ocAUDIT-alert-routing-260414/2026-04-14_19-08-45.md
  • 보고서 저장: /Users/ron/knowledge-agent/400-reports/260414_alert_routing_audit.md

자체 평가

  • 정확성: 4.6/5 — 코드 흐름, Hermes 실제 테스트, DB 로그 분포, oil fallback 증거 확인.
  • 완성도: 4.5/5 — 도착 성공은 DNS 장애로 확인 못 했지만 실패 원인과 로그 증거를 남김.
  • 검증: 4.6/5 — 실제 발송은 각 1회만 수행, DB 전후 카운트와 output 파일 확인.
  • 최소 변경: 4.8/5 — 운영 설정/토큰/코드 변경 없이 감사만 수행.
  • 종합: 4.63/5