{
  "schema_version": "system-graph/v1",
  "generated_at": "2026-04-13T00:00:00+09:00",
  "title": "OpenClaw Purge + Hermes Gateway Promotion — Ron Mac Mini System Graph",
  "description": "v4 청사진 (2026-04-13) 반영. LaunchAgent 6건 폐기, 18789 Hermes 이관, OpenClaw server.py 잔존 명시, cmux 6 surface, 헬스 리포트 오탐 구조 개선",
  "supersedes": "260412_system-graph-data.json",
  "sources_checked": {
    "v3_blueprint": "/Users/ron/knowledge-agent/400-reports/260412_claude_system-blueprint-hermes-migration.md",
    "v3_graph": "/Users/ron/knowledge-agent/400-reports/260412_system-graph-data.json",
    "hermes_cron": "/Users/ron/.hermes/cron/jobs.json",
    "hermes_config": "/Users/ron/.hermes/config.yaml",
    "ops_db": "/Users/ron/.openclaw/data/ops_multiagent.db",
    "launchagents": "/Users/ron/Library/LaunchAgents/"
  },
  "v4_changes": {
    "deprecated_launchagents": [
      "ai.openclaw.cmux-safe-restart",
      "ai.openclaw.gateway",
      "ai.openclaw.gateway.env",
      "ai.openclaw.node",
      "com.openclaw.dashboard-v2",
      "com.openclaw.agent-queue-analyst"
    ],
    "port_18789_owner": "ai.hermes.gateway (PID 32468) — was ai.openclaw.node (PID 5046)",
    "openclaw_server_status": "PARTIALLY_DEPRECATED — server.py PID 1274 still running on 3344 only. 18790 belongs to tts_webhook.py (PID 1329, smart-home).",
    "cmux_surfaces": "2 Claude + 4 Codex (total 6)",
    "callers_migrated_to_18789_hermes": 9,
    "patch_corrections_2026_04_13_pm": {
      "port_18790_owner": "tts_webhook.py PID 1329 (was incorrectly attributed to server.py)",
      "otel_4317_listen": "ABSENT — only 4318 HTTP listens (PID 1346)",
      "price_history_collector": "enabled=false delivery=null in ~/.hermes/cron/jobs.json — earlier '재활성화' claim was incorrect",
      "staged_boot_dup_removed": "ai.hermes.gateway double-call at line 47 + 61 — line 61 removed",
      "launchagents_actual": "60 .plist + 10 .disabled in ~/Library/LaunchAgents/, 44 active in launchctl list",
      "telegram_bots_corrected": "3 bots in body table now matches JSON (@openclaw_harybot, @RONforMAC_Bot, @ronclawBot)",
      "stale_18789_refs": "80 grep hits remain in ~/.openclaw/workspace/scripts/ (mostly check scripts + podman); auto-routed to Hermes, no runtime impact"
    }
  },
  "nodes": [
    {
      "id": "hermes_gateway",
      "label": "Hermes Gateway",
      "kind": "runtime",
      "role": "운영 중심축 / 게이트웨이 / 텔레그램 / 크론 / 큐",
      "technology": "Python / Hermes v0.8.0",
      "status": "primary_runtime",
      "tags": [
        "promoted_v4"
      ],
      "ports": {
        "telegram": "polling",
        "gateway": 18789
      },
      "gateway_port": 18789,
      "pid": 32468,
      "rss_mb": 74,
      "paths": [
        "/Users/ron/.hermes",
        "/Users/ron/.hermes/hermes-agent"
      ],
      "community": "runtime",
      "centrality": "center"
    },
    {
      "id": "openclaw_server",
      "label": "OpenClaw server.py (legacy)",
      "kind": "runtime",
      "role": "레거시 대시보드/API, 워커 9개 + orchestrator의 /api/bus/* 백엔드",
      "technology": "Python / Flask",
      "status": "partially_deprecated",
      "tags": [
        "legacy",
        "still_running"
      ],
      "pid": 1274,
      "ports": {
        "dashboard_api": 3344
      },
      "note": "18790 포트는 server.py가 아니라 별개 프로세스 tts_webhook.py(PID 1329, smart-home)가 점유. v4 정정.",
      "launchagent": "com.openclaw.ops-dashboard",
      "community": "ops",
      "centrality": "high"
    },
    {
      "id": "tts_webhook",
      "label": "tts_webhook.py (smart-home)",
      "kind": "runtime",
      "role": "Smart-home TTS 알림 수신 웹훅",
      "technology": "Python",
      "status": "running",
      "pid": 1329,
      "ports": {
        "http": 18790
      },
      "paths": [
        "/Users/ron/.openclaw/skills/smart-home/scripts/tts_webhook.py"
      ],
      "community": "integrations"
    },
    {
      "id": "telegram",
      "label": "Telegram",
      "kind": "external_channel",
      "role": "해리 DM / 봇 폴링 채널 / 알림센터 sqlite 기록",
      "technology": "Telegram Bot API polling",
      "status": "connected_by_hermes",
      "bots": [
        "@openclaw_harybot",
        "@RONforMAC_Bot",
        "@ronclawBot"
      ],
      "community": "runtime"
    },
    {
      "id": "hermes_cron",
      "label": "Hermes Cron",
      "kind": "scheduler",
      "role": "정기 작업 스케줄러, jobs.json 150잡",
      "technology": "Hermes cron jobs.json",
      "status": "migrated_normalized",
      "job_count": 150,
      "tags": [
        "origin_dict_normalized_v4",
        "16_jobs_recovered"
      ],
      "paths": [
        "/Users/ron/.hermes/cron/jobs.json"
      ],
      "community": "automation"
    },
    {
      "id": "pipeline_scripts",
      "label": "Pipeline Scripts",
      "kind": "script_layer",
      "role": "분석·수집·웹앱 갱신 파이프라인 (9개 파일 18789 호출 이관 완료)",
      "technology": "Python scripts",
      "tags": [
        "18789_callers_migrated"
      ],
      "modified_files_v4": [
        "hypothesis_engine.py",
        "note_atomizer.py",
        "system_dashboard.py",
        "daily_system_validator.py",
        "webapp/blueprints/ops.py",
        "sihwang_webapp.py",
        "shared/autoheal_auth.py",
        "hermes_cli/status.py",
        "agent_registry.py"
      ],
      "paths": [
        "/Users/ron/.openclaw/workspace/scripts/pipeline"
      ],
      "community": "automation"
    },
    {
      "id": "system_digest",
      "label": "system_digest.py (개선)",
      "kind": "script",
      "role": "시스템 헬스 다이제스트, 오탐 구조 개선",
      "tags": [
        "v4_health_oversight_fix"
      ],
      "changes_v4": {
        "log_window": "7d → 24h",
        "log_tail_lines": "100 → 500",
        "timestamp_parse": "raise → continue",
        "pipeline_state_source": "mtime → jobs.json lastRunAtMs",
        "cutoff_auto_resolve": "7d → 2d"
      },
      "paths": [
        "/Users/ron/.openclaw/workspace/scripts/pipeline/system_digest.py"
      ],
      "community": "automation"
    },
    {
      "id": "drift_recovery",
      "label": "drift_recovery.py (수정)",
      "kind": "script",
      "role": "드리프트 복구 스크립트",
      "tags": [
        "v4_nameerror_fixed",
        "v4_shadowing_fixed"
      ],
      "fixes_v4": [
        "info → db_info 리네이밍",
        "from shared.db import db_connection, db_transaction 추가"
      ],
      "community": "automation"
    },
    {
      "id": "hermes_task_queue_plugin",
      "label": "Hermes Task Queue Plugin",
      "kind": "plugin",
      "role": "Hermes에서 OpenClaw bus_commands 큐를 도구로 사용",
      "technology": "Hermes plugin / SQLite wrapper",
      "status": "installed",
      "tools": [
        "queue_add",
        "queue_pick",
        "queue_complete",
        "queue_list"
      ],
      "paths": [
        "/Users/ron/.hermes/plugins/task-queue"
      ],
      "community": "queue"
    },
    {
      "id": "sqlite_ops_db",
      "label": "SQLite ops_multiagent.db",
      "kind": "database",
      "role": "bus_commands / ops_todos / notification_center_log 운영 상태 저장소",
      "technology": "SQLite WAL",
      "tables": [
        "bus_commands",
        "ops_todos",
        "notification_center_log"
      ],
      "tags": [
        "v4_notification_center_added"
      ],
      "paths": [
        "/Users/ron/.openclaw/data/ops_multiagent.db"
      ],
      "community": "queue"
    },
    {
      "id": "flask_webapp",
      "label": "Flask Webapp",
      "kind": "webapp",
      "role": "virtual-insanity.net 시황 웹앱 로컬 엔트리포인트",
      "technology": "Flask / Python",
      "port": 8080,
      "paths": [
        "/Users/ron/.openclaw/workspace/scripts/pipeline/run_webapp.py",
        "/Users/ron/.openclaw/workspace/mission-control"
      ],
      "community": "web"
    },
    {
      "id": "cloudflare_tunnel",
      "label": "Cloudflare Tunnel",
      "kind": "network_edge",
      "role": "로컬 웹앱을 외부 도메인으로 노출",
      "technology": "Cloudflare Tunnel",
      "domain": "https://virtual-insanity.net",
      "community": "web"
    },
    {
      "id": "internet",
      "label": "Internet",
      "kind": "external_network",
      "role": "외부 사용자 / 공개 웹 접근",
      "community": "web"
    },
    {
      "id": "anthropic_api",
      "label": "Anthropic API",
      "kind": "external_api",
      "role": "Hermes / Claude Code의 LLM 호출 대상",
      "technology": "Anthropic API",
      "community": "ops"
    },
    {
      "id": "cmux",
      "label": "cmux v0.63.2",
      "kind": "session_manager",
      "role": "다중 세션 관리, 6 surface 구성, 자체 영속화",
      "technology": "cmux",
      "tags": [
        "v4_self_persistence",
        "safe_restart_deprecated"
      ],
      "surfaces": {
        "claude": 2,
        "codex": 4,
        "total": 6
      },
      "community": "agents"
    },
    {
      "id": "claude_code_cli",
      "label": "Claude Code (Opus 4.6) ×2",
      "kind": "agent_cli",
      "role": "기획·검토·오케스트레이션, 메인 감독 세션 포함",
      "technology": "Claude Code Opus 4.6",
      "surface_count": 2,
      "paths": [
        "/Users/ron/.claude"
      ],
      "community": "agents"
    },
    {
      "id": "codex_cli",
      "label": "Codex (GPT-5.4) ×4",
      "kind": "agent_cli",
      "role": "구현·수정·검증 전담, 4 surface 병행",
      "technology": "Codex CLI / GPT-5.4",
      "surface_count": 4,
      "paths": [
        "/Users/ron/.codex"
      ],
      "community": "agents"
    },
    {
      "id": "knowledge_vault",
      "label": "knowledge vault",
      "kind": "vault",
      "role": "해리 개인 원본 지식 볼트",
      "access": "read-only-by-agents",
      "paths": [
        "/Users/ron/knowledge"
      ],
      "community": "knowledge"
    },
    {
      "id": "knowledge_agent_vault",
      "label": "knowledge-agent vault",
      "kind": "vault",
      "role": "에이전트 작업 산출물 / 양방향 공유 매체",
      "access": "read_write",
      "paths": [
        "/Users/ron/knowledge-agent"
      ],
      "community": "knowledge"
    },
    {
      "id": "otel_collector",
      "label": "OTEL Collector",
      "kind": "observability",
      "role": "텔레메트리 수집",
      "technology": "OpenTelemetry Collector",
      "ports": {
        "http": 4318
      },
      "note": "v4 실측 정정: 4317 gRPC LISTEN 없음. 4318 HTTP만 운영(PID 1346).",
      "community": "ops"
    },
    {
      "id": "memory_guardian",
      "label": "Memory Guardian v2",
      "kind": "watchdog",
      "role": "Hermes 메모리/상태 감시, RSS 500MB 임계",
      "technology": "guardian workflow",
      "status": "monitoring_role",
      "watches": [
        "hermes_gateway",
        "chroma_mcp"
      ],
      "thresholds": {
        "hermes_rss_mb": 500,
        "chroma_rss_mb": 1000
      },
      "community": "ops"
    },
    {
      "id": "smart_home",
      "label": "Smart Home (5개 알림)",
      "kind": "integration",
      "role": "스마트홈 상태·알림 연동",
      "technology": "Home Assistant / Hermes homeassistant toolset",
      "notification_count": 5,
      "community": "integrations"
    },
    {
      "id": "mcp_servers",
      "label": "MCP Servers",
      "kind": "tool_layer",
      "role": "Claude/Hermes 도구 확장 계층",
      "technology": "MCP",
      "enabled": [
        "vault",
        "agent-vault"
      ],
      "paths": [
        "/Users/ron/.hermes/config.yaml"
      ],
      "community": "tools"
    },
    {
      "id": "deprecated_la_cmux_safe_restart",
      "label": "ai.openclaw.cmux-safe-restart",
      "kind": "launchagent",
      "status": "deprecated",
      "tags": [
        "deprecated_v4",
        "root_cause"
      ],
      "reason": "매일 cmux 세션 휘발 근본 원인, v0.63.2 자체 영속화에 위임",
      "community": "deprecated"
    },
    {
      "id": "deprecated_la_openclaw_gateway",
      "label": "ai.openclaw.gateway",
      "kind": "launchagent",
      "status": "deprecated",
      "tags": [
        "deprecated_v4"
      ],
      "reason": "Hermes 게이트웨이 이전",
      "community": "deprecated"
    },
    {
      "id": "deprecated_la_openclaw_gateway_env",
      "label": "ai.openclaw.gateway.env",
      "kind": "launchagent",
      "status": "deprecated",
      "tags": [
        "deprecated_v4"
      ],
      "reason": "gateway 서브 plist, 함께 폐기",
      "community": "deprecated"
    },
    {
      "id": "deprecated_la_openclaw_node",
      "label": "ai.openclaw.node",
      "kind": "launchagent",
      "status": "deprecated",
      "tags": [
        "deprecated_v4"
      ],
      "reason": "18789 포트 Hermes 이관",
      "community": "deprecated"
    },
    {
      "id": "deprecated_la_dashboard_v2",
      "label": "com.openclaw.dashboard-v2",
      "kind": "launchagent",
      "status": "deprecated",
      "tags": [
        "deprecated_v4"
      ],
      "reason": "빌드 산출물 부재, 실행 불가",
      "community": "deprecated"
    },
    {
      "id": "deprecated_la_agent_queue_analyst",
      "label": "com.openclaw.agent-queue-analyst",
      "kind": "launchagent",
      "status": "deprecated",
      "tags": [
        "deprecated_v4"
      ],
      "reason": "data-analyst 잘못된 에이전트 이름, 무한 실패 루프 (97MB err.log)",
      "community": "deprecated"
    }
  ],
  "edges": [
    {
      "source": "hermes_gateway",
      "target": "telegram",
      "relation": "polls",
      "label": "Hermes → Telegram (폴링 + 알림센터 sqlite 기록)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "hermes_cron",
      "relation": "runs_scheduler",
      "label": "Hermes → Cron (150 잡)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_cron",
      "target": "pipeline_scripts",
      "relation": "executes",
      "label": "Cron → Pipeline Scripts",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_cron",
      "target": "system_digest",
      "relation": "executes",
      "label": "Cron → system_digest.py",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_cron",
      "target": "drift_recovery",
      "relation": "executes",
      "label": "Cron → drift_recovery.py",
      "confidence": "EXTRACTED"
    },
    {
      "source": "system_digest",
      "target": "hermes_cron",
      "relation": "reads_jobs_lastrunatms",
      "label": "system_digest → jobs.json lastRunAtMs (v4 신규)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "hermes_task_queue_plugin",
      "relation": "loads_plugin",
      "label": "Hermes → Task Queue Plugin",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_task_queue_plugin",
      "target": "sqlite_ops_db",
      "relation": "reads_writes",
      "label": "Task Queue → SQLite (bus_commands)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "sqlite_ops_db",
      "relation": "writes_notification_log",
      "label": "Hermes → notification_center_log (v4 신규)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "knowledge_agent_vault",
      "relation": "mcp_read_write",
      "label": "Hermes → knowledge-agent (MCP)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "knowledge_vault",
      "relation": "mcp_read",
      "label": "Hermes → knowledge (MCP 읽기)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "anthropic_api",
      "relation": "calls_via_18789",
      "label": "Hermes Gateway → Anthropic API (port 18789 LLM 프록시)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "pipeline_scripts",
      "target": "hermes_gateway",
      "relation": "calls_18789",
      "label": "Pipeline Scripts → 18789 (9개 파일 이관 완료)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "openclaw_server",
      "target": "sqlite_ops_db",
      "relation": "direct_db_access",
      "label": "OpenClaw server.py → SQLite (3344 /api/bus/*)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "pipeline_scripts",
      "target": "openclaw_server",
      "relation": "calls_api_bus",
      "label": "워커/orchestrator → server.py /api/bus/* (3344)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "flask_webapp",
      "target": "cloudflare_tunnel",
      "relation": "exposed_by",
      "label": "Flask Webapp → Cloudflare",
      "confidence": "EXTRACTED"
    },
    {
      "source": "cloudflare_tunnel",
      "target": "internet",
      "relation": "publishes_to",
      "label": "Cloudflare → internet",
      "confidence": "EXTRACTED"
    },
    {
      "source": "cmux",
      "target": "claude_code_cli",
      "relation": "manages_surfaces",
      "label": "cmux → Claude ×2",
      "confidence": "EXTRACTED"
    },
    {
      "source": "cmux",
      "target": "codex_cli",
      "relation": "manages_surfaces",
      "label": "cmux → Codex ×4",
      "confidence": "EXTRACTED"
    },
    {
      "source": "claude_code_cli",
      "target": "mcp_servers",
      "relation": "uses_tools",
      "label": "Claude Code → MCP Servers",
      "confidence": "EXTRACTED"
    },
    {
      "source": "claude_code_cli",
      "target": "knowledge_vault",
      "relation": "reads_guidance",
      "label": "Claude Code → knowledge",
      "confidence": "EXTRACTED"
    },
    {
      "source": "claude_code_cli",
      "target": "knowledge_agent_vault",
      "relation": "writes_reports",
      "label": "Claude Code → knowledge-agent",
      "confidence": "EXTRACTED"
    },
    {
      "source": "codex_cli",
      "target": "knowledge_agent_vault",
      "relation": "writes_reports",
      "label": "Codex → knowledge-agent",
      "confidence": "EXTRACTED"
    },
    {
      "source": "codex_cli",
      "target": "pipeline_scripts",
      "relation": "edits_code",
      "label": "Codex → Pipeline Scripts (구현)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "mcp_servers",
      "relation": "uses_enabled_servers",
      "label": "Hermes → MCP Servers",
      "confidence": "EXTRACTED"
    },
    {
      "source": "memory_guardian",
      "target": "hermes_gateway",
      "relation": "monitors_rss_500mb",
      "label": "Memory Guardian → Hermes (RSS 500MB)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "smart_home",
      "target": "hermes_gateway",
      "relation": "notifies",
      "label": "Smart Home → Hermes 알림",
      "confidence": "INFERRED"
    },
    {
      "source": "otel_collector",
      "target": "openclaw_server",
      "relation": "feeds_observability",
      "label": "OTEL → OpenClaw 대시보드 관측",
      "confidence": "INFERRED"
    },
    {
      "source": "deprecated_la_cmux_safe_restart",
      "target": "cmux",
      "relation": "DEPRECATED_was_restarting",
      "label": "[폐기] safe-restart → cmux 매일 휘발",
      "confidence": "EXTRACTED"
    },
    {
      "source": "deprecated_la_openclaw_node",
      "target": "hermes_gateway",
      "relation": "DEPRECATED_18789_handover",
      "label": "[폐기] Node 게이트웨이 18789 → Hermes 이관",
      "confidence": "EXTRACTED"
    },
    {
      "source": "deprecated_la_openclaw_gateway",
      "target": "hermes_gateway",
      "relation": "DEPRECATED_replaced_by",
      "label": "[폐기] OpenClaw gateway → Hermes",
      "confidence": "EXTRACTED"
    }
  ],
  "links": [
    {
      "source": "hermes_gateway",
      "target": "telegram",
      "relation": "polls",
      "label": "Hermes → Telegram (폴링 + 알림센터 sqlite 기록)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "hermes_cron",
      "relation": "runs_scheduler",
      "label": "Hermes → Cron (150 잡)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_cron",
      "target": "pipeline_scripts",
      "relation": "executes",
      "label": "Cron → Pipeline Scripts",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_cron",
      "target": "system_digest",
      "relation": "executes",
      "label": "Cron → system_digest.py",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_cron",
      "target": "drift_recovery",
      "relation": "executes",
      "label": "Cron → drift_recovery.py",
      "confidence": "EXTRACTED"
    },
    {
      "source": "system_digest",
      "target": "hermes_cron",
      "relation": "reads_jobs_lastrunatms",
      "label": "system_digest → jobs.json lastRunAtMs (v4 신규)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "hermes_task_queue_plugin",
      "relation": "loads_plugin",
      "label": "Hermes → Task Queue Plugin",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_task_queue_plugin",
      "target": "sqlite_ops_db",
      "relation": "reads_writes",
      "label": "Task Queue → SQLite (bus_commands)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "sqlite_ops_db",
      "relation": "writes_notification_log",
      "label": "Hermes → notification_center_log (v4 신규)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "knowledge_agent_vault",
      "relation": "mcp_read_write",
      "label": "Hermes → knowledge-agent (MCP)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "knowledge_vault",
      "relation": "mcp_read",
      "label": "Hermes → knowledge (MCP 읽기)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "anthropic_api",
      "relation": "calls_via_18789",
      "label": "Hermes Gateway → Anthropic API (port 18789 LLM 프록시)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "pipeline_scripts",
      "target": "hermes_gateway",
      "relation": "calls_18789",
      "label": "Pipeline Scripts → 18789 (9개 파일 이관 완료)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "openclaw_server",
      "target": "sqlite_ops_db",
      "relation": "direct_db_access",
      "label": "OpenClaw server.py → SQLite (3344 /api/bus/*)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "pipeline_scripts",
      "target": "openclaw_server",
      "relation": "calls_api_bus",
      "label": "워커/orchestrator → server.py /api/bus/* (3344)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "flask_webapp",
      "target": "cloudflare_tunnel",
      "relation": "exposed_by",
      "label": "Flask Webapp → Cloudflare",
      "confidence": "EXTRACTED"
    },
    {
      "source": "cloudflare_tunnel",
      "target": "internet",
      "relation": "publishes_to",
      "label": "Cloudflare → internet",
      "confidence": "EXTRACTED"
    },
    {
      "source": "cmux",
      "target": "claude_code_cli",
      "relation": "manages_surfaces",
      "label": "cmux → Claude ×2",
      "confidence": "EXTRACTED"
    },
    {
      "source": "cmux",
      "target": "codex_cli",
      "relation": "manages_surfaces",
      "label": "cmux → Codex ×4",
      "confidence": "EXTRACTED"
    },
    {
      "source": "claude_code_cli",
      "target": "mcp_servers",
      "relation": "uses_tools",
      "label": "Claude Code → MCP Servers",
      "confidence": "EXTRACTED"
    },
    {
      "source": "claude_code_cli",
      "target": "knowledge_vault",
      "relation": "reads_guidance",
      "label": "Claude Code → knowledge",
      "confidence": "EXTRACTED"
    },
    {
      "source": "claude_code_cli",
      "target": "knowledge_agent_vault",
      "relation": "writes_reports",
      "label": "Claude Code → knowledge-agent",
      "confidence": "EXTRACTED"
    },
    {
      "source": "codex_cli",
      "target": "knowledge_agent_vault",
      "relation": "writes_reports",
      "label": "Codex → knowledge-agent",
      "confidence": "EXTRACTED"
    },
    {
      "source": "codex_cli",
      "target": "pipeline_scripts",
      "relation": "edits_code",
      "label": "Codex → Pipeline Scripts (구현)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "hermes_gateway",
      "target": "mcp_servers",
      "relation": "uses_enabled_servers",
      "label": "Hermes → MCP Servers",
      "confidence": "EXTRACTED"
    },
    {
      "source": "memory_guardian",
      "target": "hermes_gateway",
      "relation": "monitors_rss_500mb",
      "label": "Memory Guardian → Hermes (RSS 500MB)",
      "confidence": "EXTRACTED"
    },
    {
      "source": "smart_home",
      "target": "hermes_gateway",
      "relation": "notifies",
      "label": "Smart Home → Hermes 알림",
      "confidence": "INFERRED"
    },
    {
      "source": "otel_collector",
      "target": "openclaw_server",
      "relation": "feeds_observability",
      "label": "OTEL → OpenClaw 대시보드 관측",
      "confidence": "INFERRED"
    },
    {
      "source": "deprecated_la_cmux_safe_restart",
      "target": "cmux",
      "relation": "DEPRECATED_was_restarting",
      "label": "[폐기] safe-restart → cmux 매일 휘발",
      "confidence": "EXTRACTED"
    },
    {
      "source": "deprecated_la_openclaw_node",
      "target": "hermes_gateway",
      "relation": "DEPRECATED_18789_handover",
      "label": "[폐기] Node 게이트웨이 18789 → Hermes 이관",
      "confidence": "EXTRACTED"
    },
    {
      "source": "deprecated_la_openclaw_gateway",
      "target": "hermes_gateway",
      "relation": "DEPRECATED_replaced_by",
      "label": "[폐기] OpenClaw gateway → Hermes",
      "confidence": "EXTRACTED"
    }
  ],
  "stats": {
    "nodes": 29,
    "edges": 31,
    "deprecated_nodes": 6,
    "hermes_cron_jobs": 150,
    "cmux_surfaces": 6,
    "callers_migrated": 9,
    "patch_note": "tts_webhook 노드 추가로 nodes 28→29. 18790은 server.py가 아님."
  }
}