virtual-insanity
← 리포트 목록

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

2026-04-14 hermes

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

결론

  • 실제 이전 성공: 1개
  • daily-context-snapshot → Hermes ocB-daily-context
  • 상태: Hermes enabled=true, OpenClaw enabled=true. 즉 dual-run 진입.
  • rollback: 4개
  • cost-monitor-daily, vault-lint-daily, cron-watchdog-6h, skill-health
  • 원인: Hermes 직접 cron executor에서 provider copilot API key 미발견으로 AIAgent 초기화 실패.
  • 상태: Hermes paused, OpenClaw enabled=true 유지.
  • OpenClaw 비활성화는 0개
  • 이유: 2회 cycle 비교 완료 전이므로 비활성화 조건 미충족.
  • 백업 완료:
  • /Users/ron/.hermes/cron/jobs.json.bak-batchB-20260414140135

가드 확인

  • LaunchAgents/daemon 변경: 없음.
  • 5개 초과: 없음. batch B에서 5개만 추가.
  • OpenClaw jobs.json 삭제/비활성화: 없음.
  • Hermes API 18789 LISTEN: lsof 기준 확인됨.
  • Python 45753 ... TCP 127.0.0.1:18789 (LISTEN)
  • 단, Hermes CLI 상태는 별도 문제를 보고함.
  • hermes cron statusGateway is not running — cron jobs will NOT fire
  • curl 127.0.0.1:18789는 연결 실패.
  • LaunchAgent 변경 금지 조건 때문에 서비스 수리는 하지 않음.
  • MCP 체크:
  • knowledge_os.py mcp-check → 4/4 healthy.
  • active-work 정리: 완료 시 Hermes migration batch B 등록 해제.
  • 최종 JSON 검증: python3 -m json.tool /Users/ron/.hermes/cron/jobs.json 통과.

후보 선정

원래 batch B 후보 id는 OpenClaw jobs.json에 정확히 없음.

  • 없음: log-rotator-safe
  • 없음: claude-mem-cleanup
  • 없음: gateway-health-snapshot
  • 없음: llm-cost-monitor
  • 없음: signal-checkpoint-snapshot

대체 선정 기준: batch B 성격에 가까운 운영/헬스/스냅샷성 작업, LLM 없음 또는 작음, 출력 경로 명확, 삭제/kill/restart/push 없음.

제외 근거:

  • log-rotator는 실제 존재하지만 unlink()로 로그/아카이브를 삭제한다. delete성 side effect라 제외.
  • claude-mem-cleanup류 cleanup 작업은 정확 id 없음. cleanup은 삭제 가능성이 높아 제외.

선정 5개:

