wiki fetch 43회 연속 실패 안정화
결론
- 로그의
wiki 연속실패 43회는 외부 Wikipedia/API fetch 실패가 아니라 로컬shared.pipeline_wiki실행 이력 해석의 false positive였다. oil_supply_monitor는 가격·차트·텔레그램까지 성공해도 wiki 기록을 항상partial로 남겼고,pipeline_wiki.get_failure_patterns()가partial을 hard failure로 세어 연속 실패가 누적됐다.- 패치 후
get_failure_patterns("oil_supply_monitor")결과는failure_count=0,failure_rate=0%,streak=0으로 정상화됐다.
1. 호출처와 로그 증거
호출처:
/Users/ron/.hermes/workspace/scripts/pipeline/oil_supply_monitor.py- 시작 시:
from shared.pipeline_wiki import get_failure_patterns - 종료 시:
from shared.pipeline_wiki import log_run as wiki_log /Users/ron/.hermes/workspace/scripts/shared/pipeline_wiki.py- 로컬 마크다운 이력 저장소:
/Users/ron/.hermes/workspace/memory/pipeline-wiki/oil_supply_monitor.md
실측 로그:
- 2026-04-20 수동 실행:
연속실패 12회,13회,14회 - 2026-04-24 가격 신선도 fix 실행:
연속실패 43회
문제 파일의 실제 Summary:
last_status: partial
success_rate_7d: 0/33 (0%)
avg_score_7d: 30
하지만 같은 2026-04-24 13:17 실행은 WTI/Brent 가격 수집, 텔레그램 발송, snapshot 저장, 품질 평가 5.0/5.0까지 완료했다. 즉 실제 hard failure가 아니라 wiki 분류 기준 오류였다.
2. 43회 산정
Hermes oil monitor는 하루 3회 등록되어 있다.
| id | schedule | enabled |
|---|---|---|
| ocCRIT-oil-supply-monitor-global | 06:00 KST | true |
| ocRESTORE-oil-supply-monitor-afternoon | 14:00 KST | true |
| ocCRIT-oil-supply-monitor-evening | 21:00 KST | true |
로컬 wiki 이력은 최근 14일 기준 44개였다. 특히 2026-04-20에 수동 재실행이 21건 있어 자연 cron 3회/일보다 빠르게 streak가 쌓였다.
3. 근본 원인
A. oil_supply_monitor의 wiki status 기록 오류
기존 로직:
_src_ok = sum(1 for k, v in checklist.items() if isinstance(v, dict) and bool(v) and not k.startswith("_"))
wiki_log("oil_supply_monitor", {
"status": "success" if _src_ok > 5 else "partial",
"score": min(100, _src_ok * 10),
})
checklist의 top-level dict 섹션 수가 3개 수준이라 정상 실행도 항상 partial, score 30으로 기록됐다.
B. pipeline_wiki의 partial 처리 오류
기존 get_failure_patterns()는 status != success를 모두 실패로 셌다. 그 결과 degraded-but-usable인 partial이 hard failure로 계산되어 streak=43이 됐다.
4. 수정 내역
백업:
/Users/ron/.hermes/workspace/scripts/shared/pipeline_wiki.py.bak-wiki-stabilize-20260424/Users/ron/.hermes/workspace/scripts/pipeline/oil_supply_monitor.py.bak-wiki-stabilize-20260424
수정:
/Users/ron/.hermes/workspace/scripts/shared/pipeline_wiki.py_is_success_status()와_is_failure_status()추가.- hard failure는
fail/failed/failure/error/critical만 세도록 변경. -
partial은 full success는 아니지만 hard failure도 아니게 처리. -
/Users/ron/.hermes/workspace/scripts/pipeline/oil_supply_monitor.py - wiki 기록 기준을 checklist 섹션 수에서 핵심 가격 지표 + evaluator 통과 여부로 변경.
- 핵심 지표:
wti,brent,singapore_crack - 조건: evaluator 통과 + 핵심 지표 2개 이상이면
success. - 핵심 지표가 일부 있으면
partial, 전부 없으면failure.
5. 검증
구문 검사:
python3 -m py_compile scripts/shared/pipeline_wiki.py scripts/pipeline/oil_supply_monitor.py → 통과
패턴 조회:
get_failure_patterns("oil_supply_monitor", days=14)
결과:
{
'total_runs': 44,
'failure_count': 0,
'failure_rate': '0%',
'top_failing_sources': [],
'recent_errors': [],
'streak': 0
}
oil_supply_monitor.py --dry-run 시작부 검증:
[wiki] 최근 14일: 44회 실행, 실패율 0%
[1/6] 데이터 수집 중...
· 현물가격 (yfinance)...
→ WTI=96.62 Brent=106.16 HH=2.722 JetCrack=67.23
stderr line count at that point: 0.
주의: full dry-run은 이후 뉴스 인텔리전스 (웹) 외부 fetch 단계가 길어져 5~10분 제한 내 wiki 검증 범위만 확인했다. 이번 패치 대상인 wiki failure gate는 이미 streak=0으로 안정화됐다.
6. Remaining Risks
뉴스 인텔리전스 (웹)단계 자체가 길어질 수 있다. 이는 wiki false failure와 별개이며, 다음 과제로 timeout/캐시/skip flag를 넣는 것이 좋다.partial을 hard failure에서 제외했으므로, 진짜 장애는 status를failure또는error로 기록해야 한다. oil monitor는 핵심 가격 지표가 전부 없으면failure로 남기게 보강했다.
자체평가
- 정확성: 4.4/5 — 43회 원인이 외부 wiki fetch가 아니라 local pipeline-wiki status false positive임을 확인하고 수정.
- 완성도: 4.1/5 — wiki gate는 해결. 장시간 news fetch는 별도 리스크로 분리.
- 검증: 4.2/5 — py_compile, failure pattern 조회, dry-run 시작부 로그 검증 완료.
- 최소 변경: 4.3/5 — 공통 wiki 실패 판정과 oil monitor wiki 기록부만 변경.
종합: 4.25/5
DONE