bond_daily_report 최신 message_id 확보 시도
bond_daily_report 최신 message_id 확보 시도
결론
- 최신 산출물 생성/저장 상태는 정상 확인했다.
- Hermes memory:
/Users/ron/.hermes/workspace/memory/bond-briefing/2026-04-14.json,latest.json— 둘 다2026-04-15 16:00:28생성/갱신. - vault note:
/Users/ron/knowledge-agent/100-inbox/119-크레딧메일/260414_브리핑_2026-04-14.md존재. - 오늘 16:00 실행의 그룹 텍스트 폴백 성공 로그는 확인했다.
텔레그램 그룹 텍스트 폴백: 성공- 다만 최신 Telegram
message_id는 확보하지 못했다. - 현재
send_group_chunked()경로가 내부_send_raw()의message_id를 bool로 버려서, 성공 로그에는 message_id가 남지 않는다. sector_trace.log는send_sector()호출만 남기므로 bond의 그룹 폴백 경로는 기록되지 않았다.- Hermes gateway 로그도 해당 시각에
getUpdates만 있고 bondsendMessage/sendDocument응답 body 또는 message_id는 남아 있지 않았다. - 지시대로 1회 재실행했으나, 이번 재실행은 LLM 단계에서 DNS 오류로 중단되어 그룹 전송 단계까지 도달하지 못했다. 따라서 신규 message_id도 생성되지 않았다.
판정: 부분 PASS — 산출물과 16:00 그룹 폴백 성공은 확인. 그러나 최종 freeze 전 요구된 “최신 message_id”는 현 로그 구조상 복원 불가이며, 1회 재실행도 네트워크/DNS 실패로 신규 전송 증거 확보 실패.
1단계 — 현재 상태 재확인
로그 위치
요청 경로 ~/.hermes/logs/bond_*.log에는 bond 전용 로그가 없었다. 실제 스크립트 로그는 아래에 기록된다.
/Users/ron/.hermes/workspace/logs/bond_daily_report.log
최근 핵심 로그:
[2026-04-15 15:59:29] bond_daily_report 시작
[2026-04-15 15:59:29] 노트: 260414_황대진_전달-일일-414-화-마감-및-채권시장-정리-DS증권-황대진.md
[2026-04-15 15:59:29] 파싱 완료 — 타입: 낙찰정리, 날짜: 2026-04-14, 낙찰: 0건
[2026-04-15 16:00:18] LLM 완료 (모델: ollama/qwen2.5:3b, 2689자)
[2026-04-15 16:00:28] [WARN] NanumGothic 폰트 없음 — PDF 생성 스킵
[2026-04-15 16:00:28] 메모리 저장 완료. 볼트: /Users/ron/knowledge-agent/100-inbox/119-크레딧메일/260414_브리핑_2026-04-14.md
[2026-04-15 16:00:30] 텔레그램 그룹 텍스트 폴백: 성공
최신 산출물
2026-04-15 16:00:28 7798 /Users/ron/.hermes/workspace/memory/bond-briefing/2026-04-14.json
2026-04-15 16:00:28 7798 /Users/ron/.hermes/workspace/memory/bond-briefing/latest.json
2026-04-15 16:00:28 35 /Users/ron/.hermes/workspace/memory/bond-briefing/explained_terms.json
PDF는 2026-04-14 건이 없다. 원인은 로그상 NanumGothic 폰트 없음 — PDF 생성 스킵이며, 이 경우 스크립트가 그룹 텍스트 폴백을 사용한다.
vault note
-rw-r--r-- 7392 Apr 15 16:00 /Users/ron/knowledge-agent/100-inbox/119-크레딧메일/260414_브리핑_2026-04-14.md
sector_trace
/Users/ron/.hermes/logs/sector_trace.log
bond 관련 최근 라인은 없었다. 원인: bond_daily_report.py는 send_sector()가 아니라 send_group_chunked() 또는 send_document()를 직접 호출한다.
2단계 — 재실행 with 증거 수집
재실행은 원본 파일 수정 없이 sitecustomize.py로 urllib.request.urlopen 응답/오류만 캡처했다.
캡처 디렉터리:
/tmp/bond_daily_resend_20260415172922
실행 명령:
PYTHONPATH="/tmp/bond_daily_resend_20260415172922/instrument:/Users/ron/.hermes/workspace/scripts:/Users/ron/.hermes/workspace/scripts/shared:/Users/ron/.hermes/workspace/scripts/pipeline" \
TELEGRAM_API_CAPTURE_LOG="/tmp/bond_daily_resend_20260415172922/telegram_api_capture.jsonl" \
python3 /Users/ron/.hermes/workspace/scripts/pipeline/bond_daily_report.py --notify \
> /tmp/bond_daily_resend_20260415172922/bond_daily_report_stdout.log \
2> /tmp/bond_daily_resend_20260415172922/bond_daily_report_stderr.log
종료코드:
0
stdout:
[2026-04-15 17:30:33] bond_daily_report 시작
[2026-04-15 17:30:33] 노트: 260414_황대진_전달-일일-414-화-마감-및-채권시장-정리-DS증권-황대진.md
[2026-04-15 17:30:33] 파싱 완료 — 타입: 낙찰정리, 날짜: 2026-04-14, 낙찰: 0건
[2026-04-15 17:31:24] [ERROR] LLM 실패: github-copilot/gpt-5-mini: <urlopen error [Errno 8] nodename nor servname provided, or not known>
stderr:
no oauth token found for github.com
Telegram send failed after 3 retries: <urlopen error [Errno 8] nodename nor servname provided, or not known>
Telegram API 캡처:
{"ts": "2026-04-15 17:31:24", "url": "https://api.telegram.org/bot***/REDACTED", "method": "POST", "elapsed_ms": 2.3, "error": "URLError(gaierror(8, 'nodename nor servname provided, or not known'))"}
{"ts": "2026-04-15 17:31:25", "url": "https://api.telegram.org/bot***/REDACTED", "method": "POST", "elapsed_ms": 2.5, "error": "URLError(gaierror(8, 'nodename nor servname provided, or not known'))"}
{"ts": "2026-04-15 17:31:27", "url": "https://api.telegram.org/bot***/REDACTED", "method": "POST", "elapsed_ms": 2.5, "error": "URLError(gaierror(8, 'nodename nor servname provided, or not known'))"}
해석:
- 이번 재실행은
bond_daily_report.py의 LLM 호출 단계에서 실패했다. - 실패 알림
send_dm_chunked()가 Telegram API를 3회 호출했으나 DNS 오류로 실패했다. - 따라서 이번 실행은
send_group_chunked()/send_document()까지 도달하지 않았고, 신규 그룹 message_id는 없다.
3단계 — 중복 방지 / message_id 복원 가능성
bond_daily_report 자체 dedupe
bond_daily_report.py 안에는 날짜/해시 기반 “이미 발송됨” dedupe 로직이 없다. 관련 흐름은 아래와 같다.
PDF 생성 성공 → send_document(GROUP_CHAT_ID, ..., topic_id=DAILY_REPORT_TOPIC_ID)
PDF 생성 실패 → send_group_chunked(report_md, topic_id=DAILY_REPORT_TOPIC_ID, parse_mode="")
오늘 16:00 실행은 PDF 생성 실패 → 텍스트 폴백 경로였다.
shared.telegram dedupe
send_group_chunked()에는 1시간 TTL 파일 기반 dedupe가 있다.
/Users/ron/.hermes/run/telegram_dedup.json
관련 코드 경로:
shared/telegram.py:592 send_group_chunked(...)
shared/telegram.py:596 if _is_duplicate(GROUP_CHAT_ID, text): ... return True
shared/telegram.py:602 _send(GROUP_CHAT_ID, chunk, ...)
단, 이번 17:30 재실행은 LLM 실패로 리포트 본문이 생성되지 않았기 때문에 dedupe skip이 아니라 전송 전 실패다.
message_id가 안 남는 이유
_send_raw()는 Telegram 응답에서 message_id를 추출한다.
shared/telegram.py:350 _send_raw(...)
shared/telegram.py:381 if result.get("ok"):
shared/telegram.py:384 mid = result.get("result", {}).get("message_id")
shared/telegram.py:387 return {"ok": True, "message_id": mid, "error": None}
하지만 send_group_chunked()는 _send()를 호출하고, _send()는 bool만 반환한다.
shared/telegram.py:403 def _send(...)
shared/telegram.py:410 result = _send_raw(...)
shared/telegram.py:427 return bool(result.get("ok"))
알림센터 직접 메시지(NOTIFICATION_CENTER_ID, topic_id 없음)만 notification_center_log에 message_id를 남긴다. bond 그룹 토픽 발송은 그 경로가 아니다.
기존 저장소 검색 결과
sector_trace.log: bond 라인 없음.*_last_telegram.tsv: analyst 계열만 존재, bond 없음.ops_multiagent.db.notification_center_log: bond 실패 알림 기록만 있음. 그룹 리포트 message_id 없음.gateway.log: 2026-04-15 16:00/17:31 부근getUpdates200 OK만 확인. bondsendMessage/sendDocument응답 body 또는 message_id 없음.
DB에서 확인된 bond 관련 최신 실패 알림:
id=187 ts=2026-04-15 17:31:27 topic=bond_daily_report success=0 message_id=None raw_error=<urlopen error [Errno 8] nodename nor servname provided, or not known>
Telegram 도달 증거
확보된 도달 증거는 다음 하나다.
[2026-04-15 16:00:30] 텔레그램 그룹 텍스트 폴백: 성공
이 로그는 send_group_chunked()가 True를 반환했다는 의미다. 다만 현재 구현상 Telegram API 응답의 message_id는 저장되지 않아 복원할 수 없다.
남은 리스크 / 권고
- 최신 message_id 확보는 아직 미완료
- 현 로그만으로는 16:00 그룹 폴백 성공의 message_id를 복원할 수 없다.
- 다음 재실행 전 관측성 보강 필요
- 최소 변경안:
send_group_chunked()에서 각 chunk 전송 결과의message_id를 trace/tsv/DB 중 하나에 남기도록 보강. - 더 좁은 임시안:
bond_daily_report.py실행 시만 monkeypatch로_send_raw()결과를 별도 jsonl에 기록하고, 네트워크 정상 환경에서 1회 재실행. - 재실행 조건
- LLM fallback이 DNS/OAuth 없이 로컬 모델로 통과해야 한다.
- Telegram API DNS가 정상이어야 한다.
- PDF 폰트가 없으면 텍스트 폴백은 정상 경로이므로 문제 아님.
증거 파일
/tmp/bond_daily_resend_20260415172922/step1_current_state.txt
/tmp/bond_daily_resend_20260415172922/bond_daily_report_stdout.log
/tmp/bond_daily_resend_20260415172922/bond_daily_report_stderr.log
/tmp/bond_daily_resend_20260415172922/telegram_api_capture.jsonl
/tmp/bond_daily_resend_20260415172922/workspace_bond_logs.txt
/tmp/bond_daily_resend_20260415172922/message_store_search.txt
/tmp/bond_daily_resend_20260415172922/gateway_telegram_search.txt
/tmp/bond_daily_resend_20260415172922/telegram_file_search.txt
자체평가
- 정확성: 4.2/5 — 현재 로컬 로그/DB/캡처 기준으로 message_id 부재 원인을 확인했다.
- 완성도: 4.0/5 — 산출물/로그/재실행/검색은 완료했으나, 네트워크 실패로 신규 message_id 확보는 미완료.
- 검증: 4.2/5 — stdout/stderr/API 캡처/DB/로그를 모두 확인했다.
- 최소 변경: 5.0/5 — 원본 스크립트 수정 없음, bond_daily_report 1회 실행만 수행.
종합: 4.35/5