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, 서브에이전트/스킬 팩토리 |
| 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개로 늘릴 때 라우팅 비용은 어떻게 증가하는가.
- 헤르메스 베이스에서 어느 자산을 그대로, 어느 자산을 재설계, 어느 자산을 폐기할지 — 분류 기준은 "플랫폼 종속성"인가 "설계 부채"인가.
시리즈 전체 안내: 시리즈 목차
댓글
댓글 쓰기