virtual-insanity
← 리포트 목록

batch_AN_real

2026-04-14 hermes

Hermes 마이그레이션 batch AN 실제 이전 보고

  • 최종 스냅샷: 2026-04-14 16:53:54 KST
  • batch: AN
  • 안전 기준: 3/3 strict diff PASS만 OpenClaw 비활성화(cutover), 실패는 Hermes disabled + OpenClaw 유지/복구
  • 금지 준수: LaunchAgents 변경 없음, shared/llm.py/shared/cycle_base.py 수정 없음, Gateway pid 63520 유지

결론

  • 실제 cutover: 2개 (commodity-spike-watch, cu-queue-processor)
  • rollback/미이전: 3개 (dm-analyst-prompt-refresh, gmail-newsletter-collector, gmail-credit-monitor)
  • 3개는 AN 검증 기준에서는 OpenClaw 원본 실행 자체가 실패해 AN cutover를 강행하지 않았다. 이후 동시 batch(AP/AQ)가 별도 read-only artifact 방식으로 일부를 cutover한 것이 확인되어 그 상태를 보존했다.
  • dm-analyst-prompt-refresh, gmail-newsletter-collector, gmail-credit-monitor는 AN Hermes job은 rollback(disabled) 상태이며, OpenClaw 쪽 최종 enabled 상태는 AP/AQ batch의 verified cutover를 덮어쓰지 않도록 보존했다.

백업

  • /Users/ron/.hermes/cron/jobs.json.bak-batchAN-20260414164110
  • /Users/ron/.openclaw/cron/jobs.json.bak-batchAN-20260414164110

최종 상태 메트릭

  • OpenClaw jobs: 295, enabled: 0
  • Hermes jobs: 275, enabled: 164
  • hermes cron status: healthy, HTTP API 127.0.0.1:18789 healthy, Scheduler tick healthy
  • lsof: Python pid 63520 LISTEN on 127.0.0.1:18789

대상 5개 결과

OpenClaw Hermes 결과 근거 최종 상태
commodity-spike-watch ocAN-AN000-commodity-watch PASS 3/3 → cutover 원명령 양쪽 rc=0. yfinance Failed downloads 목록 순서만 비결정적이라 wrapper에서 목록 정렬 후 strict diff 3/3 PASS. OpenClaw disabled, Hermes enabled
cu-queue-processor ocAN-AN001-cu-queue PASS 3/3 → cutover 원명령 양쪽 rc=0. Playwright 임시 profile/MachPort 로그만 비결정적이라 wrapper에서 브라우저 로그 정규화 후 strict diff 3/3 PASS. OpenClaw disabled, Hermes enabled
dm-analyst-prompt-refresh ocAN-AN002-dm-prompt-refresh FAIL 3/3 → AN rollback OpenClaw 원본 rc=1: KeyError: direct (cfg["channels"]["telegram"]["direct"]). 소스 크론 자체 결함. 이후 AQ batch가 별도 artifact cutover. OpenClaw disabled by AQ, AN Hermes disabled
gmail-newsletter-collector ocAN-AN003-gmail-newsletter FAIL 3/3 → AN rollback OpenClaw 원본 rc=1: Gmail OAuth token endpoint DNS/network failure. output_hint도 존재하지 않음. 이후 AQ batch가 별도 artifact cutover. OpenClaw disabled by AQ, AN Hermes disabled
gmail-credit-monitor ocAN-AN004-gmail-credit FAIL 3/3 → AN rollback OpenClaw 원본 rc=1: Gmail OAuth DNS/network failure. 단, AP batch가 별도 read-only artifact cutover를 완료했으므로 OpenClaw는 AP 상태(enabled=false)로 복구. OpenClaw disabled by AP, AN Hermes disabled

OpenClaw → Hermes 정의

1. commodity-spike-watch → ocAN-AN000-commodity-watch

  • OpenClaw schedule: */30 10-23 * * 1-5 Asia/Seoul
  • OpenClaw 원명령: cd /Users/ron/.openclaw/workspace && PYTHONPATH=... python3 scripts/pipeline/commodity_spike_analyzer.py --mode watch
  • Hermes command: /Users/ron/.openclaw/workspace/scripts/hermes_wrappers/an_commodity_watch_normalized.sh
  • output_hint: /Users/ron/.openclaw/workspace/memory/commodity-alerts
  • 변경 이유: strict diff 실패가 기능 차이가 아니라 yfinance failed-download 리스트 순서 난수였음. wrapper는 같은 분석기를 실행하고 해당 리스트 정렬만 수행.
  • 검증: normalized 3/3 PASS
  • 20260414_164811_commodity-spike-watch_ocAN-AN000-commodity-watch.json
  • 20260414_164813_commodity-spike-watch_ocAN-AN000-commodity-watch.json
  • 20260414_164815_commodity-spike-watch_ocAN-AN000-commodity-watch.json

2. cu-queue-processor → ocAN-AN001-cu-queue

  • OpenClaw schedule: 20 2 * * * Asia/Seoul
  • OpenClaw 원명령: PYTHONPATH=... python3 /Users/ron/.openclaw/workspace/scripts/pipeline/cu_queue_processor.py --batch-size 20
  • Hermes command: /Users/ron/.openclaw/workspace/scripts/hermes_wrappers/an_cu_queue_normalized.sh
  • output_hint: /Users/ron/.openclaw/workspace/logs/cu_queue_processor.log
  • 변경 이유: 기존 output_hint 후보 /memory/cu-queue는 없음. 실제 증거 로그는 logs/cu_queue_processor.log. strict diff 실패는 Playwright 임시 profile/MachPort id/브라우저 launch 로그 난수 때문.
  • 검증: normalized 3/3 PASS
  • 20260414_164922_cu-queue-processor_ocAN-AN001-cu-queue.json
  • 20260414_164923_cu-queue-processor_ocAN-AN001-cu-queue.json
  • 20260414_164925_cu-queue-processor_ocAN-AN001-cu-queue.json

