Hermes 실제 마이그레이션 — batch B
결론
- 실제 이전 성공: 1개
daily-context-snapshot→ HermesocB-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
copilotAPI 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 status→Gateway is not running — cron jobs will NOT firecurl 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]
초기 등록은 전부 `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-contexthermes 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
잔존 리스크
- Hermes CLI 기준 gateway가 not running으로 표시된다. 반면 18789 LISTEN 프로세스는 존재한다. 이 불일치 때문에 자동 schedule firing 신뢰성은 아직 낮다.
.tick.lock을 기존 Hermes 프로세스가 오래 잡는 현상이 있어 두 번째 forced cycle이 실행되지 않았다.- Hermes 직접 cron executor는 현재 config의
github-copilotprovider에서COPILOT_API_KEY를 찾지 못한다. 이 때문에 4개는 prompt wrap이 shell까지 도달하지 못했다. ocB-daily-context는 1회 성공했지만 2회 cycle 비교를 끝내지 못했다. 따라서 OpenClaw 비활성화는 보류해야 한다.- 다른 세션이 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 비교는 후속 검증으로 남겼다.