Hermes 실제 마이그레이션 — batch C
결론
batch C는 실제 이전을 시도했지만 최종 dual-run 이전은 0개다. 이유는 보수적 보류가 아니라, 첫 Hermes 강제 실행(ocC-data-fresh)에서 prompt-wrap LLM이 지정 명령 이후 범위 밖 명령을 실행하려고 하며 무한 대기 루프에 빠졌기 때문이다.
안전 가드에 따라 즉시 batch C 전체를 rollback했다.
- Hermes batch C 항목 5개: 추가됨 → 현재 모두
enabled=false,state=paused - OpenClaw 원본 5개: 그대로
enabled=true - OpenClaw
jobs.json: 백업과 SHA256 동일, 변경 없음 - LaunchAgents/daemon: 변경 없음
- 삭제: 없음
안전 가드 확인
| 항목 | 결과 | 근거 |
|---|---|---|
| Hermes API 18789 LISTEN | ✅ | Python 45753 ... 127.0.0.1:18789 (LISTEN) |
| Hermes health | ✅ | {"status":"ok","platform":"hermes-agent"} |
| Hermes cron status | ✅ | Gateway is running — cron jobs will fire automatically, PID 45753 |
| 백업 | ✅ | Hermes/OpenClaw 백업 생성 |
| 5개 초과 금지 | ✅ | batch C 후보 5개만 처리 |
| LaunchAgent/daemon 변경 금지 | ✅ | 변경 없음 |
| OpenClaw 비활성화 | ✅ | 수행하지 않음. dual-run 검증 실패 전 단계에서 중단 |
백업 파일:
/Users/ron/.hermes/cron/jobs.json.bak-batchC-260414_140028/Users/ron/.openclaw/cron/jobs.json.bak-batchC-260414_140028/Users/ron/.hermes/cron/jobs.json.bak-batchC-before-add-1776143244/Users/ron/.hermes/cron/jobs.json.bak-batchC-baseurl127-1776143427/Users/ron/.hermes/cron/jobs.json.bak-batchC-rollback-1776143999
OpenClaw 파일 무변경 검증:
- current
/Users/ron/.openclaw/cron/jobs.json:dfdb65fe2bb573c662490fc13e6002d08ac8b1c9431b42ee7e5eff04951e99e8 - backup
/Users/ron/.openclaw/cron/jobs.json.bak-batchC-260414_140028:dfdb65fe2bb573c662490fc13e6002d08ac8b1c9431b42ee7e5eff04951e99e8 same=True
후보별 분석·조치
| 후보 | OpenClaw schedule | OpenClaw 상태 | 출력 경로/성격 | 사전 판단 | Hermes 조치 | 첫 실행/결과 | 최종 상태 |
|---|---|---|---|---|---|---|---|
data-freshness-watcher |
0 */4 * * * |
enabled | memory/analyst-technical/latest.json 및 freshness 메모리 |
주기적 운영 감시. OpenClaw 원본도 prompt형. side effect 작다고 판단해 첫 실행 대상으로 선정 | ocC-data-fresh 추가 후 hermes cron run + 단일 실행 스크립트로 강제 실행 |
❌ 지정 명령 뒤 pip install, python myscript.py, python setup.py install, wait 반복. 수동 TERM 필요 |
rollback: disabled/paused, last_status=error |
gics-sector-tracker |
15 6 * * 2-6 |
enabled | memory/gics-sector-summary.json |
데이터 수집. dry-run은 DNS/외부 API 실패로 0 tickers, 저장 없음 | ocC-gics-sector disabled 등록 |
실행 안 함. 첫 job 실패로 batch 중단 | rollback: disabled/paused |
etf-data-collect-domestic-index |
0 16 * * 1-5 |
enabled | ~/knowledge/600 데이터/610 TIME-ETF/etf_data |
~/knowledge 쓰기 및 matplotlib font-cache hang 위험. dry-run이 멈춰 pkill로 종료 |
ocC-etf-dom-idx disabled 등록 |
실행 안 함. 첫 job 실패로 batch 중단 | rollback: disabled/paused |
copper-market-collector |
30 7 * * 5 |
enabled | memory/market-indicators/copper |
주간 데이터 수집. dry-run rc=0이나 yfinance/SHFE 일부 실패, composite neutral | ocC-copper disabled 등록 |
실행 안 함. 첫 job 실패로 batch 중단 | rollback: disabled/paused |
urea-price-tracker |
0 9 * * 1 |
enabled | memory/urea-tracker |
주간 데이터 수집. dry-run rc=0이나 모든 urea source 실패, “No meaningful data collected” | ocC-urea disabled 등록 |
실행 안 함. 첫 job 실패로 batch 중단 | rollback: disabled/paused |
OpenClaw 원본 정의 확인
| id | enabled | schedule | 핵심 명령 |
|---|---|---|---|
data-freshness-watcher |
true | 0 */4 * * * |
cd /Users/ron/.openclaw/workspace && PYTHONPATH=scripts python3 scripts/pipeline/data_freshness_watcher.py |
gics-sector-tracker |
true | 15 6 * * 2-6 |
PYTHONPATH=... python3 .../gics_sector_tracker.py --all --collect |
etf-data-collect-domestic-index |
true | 0 16 * * 1-5 |
python3 /Users/ron/.openclaw/skills/etf-tracker/scripts/run_etf_tracker.py domestic_index |
copper-market-collector |
true | 30 7 * * 5 |
python3 .../copper_market_collector.py --notify |
urea-price-tracker |
true | 0 9 * * 1 |
python3 .../urea_price_tracker.py --notify |
Hermes 정의
batch C Hermes 항목은 .hermes/cron/jobs.json에 추가했다. 공통 설정:
- provider:
custom - model:
qwen2.5:3b - base_url:
http://127.0.0.1:11434/v1 - prompt-wrap 패턴: “다음 명령을 terminal/shell 도구로 정확히 한 번만 실행하고, 성공 시
[SILENT], 실패 시ERROR: ...”
현재 상태:
| Hermes id | schedule | enabled | state | next_run_at | last_status | paused_reason |
|---|---|---|---|---|---|---|
ocC-data-fresh |
0 */4 * * * |
false | paused | null | error | prompt-wrap 범위 밖 명령 및 wait loop로 rollback |
ocC-gics-sector |
15 6 * * 2-6 |
false | paused | null | null | ocC-data-fresh 실패 후 guard halt |
ocC-etf-dom-idx |
0 16 * * 1-5 |
false | paused | null | null | ocC-data-fresh 실패 후 guard halt |
ocC-copper |
30 7 * * 5 |
false | paused | null | null | ocC-data-fresh 실패 후 guard halt |
ocC-urea |
0 9 * * 1 |
false | paused | null | null | ocC-data-fresh 실패 후 guard halt |
첫 실행 상세: ocC-data-fresh
실행 방식:
hermes cron run ocC-data-fresh로 schedule/enable 처리- 전역
hermes cron tick은 다른 세션 batch B due job을 실행할 수 있어 사용하지 않음 /tmp/hermes_single_run.py로ocC-data-fresh단일 job만 실행
결과 파일:
/Users/ron/.hermes/cron/output/ocC-data-fresh/2026-04-14_14-09-43.md
Hermes 저장 response:
API call failed after 3 retries: Connection error.
실제 tee 로그 핵심:
RUN_START ocC-data-fresh phase-c-data-freshness-watcher
[tool] cd /Users/ron/.openclaw/workspace && PYTHONPATH=scripts python3 scripts/pipeline/data_freshness_watcher.py
[tool] pip install requests pyyaml
[tool] python myscript.py
[tool] python setup.py install
[tool] wait
[tool] wait 60s
...
판정:
- 지정 명령을 한 번 실행하라는 prompt를 지키지 않았다.
pip install,python myscript.py,python setup.py install은 명시 범위 밖이다.- 이후
wait반복으로 종료하지 않아 수동 TERM했다. - Hermes가 이 실패를 일시적으로
last_status=ok로 기록했기 때문에 수동으로last_status=error와 rollback reason을 기록했다.
diff / dual-run 판단
2회 cycle 비교는 수행하지 않았다.
이유:
- 첫 실행이 정상적인
[SILENT]또는ERROR: ...결과로 끝나지 않았다. - 지정 명령 외 shell 명령을 실행하려 했다.
- 따라서 output diff 이전 단계에서 safety guard 위반이다.
OpenClaw disable 단계는 수행하지 않았다.
rollback 검증
현재 Hermes batch C 상태:
ocC-data-fresh False paused None error
ocC-gics-sector False paused None None
ocC-etf-dom-idx False paused None None
ocC-copper False paused None None
ocC-urea False paused None None
현재 OpenClaw 원본 상태:
data-freshness-watcher enabled=True
gics-sector-tracker enabled=True
etf-data-collect-domestic-index enabled=True
copper-market-collector enabled=True
urea-price-tracker enabled=True
현재 Hermes active job은 batch C가 아니다:
['41c2736f0527', 'ocB-daily-context']
원인 판단
이번 실패는 개별 cron script 문제가 아니라 Hermes prompt-wrap 방식의 통제성 문제다.
LLM에게 “이 shell 명령만 실행하라”고 시켰지만, 실제로는 다음 위험이 확인됐다.
- 지정 명령 외 임의 명령 실행 가능
- 실패/불확실 상황에서 패키지 설치 시도 가능
- 종료 조건을 지키지 못하고 wait loop 가능
- Hermes cron 상태가 실제 실패를
ok로 오기록할 수 있음
따라서 “AIAgent prompt wrap = shell runner 대체”는 현재 형태로는 migration guard를 통과하지 못한다.
다음 권장 조치
실제 이전을 계속하려면 prompt 강화가 아니라 실행 구조를 바꿔야 한다.
권장안:
- Hermes에 LLM-free deterministic shell job 타입 추가
- command allowlist
- timeout 강제
- stdout/stderr capture
- exit code 기반 success/failure
- 또는 prompt-wrap 명령을 직접 실행하지 말고,
/tmp가 아닌 고정 wrapper 스크립트 하나만 실행 - wrapper가 내부에서 명령 allowlist 검증
- wrapper가
[SILENT]/ERROR:를 직접 출력 - LLM은 shell tool 호출 권한 없이 결과만 요약
- Hermes job success 판정 보강
- response가 정확히
[SILENT]가 아니면 실패 - API error / manual TERM / extra command 감지 시
last_status=error
최종 판정
REVISE / FAILED-SAFE
batch C는 실제 마이그레이션을 시도했으나 첫 job에서 안전 가드가 발동했다. 현재 시스템 상태는 안전하게 원복됐다. OpenClaw는 계속 원본 cron을 유지한다.