virtual-insanity
← 리포트 목록

d_day_critic_summary

2026-04-14 post

260414 post D-day 종합 Critic 검증 요약

작성: 2026-04-14 19:27 KST
범위: bond, alert routing, webapp part1, webapp part2, other reports recovery 5개 보고서
원칙: 원본 코드 수정 없음. 보고서/런타임/산출물/DB/Flask test_client/pytest만 검증.

총판정

보고서 판정 핵심 이유
260414_bond_pipeline_recovery.md REVISE Gmail 수집·신규 04-12 리포트·웹 route는 복구 확인. 단, 현재 Hermes job command는 /usr/bin/python3로 고쳐졌지만 마지막 실제 Hermes 실행 산출물은 여전히 python3 실행분이고 PDF 실패 로그가 남아 있음. 고친 command로 재실행 검증 필요.
260414_alert_routing_audit.md APPROVE 코드 경로, DB, audit output, monkeypatch 라우팅 테스트로 INFO→알림센터 / CRITICAL→DM / LOG→로그-only 확인. 보고서가 주요 엣지도 이미 짚음.
260414_webapp_repair_part1.md APPROVE /api/ops, /graph 모두 Flask test_client 200 확인. 실서버 로그에도 19:09~19:10 live 200 기록 있음. 단 현재 Codex sandbox는 로컬 소켓 연결 자체가 막혀 curl 재현은 불가.
260414_webapp_repair_part2.md REVISE 핵심 endpoint 3개는 test_client 200 확인. 그러나 /api/chart/SPY?days=abc가 500, days=0이 전체 데이터를 반환. 또 price-history 정기 갱신 job이 여전히 artifact-read/paused 구조라 seed 데이터가 지속 갱신되지 않음.
260414_other_reports_recovery.md APPROVE daily_report 테스트 70 passed, commodity wrapper 복구, Hermes 산출물, jobs 상태, 알림센터 row, webapp_refresh dry-run 결과 대부분 재현. 잔존 리스크도 보고서에 반영됨.

APPROVE 3 / REVISE 2 / REJECT 0


1) bond pipeline recovery — REVISE

검증한 사실:

  • Hermes 현재 상태:
  • ocAK-AK000-bond-daily-dry-run: enabled/scheduled/last_status ok, 현재 command는 /usr/bin/python3 ... bond_daily_report.py --notify.
  • ocAO-AO003-bond-morning-command: enabled/scheduled/last_status ok, command는 gmail_credit_monitor.py --fixed-income-only.
  • Gmail 수집 output 2026-04-14_19-11-00.md 확인:
  • 황대진 6건 발견, 신규 4건 저장, exit code 0.
  • bond 생성 output 2026-04-14_19-17-34.md 확인:
  • 입력 260412_황대진..., 파싱 날짜 2026-04-12, LLM 9253자, 메모리/vault 저장 완료.
  • 하지만 이 output의 command 표기는 아직 python3 ... bond_daily_report.py --notify이고 stdout에 PDF 생성 실패: No module named 'fpdf'가 있음.
  • 파일 확인:
  • 2026-04-12.json 존재, briefing_2026-04-12.pdf 존재(171,581 bytes), vault briefing 존재.
  • Flask test_client:
  • /market/bond-study/2026-04-12 200
  • /market/bond-study/2026-04-12/pdf 200 application/pdf
  • /market/bond-study/2026-04-14 404 — 원본 04-14 황대진 노트 부재라 정상

담당 세션 전달 형식:

  • 문제: /usr/bin/python3 고정 후 실제 Hermes 재실행 증거가 없음.
  • 증거: 마지막 ocAK output은 No module named 'fpdf'로 PDF 실패. PDF 파일은 이후 별도 생성된 것으로 보이며 scheduled command 전체 성공을 증명하지 못함.
  • 요구 수정: 현재 jobs.json의 /usr/bin/python3 command로 hermes cron run ocAK-AK000-bond-daily-dry-run 1회 재실행 후, 새 output에서 PDF 실패가 사라졌는지 확인하고 보고서 갱신.
  • 엣지: 04-14 원본 데이터 없음, Gmail 네트워크/계정 범위 차이, LLM 429 fallback 반복, Hermes PATH 의존성.

