OpenClaw·Hermes 마이그레이션 (1/13) — 현행 구조 인벤토리: 마이그레이션 전 스냅샷

단일 페르소나 + 백엔드 역할 분리, 4-tier 메모리, 크론·LaunchAgent·스크립트 레이어링 — 1인 AI 시스템이 실제로 어떤 부품들로 구성되는지 해부한다.


이 글이 전달하는 것

  • 단일 대화 페르소나 + 다중 백엔드 에이전트로 역할을 분리하는 설계 패턴
  • 크론 / macOS LaunchAgent / 스크립트 레이어를 어떤 기준으로 나누는지
  • 메모리를 Identity / Curated / Project / Episode 4-tier로 쪼개 토큰과 회상 품질을 동시에 잡는 구조
  • oMLX 기반 하이브리드 검색(임베딩 + 키워드 + MMR + temporal decay)의 실제 구성값
  • 마이그레이션 관점에서 "재사용 가능한 자산"과 "해당 플랫폼에 종속된 자산"을 가르는 기준

오픈클로는 Claude Code 기반 1인 AI 시스템으로 출발해 현재 다수의 에이전트, 다수의 스케줄러 / 데몬, 다수의 운영 스크립트, 여러 스킬, 4-tier 메모리로 구성되어 있다. 헤르메스(Hermes) 베이스로의 이관 결정을 앞두고 현행 자산을 한 번에 조감하기 위해 인벤토리를 정리한다. 같은 구조를 만들거나 참고하려는 사람이 어느 레이어에 어떤 역할이 붙는지 그대로 가져갈 수 있도록 구성했다.


1. 에이전트 레이어 — 단일 페르소나 + 역할 분리

에이전트는 여러 개이고, 사용자가 대화하는 인터페이스는 mir 하나로 고정한다. 나머지는 전부 백엔드 역할로 분리된다. 이 구조는 (a) 대화 맥락 하나만 유지하면서 (b) 무거운 작업은 전용 에이전트로 위임해 모델·프롬프트를 독립적으로 튜닝할 수 있게 한다.

에이전트 모델 역할
mir gpt-5.4 (high) 유일 대화 인터페이스, 라우팅
monitor omlx gemma-4 시스템 상태 감시
researcher gemini-3.1-flash-lite 웹 리서치, AutoSearch Deep, Scrapling
communicator gpt-5.4 (medium) 글쓰기
orchestrator gpt-5.3-codex 코딩 + CLI, 서브에이전트/스킬 팩토리
google gemini-3.1-flash-lite Google Workspace API
reviewer gemini-3.1-flash-lite 월간 메모리 리뷰
memory-runner omlx gemma-4 bank/ 파일 I/O
memory-manager gemini-2.5-flash Reflect 의미 판단
telegram-ops gemini-3.1-flash-lite 텔레그램 송신
planner mir 상속 (subagent) PRD/기획

모델 선택 기준

  • 판단 무거움 / 라우팅: GPT-5.4 high
  • 코딩·CLI: GPT-5.3 codex
  • 경량 처리 (리서치, 송신, 리뷰): Gemini 3.1 Flash Lite
  • 로컬 보안(네트워크로 내보내지 않음): oMLX gemma-4 26b

판단 비용과 보안 경계, 두 축만으로 모델이 결정된다. 대화 인터페이스를 한 에이전트에 고정하면 모델 이질성이 사용자 경험에 노출되지 않는다는 점이 핵심이다.


2. 자동화 레이어 — Cron

스케줄된 배치 작업은 크론에 올린다. 작업은 크게 두 축이다.

name schedule agent
ai-research-scan 09:00 researcher
reddit-scan 15분/6시간 researcher
reflect-orchestrate 03:00 memory-manager
memory-micro-cycle 7,37분/매시간 mir
daily-summary 22:40 mir
self-review-scan 22:05 mir
self-review-apply 22:12 mir
self-review-fix 10분/22~23시 mir
monthly-memory-review 매월 1일 09:00 reviewer

작동 원리

  • 메모리 사이클: 03:00 Reflect(의미 병합·정리), 매시간 7분·37분에 micro-cycle(짧은 주기 정리). 사용자가 입력하지 않는 시간대에 bank/와 memory/를 정합시킨다.
  • 셀프 리뷰: 22:05 스캔 → 22:12 적용 → 22~23시 fix 루프. 하루 끝에 규칙 위반·드리프트를 자기 수정한다.

