virtual-insanity
← 리포트 목록

market-indicator-tracker 크론 08-16 정지 원인 진단 (macro-timeseries 38개 정체)

2026-09-28 guardian [ops, cron, macro-timeseries, market-indicators, failure-analysis]

결론 (한 줄)

market-indicator-tracker는 연속실패 자동 비활성화가 아니라, 2026-08-17 13:31:43 KST에 사유 기록 없이 30개 잡이 한꺼번에 멈춘 일괄 정지(08-16/17 역이관 정황)에 휩쓸린 것이다. 그리고 macro-timeseries 38개 정체의 진짜 작성자는 이 잡이 아니라 같은 초에 함께 멈춘 macro-series-collector다.

[점검]

  • 장부: /Users/ron/.hermes/cron/jobs.json (mtime 09-28 13:06, 라이브), /Users/ron/.hermes/cron/executions.db (복사본 /tmp/exec_copy.db로 조회), 참고용 /Users/ron/.hermes-next/cron/{jobs.json,executions.db}
  • 실행 증빙: /Users/ron/.hermes/cron/output/ocRESTORE-market-indicator-tracker/*.md
  • 스크립트: scripts/pipeline/market_indicator_tracker.py (존재, 102,249바이트), scripts/pipeline/macro_series_collector.py (존재, 19,921바이트)

[수치]

jobs.json 필드 (id=ocRESTORE-market-indicator-tracker, 3101행)

필드 값
enabled / state false / paused
schedule 5 7,16 * * * (Asia/Seoul)
last_run_at 2026-08-16T07:05:43.508583+09:00
last_status error
last_error RuntimeError: HTTP 429 usage_limit_reached (prolite, resets_at=1787196898)
failure_streak / consecutiveErrors 필드 없음
paused_at 2026-08-17T13:31:43.841328+09:00 (3149행)
paused_reason null (3150행)
migration {source: cron-missing-recovery-surface2, date: 2026-04-22} — moved-from-hermes-next 태그 없음
command PYTHONPATH=.../scripts /usr/bin/python3 .../scripts/pipeline/market_indicator_tracker.py --notify

executions.db 조회

  • SQL: SELECT id,status,started_at,finished_at,error,delivery_outcome FROM executions WHERE job_id='ocRESTORE-market-indicator-tracker' AND started_at BETWEEN '2026-08-10' AND '2026-08-18' → 0행 (라이브 ~/.hermes 장부). 원인: 이 장부는 전체 1000행만 남아 있고 최소 started_at=2026-09-27T10:42 — 8월 기록은 이미 밀려나 없다(SELECT min(started_at),max(started_at),count(*) FROM executions → 2026-09-27T10:42:58 / 2026-09-28T13:08:09 / 1000).
  • 같은 SQL을 ~/.hermes-next 장부(1000행, 08-15 23:31~08-16 12:45)에 실행 → 1행: ocRESTORE-market-indicator-tracker|completed|2026-08-16T07:05:07|07:05:36.
  • 대체 증빙(output 폴더): 08-10~08-14 07:05까지는 [SILENT] 정상 응답, 08-14 16:05 / 08-15 07:05 / 08-15 16:05 / 08-16 07:05 4회는 HTTP 429 usage_limit_reached 오류.

이상한 점 — 셸 잡인데 429

이 잡은 LLM을 부르지 않는 셸 명령인데 ~/.hermes 쪽 출력은 "Prompt" 섹션이 있는 에이전트 모드 형식으로 429가 찍혔다. 같은 08-16 07:05에 ~/.hermes-next 쪽은 Mode: no_agent (script) 로 정상 완료(silent)했다. 즉 08-14 16:05부터 두 게이트웨이가 같은 잡을 동시에 돌렸고, 구 경로 쪽은 셸 잡을 에이전트로 잘못 처리하다 모델 한도(프롤라이트)에 걸린 것이다. 스크립트 자체 실패가 아니다.

일괄 정지 규모

  • jobs.json 158개 중 paused_at이 2026-08-17T13:31로 시작하는 잡: 30개, 전부 paused_reason=null. last_status: error 26 / ok 4.
  • 여기에 macro-series-collector(157행, paused_at 2026-08-17T13:31:43.153, last_status=ok, last_run_at 2026-08-14T06:50)가 포함된다. 연속실패 없이 멈췄다.
  • 자동 비활성화(sweeper consecutiveErrors≥3) 흔적 없음: 해당 필드 자체가 없고, 정지 시각이 한 초 안에 30개로 몰려 있어 일괄 조작으로 판정.

macro-timeseries 작성 주체 분리

폴더 작성자 상태
memory/macro-timeseries/ (51개) macro-series-collector (평일 06:50, 전 50개) + fi-morning-brief 07:10 (11개 --series) 38개 08-14 정지, 11개 매일 갱신
memory/market-indicators/YYYY-MM-DD.json market-indicator-tracker 08-17 이후 09-01/02/07만 산발(수동 추정), 09-28 오늘 수동 실행분
- 근거: market_indicator_tracker.py 31행 OUTPUT_DIR = WORKSPACE / "memory" / "market-indicators" — macro-timeseries에 안 쓴다. macro_series_collector.py 31행 MACRO_DIR = WORKSPACE / "memory" / "macro-timeseries".
- 실행 전 mtime 분포: 2026-05-11 1개 / 2026-08-14 38개 / 2026-08-27 1개(CPIAUCSL) / 2026-09-28 11개 = 51개.

수동 1회 실행 결과 (2026-09-28 KST)

  1. cd /Users/ron/.hermes/workspace && PYTHONPATH=/Users/ron/.hermes/workspace/scripts /usr/bin/python3 scripts/pipeline/market_indicator_tracker.py (--notify 제외, DM 미발송)
  2. 13:09:41~13:10:12, exit 0, 지표 89개, 이상치 24건, Saved: 2026-09-28.json
  3. macro-timeseries 변경 파일 수: 0 (예상대로 — 이 스크립트는 다른 폴더에 씀)
  4. 부수 경고: 웹앱 알림 트리거 HTTP 404 (무시 처리됨)
  5. cd /Users/ron/.hermes/workspace && /usr/bin/python3 scripts/pipeline/macro_series_collector.py
  6. 13:10:28~13:11:27, exit 0, 50/50 succeeded, 0 failed (success_rate=100.0%)
  7. macro-timeseries 변경 파일 수: 50 / 51. 실행 후 mtime 분포: 2026-09-28 50개 / 2026-05-11 1개(ADPWNUSNERSA — 수집 목록에 없는 과거 잔재, 목록엔 ADPMNUSNERSA만 있음)
  8. 최신 관측일 예: DGS10 2026-09-24 5.18, BAMLC0A0CM 2026-09-24 0.79, WALCL 2026-09-23, CPIAUCSL 2026-08-01(월간 정상 주기)
  9. ls -lt memory/macro-timeseries/*.json | head 결과 상위: BOGZ1FL663067003Q, CPIMEDSL, CUSR0000SEHC, DEXCHUS, MMMFFAQ027S, WRESBAL, WTREGEN, RRPONTSYD, ADPMNUSNERSA, JTSJOL — 모두 9월 28 13:11.

[판단]

  • 즉시 조치(완료): 두 수집기 수동 1회 실행으로 오늘자 데이터 공백 메움. 크론 설정은 건드리지 않음(두 잡 모두 enabled=false 유지).
  • 해리 확인 필요: macro-series-collector와 market-indicator-tracker 재가동. 둘 다 스크립트는 정상(exit 0)이라 켜기만 하면 된다. 재가동하지 않으면 38개는 내일부터 다시 멈춘다.
  • 참고: 같은 초에 멈춘 나머지 28개 잡(fed-liquidity-aggregator, economic-calendar-daily, kr-index-close-refresh 등)도 같은 원인일 가능성이 높다 — 일괄 재검토 필요.

[다음행동]

  • ops_todos #1976 등록: "[재가동 승인 요청] macro-series-collector + ocRESTORE-market-indicator-tracker 크론 (08-17 13:31 일괄 paused)" (todo/high, assigned harry)
  • 승인 후 검증: 다음 06:50 / 07:05 실행 뒤 stat -f '%Sm %N' -t '%Y-%m-%d' memory/macro-timeseries/*.json | awk '{print $1}' | sort | uniq -c 에서 50개가 당일이어야 함, ls -lt memory/market-indicators/*.json | head -1 이 당일이어야 함.
  • 재가동 시 주의: 두 잡 모두 셸 잡이다. 08-14~16처럼 에이전트 모드로 잘못 처리되지 않는지 첫 실행 output의 Mode: no_agent (script) 줄을 확인할 것.