2) alert routing audit — APPROVE

검증한 사실:

  • shared/telegram.py 코드 확인:
  • send_dm(level=info/error/warning/alert)NOTIFICATION_CENTER_ID로 redirect.
  • send_dm(level=critical)은 5줄 제한 후 DM_CHAT_ID로 전송.
  • level=log는 전송 없이 log row 경로.
  • send_sector() 텍스트 fallback은 알림센터 root.
  • send_sector_photo()/send_sector_album() config 누락 fallback은 DM.
  • 외부 전송 없이 monkeypatch로 실행 검증:
  • info/error → -1003522748967 알림센터
  • critical → 492860021 DM, 5줄 초과 시 안내 문구 추가
  • log → log-only
  • chunk-info → 알림센터 chunk
  • chunk-critical → DM chunk
  • DB 24h 분포 재확인 시 보고서 이후 row가 늘었지만 방향성 일치:
  • error/info 위주로 알림센터 로그 존재, DNS 실패 row 존재.
  • audit output 파일 존재 확인.
  • oil jobs 2개 enabled/last_status ok 확인.

담당 세션 전달 형식:

  • 문제 1: send_dm_chunked()는 caller mute 검사를 critical 여부보다 먼저 수행함.
  • 요구: CRITICAL chunked는 mute보다 우선하거나, 의도 정책을 명시.
  • 문제 2: send_sector_photo()/send_sector_album()은 sector config 누락 시 DM fallback.
  • 요구: 텍스트 send_sector()와 동일하게 알림센터 fallback으로 맞출지 결정.
  • 문제 3: sector topic 전송은 notification_center_log에 자동 기록되지 않음.
  • 요구: topic_id가 있는 알림센터 전송도 관측 row를 남길지 결정.
  • 엣지: Telegram API DNS 실패 시 topic→root fallback도 같이 실패 가능.

3) webapp repair part1 — APPROVE

검증한 사실:

  • Flask test_client:
  • /api/ops 200 application/json, keys digest/tasks/workers 확인.
  • /graph 200 HTML, Knowledge Graph 렌더 확인.
  • route/code 확인:
  • api_ops()_L() 전체 언패킹 대신 loaders[4], [5], [7] 참조.
  • /graph alias가 /vault/knowledge-graph view에 추가됨.
  • 실서버 로그 확인:
  • 19:07에는 /api/ops 500, /graph 404였음.
  • restart 후 19:09~19:10에 /api/ops, /graph 200 기록 있음.
  • 현재 Codex sandbox에서 curl/socket connectPermissionError(1, Operation not permitted) 또는 connection refused로 재현 불가. 단 lsof상 8080 listener는 존재하고 test_client는 통과.

담당 세션 전달 형식:

  • 문제: 현재 git diff 기준 market.py, vault.py 변경량이 매우 큼. part1 의도 변경과 기존 미커밋 변경의 경계가 보고서만으로는 완전 증명되지 않음.
  • 요구: 후속 정리 때 part1 소유 변경 hunk만 별도 기록하거나, 기존 변경분/part2 변경분과 구분되는 증거를 남길 것.
  • 엣지: _L() 반환 순서가 또 바뀌면 index 참조도 깨짐. named tuple/dict loader가 더 안전.

4) webapp repair part2 — REVISE

검증한 사실:

  • 파일/코드:
  • graph.html/vault/knowledge-graph/graph.json 절대 경로 사용.
  • vault.py/vault/knowledge-graph/graph.json route 존재.
  • SPY.json 존재, 50 rows, 2026-01-30~2026-04-13, source_url 기록.
  • price_history_collector.py에 SPY ticker 추가.
  • Flask test_client:
  • /vault/knowledge-graph/embed 200
  • /vault/knowledge-graph/graph.json 200, 약 25MB, nodes 8,972 / edges 38,034
  • /api/chart/SPY?days=30 200, rows 30, 2026-03-02~2026-04-13
  • Hermes price-history 상태:
  • 실제 collector job 후보들은 paused/error.
  • enabled인 ocAL-AL004-price-history-command는 artifact-read 성격.
  • ocAB-AB003-price-history-reminder도 실제 collector가 아니라 prompt/reminder 성격.

