애널리스트 입력 파일 정지(펀더멘털·기술 07-20) 원인 정리와 재가동 승인안
애널리스트 입력 파일 정지 원인 정리와 재가동 승인안
조회 시각: 2026-09-28 20:40~20:55 KST. 크론은 켜거나 끄지 않았다(조회만).
장부: /Users/ron/.hermes/cron/jobs.json(라이브, 158개 잡 중 enabled 50개), 비교용 정지 장부 /Users/ron/.hermes-next/cron/jobs.json.
한 줄 결론
사용량 한도 초과(429) 때문에 멈춘 게 아니다. 07-20에 수집 크론이 "스크립트를 실행하는 잡"에서 "빈 지시문으로 AI를 깨우는 잡"으로 잘못 옮겨져 수집기가 한 번도 안 돌았고(07-20~08-16), 429는 그 빈 AI 호출이 08-15~16 한도 소진 때 부수적으로 찍힌 흔적이다. 비활성은 연속 실패 자동 차단이 아니라 08-16·08-17 두 차례의 일괄 정지 조작이다.
1. 크론 5개 실측 표
| id | 명령 | 마지막 실행(라이브 장부) | 마지막 오류 | 정지 시각 / 사유 | 스크립트 모드 키 |
|---|---|---|---|---|---|
| ocRESTORE-vault-fundamental-bridge | cd /Users/ron/.hermes/workspace && PYTHONPATH=scripts:scripts/pipeline python3 scripts/pipeline/fundamental_collector.py (매일 07:00) |
2026-08-16 07:00:44 | HTTP 429 usage_limit_reached, prolite, resets_at 1787196898(=08-20 12:34 KST) | 2026-08-16 12:45:26 KST / "2026-08-16 미사용 정리 (3~4월 생성, 사용자 확인)" | no_agent·script 없음, prompt="" |
| ocRESTORE-vault-technical-bridge | ... /usr/bin/python3 scripts/pipeline/technical_collector.py --no-charts (매일 07:10) |
2026-08-16 07:10:45 | 동일 429 prolite | 2026-08-16 12:45:26 KST / 동일 "미사용 정리" | 없음 |
| ocRESTORE-inbox-bridge | PYTHONPATH=scripts:scripts/pipeline .../venv/bin/python3 scripts/pipeline/inbox_bridge.py (30분마다) |
2026-08-16 12:31:05 | 동일 429 prolite | 2026-08-16 12:45:26 KST / 동일 "미사용 정리" | 없음 |
| ocRESTORE-market-indicator-tracker | ... /usr/bin/python3 .../market_indicator_tracker.py --notify (07:05, 16:05) |
2026-08-16 07:05:43 | 동일 429 prolite | 2026-08-17 13:31:43 KST / 사유 없음(null) | 없음 |
| daily-context-snapshot | ... /usr/bin/python3 .../daily_context_snapshot.py (09:00, 22:00) |
2026-08-16 09:00:56 | 동일 429 prolite | 2026-08-17 13:31:53 KST / 사유 없음(null) | 없음 |
참고: 과제에 "3개"로 적힌 429는 실측상 5개 모두다. 매크로 쪽 ocRESTORE-vault-macro-bridge도 같은 08-16 12:45:26에 정지됐지만 last_error는 없음(08-14 ok).
2. 판정 — "한도 초과에 따른 연속 실패 자동 비활성"인가?
판정: 아니다. 근거 3가지.
- 07-20부터 수집기가 안 돌았다(한도와 무관한 원인).
- 라이브 장부 5개 잡 모두
no_agent/script키가 없고 지시문도 비어 있다(4개는prompt="", 스냅샷은 prompt 키 없이skills: []). 스케줄러는no_agent일 때만 스크립트를 실행한다(/Users/ron/.hermes/hermes-agent/cron/scheduler.py:1949if job.get("no_agent"):).command필드는 읽지 않는다. - 그래서 07-20 이후 이 잡들은 "빈 지시문 AI 잡"으로 돌았다. 펀더멘털 출력 기록: 711바이트
[SILENT]응답 24건(07-20~08-14, 상태 ok) + 920바이트 429 오류 4건(07-24~08-16). 기술도 708바이트 24건 + 917바이트 4건. 수집기 로그 줄은 0건. - 정지 장부(
~/.hermes-next)에는 같은 잡이no_agent: True,script: migrated/<id>.sh로 들어 있고, 마지막 정상 실행이 07-20 07:01(펀더멘털)·07:12(기술)였다가 같은 날 08:29에 정지됐다. 두 context 파일의collected_at(07-20T07:01:46 / 07-20T07:12:22)과 초 단위로 일치한다. 즉 07-20 08:29에 구 경로가 잡을 넘겨받으면서 스크립트 모드 정보가 빠졌다. - 래퍼 스크립트는
~/.hermes-next/scripts/migrated/에만 있고~/.hermes/scripts/migrated/에는 두 bridge 래퍼가 0개다. - 429는 결과이지 원인이 아니다. 이 잡들은 원래 AI를 부르지 않는 셸 수집기다(
fundamental_collector.py·technical_collector.py에 LLM 호출 없음). 429는 빈 AI 호출이 08-15~16 prolite 주간 한도 소진 구간에 걸려 찍힌 것이고, 한도는 08-20 12:34에 이미 풀렸다. - 꺼진 방식은 자동 차단이 아니라 일괄 조작이다.
- 5개 잡 모두
consecutiveErrors/failure_streak필드가 없다(자동 비활성 흔적 없음). - 08-16 03:45:26 UTC 같은 초에 45개 잡이 같은 사유 "미사용 정리 (사용자 확인)"로 정지(그중 last_status ok 5개 포함) → 사람/스크립트 일괄 정리.
- 08-17 13:31 같은 분에 30개 잡이 사유 없이 정지 → 역이관 시기 일괄 조작.
추가 발견(리스크):
- 07-20 마지막 정상 실행조차 펀더멘털은 "수집 완료: 0/176 성공"이었다(당시 실행 환경에 yfinance 모듈 없음, 176건 전부 실패). 그런데도 context 파일은 저장됐다. 지금 /usr/bin/python3에는 yfinance 1.2.0이 있어 재가동 시 이 문제는 없을 것으로 보이나 첫 실행에서 성공 건수를 반드시 확인해야 한다.
- 소비자는 살아 있다. 펀더멘털·기술 분석가는 07-20 입력으로 매일 시장방에 발송 중이다(/Users/ron/.hermes/logs/analyst_fundamental_last_telegram.tsv, 09-28 07:12 OK message_id 8058 / 기술 09-28 07:20 OK 8059). latest.json의 data_freshness는 null이라 신선도 차단도 없다. "미사용 정리" 사유와 실제 사용이 어긋난다.
- guardian 진단 3건(#40301 needs_evidence, #40314 failed, #40282 needs_evidence)은 결과물 경로 미실존(/Users/ron/.hermes/workspace/jobs.json 등)으로 반려됐다. 원인 결론 자체는 이 보고서로 대체한다.
3. [권고] 재가동 순서 (해리 승인 필요 — 크론 설정 변경)
기존 승인 티켓에 묶는다: ops_todos #1977(펀더멘털·기술), #1976(market-indicator-tracker). 새 티켓 없음.
1순위 — 펀더멘털·기술 bridge 2개
- 무엇을: enabled=true만 켜지 말고 no_agent: true + script: migrated/<id>.sh를 같이 넣고, 래퍼 2개를 ~/.hermes-next/scripts/migrated/에서 ~/.hermes/scripts/migrated/로 복사.
- 왜: enabled만 켜면 파일은 여전히 안 바뀐다. 현재 스케줄러 코드는 실행할 내용이 빈 잡을 AI로 깨우지 않고 바로 다시 정지시킨다(scheduler.py 1951~1956행 "Legacy / hand-edited job with nothing to run: pause it" → _block_and_pause_job). 즉 켜자마자 다시 꺼지거나, 구버전 동작이면 07-20~08-16처럼 빈 AI 호출만 돈다. no_agent로 넣으면 AI 호출 자체가 사라져 한도 소진에도 기여하지 않는다.
- 순서: ① 수동 1회 실행(발송 옵션 없음)으로 collected_at이 오늘로 바뀌고 성공 건수 170/176 이상 확인 → ② 잡 정의 수정 → ③ 다음날 07:00·07:10 첫 실행 출력에 "Mode: no_agent (script)" 줄 확인.
- 기대효과: 입력 정체 70일 → 0일. 펀더멘털·기술 분석가가 옛 입력으로 매일 내보내던 발송(09-22~09-28 7일간 펀더멘털 7건·기술 7건 OK)이 새 입력 기반으로 바뀜.
2순위 — market-indicator-tracker
- 같은 방식(no_agent + script). 첫 1주는 --notify 빼고 운영. 09-28 13:10 수동 실행분이 memory/market-indicators/2026-09-28.json에 이미 있음.
3순위 — 켜지 않는 것을 기본값으로 권고 - daily-context-snapshot: 원래 목적이 "구 시스템과 1주 병행 비교"(설명문 "for 1-week OpenClaw dual-run comparison")라 목적 종료. 계속 끔. - inbox-bridge: 30분마다 도는 고빈도 잡이며 해리가 08-16에 "미사용 정리"로 확인해 끈 항목. 필요 여부를 해리가 따로 말할 때까지 끔.
4. 한도 재발 방지안
- 1안(권고): 모델 변경이 아니라 AI 호출 제거. 이 5개는 셸 수집기라 no_agent로 돌리면 AI 호출이 0회가 된다. 잘못 옮겨진 구간(07-20~08-16) 동안 5개 잡이 만든 빈 AI 호출은 출력 기록 기준 206건(펀더멘털 28, 기술 28, 시장지표 50, 스냅샷 50, 인박스 50 — 07-20 이후 출력 파일 전부에 AI 지시문 섹션 존재, 스크립트 실행 0건)이었다.
- 2안: 실행 시각 분산. 지금 06:50 매크로 → 07:00 펀더멘털 → 07:05 시장지표 → 07:10 기술 → 07:11/07:20 분석가 발송이 20분에 몰려 있다. 펀더멘털 06:35, 기술 06:45로 당기면 분석가 실행(07:11, 07:20) 전에 수집이 끝나는 여유가 각각 약 30분 생긴다(현재 펀더멘털 수집 1.5~4분, 분석가 07:11 시작과 거의 붙어 있음).
- 3안: 재발 감지. 셸 잡(
type: shell)인데no_agent가 없는 잡을 찾아 경고하는 점검 1줄을 헬스체크에 추가(codex 위임). 현재 라이브 장부에서 이 조건에 걸리는 잡 수부터 세어 보고. - 4안: 분석가 발송 전 입력 신선도 확인. context 파일
collected_at이 2일 넘게 지나면 발송 보류 + 운영방 알림(codex 위임, 이미 매크로 쪽에 진행 중인 신선도 게이트와 같은 방식).
5. [검증방법]
- 성공: 재가동 다음날
python3 -c "import json;print(json.load(open('/Users/ron/.hermes/workspace/memory/analyst-context/context-fundamental.json'))['collected_at'])"결과가 그날 07시대, 기술도 동일. - 성공:
/Users/ron/.hermes/cron/output/ocRESTORE-vault-fundamental-bridge/최신 파일에 "Mode: no_agent (script)"와 "수집 완료: N/176"(N≥170) 줄 존재.## Prompt섹션이 있으면 실패. - 성공: 두 잡 output에
usage_limit_reached0건. - 롤백 조건: 첫 실행 실패 또는 성공 N<100이면 해당 잡 다시 끄고 수동 실행으로 원인 확인. 분석가 발송이 비정상(빈 본문 등)이면 해당 분석가 발송만 보류.
근거
/Users/ron/.hermes/cron/jobs.json1523행("enabled": false), 1557행(last_error 429), 1559행(paused_reason) — 펀더멘털. 1580/1614/1616 기술, 3104/3138/3150 시장지표, 3490/3527/3529 인박스, 3786/3811/3831 스냅샷./Users/ron/.hermes/hermes-agent/cron/scheduler.py:1949if job.get("no_agent"):/Users/ron/.hermes/cron/output/ocRESTORE-vault-fundamental-bridge/2026-08-13_07-01-02.md(응답[SILENT]),2026-08-16_07-00-44.md(429)/Users/ron/.hermes-next/cron/output/ocRESTORE-vault-fundamental-bridge/2026-07-20_07-01-46.md(Mode: no_agent, "수집 완료: 0/176 성공", Context saved)/Users/ron/.hermes-next/cron/output/ocRESTORE-vault-technical-bridge/2026-07-20_07-12-22.md("수집 완료: 176/176 성공")/Users/ron/.hermes/data/ops_multiagent.dbops_todos #1976, #1977 / bus_commands #40282, #40301, #40314