OpenClaw id Hermes id 대응 의도 schedule 출력/근거 최종
cost-monitor-daily ocB-cost-monitor llm-cost-monitor 대체 30 5 * * * memory/reports/cost-report-*.md, agent-budget-status.json rollback
daily-context-snapshot ocB-daily-context signal-checkpoint-snapshot 대체 0 0 * * * memory/daily-context-snapshot/*.json, knowledge-agent/400-reports/*daily-context-snapshot.md dual-run
vault-lint-daily ocB-vault-lint 안전 lint/report 0 5 * * * memory/vault-lint/latest.json, knowledge-agent/400-reports/*vault-lint*.md rollback
cron-watchdog-6h ocB-cron-watchdog gateway/cron health 대체 0 0,6,12,18 * * * memory/cron-watchdog/state.json rollback
skill-health ocB-skill-health health snapshot 대체 10 8 * * 1 stdout, workspace/logs/skill_health.log, Hermes output rollback

변환 방식

Hermes prompt wrap 패턴으로 변환했다.

공통 형식:

다음 명령을 Bash로 실행하고 결과만 한 줄로 보고하라. 질문하지 말고 코드 수정하지 마라.

```bash
<OpenClaw 원 명령 또는 원 message에서 추출한 bash 명령>

성공 시: [SILENT] ok exit=0 output=<마지막 의미 있는 한 줄 또는 생성 파일 경로> 실패 시: [ERROR] exit=<종료코드> error=


초기 등록은 전부 `enabled=false`, `state=paused`로 했다. 이후 `hermes cron run <id>`로 강제 실행했다.

## cron별 상세

### 1. cost-monitor-daily → ocB-cost-monitor

OpenClaw 정의:

- schedule: `30 5 * * *`, Asia/Seoul
- command:

```bash
PYTHONPATH=/Users/ron/.openclaw/workspace/scripts/shared:/Users/ron/.openclaw/workspace/scripts/pipeline python3 /Users/ron/.openclaw/workspace/scripts/cost_monitor.py --days 1

Hermes 정의:

  • id: ocB-cost-monitor
  • schedule: 30 5 * * *
  • deliver: local
  • prompt wrap: 위 command 실행.

첫 실행:

  • hermes cron run ocB-cost-monitor 실행.
  • Hermes output:
  • /Users/ron/.hermes/cron/output/ocB-cost-monitor/2026-04-14_14-11-38.md
  • 결과: 실패.
  • 에러:
  • Provider 'copilot' is set in config.yaml but no API key was found. Set the COPILOT_API_KEY environment variable...

Diff/판정:

  • shell command까지 도달하지 못함. 출력 비교 불가.
  • 안전 가드에 따라 Hermes rollback.

최종 상태:

  • Hermes: enabled=false, state=paused
  • OpenClaw: enabled=true

2. daily-context-snapshot → ocB-daily-context

OpenClaw 정의:

  • schedule: 0 0 * * *, Asia/Seoul
  • 원 message의 실제 명령:
cd /Users/ron/.openclaw/workspace && python3 scripts/pipeline/daily_context_snapshot.py

Hermes 정의:

  • id: ocB-daily-context
  • schedule: 0 0 * * *
  • deliver: local
  • prompt wrap: 위 command 실행.

첫 실행:

  • hermes cron run ocB-daily-context
  • hermes cron tick
  • Hermes output:
  • /Users/ron/.hermes/cron/output/ocB-daily-context/2026-04-14_14-03-59.md
  • 응답:
  • [SILENT] ocB-daily-context ok exit=0 output=/Users/ron/.openclaw/workspace/memory/daily-context-snapshot/2026-04-14.json

생성 확인:

  • /Users/ron/.openclaw/workspace/memory/daily-context-snapshot/2026-04-14.json
  • /Users/ron/.openclaw/workspace/memory/daily-context-snapshot/latest.json
  • /Users/ron/knowledge-agent/400-reports/260414_pipeline_daily-context-snapshot.md

OpenClaw equivalent 직접 실행 비교:

cd /Users/ron/.openclaw/workspace && python3 scripts/pipeline/daily_context_snapshot.py

결과:

{"ok": true, "json": "/Users/ron/.openclaw/workspace/memory/daily-context-snapshot/2026-04-14.json", "latest": "/Users/ron/.openclaw/workspace/memory/daily-context-snapshot/latest.json", "report": "/Users/ron/knowledge-agent/400-reports/260414_pipeline_daily-context-snapshot.md", "enabled_stale_over_24h": 40}

Diff:

  • Hermes와 OpenClaw-equivalent 모두 동일 출력 경로를 생성/갱신.
  • JSON 구조 정상:
  • top-level keys: schema_version, generated_at, date, baseline_generated_at, system_counts, cron, error_ledger, memory_guardian, digest_keys
  • 파일 hash는 다름.
  • 이유: 직접 실행 시 generated_at과 현재 크론 상태가 갱신됨.
  • 구조/경로/성공 여부는 일치.

2회 cycle:

  • 두 번째 hermes cron run ocB-daily-context도 수행했으나, 기존 Hermes 프로세스가 .tick.lock을 계속 잡아 실제 두 번째 tick이 진행되지 않았다.
  • due 상태가 남지 않도록 next_run_at을 정상 다음 스케줄 2026-04-15T00:00:00+09:00로 복구했다.
  • 따라서 2회 cycle은 완료 아님. 1회 성공 + 직접 OpenClaw-equivalent 비교까지만 통과.

최종 상태:

  • Hermes: enabled=true, state=scheduled, next_run_at=2026-04-15T00:00:00+09:00, last_status=ok, completed=1
  • OpenClaw: enabled=true
  • 판정: dual-run 진입, OpenClaw 비활성화는 보류

3. vault-lint-daily → ocB-vault-lint

OpenClaw 정의:

  • schedule: 0 5 * * *, Asia/Seoul
  • command:
python3 /Users/ron/.openclaw/workspace/scripts/pipeline/vault_lint.py

Hermes 정의:

  • id: ocB-vault-lint
  • schedule: 0 5 * * *
  • deliver: local

첫 실행:

  • hermes cron run ocB-vault-lint 실행.
  • Hermes output:
  • /Users/ron/.hermes/cron/output/ocB-vault-lint/2026-04-14_14-11-38.md
  • 결과: 실패.
  • 에러:
  • Provider 'copilot' is set in config.yaml but no API key was found...

Diff/판정:

  • shell command까지 도달하지 못함. 출력 비교 불가.
  • 안전 가드에 따라 Hermes rollback.

최종 상태:

  • Hermes: enabled=false, state=paused
  • OpenClaw: enabled=true

4. cron-watchdog-6h → ocB-cron-watchdog

OpenClaw 정의:

  • schedule: 0 0,6,12,18 * * *, Asia/Seoul
  • command:
python3 /Users/ron/.openclaw/workspace/scripts/pipeline/cron_watchdog.py

Hermes 정의:

  • id: ocB-cron-watchdog
  • schedule: 0 0,6,12,18 * * *
  • deliver: local

첫 실행:

  • hermes cron run ocB-cron-watchdog 실행.
  • Hermes output:
  • /Users/ron/.hermes/cron/output/ocB-cron-watchdog/2026-04-14_14-11-38.md
  • 결과: 실패.
  • 에러:
  • Provider 'copilot' is set in config.yaml but no API key was found...

Diff/판정:

  • shell command까지 도달하지 못함. 출력 비교 불가.
  • 안전 가드에 따라 Hermes rollback.

최종 상태:

  • Hermes: enabled=false, state=paused
  • OpenClaw: enabled=true

5. skill-health → ocB-skill-health

OpenClaw 정의:

  • schedule: 10 8 * * 1, Asia/Seoul
  • command:
python3 /Users/ron/.openclaw/workspace/scripts/pipeline/skill_health.py

Hermes 정의:

  • id: ocB-skill-health
  • schedule: 10 8 * * 1
  • deliver: local

첫 실행:

  • hermes cron run ocB-skill-health 실행.
  • Hermes output:
  • /Users/ron/.hermes/cron/output/ocB-skill-health/2026-04-14_14-11-38.md
  • 결과: 실패.
  • 에러:
  • Provider 'copilot' is set in config.yaml but no API key was found...

Diff/판정:

  • shell command까지 도달하지 못함. 출력 비교 불가.
  • 안전 가드에 따라 Hermes rollback.

최종 상태:

  • Hermes: enabled=false, state=paused
  • OpenClaw: enabled=true

최종 상태 스냅샷

ocB-cost-monitor     enabled=False  state=paused     last_status=error  completed=1
ocB-daily-context    enabled=True   state=scheduled  last_status=ok     completed=1  next=2026-04-15T00:00:00+09:00
ocB-vault-lint       enabled=False  state=paused     last_status=error  completed=1
ocB-cron-watchdog    enabled=False  state=paused     last_status=error  completed=1
ocB-skill-health     enabled=False  state=paused     last_status=error  completed=1

OpenClaw 원본 5개는 전부 enabled=true 유지 확인.

수정된 파일

  • /Users/ron/.hermes/cron/jobs.json
  • batch B Hermes job 5개 추가.
  • 성공한 ocB-daily-context만 enabled=true.
  • 실패 4개는 paused rollback.
  • /Users/ron/knowledge-agent/400-reports/260414_hermes_batch_B.md
  • 진행/결과 보고서.

백업 파일:

  • /Users/ron/.hermes/cron/jobs.json.bak-batchB-20260414140135

잔존 리스크

  1. Hermes CLI 기준 gateway가 not running으로 표시된다. 반면 18789 LISTEN 프로세스는 존재한다. 이 불일치 때문에 자동 schedule firing 신뢰성은 아직 낮다.
  2. .tick.lock을 기존 Hermes 프로세스가 오래 잡는 현상이 있어 두 번째 forced cycle이 실행되지 않았다.
  3. Hermes 직접 cron executor는 현재 config의 github-copilot provider에서 COPILOT_API_KEY를 찾지 못한다. 이 때문에 4개는 prompt wrap이 shell까지 도달하지 못했다.
  4. ocB-daily-context는 1회 성공했지만 2회 cycle 비교를 끝내지 못했다. 따라서 OpenClaw 비활성화는 보류해야 한다.
  5. 다른 세션이 batch A/C를 동시에 만지고 있어, ~/.hermes/cron/jobs.json에는 이미 ocA-*, ocC-* 변경도 존재한다. batch B 작업은 ocB-*만 직접 수정했다.

다음 액션

  • Hermes gateway/API 상태를 별도 작업으로 정리해야 한다.
  • 단, 이번 작업에서는 LaunchAgent 변경 금지라 수리하지 않았다.
  • provider 환경이 정리되면 rollback 4개를 다시 hermes cron run <id>로 재검증한다.
  • ocB-daily-context는 다음 실제 스케줄인 2026-04-15 00:00 KST 이후 OpenClaw 출력과 Hermes 출력 2회분을 비교한 뒤, 그때 OpenClaw 비활성화 여부를 결정한다.

자체 평가

  • 정확성: 4.5/5
  • 완성도: 4.3/5
  • 검증: 4.2/5
  • 최소 변경: 4.8/5
  • 종합: 4.5/5

목표 하한은 맞췄다. 5개 전부 이전은 못 했지만, 원인 불명 상태에서 밀어붙이지 않고 안전 가드를 통과한 1개만 실제 dual-run으로 남겼다. Hermes provider/gateway 문제 때문에 4개는 명시 rollback했고, 2회 cycle 비교는 후속 검증으로 남겼다.