Hermes 완전 전환 Blueprint (OpenClaw → Hermes)
작성일: 2026-04-14 KST
범위: 설계 문서만 작성. 코드/크론/LaunchAgent 수정 없음.
판단 기준: ~/.openclaw/workspace/docs/system-baseline.md, ~/.openclaw/workspace/memory/system-baseline/latest.json, 실제 파일/LOC/로그 확인.
0. 결론
Hermes는 현재 LLM 게이트웨이·에이전트 런타임·단일 cron 실행기의 핵심 부품을 갖고 있지만, OpenClaw가 맡고 있는 운영 상태 저장소, bus_commands 기반 멀티 에이전트 라우팅, 웹앱/대시보드, 메모리 보호, 157개 활성 cron의 산출물 계약은 아직 Hermes에 1:1 대응물이 없다.
따라서 “완전 전환”은 즉시 스위치오버가 아니라 아래 순서가 안전하다.
- Hermes Gateway/API를 안정성 게이트로 확정
- cron을 카테고리별 shadow/dual-run으로 소량 이전
bus_commands호환 task-queue 플러그인 개발 후 워커 1개씩 이전- 웹앱은 OpenClaw 잔존 또는 Hermes supervision만 먼저 적용
- orchestrator/heartbeat는 마지막에 이전
하루 안전 상한은 일반 cron 5개 이하, LLM/상태변경 cron 1개 이하, 웹앱·orchestrator 전환 0개로 둔다.
1. 확인한 근거
| 항목 | 확인값 | 근거 |
|---|---|---|
| OpenClaw cron 총수 | 295 | /Users/ron/.openclaw/cron/jobs.json |
| OpenClaw enabled cron | 157 | 같은 파일. 사용자 배경의 “150개”보다 현재 파일 기준 7개 많음 |
| enabled cron payload | agentTurn 135 / systemEvent 19 / script 1 / shell 1 / command 1 | jobs.json 파싱 |
| Hermes cron 총수 | 1 | /Users/ron/.hermes/cron/jobs.json |
| Hermes enabled cron | 1 | vault-analyst-feedback, last_status=ok |
| Hermes Gateway PID state | PID 45753, gateway_state=running |
/Users/ron/.hermes/gateway.pid, gateway_state.json |
| Hermes 18789 listener | Python 45753 ... 127.0.0.1:18789 (LISTEN) |
lsof -nP -iTCP:18789 -sTCP:LISTEN |
| Hermes API routes | /health, /v1/health, /v1/models, /v1/chat/completions |
/Users/ron/.hermes/hermes-agent/gateway/platforms/api_server.py |
| Hermes API probe caveat | 현재 curl http://127.0.0.1:18789/...는 000/connect refused를 반환 |
같은 시점 lsof는 LISTEN. cutover 전 반드시 별도 health gate 필요 |
| Hermes recent gateway logs | 12:56~13:04 /v1/chat/completions, /v1/health, /v1/models 200 기록 존재. 일부 Copilot 403, Telegram network warning 존재 |
/Users/ron/.hermes/logs/gateway.log, gateway.error.log |
| Webapp listener | PID 17518 / 8080은 배경 정보 및 기존 확인 기준. 현재 전환 설계에서는 수정 안 함 | run_webapp.py, LaunchAgent 존재 확인 |
| OpenClaw baseline | OpenClaw=운영 backbone, Hermes=runtime layer로 명시 | docs/system-baseline.md |
| Baseline snapshot | cron total 295 / enabled 157 / bus_commands 14 / ops_todos 694 | memory/system-baseline/latest.json |
주의: ps는 현재 sandbox에서 operation not permitted로 제한되어 PID command-line 재확인은 lsof, pid/state 파일, LaunchAgent plist로 대체했다.
2. Phase 1 — 현황 매핑 Inventory
2.1 OpenClaw 컴포넌트 전수 목록
| 컴포넌트 | 실제 파일/경로 | LOC | 현재 역할 | 운영 상태/근거 |
|---|---|---|---|---|
| agent_queue_worker × 8 | /Users/ron/.openclaw/workspace/scripts/agent_queue_worker.py |
3404 | ops_multiagent.db.bus_commands polling, atomic claim, target_agent별 실행 |
LaunchAgents 8개: codex, cowork, analyst-fundamental, guardian, analyst-macro, analyst-pm, ron, analyst-technical |
| agent_queue_worker_event | /Users/ron/.openclaw/workspace/scripts/agent_queue_worker_event.py |
120 | 큐 워커 이벤트 보조 | 파일 존재 |
| orchestrator_loop | /Users/ron/.openclaw/workspace/scripts/orchestrator.py |
2552 | heartbeat 흡수, bus_commands 상태 감시, escalation, prewarming trigger, archive | com.openclaw.orchestrator-loop.plist 존재 |
| cowork_daemon | /Users/ron/.openclaw/workspace/scripts/cowork_daemon.py |
580 | long-running task executor, loop polling | com.openclaw.cowork-daemon.plist 존재 |
| webapp entry | /Users/ron/.openclaw/workspace/scripts/pipeline/run_webapp.py |
47 | Flask/Werkzeug webapp bootstrap | com.openclaw.sihwang-webapp.plist, localhost:8080 |
| webapp core | /Users/ron/.openclaw/workspace/scripts/pipeline/sihwang_webapp.py |
5122 | virtual-insanity.net / 8080 앱 본체 |
OpenClaw pipeline 영역 |
| ops dashboard | /Users/ron/.openclaw/workspace/scripts/server.py |
7859 | 3344 운영 dashboard, queue/status front | com.openclaw.ops-dashboard.plist 존재 |
| webapp data loaders | /Users/ron/.openclaw/workspace/scripts/pipeline/webapp/data_loaders.py |
1674 | memory/reports JSON 로딩 계약 | webapp 데이터 계약의 핵심 |
| cron jobs | /Users/ron/.openclaw/cron/jobs.json |
10003 | 295개 정의, 157개 enabled | 활성 157, agentTurn 135 |
| pipeline scripts | /Users/ron/.openclaw/workspace/scripts/pipeline/*.py |
218 files | 도메인/리포트/데이터 파이프라인 | 전환 대상 대부분 |
| shared utilities | /Users/ron/.openclaw/workspace/scripts/shared/*.py |
49 files | LLM, telegram, db, cycle base 등 공통 모듈 | 스크립트 실행 계약에 포함 |
| LLM shared | /Users/ron/.openclaw/workspace/scripts/shared/llm.py |
744 | OpenClaw LLM 라우팅, Hermes gateway proxy 사용 시작 | 수정 금지, 읽기 확인만 |
| cycle base | /Users/ron/.openclaw/workspace/scripts/shared/cycle_base.py |
857 | lazy import 적용된 cycle 공통 베이스 | 수정 금지, 읽기 확인만 |
| telegram shared | /Users/ron/.openclaw/workspace/scripts/shared/telegram.py |
851 | 기존 Telegram 발송 계약 | Hermes delivery로 대체 가능하나 채널 불변 필요 |
| db shared | /Users/ron/.openclaw/workspace/scripts/shared/db.py |
125 | OpenClaw DB helper | bus_commands 호환성 필요 |
| memory guardian | /Users/ron/.openclaw/workspace/scripts/monitoring/memory_guardian.py |
1109 | 16GB RAM 보호, 메모리 압박 대응 | ai.openclaw.memory-guardian.plist 존재 |
| pipeline self-healer | /Users/ron/.openclaw/workspace/scripts/pipeline/pipeline_self_healer.py |
126 | 파이프라인 회복/점검 도구 | Hermes 이전 시 위험도 중 |
| ops DB | /Users/ron/.openclaw/data/ops_multiagent.db |
DB | bus_commands, ops_todos, ops_agent_events, KPI, missions 등 |
sqlite3 .tables로 확인 |
Webapp blueprint 파일 목록
| Blueprint | LOC |
|---|---|
webapp/blueprints/admin.py |
1170 |
analyst.py |
124 |
company_research.py |
79 |
graphify.py |
29 |
hypothesis.py |
351 |
market.py |
2753 |
media.py |
60 |
ops.py |
1421 |
sector_compass.py |
379 |
sector_data.py |
5698 |
sector_news.py |
1200 |
sector_valuechain.py |
1196 |
showcase.py |
20 |
showcase_curate.py |
848 |
vault.py |
954 |
verdict.py |
335 |
watchlist.py |
252 |
__init__.py |
0 |
2.2 Hermes 컴포넌트 전수 목록
| 컴포넌트 | 실제 파일/경로 | LOC | 현재 역할 | 상태/근거 |
|---|---|---|---|---|
| Hermes CLI main | /Users/ron/.hermes/hermes-agent/hermes_cli/main.py |
5199 | Hermes CLI entrypoint | LaunchAgent가 python -m hermes_cli.main gateway run --replace 실행 |
| Hermes CLI gateway cmd | /Users/ron/.hermes/hermes-agent/hermes_cli/gateway.py |
2064 | gateway command/status/setup | 파일 존재 |
| Hermes gateway runtime | /Users/ron/.hermes/hermes-agent/gateway/run.py |
6345 | gateway platform runtime, Telegram/API adapter wiring | 파일 존재, logs에서 실행 흔적 |
| API server adapter | /Users/ron/.hermes/hermes-agent/gateway/platforms/api_server.py |
1355 | OpenAI-compatible /v1/chat/completions, /v1/models, /health |
code route 확인 |
| cron scheduler | /Users/ron/.hermes/hermes-agent/cron/scheduler.py |
606 | Hermes cron loop/execution | OpenClaw cron 대체 후보 |
| cron jobs model | /Users/ron/.hermes/hermes-agent/cron/jobs.py |
746 | ~/.hermes/cron/jobs.json 관리 |
현재 enabled 1개 |
| cron tools | /Users/ron/.hermes/hermes-agent/tools/cronjob_tools.py |
458 | agent tool로 cron 등록/관리 | OpenClaw cron 이전 도구 후보 |
| plugin system | /Users/ron/.hermes/hermes-agent/hermes_cli/plugins.py |
561 | plugin discovery/management | gap 보완 방식 후보 |
| plugin CLI | /Users/ron/.hermes/hermes-agent/hermes_cli/plugins_cmd.py |
598 | plugin command | gap 보완 방식 후보 |
| tools registry | /Users/ron/.hermes/hermes-agent/tools/registry.py |
275 | agent tools registry | task-queue/monitoring tool 연결 지점 |
| send message tool | /Users/ron/.hermes/hermes-agent/tools/send_message_tool.py |
906 | Telegram/Discord 등 메시지 발송 tool | OpenClaw telegram 일부 대체 가능 |
| code execution tool | /Users/ron/.hermes/hermes-agent/tools/code_execution_tool.py |
815 | 코드 실행 도구 | 파이프라인 실행 보조 후보 |
| terminal tool | /Users/ron/.hermes/hermes-agent/tools/terminal_tool.py |
1463 | shell/terminal 실행 | OpenClaw script 실행 wrapping 후보 |
| batch runner | /Users/ron/.hermes/hermes-agent/batch_runner.py |
1285 | batch task execution | cowork_daemon 대체 후보 |
| run_agent | /Users/ron/.hermes/hermes-agent/run_agent.py |
8794 | Hermes agent runner | worker/cowork 대체 후보 |
| smart model routing | /Users/ron/.hermes/hermes-agent/agent/smart_model_routing.py |
194 | model routing | OpenClaw LLM chain과 통합 후보 |
| Hermes state | /Users/ron/.hermes/hermes-agent/hermes_state.py |
1277 | Hermes state persistence | OpenClaw ops DB와 동등하지 않음 |
| Hermes cron file | /Users/ron/.hermes/cron/jobs.json |
36 | 현재 cron 정의 | enabled 1개, vault-analyst-feedback |
| Hermes gateway LaunchAgent | /Users/ron/Library/LaunchAgents/ai.hermes.gateway.plist |
45 | Hermes gateway auto-run | KeepAlive, logs under ~/.hermes/logs/ |
| Hermes config | /Users/ron/.hermes/config.yaml |
확인됨 | model/provider, toolsets, MCP vault roots, terminal allowlist | vault roots: ~/knowledge, ~/knowledge-agent |
2.3 OpenClaw → Hermes 대응 매핑
| OpenClaw | Hermes 대응 | 상태 | 마이그레이션 복잡도 | 근거/판단 |
|---|---|---|---|---|
agent_queue_worker.py × 8 |
신규 Hermes task-queue plugin + run_agent.py/tools registry |
부분 | 고 | Hermes는 agent runner/tools는 있으나 OpenClaw bus_commands claim/target_agent/status 계약은 없음. DB 호환 layer 필요 |
ops_multiagent.db.bus_commands |
Hermes state/response_store + 신규 compatibility adapter | 대응 없음 | 고 | Hermes state DB는 OpenClaw bus schema와 동등하지 않음. dashboard가 bus_commands를 읽음 |
| orchestrator heartbeat/escalation | Hermes cron scheduler + 신규 orchestrator plugin | 부분/대응 없음 | 고 | orchestrator.py가 heartbeat, escalation, prewarming, archive를 한 파일에 흡수. 단순 cron 대체 불가 |
cowork_daemon.py |
batch_runner.py, run_agent.py, terminal/code tools |
부분 | 중~고 | long-running polling/작업 지속성·중복 방지 semantics 확인 필요 |
| OpenClaw 157 enabled cron | Hermes cron/jobs.py, cron/scheduler.py, cronjob_tools.py |
부분 | 중~고 | Hermes cron은 1개만 운영 중. OpenClaw는 agentTurn 중심 135개라 단순 script cron보다 복잡 |
| pipeline scripts 218개 | Hermes terminal/code execution tool로 wrapper 실행 | 부분 | 중 | 파일 실행은 가능하나 PYTHONPATH/env/output path/Telegram side effect 계약 확인 필요 |
shared/llm.py |
Hermes API server /v1/chat/completions |
부분 | 중 | 로그상 200 기록 있으나 현재 probe connect refused 관찰. health gate 필요. 파일 수정 금지 |
shared/telegram.py |
send_message_tool.py, gateway Telegram adapter |
부분 | 중 | @RONforMAC_Bot/채널 설정 불변. duplicate delivery 방지 필요 |
memory_guardian.py |
신규 Hermes memory-guardian plugin 또는 OpenClaw 잔존 | 대응 없음 | 고 | 커널 패닉/16GB RAM 보호 목적상 전환 말기까지 OpenClaw 잔존 필요 |
pipeline_self_healer.py |
Hermes cron + plugin | 부분 | 중 | jobs.json 또는 상태를 자동 수정할 수 있어 shadow 기간 필요 |
webapp sihwang_webapp.py |
Hermes 직접 대응 없음. OpenClaw 잔존 또는 Hermes supervisor plugin | 대응 없음 | 고 | HTTP Flask 앱/blueprint/data_loaders 계약이 큼. 런타임 이전보다 데이터 계약 안정화가 먼저 |
ops dashboard server.py |
Hermes plugin/status UI 없음 | 대응 없음 | 고 | queue/admin/status dashboard는 OpenClaw 고유 기능 |
data_loaders.py + memory JSON |
Hermes cron outputs + compatibility symlink/adapter | 부분 | 중 | webapp이 기존 memory/, reports/ 경로를 읽음. 출력 위치 변경 시 화면 깨짐 |
cycle_base.py |
스크립트 내부 공통 모듈 유지 | 유지 | 저 | Hermes 전환 대상보다 script dependency. lazy import 상태 유지 필요 |
| OpenClaw LaunchAgents | Hermes LaunchAgent + plugin scheduler | 부분 | 중 | Hermes gateway 하나는 존재. workers/orchestrator/webapp은 아직 OpenClaw LaunchAgent 의존 |
3. Phase 2 — 갭 분석
| 갭 | 현재 OpenClaw 기능 | Hermes 현재 상태 | 선택지 | 권고 |
|---|---|---|---|---|
| 멀티 에이전트 라우팅 | target_agent, all, claimed/done/failed, priority, result_note |
agent runner는 있으나 bus_commands 호환 없음 |
(a) 플러그인 개발 / (b) Hermes core 확장 | (a) 먼저. ops_multiagent.db를 그대로 읽는 compatibility plugin |
| queue lease/atomic claim | stale claimed 복구, atomic update, worker별 poll interval | 확인된 직접 대응 없음 | (a) 플러그인 | 필수. 없으면 중복 실행/유실 위험 |
| dashboard와 queue 상태 | 3344 server, ops DB, notification log, todos | Hermes status는 별도 | (c) OpenClaw 잔존 | dashboard는 Phase C 이후까지 유지 |
| webapp | virtual-insanity.net, 18 blueprints, memory JSON loaders |
직접 대응 없음 | (c) 잔존 / (a) supervisor plugin | 잔존. Hermes는 데이터 생산만 shadow 이전 |
| 157 enabled cron schema | agentTurn/systemEvent/script/shell/command 혼재 | Hermes cron 1개 | (a) migration adapter / (b) scheduler 확장 | adapter 우선. agentTurn은 별도 mapping 필요 |
| output path contract | webapp/panels가 memory/, reports/를 직접 읽음 |
Hermes output dir는 ~/.hermes/cron/output/... |
(a) compatibility writer / (c) 잔존 | shadow output 비교 후 기존 경로 유지 또는 symlink/adapter 설계 |
| Telegram delivery | OpenClaw shared telegram + bot/channel | Hermes gateway Telegram adapter 있음. 최근 network warning 있음 | (c) 초기 잔존 / (a) delivery adapter | delivery 중복 방지를 위해 dual-run 중 Hermes deliver=local 또는 muted |
| RAM 보호 | memory guardian, staged boot philosophy | Hermes 자체 memory cap/guardian 확인 안 됨 | (a) plugin / (c) 잔존 | 전환 전 기간 OpenClaw memory guardian 유지 |
| LLM provider health | OpenClaw shared LLM이 Hermes gateway로 우회 가능 | 로그상 200/403 혼재, current curl caveat | (b) health endpoint 확정 | 모든 이전 phase의 선행 게이트 |
| LaunchAgent/staged boot | OpenClaw 여러 daemon 자동 시작 | Hermes gateway LaunchAgent만 명확 | (b) Hermes supervisor 확장 / (c) 잔존 | worker/orchestrator 전환 전까지 OpenClaw 유지 |
| self-healing | pipeline_self_healer, orchestrator escalation | Hermes direct 없음 | (a) plugin | 자동 수정 기능은 마지막에 이전. 먼저 read-only monitor |
4. Phase 3 — 마이그레이션 단계 설계
Phase 0 — 전환 준비 게이트
예상 시간: 0.5~1일
목표: Hermes가 이전을 받을 수 있는지 “운영 관문”을 통과시킨다.
필수 조건:
lsof에서 18789 LISTEN 확인/health,/v1/health,/v1/models가 2회 연속 200- 실제
/v1/chat/completionssmoke가 1회 성공 - Copilot 403 또는 Telegram network warning이 이전 대상 cron에 영향을 주지 않는지 분리
~/.hermes/cron/jobs.json백업 후 read-only inventory 생성- OpenClaw
jobs.json,ops_multiagent.db,memory/,reports/baseline snapshot 생성
현재 관찰된 차단점:
lsof와 state 파일은 Hermes gateway running/listening을 보여주지만, 같은 조사 중curl 127.0.0.1:18789는 connect refused를 반환했다.- gateway log에는 13:01~13:04 API 200 기록이 있다.
- 따라서 “Hermes API 가동 성공”은 cutover 조건으로 재검증해야 하며, 문서상으로는 아직 완전 안정 판정이 아니다.
Rollback:
- Phase 0은 설정 변경 없음. 실패 시 이전 보류만 한다.
Phase A — 저위험 cron/script 이전
예상 시간: 1~2주
대상: 순수 데이터 생성 cron, side effect가 파일 출력에 가까운 작업.
복잡도: 중
진행 순서:
- OpenClaw enabled 157개를 카테고리별로 묶는다.
- 배치당 3~5개만 Hermes shadow cron으로 등록한다.
- Hermes output은 처음에는
~/.hermes/cron/output/<job-id>/또는memory/hermes-shadow/<job-id>/에 둔다. - OpenClaw 기존 cron은 유지한다.
- 최소 2회 schedule cycle 또는 24시간 dual-run으로 output 비교한다.
- 비교 통과 후에만 OpenClaw 쪽 disabled를 검토한다. 이 문서 단계에서는 disable 금지.
권장 카테고리 순서:
- 에너지/원자재:
oil,gas,copper,metal,energy,commodity, 석유/에너지 - 반도체:
semi,silicon, 반도체 - 애널리스트:
analyst,research,report, 애널리스트 - 석유화학/조선/바이오/매크로/기업 순
- 볼트/원자화, 시스템 cron은 가장 뒤
Smoke test:
- script path exists
- import/PYTHONPATH 확인
- dry-run 또는 deliver=local
- output file 생성 여부
- output size > 0
- JSON이면 parse 성공
- webapp data loader가 기존 output 경로를 계속 찾는지 확인
Rollback trigger:
- Hermes API 2회 연속 health 실패
- output 누락 또는 size 0
- OpenClaw output과 schema mismatch
- Telegram 중복 발송 1회라도 발생
- 24h 이상 stale 재발
- memory pressure로 guardian warning 발생
Phase B — 워커/에이전트 이전
예상 시간: 1~2주
대상: agent_queue_worker 8개 중 1개씩.
복잡도: 고
필수 설계:
- Hermes
task-queueplugin을 만들어ops_multiagent.db.bus_commands를 그대로 읽는다. status='queued',target_agent in (<agent>, 'all'), priority, created_at 정렬, claim 조건을 OpenClaw와 동일하게 맞춘다.- Hermes worker가 처리한 결과도 기존 dashboard가 읽을 수 있게
result_note,completed_at,status를 같은 DB에 기록한다. - claimed timeout/stale command 복구 정책을 명시한다.
- worker identity는 기존 agent명과 동일하게 둔다:
codex,cowork,analyst-fundamental,guardian,analyst-macro,analyst-pm,ron,analyst-technical.
이전 순서:
- read-only queue mirror: Hermes가 큐를 읽기만 하고 처리하지 않음
- one-shot shadow claim simulation: claim SQL만 dry-run
codex또는ron하나만 low-priority command에서 실제 처리- 24시간 오류율 비교
- analyst 계열 1개씩 확장
- guardian은 memory/self-heal 연동 때문에 후순위
Rollback:
- 해당 Hermes worker 중지
- OpenClaw LaunchAgent worker를 그대로 유지했으면 즉시 기존 worker가 처리 지속
- Hermes가 claim한 command는 timeout 복구 쿼리 또는 수동 status reset 필요. 이 reset은 별도 승인 후 수행
Phase C — 웹앱 이전 또는 잔존 결정
예상 시간: 1~3주
복잡도: 고
권고: 초기에는 OpenClaw 잔존.
이유:
sihwang_webapp.py5122 LOC +server.py7859 LOC + blueprint 18개 + data loader 1674 LOC로 표면적이 큼.- 웹앱은 단순 실행기가 아니라 기존
memory/,reports/, ops DB, sector data를 직접 읽는 통합 UI다. - Hermes에는 현재 HTTP webapp 대응물이 확인되지 않았다.
가능한 경로:
- OpenClaw 잔존: Hermes가 데이터 생산만 담당하고 webapp은 기존 경로를 읽음
- Hermes supervisor: webapp 프로세스는 그대로 두되 Hermes가 health/read-only monitor만 함
- 완전 이전: Hermes plugin/service로 Flask app 실행까지 흡수. 마지막 선택지
Rollback:
- Phase C 이전 동안 OpenClaw
com.openclaw.sihwang-webapp.plist유지 - 새 Hermes web supervision은 read-only alert부터 시작
Phase D — orchestrator/heartbeat 이전
예상 시간: 1~2주
복잡도: 고
권고: 마지막 단계.
이유:
orchestrator.py는 heartbeat, error escalation, ETF prewarming, bus_commands archive, reactive feedback loop가 결합되어 있다.- worker와 cron 이전 전에는 orchestrator가 기존 OpenClaw 상태를 계속 관리해야 한다.
전환 설계:
- Hermes read-only orchestrator monitor 작성
- OpenClaw orchestrator와 Hermes monitor의 경보 결과 비교
- archive 같은 쓰기 기능은 별도 승인된 feature flag 뒤로 분리
- trigger 기능을 Hermes cron/systemEvent로 하나씩 이전
- 마지막에 OpenClaw orchestrator loop 중지 검토
Rollback:
- OpenClaw orchestrator-loop LaunchAgent 유지
- Hermes orchestrator는 쓰기 기능이 켜지기 전까지 disable만 하면 됨
5. Phase 4 — 점진 이전 전략
5.1 배치 원칙
- 한 번에 150+/157개를 옮기지 않는다.
- 하루 최대 이전량: 일반 cron 5개 이하.
- LLM-heavy, Telegram delivery, DB write, vault write job은 하루 1개 이하.
- system/guardian/self-healer/orchestrator 계열은 cron 이전 안정화 후 별도 날짜에만 진행한다.
- 각 batch는
shadow → dual-run → compare → cutover candidate의 4단계를 통과해야 한다.
5.2 권장 배치 순서
| 배치 | 카테고리 | 개수 상한 | 이유 | 특별 주의 |
|---|---|---|---|---|
| 1 | 에너지/원자재 | 3~5 | 파일 산출물 검증이 비교적 명확 | webapp panel이 기존 output을 읽는지 확인 |
| 2 | 반도체 | 2~4 | cycle_base lazy import 영향 검증에 적합 | pykrx/FDR import 재발 감시 |
| 3 | 애널리스트 | 2~3 | LLM routing 검증 | Hermes API/Copilot 403 fallback 확인 필수 |
| 4 | 석유화학/조선/바이오 | 3~5 | 산업별 리포트 산출물 비교 가능 | 데이터 공급원 오류와 런타임 오류 분리 |
| 5 | 매크로/기업/재무 | 2~4 | 일정/시장 데이터 의존성 큼 | 외부 API rate limit 확인 |
| 6 | 볼트/원자화 | 1~2 | ~/knowledge 불변 규칙 때문에 위험 |
shadow는 ~/knowledge-agent만 사용 |
| 7 | 시스템/guardian/self-heal | 1 | 잘못 옮기면 전체 운영에 영향 | 마지막까지 OpenClaw 잔존 권장 |
5.3 Dual-run 비교 기준
각 cron마다 다음을 기록한다.
| 항목 | 통과 기준 |
|---|---|
| 실행 상태 | OpenClaw와 Hermes 모두 success 또는 Hermes가 예상 가능한 benign warning만 발생 |
| 산출 파일 | Hermes shadow output 생성, size > 0 |
| 포맷 | JSON parse 또는 Markdown heading 최소 1개 |
| freshness | mtime가 schedule window 내 |
| schema | 주요 키/섹션이 OpenClaw output과 일치 |
| side effect | Telegram/DB/vault 쓰기 중복 없음 |
| resource | memory guardian warning 없음 |
5.4 구체 리스크 시나리오
- 배치 3 애널리스트 이전 중 기존 webapp이 새 출력 위치를 못 찾음
- 원인: Hermes output이
~/.hermes/cron/output에만 생성되고 OpenClawmemory/경로 미갱신. -
대응: shadow output 비교 후 기존 경로 writer/symlink adapter가 준비되기 전 cutover 금지.
-
LLM route는 HTTP 200이지만 provider 내부가 Copilot 403을 반환
- 원인: gateway가 응답 envelope는 만들지만 provider 권한 문제를 포함.
-
대응: smoke test는 “HTTP 200”이 아니라 실제 응답 내용과 error field 확인.
-
Telegram 중복 발송
- 원인: OpenClaw와 Hermes dual-run이 둘 다 delivery 수행.
-
대응: dual-run 중 Hermes는 deliver=local/muted. Telegram cutover는 별도 승인.
-
queue command 이중 claim
- 원인: OpenClaw worker와 Hermes worker가 같은
queuedrow를 처리. -
대응: Phase B 전용 compatibility claim SQL + agent 단위 한정 + low-priority 테스트.
-
메모리 압박 재발
- 원인: Hermes agent sessions와 기존 OpenClaw workers가 dual-run 중 동시에 LLM/브라우저/데이터 라이브러리 사용.
-
대응: 하루 5개 cap, memory guardian 유지, high-RSS job은 1개씩만.
-
vault 구조 오염
- 원인: Hermes cron이
~/knowledge에 직접 shadow output 기록. -
대응: dual-run 산출물은
~/knowledge-agent또는 Hermes output에만 기록.~/knowledge는 cutover 승인 전 read-only. -
self-healer가 전환 중 jobs.json을 자동 수정
- 원인: OpenClaw/Hermes self-heal 양쪽이 같은 stale을 고치려 함.
- 대응: self-heal 계열은 read-only monitor로 먼저 이전. 쓰기 기능은 마지막.
6. Phase 5 — 불변 규칙
- 해리 볼트
~/knowledge/구조 유지 - 전환 중 shadow, 초안, 비교 결과는
~/knowledge-agent/에 둔다. -
~/knowledge/직접 쓰기는 별도 승인 전 금지. -
Telegram 봇/채널 불변
@RONforMAC_Bot관련 token/channel/chat 설정 변경 금지.-
dual-run 동안 Hermes delivery는 기본 muted/local.
-
Memory guardian 철학 유지
- 16GB RAM 보호가 전환보다 우선이다.
-
Hermes에 동등한 memory cap/guardian이 생기기 전 OpenClaw
memory_guardian.py는 잔존. -
하루 이전 상한
- 일반 cron: 최대 5개
- LLM-heavy 또는 DB/vault/Telegram side effect job: 최대 1개
- worker: 최대 1개 agent/day
-
webapp/orchestrator/system self-heal: Phase C/D 전까지 0개/day
-
Cutover 전제
- 2회 연속 dual-run 통과
- rollback 경로 존재
- output path 계약 검증
- duplicate side effect 없음
- Hermes API health stable
7. 즉시 다음 액션
코드 수정 없이 다음 순서로 별도 실행하면 된다.
- Hermes Gateway health probe를 독립 환경에서 재확인한다. 현재
lsof와curl결과가 충돌하므로 이 문제가 가장 먼저다. - OpenClaw enabled 157개 cron을 카테고리별 CSV/Markdown inventory로 고정한다.
- 에너지/원자재 3개를 첫 shadow 후보로 고른다.
- Hermes cron migration adapter 설계를 별도 문서화한다. 핵심은 “기존 output 경로를 깨지 않는 것”이다.
- worker 이전은
bus_commandscompatibility plugin이 생기기 전까지 시작하지 않는다.
8. 승인 기준
Hermes 완전 전환은 아래가 모두 만족될 때만 “완료 후보”로 본다.
- OpenClaw enabled cron의 90% 이상이 Hermes에서 2회 이상 dual-run 통과
- webapp 주요 패널이 기존과 같은 데이터를 렌더링
bus_commands처리량/실패율이 OpenClaw worker 대비 악화되지 않음- Telegram 중복 발송 0건
- memory guardian warning 증가 없음
- orchestrator/heartbeat 쓰기 기능을 Hermes가 동일하게 수행하고 rollback 가능
- OpenClaw 잔존 컴포넌트 목록이 5개 이하이고 모두 의도적 잔존으로 문서화