virtual-insanity

Knowledge Graph / System Blueprint

시스템 청사진 v4 (4/13)

29 nodes · 31 edges · 2026-04-13T00:00

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

date: "2026-04-13"

tags: ["system", "blueprint", "hermes", "openclaw", "purge", "architecture", "cmux"]

source: "claude-code"

supersedes: "260412_claude_system-blueprint-hermes-migration.md"

시스템 청사진 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_recoveryNameError 잠재db_connection/db_transaction 임포트, info→db_info 리네이밍
system_digest7일 윈도우, 100줄, 7일 cutoff24시간/500줄/2일 cutoff, jobs.json lastRunAtMs 우선
jobs.json origindict/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.gatewayHermes 게이트웨이로 이전
ai.openclaw.gateway.envgateway 서브 plist, 함께 폐기
ai.openclaw.nodeHermes가 18789 점유, Node 게이트웨이 불필요
com.openclaw.dashboard-v2빌드 산출물 부재, 실행 불가 상태였음
com.openclaw.agent-queue-analystdata-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곳 이관 완료:

1. pipeline/hypothesis_engine.py

2. pipeline/note_atomizer.py

3. pipeline/system_dashboard.py

4. pipeline/daily_system_validator.py

5. webapp/blueprints/ops.py

6. webapp/sihwang_webapp.py

7. shared/autoheal_auth.py

8. hermes_cli/status.py

9. 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건) — 헬스 리포트 오탐 구조 개선

항목BeforeAfter
로그 윈도우7일24시간
로그 파싱 범위lines[-100:]lines[-500:]
타임스탬프 파싱 실패예외 발생continue (스킵)
collect_pipeline_states디스크 mtime만jobs.json lastRunAtMs 우선 참조
cutoff_auto_resolve7일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.tsNode 호스트 러너
telegram/polling-session.ts텔레그램 폴링 세션
imessage/client.tsiMessage 클라이언트
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
LaunchAgentai.hermes.gatewayAPI_SERVER_ENABLED/HOST/PORT 하드코딩
인증X-Ops-Tokenautoheal_auth.py 경로 수정 완료
크론~/.hermes/cron/jobs.json150 잡, origin dict 정규화
텔레그램네이티브 어댑터알림센터 sqlite 기록
task-queue 플러그인bus_commands 직접 사용
RSS~74MBMemory Guardian 임계 500MB

4-2. OpenClaw server.py (레거시, 부분 폐기)

항목상태
프로세스PID 1274, 살아있음
LaunchAgentcom.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

항목설정
감시 대상 1hermes_cli.main gateway (RSS 500MB)
감시 대상 2chroma-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. 네트워크 포트

포트서비스소유비고
8080Flask 웹앱mission-controlvirtual-insanity.net
3344OpenClaw 대시보드/APIserver.py PID 1274/api/bus/* 워커 호출
18789Hermes 게이트웨이hermes_cli PID 32468★Node에서 이전
18790smart-home tts 웹훅tts_webhook.py PID 1329server.py와 무관, smart-home 알림
4318OTel HTTPotel collector PID 1346LISTEN 확인됨
4317OTel 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개 변경 항목 반영 확인

#변경 항목반영 위치
1LaunchAgent 6건 폐기§3-1, §6
218789 포트 이전 (호출자 9곳)§3-2, §4-1, §5
3staged_boot.sh 수정§3-3
4autoheal_auth.py 인증 경로§3-4
5agent_registry.py 프롬프트§3-5
6drift_recovery.py (2건)§3-6
7system_digest.py (5건)§3-7
8jobs.json origin 정규화 + 16잡 복구§3-8
9~/.hermes/migration 1.9GB 삭제§3-9
10agent-queue-analyst.err.log truncate§3-10
11로그 폭주 가드 6개 파일§3-11
12shared/telegram.py 알림센터 sqlite§3-12
13price-history-collector 재활성화§3-13
14bond_daily_report 폴백 체인§3-14
15OpenClaw server.py 잔존 명시§3-15, §4-2

9. 다음 단계

우선순위작업상태
1OpenClaw server.py /api/bus/* 호출자 9개 Hermes 이관대기
2server.py 종료 후 com.openclaw.ops-dashboard 폐기대기
3system_digest.py 24시간 윈도우 1주일 운영 검증진행 중
4jobs.json 150잡 실행 안정성 모니터링진행 중
5OTel → Hermes filelog receiver 연결미착수
6cmux 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