크론 레이어는 "사람이 잠든 사이에 시스템이 스스로 정리·교정한다"는 원칙이 구현되는 곳이다.


3. 데몬 레이어 — macOS LaunchAgent

크론이 시간 기반이라면 LaunchAgent는 프로세스 기반이다. 살아 있어야 하는 것들이 여기 들어간다. 대표적인 데몬은 다음과 같다.

  • ai.openclaw.gateway — Gateway 데몬 (포트 18789)
  • ai.openclaw.update-check — 자동 업데이트
  • com.openclaw.omlx — oMLX 서버 (gemma-4 26b)
  • com.openclaw.omlx-proxy — oMLX 프록시
  • com.openclaw.daily-audit — 05:00 일일 감사 (Phase A~E)
  • com.claude-agent.watchdog — 세션 워치독
  • com.claude-agent.autostart — 자동 시작

oMLX 서버와 프록시가 로컬 임베딩·추론 인프라를 구성한다. 외부 API로 내보내고 싶지 않은 데이터는 반드시 이 두 엔드포인트를 경유한다. 로컬 추론을 붙이고 싶다면 "서버 + 프록시 + 프록시를 가리키는 라우팅 설정" 세트가 최소 단위다.


4. 실행 레이어 — 운영 스크립트

가장 양이 많은 영역이고, 기능별 카테고리가 명확하다.

메모리 파이프라인

  • retain-extract.py / retain-merge.py — Retain 태그 추출/병합
  • recall-tree.py / recall-match.py — Topic-Cued Recall
  • recall-cleanup.py — TTL 정리
  • confidence-decay.py — opinions confidence 감쇠
  • topics-validate.py / topics-expand.py — topic 일관성
  • session-cleanup.py / session-archive.py — 세션 라이프사이클
  • user-pattern-stage.py — U-tag 변증법(관찰→가설→검증)
  • bank-lint.py / bank-size-watch.py — bank/ 검증
  • entity-audit.py — entities/ stale 감지
  • memory-micro-cycle.py — 30분 주기 오케스트레이터
  • decision-prepare.py / decision-apply.py — LLM 의사결정 큐
  • memory-warning-report.py / memory-optimize.py
  • memory-archive.sh — memory/ → archived/

Heartbeat

  • heartbeat-router.sh / heartbeat-update.sh / heartbeat-tick.py / heartbeat-health.py
  • proactive-exception-alerts.py
  • check-quotas.sh
  • gws-check.sh — Gmail/Calendar 빠른 체크

Self-Review

  • self-review-prescan.py / self-review-apply.py / self-review-fix.py
  • skill-candidate-stage.py

Daily Audit

  • daily-audit.sh / docs-snapshot.sh / release-check.sh / docs-update-ai.sh
  • agent-linter.sh / config-drift.sh / cron-analytics.sh / session-audit.sh / reflect-trace.py

외부 통합

  • scrape.py — Scrapling + playwright + curl_cffi (Cloudflare 우회)
  • gws-wrapper.sh — Google Workspace CLI
  • omlx-serve.sh — oMLX 데몬

Hooks (.claude/settings)

  • PostToolUse: JSON 검증, AgentLinter, DOC_SYNC, debug 경고
  • PreToolUse(git commit): DOC_SYNC gate, AgentLinter
  • SessionStart / SessionEnd / PreCompact

스크립트는 한 작업 = 한 파일 원칙으로 쪼개져 있다. 크론/LaunchAgent/훅이 이 스크립트를 엔트리로 호출한다. 즉 상위 레이어는 "언제/왜"를 결정하고 스크립트는 "무엇을"만 수행한다.


5. 인터페이스 레이어 — Skill

슬래시 명령 형태의 스킬은 사용자가 직접 호출하는 엔트리포인트다.

  • 일반: brainstorming, writing-plans, verification, deep-interview, code-review, testing, git-commit, project-doctor, self-audit
  • OpenClaw 전용: oc-config, oc-agent, oc-channel, oc-skill, oc-memory, oc-doctor, oc-deploy, oc-backup

이관 관점의 분류

  • 일반 스킬은 플랫폼 독립 — 다른 하네스로 그대로 이식 가능.
  • oc-* 계열은 오픈클로 내부 구조(에이전트 구성, 채널 라우팅, bank/ 스키마)에 묶여 있어 재설계 대상.

