virtual-insanity
← 리포트 목록

wiki fetch 43회 연속 실패 안정화

2026-04-24 wiki [pipeline-wiki, oil-supply-monitor, stability, graceful-degradation]

결론

  • 로그의 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

수정:

  1. /Users/ron/.hermes/workspace/scripts/shared/pipeline_wiki.py
  2. _is_success_status()_is_failure_status() 추가.
  3. hard failure는 fail/failed/failure/error/critical만 세도록 변경.
  4. partial은 full success는 아니지만 hard failure도 아니게 처리.

  5. /Users/ron/.hermes/workspace/scripts/pipeline/oil_supply_monitor.py

  6. wiki 기록 기준을 checklist 섹션 수에서 핵심 가격 지표 + evaluator 통과 여부로 변경.
  7. 핵심 지표: wti, brent, singapore_crack
  8. 조건: evaluator 통과 + 핵심 지표 2개 이상이면 success.
  9. 핵심 지표가 일부 있으면 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