알림센터 라우팅 + 텔레그램 등급 게이트 검증
- 스냅샷: 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 금지, 알림센터로 redirectCRITICAL: 해리 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.pyL5-L9 - 알림센터 로그 DB: L31-L120 (
notification_center_log) send_dm: L456-L511level="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다.
errorlevel도 정책상 CRITICAL이 아니므로 DM이 아니라 알림센터로 간다. 실제 로그에error/vault_gdrive_backup이 알림센터 row로 남아 있음.
4. dual-run / fallback 패턴 적용 확인
글로벌 석유 cron
- Hermes actual jobs:
ocCRIT-oil-supply-monitor-global: enabled=true, last_status=okocCRIT-oil-supply-monitor-evening: enabled=true, last_status=ok- 코드:
oil_supply_monitor.pyL4898-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
--notifyactual shell job들은 스크립트가shared.telegram을 사용하면 등급 게이트 적용을 받는다.- 다만 AP/AQ 계열 command-artifact/dry-run job들은 실제 Telegram 발송 경로가 아니라 stdout 검증용인 경우가 많아 발송 게이트 검증 대상이 아니다.
send_sector사용 job은 topic 전송 성공/실패가notification_center_log에 자동 기록되지 않으므로, 향후 topic 전송도 로깅하려면_send()의topic_id있는 알림센터 전송도 로그하도록 보강이 필요하다.
누락/문제 케이스
- 현재 Hermes 환경에서 Telegram API DNS 실패 발생
- INFO/CRITICAL 테스트 둘 다 도착 실패
- 최근 24h에도 여러 topic에서 동일 raw_error가 보임
send_dm_chunked()의 critical path가 caller mute에 막힐 수 있음send_sector_photo()/send_sector_album()의 config-missing fallback이 DM으로 되어 있어 정책과 불일치 가능- 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