bond-daily-report 파이프라인 복구 보고서
작성/갱신: 2026-04-14T19:22:00+09:00
1) chain 추적
| 구간 | 확인 결과 |
|---|---|
| Hermes 채권 cron | ocAK-AK000-bond-daily-dry-run = bond-daily-report-real-notify 활성, ocAO-AO003-bond-morning-command = bond-morning-poll-real-gmail-collector 활성 |
| OpenClaw 원본 cron | bond-daily-report, bond-morning-poll 모두 enabled=false 상태. 삭제하지 않음 |
| 생성 스크립트 | /Users/ron/.openclaw/workspace/scripts/pipeline/bond_daily_report.py |
| 입력 위치 | ~/knowledge/100 수신함/119 크레딧메일 → symlink → ~/knowledge-agent/100 수신함/119 크레딧메일 |
| 입력 선택 방식 | bond_daily_report.py가 *황대진*.md를 파일명 역순으로 골라 최신 노트 사용 |
| Gmail 수집 스크립트 | /Users/ron/.openclaw/scripts/gmail_credit_monitor.py --fixed-income-only |
| 황대진 Gmail 조건 | [email protected], subject query DS증권 황대진 |
| 웹앱 데이터 | ~/.openclaw/workspace/memory/bond-briefing/{date}.json, latest.json, briefing_{date}.pdf |
| 웹앱 route | /market/bond-study/<date>는 위 JSON을 읽어 렌더링 |
2) 원인
확인된 원인은 2개였다.
-
Hermes 이전본이 실제 생성이 아니라 dry-run이었다.
ocAK-AK000-bond-daily-dry-run의 이전 command가bond_daily_report.py --dry-run이라 stdout만 만들고memory/bond-briefing/*.json, PDF, vault briefing, Telegram 전송을 하지 않았다. -
Hermes Gmail 수집 cron이 실제 수집이 아니라 OpenClaw payload 출력 mirror였다.
ocAO-AO003-bond-morning-command의 이전 command가 실제gmail_credit_monitor.py실행이 아니라 OpenClaw jobs.json에서 command 문자열만 출력하는 형태였다.
부가로, ocAK를 real notify로 바꾼 뒤 첫 실행에서 Hermes gateway의 PATH 때문에 python3가 Hermes venv를 잡았고, 그 venv에는 fpdf가 없어 PDF 생성이 실패했다. /usr/bin/python3에는 fpdf 2.8.4가 설치되어 있어 command를 절대경로로 고정했다.
3) 복구 액션
백업:
/Users/ron/.hermes/cron/jobs.json.bak-bond-pipeline-recovery-20260414190935/Users/ron/.openclaw/cron/jobs.json.bak-bond-pipeline-recovery-20260414190935/Users/ron/.hermes/cron/jobs.json.bak-bond-pythonfix-20260414192014
Hermes 수정:
| Job | 변경 전 | 변경 후 |
|---|---|---|
ocAK-AK000-bond-daily-dry-run |
... python3 .../bond_daily_report.py --dry-run |
PYTHONPATH=... /usr/bin/python3 /Users/ron/.openclaw/workspace/scripts/pipeline/bond_daily_report.py --notify |
ocAO-AO003-bond-morning-command |
OpenClaw payload command 출력 | python3 /Users/ron/.openclaw/scripts/gmail_credit_monitor.py --fixed-income-only && echo 완료 |
코드 파일은 수정하지 않았다.
4) 실행 결과
4-1. Gmail 수집 cron
실행: hermes cron run ocAO-AO003-bond-morning-command
결과 파일: /Users/ron/.hermes/cron/output/ocAO-AO003-bond-morning-command/2026-04-14_19-11-00.md
확인 결과:
- Exit Code:
0 [황대진] 6건 발견- 신규 저장 4건:
260412_황대진_전달-금일-413-월-주간-입찰-및-수요예측-안내-DS증권-황대진.md260410_황대진_전달-일일-410-금-마감정리-및-해외시장-동향-DS증권-황대진.md260409_황대진_전달-금일-410-금-입찰-안내-DS증권-황대진.md260409_황대진_전달-일일-49-목-마감정리-및-다음주-입찰-일정-안내-DS증권-황대진.md
중요: 04-08 이후 메일은 도착해 있었지만, 2026-04-14 날짜의 황대진 노트는 확인되지 않았다. 최신 실데이터는 260412..., 메일 제목상 4/13 주간 입찰/수요예측 안내다.
4-2. bond_daily_report cron
실행: hermes cron run ocAK-AK000-bond-daily-dry-run
결과 파일: /Users/ron/.hermes/cron/output/ocAK-AK000-bond-daily-dry-run/2026-04-14_19-17-34.md
확인 결과:
- Exit Code:
0 - 입력 노트:
260412_황대진_전달-금일-413-월-주간-입찰-및-수요예측-안내-DS증권-황대진.md - 파싱 날짜:
2026-04-12 - LLM:
github-copilot/gpt-5-mini는 429 rate limit →openai-codex/gpt-5.4폴백 성공 - LLM 완료:
9253자 - 저장 완료:
/Users/ron/.openclaw/workspace/memory/bond-briefing/2026-04-12.json/Users/ron/.openclaw/workspace/memory/bond-briefing/latest.json/Users/ron/knowledge-agent/100-inbox/119-크레딧메일/260412_브리핑_2026-04-12.md- Telegram: PDF 실패 당시 텍스트 폴백 전송 성공
- PDF: Hermes venv의
fpdf누락으로 첫 실행에서는 실패했지만, command를/usr/bin/python3로 고정한 뒤 저장된 report_md에서briefing_2026-04-12.pdf를 생성 확인
생성된 PDF:
/Users/ron/.openclaw/workspace/memory/bond-briefing/briefing_2026-04-12.pdf- 크기:
171,581 bytes
5) 웹앱 검증
Codex sandbox에서는 로컬 소켓 접속이 PermissionError [Errno 1] Operation not permitted로 막혀 curl 직접 검증은 불가했다. 대신 같은 Flask 앱을 test_client()로 로드해 route 렌더링을 검증했다.
| 엔드포인트 | 상태 | 본문/출력 확인 |
|---|---|---|
/market/bond-study/2026-04-14 |
404 | 브리핑 없음 — 04-14 실입력 데이터가 없으므로 정상적인 미생성 상태 |
/market/bond-study/2026-04-12 |
200 | HTML 41,167 bytes, 채권, 2026-04-12, 브리핑 포함 |
/market/bond-study/2026-04-12/pdf |
200 | application/pdf, 171,581 bytes |
/market/bond-study |
200 | 목록 HTML 15,544 bytes, 2026-04-12 포함 |
실서버 로그에서도 19:11에 /market/bond-study/2026-04-08 200은 확인됐고, 이번 검증은 test client로 04-12 신규 산출물을 확인했다.
6) 현재 상태
- Gmail 수집 chain: 복구됨. Hermes에서 실제 Gmail 수집 실행 성공.
- bond report 생성 chain: 복구됨. 최신 사용 가능한 황대진 노트 기준
2026-04-12리포트 생성 성공. - Hermes 다음 실행:
ocAK-AK000-bond-daily-dry-run:2026-04-15T02:30:00+09:00ocAO-AO003-bond-morning-command:2026-04-15T07:03:00+09:00- OpenClaw 원본 bond cron: 둘 다 disabled 유지.
- 금지 파일 무변경 확인:
shared/llm.py: 2026-04-14 12:53:12shared/cycle_base.py: 2026-04-14 12:25:16bond_daily_report.py: 2026-04-03 20:25:00
7) 잔존 리스크
-
2026-04-14 리포트는 만들지 않았다.
04-14 황대진 원본 노트가 없어서/market/bond-study/2026-04-14는 404가 맞다. 데이터 합성 금지 때문에 04-12/04-13 성격의 노트를 04-14로 둔갑시키지 않았다. -
Gmail MCP 검색과 로컬 수집 결과가 불일치했다.
Gmail connector 검색은 결과 0건이었지만, 실제gmail_credit_monitor.py는 황대진 6건을 찾고 4건을 저장했다. 계정/검색 범위 차이 가능성이 있다. -
github-copilot/gpt-5-minirate limit.
오늘 429가 반복되고 있으며, 실제 성공은openai-codex/gpt-5.4폴백으로 이뤄졌다. shared/llm.py는 요청상 수정하지 않았다. -
Hermes shell job의 PATH 문제.
python3가 Hermes venv를 잡으면fpdf가 없어 PDF가 실패한다. 이번 bond daily job은/usr/bin/python3절대경로로 고정해 해결했다. 같은 패턴이 다른 migrated cron에도 있을 수 있다.
8) 자체 평가
- 정확성: 4.6/5 — 실제 chain 원인을 확인하고 Hermes job을 real 수집/생성 경로로 복구했다.
- 완성도: 4.4/5 — 04-12 최신 실데이터 리포트는 복구했지만, 04-14 원본 데이터 부재로 04-14 endpoint 200은 달성하지 않았다.
- 검증: 4.6/5 — Hermes run, output 파일, memory/PDF, Flask test_client route까지 확인했다.
- 최소 변경: 4.8/5 — 코드 수정 없이 Hermes jobs.json의 bond 관련 2개 command만 복구했다.
종합: 4.6/5