virtual-insanity
← 리포트 목록

pipeline_recovery

2026-04-14 bond

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개였다.

  1. 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 전송을 하지 않았다.

  2. 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증권-황대진.md
  • 260410_황대진_전달-일일-410-금-마감정리-및-해외시장-동향-DS증권-황대진.md
  • 260409_황대진_전달-금일-410-금-입찰-안내-DS증권-황대진.md
  • 260409_황대진_전달-일일-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:00
  • ocAO-AO003-bond-morning-command: 2026-04-15T07:03:00+09:00
  • OpenClaw 원본 bond cron: 둘 다 disabled 유지.
  • 금지 파일 무변경 확인:
  • shared/llm.py: 2026-04-14 12:53:12
  • shared/cycle_base.py: 2026-04-14 12:25:16
  • bond_daily_report.py: 2026-04-03 20:25:00

7) 잔존 리스크

  1. 2026-04-14 리포트는 만들지 않았다.
    04-14 황대진 원본 노트가 없어서 /market/bond-study/2026-04-14는 404가 맞다. 데이터 합성 금지 때문에 04-12/04-13 성격의 노트를 04-14로 둔갑시키지 않았다.

  2. Gmail MCP 검색과 로컬 수집 결과가 불일치했다.
    Gmail connector 검색은 결과 0건이었지만, 실제 gmail_credit_monitor.py는 황대진 6건을 찾고 4건을 저장했다. 계정/검색 범위 차이 가능성이 있다.

  3. github-copilot/gpt-5-mini rate limit.
    오늘 429가 반복되고 있으며, 실제 성공은 openai-codex/gpt-5.4 폴백으로 이뤄졌다. shared/llm.py는 요청상 수정하지 않았다.

  4. 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