이 이분법이 마이그레이션 스코프의 1차 필터가 된다.


6. 메모리 구조 — v0.6 4-tier

핵심 설계이자 가장 신중히 옮겨야 할 자산이다. 토큰 예산과 회상 품질을 분리해 다루기 위해 4개 층으로 쪼갠다.

  • Identity: MEMORY.md (600 토큰) — 항상 컨텍스트 선두에 들어가는 정체성
  • Curated: bank/ (world / experience / opinions / patterns / _changelog / _conflict_log / _map / index / topics)
  • Project: bank/entities/
  • Episode: memory/ (일일 로그)

검색 스택

  • 임베딩: oMLX bge-m3-mlx-fp16
  • 하이브리드: 벡터 0.7 / 키워드 0.3
  • 재랭크: MMR
  • 시간 보정: temporalDecay 30일

Reflect

  • 다단계 Phase 파이프라인
  • U-tag 변증법 (관찰 → 가설 → 검증)

설계 원리

  • Identity는 "항상 들어간다" → 600 토큰으로 하드캡.
  • Curated는 "질문 맥락에 따라 검색" → 벡터+키워드+MMR로 다양성 확보, temporal decay로 최신성 가중.
  • Episode는 "원천 로그" → 대부분 직접 읽지 않고 Reflect가 Curated로 승격.
  • Project는 엔티티 단위 격리 → 엔티티별 stale 감지(entity-audit) 가능.

이 4-tier는 "컨텍스트에 넣을 것 / 검색해 꺼낼 것 / 승격 대상 / 원천" 4개 역할을 물리적으로 분리한 것이다. 역할이 섞이면 토큰이 낭비되거나 회상이 노이즈로 오염된다.


7. 채널 라우팅

알림을 목적별로 쪼갠다.

  • Discord 주채널 (1487837031420792832): reflect, self-review 전부
  • Telegram Forum 토픽: General / Server / Bot / Research / Memory / Heartbeat

한 채널에 이벤트가 전부 몰리면 노이즈가 되어 알림을 무시하게 된다. 토픽 단위로 쪼개 두면 "무엇을 놓치면 안 되는가"를 채널 선택만으로 결정할 수 있다. 이 라우팅 컨셉 자체는 플랫폼에 종속되지 않는 설계라 이관해도 유지될 가능성이 크다.


한계와 적용 범위

  • 레이어 수 자체가 복잡성이다: 에이전트 / 크론 / LaunchAgent / 스크립트 / 훅 / 스킬로 나뉘는 다층 구조는 혼자 유지 가능한 상한선에 가깝다. 규모가 더 커지면 레이어를 합쳐야 한다.
  • oMLX 로컬 추론은 macOS Apple Silicon 전제: 동일 구조를 다른 OS에서 구현하려면 로컬 추론 스택을 교체해야 한다.
  • 크론·LaunchAgent 조합은 macOS 의존: 리눅스로 옮길 경우 systemd timer + unit으로 1:1 치환 가능하지만, 스케줄러가 바뀌면 셀프 리뷰 루프의 실패 복구 동작도 함께 재검증해야 한다.
  • 재사용 가능 영역 vs 종속 영역: 역할 분리 원칙·4-tier 메모리·채널 라우팅·일반 스킬은 이식 가능. oc-* 스킬·Gateway 데몬·훅 구성은 하네스마다 재설계가 필요하다.

열린 질문

  • 4-tier 메모리를 더 줄일 수 있는가 — Identity + Curated 2-tier로 합치면 무엇을 잃는가.
  • 단일 페르소나 + 백엔드 분리 구조에서 페르소나를 N개로 늘릴 때 라우팅 비용은 어떻게 증가하는가.
  • 헤르메스 베이스에서 어느 자산을 그대로, 어느 자산을 재설계, 어느 자산을 폐기할지 — 분류 기준은 "플랫폼 종속성"인가 "설계 부채"인가.

시리즈 전체 안내: 시리즈 목차

댓글

이 블로그의 인기 게시물

"LLM 핵심 학습 (1/6) — 기본: 토큰화·임베딩·어텐션·위치 인코딩"

"LLM 핵심 학습 (2/6) — 파인튜닝: LoRA·QLoRA·증류·Adapter"

"ML 기초 학습 (1/9) — 머신러닝과 sklearn: 학습의 좌표계"