알림센터 dedup 효과 측정 및 cmux 도배 정상화 검증
알림센터 dedup 효과 측정 및 cmux 도배 정상화 검증
결론
cmux 2798/2799는 완전 동일 본문이 아니라 77.6% 유사한 반복 경고였다. 기존 Telegram dedupe는 전체 본문 해시라서 timestamp/current_activity가 바뀌면 막지 못했다.
수정 완료:
/Users/ron/.openclaw/workspace/scripts/cmux_supervisor.py- timestamp/current_activity를 제외한 stable alert signature 추가
shared.dedup.should_skip()→record_sent()경로 추가- 기본 dedup window: 1시간 (
CMUX_SUPERVISOR_DEDUP_WINDOW_HOURS로 조정 가능) /Users/ron/.openclaw/workspace/scripts/shared/dedup.py신규 배치/Users/ron/.openclaw/workspace/shared/dedup.py신규 배치
실제 발송 없이 검증 완료. 동일 cmux warning signature는 두 번째 호출에서 send 호출 없이 skip된다.
1. 2798/2799 동일성 확인
OpenClaw notification_center_log에서 확인한 두 메시지:
2798 len=98
[cmux 감독] 2026-04-24 13:45:41
🔵 surface:4 [0/5]
gpt-5.5 high · ~
⚠ 스킬/서브에이전트 미사용 — 방법론 미준수 가능
2799 len=121
[cmux 감독] 2026-04-24 13:46:17
🔵 surface:4 [0/5]
Press enter to confirm or esc to cancel
⚠ 스킬/서브에이전트 미사용 — 방법론 미준수 가능
판정:
exact_equal: False
similarity: 77.6%
차이: timestamp, current_activity
같은 부분: surface/status/compliance/warning
즉 기존 full-text dedupe 기준으로는 다른 메시지라 통과했다.
2. dedup이 안 먹은 이유
확인한 경로:
cmux_supervisor.py: send_telegram()
-> scripts_dir를 sys.path 앞에 추가
-> from shared.telegram import send_dm
-> send_dm(message, level="info")
-> INFO 등급이라 알림센터로 redirect
-> shared.telegram 내부 dedupe는 전체 text hash 기준
문제는 shared.telegram dedupe가 없었던 것이 아니라, cmux 본문 자체가 매번 바뀐다는 점이다.
- timestamp가 매번 바뀜
- current_activity가 매번 바뀜
- 따라서 전체 본문 hash가 달라짐
shared/dedup.py의 semantic dedup도 cmux 경로에는 적용되어 있지 않았음
3. 패치 내용
백업:
/Users/ron/.openclaw/workspace/scripts/cmux_supervisor.py.bak-20260424_dedup_effectiveness
추가 파일:
/Users/ron/.openclaw/workspace/scripts/shared/dedup.py
/Users/ron/.openclaw/workspace/shared/dedup.py
핵심 변경:
def format_dedup_key(results):
# timestamp/current_activity 제외
# surface/status/compliance/warnings/detected bits만 사용
if should_skip(dedup_key, chat_id=NOTIFICATION_CENTER_ID, topic_id=0, window_hours=1):
print("[정보] cmux 텔레그램 전송 dedup skip", file=sys.stderr)
return True
ok = send_dm(message, level="info")
if ok:
record_sent(dedup_key, chat_id=NOTIFICATION_CENTER_ID, topic_id=0)
4. 무발송 검증
실제 Telegram 발송은 추가하지 않았다. temp hash store + monkeypatch로 send 호출 여부만 검증했다.
4-1. stable key 검증
keys_equal True
first_should_skip False
second_should_skip True
store_exists True size 207
2798/2799처럼 current_activity가 달라도 warning signature가 같으면 같은 dedup key로 계산된다.
4-2. send_telegram 경로 검증 — 네트워크 없음
shared.telegram.send_dm을 fake 함수로 바꾸고 두 번 호출:
[정보] cmux 텔레그램 전송 dedup skip
first_ok True calls 1
second_ok True calls 1
의미:
- 첫 번째: fake send 1회 호출 + record
- 두 번째: dedup skip, fake send 호출 증가 없음
- 실제 Telegram 발송 없음
4-3. CLI smoke — no notify
surfaces_checked 1
total_warnings 1
has_errors False
5. dedup 효과 측정
shared/dedup.py store
대상:
/Users/ron/.hermes/workspace/memory/telegram_send_hashes.json
분석 결과:
entries_total 8
entries_24h 8
entries_48h 8
duplicate_hash_entries 0
duplicate_records 0
bydate {'2026-04-24': 8}
bytopic [('-1003522748967', '5'): 4, ('-100', '0'): 2, ('-1003522748967', '9'): 1, ('-1003522748967', '6'): 1]
주의: 이 JSON은 record_sent ledger라서 “차단 횟수”를 직접 저장하지 않는다. 따라서 이 파일만으로 blocked count는 산출 불가하고, 같은 hash 중복 기록이 없다는 점만 확인 가능하다.
notification_center_log의 dedup_skipped
Hermes DB raw_error='dedup_skipped': 99건
2026-04-14: 93
2026-04-15: 6
OpenClaw DB raw_error='dedup_skipped': 98건
2026-04-14: 93
2026-04-15: 5
2026-04-23~2026-04-24 dedup_skipped: 0건
즉 어제·오늘 실측 가능한 dedup 차단 건수는 0건이다. 오늘의 telegram_send_hashes.json은 새 shared dedup 적용 후 sent ledger 8건만 남아 있다.
6. 현재 상태
- cmux semantic dedup 추가 완료
- 추가 실제 발송 없이 테스트 완료
- 향후 1시간 내 같은 surface/status/compliance/warning 조합은 timestamp/current_activity가 달라도 skip
- 기존 full-text dedupe는 그대로 유지됨
7. 자체평가
| 기준 | 점수 | 근거 |
|---|---|---|
| 정확성 | 4.4/5 | 2798/2799 불일치 원인을 본문 diff로 확인하고 cmux용 stable signature dedup 적용 |
| 완성도 | 4.2/5 | 코드 패치, shared dedup 배치, 무발송 검증, 효과 측정 보고 완료 |
| 검증 | 4.3/5 | py_compile, temp-store, monkeypatch send path, no-notify CLI smoke 통과 |
| 최소 변경 | 4.3/5 | cmux_supervisor와 OpenClaw dedup 유틸 배치만 변경. 실제 발송 추가 없음 |
종합: 4.3/5
DONE