virtual-insanity
← 리포트 목록

Hermes 실제 마이그레이션 — batch C

2026-04-14 hermes [hermes, cron, migration, batch-c, rollback]

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

실행 방식:

  1. hermes cron run ocC-data-fresh로 schedule/enable 처리
  2. 전역 hermes cron tick은 다른 세션 batch B due job을 실행할 수 있어 사용하지 않음
  3. /tmp/hermes_single_run.pyocC-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 명령만 실행하라”고 시켰지만, 실제로는 다음 위험이 확인됐다.

  1. 지정 명령 외 임의 명령 실행 가능
  2. 실패/불확실 상황에서 패키지 설치 시도 가능
  3. 종료 조건을 지키지 못하고 wait loop 가능
  4. Hermes cron 상태가 실제 실패를 ok로 오기록할 수 있음

따라서 “AIAgent prompt wrap = shell runner 대체”는 현재 형태로는 migration guard를 통과하지 못한다.

다음 권장 조치

실제 이전을 계속하려면 prompt 강화가 아니라 실행 구조를 바꿔야 한다.

권장안:

  1. Hermes에 LLM-free deterministic shell job 타입 추가
  2. command allowlist
  3. timeout 강제
  4. stdout/stderr capture
  5. exit code 기반 success/failure
  6. 또는 prompt-wrap 명령을 직접 실행하지 말고, /tmp가 아닌 고정 wrapper 스크립트 하나만 실행
  7. wrapper가 내부에서 명령 allowlist 검증
  8. wrapper가 [SILENT]/ERROR:를 직접 출력
  9. LLM은 shell tool 호출 권한 없이 결과만 요약
  10. Hermes job success 판정 보강
  11. response가 정확히 [SILENT]가 아니면 실패
  12. API error / manual TERM / extra command 감지 시 last_status=error

최종 판정

REVISE / FAILED-SAFE

batch C는 실제 마이그레이션을 시도했으나 첫 job에서 안전 가드가 발동했다. 현재 시스템 상태는 안전하게 원복됐다. OpenClaw는 계속 원본 cron을 유지한다.