시스템 청사진 v4 — OpenClaw 부분 폐기 + Hermes 게이트웨이 승격
2026-04-13 기준. v3(4/12) 이후 LaunchAgent 6건 폐기, 18789 포트 Hermes 이관, 헬스 리포트 오탐 구조 개선, 로그 폭주 가드, jobs.json 스키마 정규화 반영.
1. v3 → v4 변경 요약
| 항목 |
v3 (Hermes 이전 직후) |
v4 (OpenClaw 부분 폐기) |
| 18789 게이트웨이 |
OpenClaw Node 잔존 가능성 |
Hermes Gateway 단독 점유 (PID 32468) |
| OpenClaw server.py |
게이트웨이 폐기됐다고 가정 |
여전히 가동 (PID 1274, 3344만 LISTEN). 18790은 별개 — tts_webhook.py (PID 1329, smart-home 스킬) |
| LaunchAgent 폐기 |
gateway/node/queue/bridge 비활성 |
+ cmux-safe-restart, dashboard-v2, agent-queue-analyst, gateway.env 추가 폐기 (총 6건) |
| cmux 안정화 |
매일 자동 재시작 (휘발 위험) |
cmux-safe-restart 폐기 → v0.63.2 자체 영속화에 위임 |
| 인증 경로 |
18789/health?agent= |
3344/api/bus/agent-status?agent= + X-Ops-Token |
| drift_recovery |
NameError 잠재 |
db_connection/db_transaction 임포트, info→db_info 리네이밍 |
| system_digest |
7일 윈도우, 100줄, 7일 cutoff |
24시간/500줄/2일 cutoff, jobs.json lastRunAtMs 우선 |
| jobs.json origin |
dict/string 혼재 (149개 string) |
전 잡 dict 정규화 |
| 로그 폭주 |
무가드 (97MB err.log) |
6개 파일 1분 dedupe throttle |
| 알림센터 sqlite |
없음 |
shared/telegram.py에 notification_center_log 추가 |
| bond 폴백 |
qwen3.5:4b 단일 |
qwen3.5:4b → qwen3.5:9b-nothinker (14곳) |
2. 시스템 토폴로지 (OpenClaw 레거시 + Hermes 중심)
[ 해리 ]
│
┌──────────────────────┼──────────────────────┐
│ │ │
▼ ▼ ▼
[ Telegram ] [ cmux v0.63.2 ] [ Web Browser ]
@openclaw_harybot │ │
@RONforMAC_Bot │ │
@ronclawBot │ │
│ ┌────────┴────────┐ │
│ │ │ │
│ ┌────▼────┐ ┌────▼────┐ │
│ │ Claude │ │ Codex │ │
│ │ ×2 │ │ ×4 │ │
│ │ surface │ │ surface │ │
│ └────┬────┘ └────┬────┘ │
│ │ │ │
│ └────────┬────────┘ │
▼ ▼ ▼
┌───────────────────────────────────────────┐ ┌────────────────┐
│ HERMES v0.8.0 (Python) │ │ Cloudflare │
│ ┌─────────────────────────────────────┐ │ │ Tunnel │
│ │ Gateway (port 18789) ★승격 │ │ │ │
│ │ - LLM 프록시 │ │ │ virtual- │
│ │ - X-Ops-Token 인증 │ │ │ insanity.net │
│ │ - PID 32468 │ │ └────────┬───────┘
│ └─────────────────────────────────────┘ │ │
│ ┌─────────────────────────────────────┐ │ │
│ │ Cron Scheduler (jobs.json 150) │ │ │
│ │ - origin 전 dict 정규화 │ │ │
│ │ - 16잡 복구 │ │ │
│ └─────────────────────────────────────┘ │ │
│ ┌─────────────────────────────────────┐ │ │
│ │ Telegram 어댑터 (네이티브) │ │ │
│ │ - 알림센터 sqlite 기록 │ │ │
│ └─────────────────────────────────────┘ │ │
│ ┌─────────────────────────────────────┐ │ │
│ │ task-queue 플러그인 │ │ │
│ │ → bus_commands (SQLite WAL) │ │ │
│ └─────────────────────────────────────┘ │ │
└───────┬─────────────────────────┬─────────┘ │
│ │ │
▼ ▼ │
┌───────────────┐ ┌──────────────┐ │
│ Pipeline │ │ ops_ │ │
│ Scripts │ │ multiagent │ │
│ ~/.openclaw/ │ │ .db (WAL) │ │
│ workspace/ │ └──────┬───────┘ │
│ scripts/ │ │ │
│ pipeline/ │ │ │
└───────┬───────┘ │ │
│ │ │
│ ╔════════════════▼════════════════╗ │
│ ║ OpenClaw server.py (잔존) ║ │
│ ║ PID 1274 ║ │
│ ║ - port 3344 (대시보드/API) ║ │
│ ║ - /api/bus/* (워커 호출) ║ │
│ ║ - LaunchAgent: ops-dashboard ║ │
│ ║ ║ │
│ ║ [별개] tts_webhook.py PID1329 ║ │
│ ║ - port 18790 (smart-home) ║ │
│ ╚════════════════┬════════════════╝ │
│ │ │
│ └────────────────────────┘
│ ▲
│ │
▼ │
┌──────────────────┐ ┌───────────┴───────────┐
│ knowledge-agent/ │ │ Flask Webapp │
│ (AI 작업 공간) │◄──────────┤ port 8080 │
│ 양방향 공유 │ │ mission-control │
└──────────────────┘ └───────────────────────┘
▲
│ (read only)
│
┌──────────────────┐
│ knowledge/ │
│ (해리 볼트) │
└──────────────────┘
┌───────────────────────────────────────────────────────┐
│ [ 폐기 영역 — LaunchAgent 6건 비활성 ] │
│ ✗ ai.openclaw.cmux-safe-restart (근본 원인) │
│ ✗ ai.openclaw.gateway / .env (Hermes로 이전) │
│ ✗ ai.openclaw.node (18789 Hermes로) │
│ ✗ com.openclaw.dashboard-v2 (빌드 산출물 없음) │
│ ✗ com.openclaw.agent-queue-analyst (잘못된 이름) │
└───────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────┐
│ [ 감시 ] │
│ Memory Guardian v2 → Hermes (RSS 500MB) │
│ Memory Guardian v2 → chroma-mcp (1GB) │
└───────────────────────────────────────────────────────┘
3. 핵심 변경 항목 (15건 상세)
3-1. LaunchAgent 폐기 (6건)
| plist |
폐기 사유 |
ai.openclaw.cmux-safe-restart |
매일 cmux 세션을 재시작해 휘발시키는 근본 원인. v0.63.2 자체 영속화로 위임 |
ai.openclaw.gateway |
Hermes 게이트웨이로 이전 |
ai.openclaw.gateway.env |
gateway 서브 plist, 함께 폐기 |
ai.openclaw.node |
Hermes가 18789 점유, Node 게이트웨이 불필요 |
com.openclaw.dashboard-v2 |
빌드 산출물 부재, 실행 불가 상태였음 |
com.openclaw.agent-queue-analyst |
data-analyst라는 잘못된 에이전트 이름, 무한 실패 루프 |
3-2. 18789 포트 이전 (Node → Hermes)
잔존 참조 경고: grep -rn "18789" ~/.openclaw/workspace/scripts/ 결과 80건 잔존. 9개 파이프라인 호출자 외에 점검 스크립트(mcp_readonly_check.sh, oc_whitelist_check.sh, mcp_check.sh), podman 정의(openclaw.container.in PublishPort/Exec), 기타 스크립트가 여전히 18789를 참조. 호출 자체는 Hermes로 자동 라우팅되므로 운영 영향은 없으나, 정리 작업은 별도 추적 필요.
- Before:
ai.openclaw.node (PID 5046)
- After:
ai.hermes.gateway (PID 32468)
- plist 환경변수 하드코딩:
API_SERVER_ENABLED=true
API_SERVER_HOST=127.0.0.1
API_SERVER_PORT=18789
- 호출자 9곳 이관 완료:
pipeline/hypothesis_engine.py
pipeline/note_atomizer.py
pipeline/system_dashboard.py
pipeline/daily_system_validator.py
webapp/blueprints/ops.py
webapp/sihwang_webapp.py
shared/autoheal_auth.py
hermes_cli/status.py
agent_registry.py (LLM 프롬프트 텍스트)
3-3. staged_boot.sh 수정
- 그룹1에서
ai.openclaw.gateway / ai.openclaw.node 제거
ai.hermes.gateway 부팅 항목으로 대체
wait_for_port 18789 헬스체크도 Hermes 기준
3-4. autoheal_auth.py 인증 경로 변경
- Before:
http://127.0.0.1:18789/health?agent=X (Node 게이트웨이 의존)
- After:
http://127.0.0.1:3344/api/bus/agent-status?agent=X + X-Ops-Token 헤더
3-5. agent_registry.py 프롬프트 텍스트 수정
- LLM에게 18789 URL을 안내하던 프롬프트 텍스트를 3344 + 토큰 가이드로 교체
- 프롬프트 오염 차단 (LLM이 폐기된 게이트웨이 호출 시도하던 패턴 제거)
3-6. drift_recovery.py 수정 (2건)
- 함수 이름 충돌: 로그 함수
info가 모듈 내 다른 변수와 shadowing → db_info로 리네이밍
- NameError 해결:
from shared.db import db_connection, db_transaction 임포트 추가
3-7. system_digest.py 수정 (5건) — 헬스 리포트 오탐 구조 개선
| 항목 |
Before |
After |
| 로그 윈도우 |
7일 |
24시간 |
| 로그 파싱 범위 |
lines[-100:] |
lines[-500:] |
| 타임스탬프 파싱 실패 |
예외 발생 |
continue (스킵) |
collect_pipeline_states |
디스크 mtime만 |
jobs.json lastRunAtMs 우선 참조 |
cutoff_auto_resolve |
7일 |
2일 |
→ 실제 정상 상태인데 7일 전 로그 한 줄로 "장애" 오판하던 패턴 제거.
3-8. Hermes cron jobs.json 정규화
- origin 필드: 149개가 string("openclaw-migrate-2026-04-12") 형태로 저장돼 있던 것을 전부 dict로 정규화
- 정규화 과정에서 누락됐던 16잡 복구
- 총 150개 잡 활성
3-9. ~/.hermes/migration 1.9GB 정리
- 마이그레이션 백업 잔재 디렉토리 삭제
- 디스크 확보, 백업 정책은 jobs.json backups/ 경로로 일원화
3-10. agent-queue-analyst.err.log truncate
- 97MB → 116B
- 잘못된 에이전트 이름으로 인한 무한 실패 로그 폭주, plist 폐기와 함께 정리
3-11. 로그 폭주 가드 (6개 파일, 1분 dedupe throttle)
| 파일 |
역할 |
ron_orchestrator_controller.py |
오케스트레이터 컨트롤러 |
agent_queue_worker.py |
에이전트 큐 워커 |
node-host/runner.ts |
Node 호스트 러너 |
telegram/polling-session.ts |
텔레그램 폴링 세션 |
imessage/client.ts |
iMessage 클라이언트 |
agents/skills/workspace.ts |
스킬 워크스페이스 |
→ 동일 메시지 1분 내 중복 차단, 디스크/로그 보호.
3-12. shared/telegram.py 알림센터 sqlite 기록
notification_center_log 테이블 추가
- 등급 게이트(CRITICAL=DM, INFO=알림센터, LOG=로그만)에 따른 분기 시 알림센터 분기는 sqlite에도 기록
- 후속 조회/통계 가능
3-13. price-history-collector 상태 정정
- 실측 결과: Hermes
~/.hermes/cron/jobs.json에서 id=783a9939a3fe price-history-collector 잡은 enabled=false, delivery=null 상태
- 이전 보고에서 "재활성화 완료"라고 적었으나 실제 미반영. delivery 설정 추가 + enabled=true 전환은 미완
- 후속 작업 필요
3-14. bond_daily_report 폴백 체인
qwen3.5:4b 단일 → qwen3.5:4b → qwen3.5:9b-nothinker 폴백
- 14개 호출 지점 일괄 적용
3-15. OpenClaw server.py 잔존 명시
- PID 1274 여전히 가동 중
- LaunchAgent:
com.openclaw.ops-dashboard (유지)
- 점유 포트: 3344 (대시보드/API). 18790은 server.py가 아님.
- 호출자: 워커 + orchestrator가
/api/bus/* 엔드포인트 사용 (9개 파일은 18789→Hermes 이관 대상이고, /api/bus 호출자는 별개로 잔존)
- 완전 이전 아님. 부분 폐기 상태로 명시.
- 18790은
tts_webhook.py (PID 1329, smart-home 알림 수신용)이 점유. server.py와 별개 프로세스.
4. 컴포넌트 상세
4-1. Hermes Gateway (운영 중심축, ★승격)
| 기능 |
구현 |
비고 |
| 게이트웨이 포트 |
18789 (Node에서 이전) |
PID 32468 |
| LaunchAgent |
ai.hermes.gateway |
API_SERVER_ENABLED/HOST/PORT 하드코딩 |
| 인증 |
X-Ops-Token |
autoheal_auth.py 경로 수정 완료 |
| 크론 |
~/.hermes/cron/jobs.json |
150 잡, origin dict 정규화 |
| 텔레그램 |
네이티브 어댑터 |
알림센터 sqlite 기록 |
| 큐 |
task-queue 플러그인 |
bus_commands 직접 사용 |
| RSS |
~74MB |
Memory Guardian 임계 500MB |
4-2. OpenClaw server.py (레거시, 부분 폐기)
| 항목 |
상태 |
| 프로세스 |
PID 1274, 살아있음 |
| LaunchAgent |
com.openclaw.ops-dashboard 유지 |
| 포트 |
3344 (대시보드/API). 18790은 별개 프로세스(tts_webhook.py) |
| 사용처 |
워커 + orchestrator → /api/bus/* |
| 폐기 시점 |
미정 (호출자 이전 후 검토) |
4-3. cmux (안정화)
- v0.63.2 자체 영속화에 위임
ai.openclaw.cmux-safe-restart 폐기로 매일 세션 휘발 정지
- 6 surface 구성:
- Claude × 2: 기획, 검토, 오케스트레이션 (Opus 4.6)
- Codex × 4: 구현, 코드 작업 (GPT-5.4)
- 메인 세션은 Claude 감독 세션 (총괄/배분/검증)
4-4. 파이프라인 스크립트
- 경로 변경 없음:
~/.openclaw/workspace/scripts/pipeline/
- 18789 호출하던 9개 파일 이관 완료
- system_digest.py: 헬스 리포트 오탐 구조 개선 (5건)
- drift_recovery.py: NameError/shadowing 해결
4-5. Memory Guardian v2
| 항목 |
설정 |
| 감시 대상 1 |
hermes_cli.main gateway (RSS 500MB) |
| 감시 대상 2 |
chroma-mcp (RSS 1GB) |
| 재시작 |
launchctl kickstart gui/501/ai.hermes.gateway |
| 누수 감지 |
1시간 50% 증가 연속 3회 시 자동 재시작 |
| 정리 단계 |
L1(3GB이하 purge) → L2(1.5GB이하 ollama/stealth 종료) → L3(500MB이하 Node MCP 종료) |
5. 네트워크 포트
| 포트 |
서비스 |
소유 |
비고 |
| 8080 |
Flask 웹앱 |
mission-control |
virtual-insanity.net |
| 3344 |
OpenClaw 대시보드/API |
server.py PID 1274 |
/api/bus/* 워커 호출 |
| 18789 |
Hermes 게이트웨이 |
hermes_cli PID 32468 |
★Node에서 이전 |
| 18790 |
smart-home tts 웹훅 |
tts_webhook.py PID 1329 |
server.py와 무관, smart-home 알림 |
| 4318 |
OTel HTTP |
otel collector PID 1346 |
LISTEN 확인됨 |
| 4317 |
OTel gRPC |
(LISTEN 없음) |
비활성/미사용. 4318 HTTP만 운영 중 |
6. LaunchAgent 현황 (v4)
- 실측 (
~/Library/LaunchAgents/): plist 60개, .disabled 10개 (총 70파일)
launchctl list | grep -E "openclaw|hermes" 활성: 44개
- 비활성/폐기 누적: v3 폐기분 + v4 추가 6건 포함 (정확 카운트는 plist 디렉토리 기준)
v4 신규 폐기 6건
ai.openclaw.cmux-safe-restart ← 근본 원인
ai.openclaw.gateway ← Hermes 이전
ai.openclaw.gateway.env ← gateway 서브
ai.openclaw.node ← 18789 Hermes 이전
com.openclaw.dashboard-v2 ← 빌드 산출물 없음
com.openclaw.agent-queue-analyst ← 잘못된 에이전트 이름
7. 데이터 흐름
해리 메시지 (텔레그램)
→ Hermes 텔레그램 어댑터
→ 알림센터 sqlite 기록 (CRITICAL 외)
→ Hermes 세션 처리 → 18789 게이트웨이
→ 파이프라인 스크립트 또는 task-queue
→ ops_multiagent.db (bus_commands)
→ knowledge-agent/ 노트 생성
Hermes 크론 (150 잡)
→ 매 스케줄마다 파이프라인 실행
→ jobs.json lastRunAtMs 갱신
→ system_digest.py가 24시간 윈도우로 헬스 판정
cmux Claude/Codex (6 surface)
→ 해리 직접 지시 또는 자율 작업
→ 파이프라인 / 볼트 / DB 접근
→ 결과 보고
워커/orchestrator
→ OpenClaw server.py (3344) /api/bus/* 호출 [잔존]
→ bus_commands DB 갱신
8. 셀프체크 — 15개 변경 항목 반영 확인
| # |
변경 항목 |
반영 위치 |
| 1 |
LaunchAgent 6건 폐기 |
§3-1, §6 |
| 2 |
18789 포트 이전 (호출자 9곳) |
§3-2, §4-1, §5 |
| 3 |
staged_boot.sh 수정 |
§3-3 |
| 4 |
autoheal_auth.py 인증 경로 |
§3-4 |
| 5 |
agent_registry.py 프롬프트 |
§3-5 |
| 6 |
drift_recovery.py (2건) |
§3-6 |
| 7 |
system_digest.py (5건) |
§3-7 |
| 8 |
jobs.json origin 정규화 + 16잡 복구 |
§3-8 |
| 9 |
~/.hermes/migration 1.9GB 삭제 |
§3-9 |
| 10 |
agent-queue-analyst.err.log truncate |
§3-10 |
| 11 |
로그 폭주 가드 6개 파일 |
§3-11 |
| 12 |
shared/telegram.py 알림센터 sqlite |
§3-12 |
| 13 |
price-history-collector 재활성화 |
§3-13 |
| 14 |
bond_daily_report 폴백 체인 |
§3-14 |
| 15 |
OpenClaw server.py 잔존 명시 |
§3-15, §4-2 |
9. 다음 단계
| 우선순위 |
작업 |
상태 |
| 1 |
OpenClaw server.py /api/bus/* 호출자 9개 Hermes 이관 |
대기 |
| 2 |
server.py 종료 후 com.openclaw.ops-dashboard 폐기 |
대기 |
| 3 |
system_digest.py 24시간 윈도우 1주일 운영 검증 |
진행 중 |
| 4 |
jobs.json 150잡 실행 안정성 모니터링 |
진행 중 |
| 5 |
OTel → Hermes filelog receiver 연결 |
미착수 |
| 6 |
cmux v0.63.2 영속화 안정성 1주 검증 |
진행 중 |
| 7 |
폐기 plist 6건 파일 삭제 (지금은 disabled 상태) |
대기 |
10. 롤백 경로 (긴급 시)
18789 롤백 (Hermes → Node)
# 1. Hermes 게이트웨이 중지
launchctl bootout gui/501/ai.hermes.gateway
# 2. OpenClaw Node 게이트웨이 재활성화
launchctl bootstrap gui/501 ~/Library/LaunchAgents/ai.openclaw.node.plist
launchctl kickstart gui/501/ai.openclaw.node
# 3. autoheal_auth.py를 18789/health 경로로 되돌리기
# 4. agent_registry.py 프롬프트 텍스트 18789 복원
cmux-safe-restart 롤백
# v0.63.2 영속화에 문제 발생 시 일시 복구
launchctl bootstrap gui/501 ~/Library/LaunchAgents/ai.openclaw.cmux-safe-restart.plist
# 단, 매일 세션 휘발이 다시 발생함을 인지
system_digest 윈도우 롤백
# system_digest.py
LOG_WINDOW_HOURS = 24 * 7 # 24 → 168
LOG_LINES_TAIL = 100 # 500 → 100
CUTOFF_AUTO_RESOLVE_DAYS = 7 # 2 → 7