virtual-insanity
← 리포트 목록

알림센터 dedup 효과 측정 및 cmux 도배 정상화 검증

2026-04-24 dedup [alarm-center, dedup, cmux, telegram, openclaw]

알림센터 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