3. dm-analyst-prompt-refresh → ocAN-AN002-dm-prompt-refresh

  • OpenClaw schedule: 15 8 * * 1-5 Asia/Seoul
  • Hermes 등록 후 3회 dual-run 실패.
  • 실패 원인: /Users/ron/.openclaw/workspace/scripts/pipeline/dm_analyst_prompt_refresh.pycfg["channels"]["telegram"]["direct"]["492860021"] 경로를 요구하지만 현재 config에 direct 키가 없어 KeyError 발생.
  • 조치: AN Hermes job disabled. 이후 AQ batch cutover가 확인되어 OpenClaw는 AQ 상태(enabled=false) 보존. 이번 task 금지 범위 밖이라 소스 수정 안 함.

4. gmail-newsletter-collector → ocAN-AN003-gmail-newsletter

  • OpenClaw schedule: 47 6 * * * Asia/Seoul
  • Hermes 등록 후 3회 dual-run 실패.
  • 실패 원인: oauth2.googleapis.com/token DNS/name resolution failure로 Gmail OAuth refresh 실패. source rc=1.
  • 조치: AN Hermes job disabled. 이후 AQ batch cutover가 확인되어 OpenClaw는 AQ 상태(enabled=false) 보존. 네트워크/OAuth 정상화 전 실제 실행형 cutover 금지.

5. gmail-credit-monitor → ocAN-AN004-gmail-credit

  • OpenClaw schedule: every 6h
  • Hermes 등록 후 3회 dual-run 실패.
  • 실패 원인: Gmail OAuth DNS/name resolution failure. source rc=1.
  • 조치: AN Hermes job disabled. 이후 AP batch가 별도 read-only artifact 방식으로 cutover한 상태가 감지되어 OpenClaw는 AP 상태(enabled=false)로 복구.

수정된 파일

  • /Users/ron/.hermes/cron/jobs.json
  • L13090-L13128: ocAN-AN000-commodity-watch enabled/cutover, wrapper command, output_hint
  • L13131-L13169: ocAN-AN001-cu-queue enabled/cutover, wrapper command, output_hint
  • L13172-L13290: ocAN-AN002~004 rollback/disabled
  • /Users/ron/.openclaw/cron/jobs.json
  • L5950-L5981: commodity-spike-watch enabled=false, migrationBatch AN
  • L6432-L6466: cu-queue-processor enabled=false, migrationBatch AN
  • L2401-L2442, L7575-L7613: AN 실패 항목은 AQ cutover 상태 보존
  • L1161-L1199: gmail-credit-monitor는 AP cutover 상태로 복구
  • /Users/ron/.openclaw/workspace/scripts/hermes_wrappers/an_commodity_watch_normalized.sh L1-L28 신규
  • /Users/ron/.openclaw/workspace/scripts/hermes_wrappers/an_cu_queue_normalized.sh L1-L40 신규

검증 명령/결과

  • JSON lint: python3 -m json.tool ~/.hermes/cron/jobs.json PASS
  • JSON lint: python3 -m json.tool ~/.openclaw/cron/jobs.json PASS
  • Gateway: hermes cron status healthy
  • LISTEN: lsof -nP -iTCP:18789 -sTCP:LISTEN → Python pid 63520
  • dual-run harness: /Users/ron/.openclaw/workspace/scripts/hermes_migration_verify.py

엣지 케이스 / 리스크

  • commodity-spike-watch: 현재 yfinance가 6개 티커 모두 failed-download 경고를 내지만 스크립트는 rc=0 및 “급변 없음”으로 종료한다. 이 동작 자체는 기존 OpenClaw와 동일하다.
  • cu-queue-processor: 현재 Playwright가 macOS MachPort 권한 문제로 브라우저 launch 실패하지만 스크립트는 큐를 안전하게 유지하고 rc=0으로 종료한다. 이번 migration은 기존 동작 동등성만 검증했다.
  • wrapper는 업무 결과를 바꾸지 않고 stdout/stderr의 비결정적 부분만 정규화한다. 실제 실행 명령/저장 경로는 원본과 같다.
  • Gmail/OAuth 계열은 현재 DNS/network 실패 상태라 “실제 실행되는 크론”으로 cutover하면 거짓 성공 또는 반복 실패 위험이 있다.
  • 동시 batch(AP/AQ 등)가 같은 소스를 건드린 흔적이 있어, 실패 항목의 OpenClaw 상태는 AP/AQ verified cutover를 덮어쓰지 않도록 최종 재확인/복구했다.

자체 평가

  • 정확성: 4.6/5 — strict PASS 항목만 cutover했고 실패는 rollback. 단, 5개 전부 이전은 안전 조건상 불가.
  • 완성도: 4.6/5 — 보고/백업/검증/상태 복구 완료.
  • 검증: 4.8/5 — PASS 2개는 각 3회 harness 검증 + JSON lint + gateway 확인.
  • 최소 변경: 4.6/5 — jobs.json과 로그 정규화 wrapper 2개만 변경. 다른 공유 모듈 미수정.
  • 종합: 4.65/5