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-12200/market/bond-study/2026-04-12/pdf200 application/pdf/market/bond-study/2026-04-14404 — 원본 04-14 황대진 노트 부재라 정상
담당 세션 전달 형식:
- 문제:
/usr/bin/python3고정 후 실제 Hermes 재실행 증거가 없음. - 증거: 마지막
ocAKoutput은No module named 'fpdf'로 PDF 실패. PDF 파일은 이후 별도 생성된 것으로 보이며 scheduled command 전체 성공을 증명하지 못함. - 요구 수정: 현재 jobs.json의
/usr/bin/python3command로hermes cron run ocAK-AK000-bond-daily-dry-run1회 재실행 후, 새 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 →
492860021DM, 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/ops200 application/json, keysdigest/tasks/workers확인./graph200 HTML, Knowledge Graph 렌더 확인.- route/code 확인:
api_ops()가_L()전체 언패킹 대신loaders[4],[5],[7]참조./graphalias가/vault/knowledge-graphview에 추가됨.- 실서버 로그 확인:
- 19:07에는
/api/ops500,/graph404였음. - restart 후 19:09~19:10에
/api/ops,/graph200 기록 있음. - 현재 Codex sandbox에서
curl/socket connect는PermissionError(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.jsonroute 존재.SPY.json존재, 50 rows,2026-01-30~2026-04-13, source_url 기록.price_history_collector.py에 SPY ticker 추가.- Flask test_client:
/vault/knowledge-graph/embed200/vault/knowledge-graph/graph.json200, 약 25MB, nodes 8,972 / edges 38,034/api/chart/SPY?days=30200, 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.pyAST parse OK.- wrapper
af_commodity_morning_normalized.shbash 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.json19:20:52,dry_run=falsegoal-alignment/latest.json19:14:02vault-control/latest_report.json19:18:34~/.claude/vault-context.md19:15:06- 알림센터 DB:
data_freshness_watchersuccess=1 message_id=2300commodity_spike_analyzer19: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-controlok/scheduledocV-V000-daily-marketdisabled/paused duplicatewebapp_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-technicalfreshness는 이번 범위 밖으로 남음. - 요구: 별도 담당 배치 필요.
통합 리스크
- 로컬 Codex sandbox에서 8080 소켓 접속이 막힘. curl 직접 검증 대신 Flask test_client와 실서버 로그를 병행해야 함.
- Hermes shell PATH가 Python 의존성 차이를 만든다. bond의
fpdf, commodity의pandas가 같은 계열 문제. - “last_status ok”가 실제 외부 전달 성공을 항상 뜻하지 않는다. DNS 실패, dedupe success, fallback success를 분리해서 봐야 함.
- 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/로그 대체 검증함.