kpi-daily / kpi-weekly 본문 품질점검
1. 실제 07:45 발송 본문 확보
확인 소스:
- ~/.hermes/logs/kpi_daily.log 마지막 100줄
- ~/.hermes/logs/kpi_daily.json
- ~/.hermes/logs/sector_trace.log
07:45 자동 발화 증거:
[SECTOR_TRACE] send_sector(ops) caller=kpi_telegram_wrapper.py:170 text='📊 <b>일일 KPI 리포트</b>\n날짜: <code>2026-04-16</code>...'
[kpi-wrapper] telegram_ok=True message_id=2381 error=None
실제 본문:
📊 <b>일일 KPI 리포트</b>
날짜: <code>2026-04-16</code>
<b>전체</b>
• 처리/실패/대기: <b>1</b> / <b>0</b> / <b>6</b>
• 성공률: <b>100.0%</b>
• Cron: <b>8/8</b> 활성, 비활성 0
<b>에이전트별</b>
• Ron: done 0, fail 0, queued 5, 성공률 100.0%
• Codex: done 0, fail 0, queued 1, 성공률 100.0%
• Cowork: done 1, fail 0, queued 0, 성공률 100.0%
• Fundamental: done 0, fail 0, queued 0, 성공률 100.0%
• Macro: done 0, fail 0, queued 0, 성공률 100.0%
• Technical: done 0, fail 0, queued 0, 성공률 100.0%
생성: <code>2026-04-16T07:45:00</code>
원본 데이터 핵심:
entries 6
last date 2026-04-16
Ron done=0 failed=0 queued=5 success_rate=100
Codex done=0 failed=0 queued=1 success_rate=100
Cowork done=1 failed=0 queued=0 success_rate=100
cron 8/8 active
2. 품질 평가 — 해리 관점
판정: 기존 본문은 숫자는 맞지만 운영 판단에는 부실.
문제점:
1. done=0, fail=0인 에이전트가 성공률 100%로 표시됨. 실제로는 처리 표본이 0이라 성공으로 해석하면 안 된다.
2. 전체 성공률도 표본 1건 기준 100%라 의미가 작지만, 본문은 이를 정상 신호처럼 보인다.
3. 전일 대비 변화율/추세가 없다. 대기열이 늘었는지 줄었는지 즉시 판단 불가.
4. 예외/경고가 없다. cron 실패 기록이 있어도 본문에서는 8/8 활성만 보여 정상처럼 보인다.
5. 액셔너블한 정보가 없다. 오늘 무엇을 봐야 하는지 제시하지 않는다.
6. 차트/시각화는 없고, 텔레그램 본문에서는 최소한 텍스트 추세 마커가 필요하다.
7. 주간 리포트는 7일 미만일 때 “데이터 부족”만 보여주며, 같은 날짜 중복 실행을 1일치처럼 정규화하지 않아 표본 해석이 흐릴 수 있다.
참고: 요청된 ~/knowledge-agent/400-reports/260415_kpi_deep_analysis.md는 존재하지 않았다. 대신 기존 wrapper 도입 보고서 260415_fix_kpi_telegram.md만 확인했고, 이번 품질 설계는 현재 로그와 데이터 기준으로 적용했다.
3. 재설계
/Users/ron/.hermes/workspace/scripts/pipeline/kpi_telegram_wrapper.py만 수정했다.
새 daily 섹션: - 핵심지표 Top3 1. 처리량 + 표본 기반 성공률 2. 병목 대기열 Top agent 3. 파이프라인 health + 실패 cron 기록 - 전일 대비 - Exception - Next Action
새 weekly 섹션: - 같은 날짜 중복 KPI 실행은 최신 1개로 collapse - 7일 미만이면 “표본 부족”을 제목에 명시 - 부족하더라도 누적 처리/실패, 현재 대기, queue delta, cron exception, next action 표시
핵심 변경:
- 처리 표본 0건 성공률은 N/A(처리 0건) 또는 Exception으로 처리
- 8/8 활성만 보지 않고 last_status=error / last_error cron을 함께 표시
- Next Action을 최대 3개로 제한해 바로 볼 수 있게 함
4. 수정 diff
백업:
/Users/ron/.hermes/workspace/scripts/pipeline/kpi_telegram_wrapper.py.bak-qc-260416-081412
전체 diff 저장:
/tmp/kpi_qc_260416/kpi_telegram_wrapper.diff
주요 diff 요약:
+def _collapse_by_date(history):
+ """같은 날짜에 여러 번 실행된 KPI는 가장 최근 timestamp만 대표값으로 사용."""
+
+def _success_text(done, failed):
+ denom = done + failed
+ if denom <= 0:
+ return "N/A(처리 0건)"
+ return f"{done / denom * 100:.1f}% (표본 {denom}건)"
+
+def _cron_exception_jobs(jobs, limit=4):
+ # enabled job 중 last_status=error 또는 last_error 존재 시 예외로 표시
+
- "📊 <b>일일 KPI 리포트</b>",
- "<b>전체</b>",
- "<b>에이전트별</b>",
+ "📊 <b>일일 KPI 리포트 — 운영 판단형</b>",
+ "<b>핵심지표 Top3</b>",
+ "<b>전일 대비</b>",
+ "<b>Exception</b>",
+ "<b>Next Action</b>",
- if len(history) < 7:
- "상태: <b>데이터 부족 (...일)</b>"
+ daily = _collapse_by_date(history)
+ title_status = "표본 부족" if coverage < 7 else "7일 추세"
+ # 부족 상태에서도 partial weekly 지표와 action 출력
검증:
python -m py_compile kpi_telegram_wrapper.py -> compile_ok
5. 재실행 결과 — no-send
실제 텔레그램 중복 발송은 피하기 위해 --no-send로 1회씩 실행했다. 원본 KPI tracker는 실제 실행되어 kpi_daily.json에 테스트 run 1건이 추가됐다.
명령:
python kpi_telegram_wrapper.py --no-send
python kpi_telegram_wrapper.py --weekly --no-send
daily after
📊 <b>일일 KPI 리포트 — 운영 판단형</b>
날짜: <code>2026-04-16</code>
<b>핵심지표 Top3</b>
1) 처리량: <b>1</b> 완료 / <b>0</b> 실패 — 성공률 100.0% (표본 1건)
2) 병목: 대기 <b>7</b>건 (Ron 6, Codex 1)
3) 파이프라인: 8/8 활성; 실패 기록 4건
<b>전일 대비</b>
• 완료 0 / 실패 0 / 대기 +2
<b>Exception</b>
• 처리 0건 에이전트: Ron, Codex, Fundamental, Macro, Technical — 성공률 100%로 보지 않음
• 실패 기록 cron: vault-analyst-feedback, price-history SPY refresh, batchM-intelligence-blog-monitor, gmail-newsletter-collector
• 주간 추세 표본 부족: 2/7일
<b>Next Action</b>
• Ron 대기 6건 우선순위 정리
• 실패 cron 재실행/로그 확인: vault-analyst-feedback
• KPI 표본이 작음 — 성공률보다 처리량/대기 감소를 기준으로 판단
생성: <code>2026-04-16T08:15:24</code>
weekly after
📈 <b>주간 KPI 리포트 — 표본 부족</b>
기간: <code>2026-04-15 ~ 2026-04-16</code>
<b>핵심지표 Top3</b>
1) 2일 누적 처리: <b>2</b> 완료 / <b>0</b> 실패 — 성공률 100.0% (표본 2건)
2) 현재 대기: <b>7</b>건 (기간 내 변화 +2)
3) 파이프라인: 8/8 활성; 실패 기록 4건
<b>Exception</b>
• 표본 2/7일 — 주간 평균/추세 확정 보류
• 실패 기록 cron: vault-analyst-feedback, price-history SPY refresh, batchM-intelligence-blog-monitor, gmail-newsletter-collector
• 최근 처리 표본이 작아 성공률 해석 제한
<b>Next Action</b>
• Ron 대기 6건 우선순위 정리
• 실패 cron 재실행/로그 확인: vault-analyst-feedback
• KPI 표본이 작음 — 성공률보다 처리량/대기 감소를 기준으로 판단
6. 결론
- 기존 07:45 msg_id 2381 본문은 “성공률 100%”가 실제 운영 상태를 과도하게 좋게 보이게 하는 문제가 있었다.
- wrapper를 운영 판단형 본문으로 변경했다.
- daily/weekly 모두
--no-send재실행에서 새 본문 생성 성공, exit 0 확인. - 다음 자동 발화부터 동일 wrapper 경로를 사용하므로 개선 본문이 ops 토픽으로 나간다.
7. 자체평가
- 정확성: 4.7/5 — 실제 로그/JSON/sector trace를 확인했고, 요청된 daily/weekly 본문을 모두 개선했다.
- 완성도: 4.6/5 — 섹션 재설계와 주간 표본 부족 처리를 적용했다. 다만 차트 이미지는 범위 밖이라 텍스트 추세 마커로 대체했다.
- 검증: 4.7/5 — py_compile, daily no-send, weekly no-send 모두 통과했다.
- 최소 변경: 4.8/5 —
kpi_telegram_wrapper.py만 수정했고 원본 tracker/공유 모듈은 건드리지 않았다.
종합: 4.7/5
Remaining Risks:
- ron_kpi_tracker.py 자체는 여전히 처리 0건 성공률을 100%로 저장한다. 이번 수정은 텔레그램 wrapper 표시 계층에서 보정한 것이다.
- no-send 재실행도 원본 tracker를 호출하므로 kpi_daily.json에 테스트 run 1건이 추가됐다.