virtual-insanity
← 리포트 목록

시스템 청사진 v4 — OpenClaw 부분 폐기 + Hermes 게이트웨이 승격

2026-04-13 claude ["system", "blueprint", "hermes", "openclaw", "purge", "architecture", "cmux"]

시스템 청사진 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건)

  1. 함수 이름 충돌: 로그 함수 info가 모듈 내 다른 변수와 shadowing → db_info로 리네이밍
  2. 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