담당 세션 전달 형식:

  • 문제 1: /api/chart/SPY?days=abc가 500.
  • 증거: ValueError: invalid literal for int() with base 10: 'abc'.
  • 요구: days 파라미터 숫자 검증 및 400/기본값 fallback.
  • 문제 2: /api/chart/SPY?days=0이 전체 50 rows를 반환.
  • 원인: Python slice [-0:].
  • 요구: 1 이상으로 clamp.
  • 문제 3: SPY seed는 route 404 해소에는 충분하지만 정기 갱신은 미복구.
  • 요구: price-history 실제 collector job을 1개만 canonical enabled로 전환하거나, 별도 보고서에서 의도적으로 미처리 확정.
  • 엣지: graph.json 25MB 직접 서빙은 모바일/느린 네트워크에서 부담. 캐시/압축/경량 API 우선 전략 필요.

5) other reports recovery — APPROVE

검증한 사실:

  • daily_report.py, commodity_spike_analyzer.py AST parse OK.
  • wrapper af_commodity_morning_normalized.sh bash syntax OK.
  • tests/test_daily_report.py: 70 passed.
  • daily_report.py 보강 marker 확인:
  • --force, last_analysis_status, last_llm_model, last_delivery_ok, [DEGRADED], [SKIP] 존재.
  • Hermes output 파일 8개와 run_results JSON 존재 확인.
  • 주요 state/산출물 mtime 확인:
  • commodity-alerts/latest.json 19:20:52, dry_run=false
  • goal-alignment/latest.json 19:14:02
  • vault-control/latest_report.json 19:18:34
  • ~/.claude/vault-context.md 19:15:06
  • 알림센터 DB:
  • data_freshness_watcher success=1 message_id=2300
  • commodity_spike_analyzer 19:19 실패 row 후 19:20 success=1 message_id=2301
  • Hermes selected jobs 상태는 보고서와 일치:
  • ocAF-AF008, ocAN-AN000, ocV-V005, ocV-V006, ocG-010, ocAF-AF006, ocAH-AH000, ocA-vault-control ok/scheduled
  • ocV-V000-daily-market disabled/paused duplicate
  • webapp_refresh.py --dry-run 재현:
  • 오늘 데이터 있음 7개: market-indicators, daily-report, vault-flow-health, sector-news, analyst-macro, analyst-fundamental, analyst-pm
  • stale/skip: geopolitical, analyst-technical

담당 세션 전달 형식:

  • 문제 1: daily-report는 정상 실행이지만 입력이 거의 비어 no_data 상태.
  • 요구: 파이프라인 장애는 아니나 upstream 데이터 공백 원인 별도 추적.
  • 문제 2: commodity_spike_analyzer.py는 알림 전송 실패를 cron failure로 승격하지 않음.
  • 증거: 보고서 Remaining Risks와 19:19 실패 row 후 재실행 성공.
  • 요구: 운영 정책상 “전송 실패=잡 실패”로 볼지 결정.
  • 문제 3: geopolitical, analyst-technical freshness는 이번 범위 밖으로 남음.
  • 요구: 별도 담당 배치 필요.

통합 리스크

  1. 로컬 Codex sandbox에서 8080 소켓 접속이 막힘. curl 직접 검증 대신 Flask test_client와 실서버 로그를 병행해야 함.
  2. Hermes shell PATH가 Python 의존성 차이를 만든다. bond의 fpdf, commodity의 pandas가 같은 계열 문제.
  3. “last_status ok”가 실제 외부 전달 성공을 항상 뜻하지 않는다. DNS 실패, dedupe success, fallback success를 분리해서 봐야 함.
  4. webapp은 seed 데이터로 404를 막는 방식과 실제 collector 복구가 섞여 있음. D-day 이후에는 seed/실수집/프롬프트 artifact를 구분해야 함.

자체평가

  • 정확성: 4.7/5
  • 완성도: 4.6/5
  • 검증: 4.7/5
  • 최소 변경: 4.8/5
  • 종합: 4.7/5

미달/주의: 외부 인터넷 원천 데이터(SPY StockAnalysis 원본값)는 현재 검증 범위에서 제외했고, 로컬 8080 curl은 sandbox 제한으로 test_client/로그 대체 검증함.