OpenClaw·Hermes 마이그레이션 (3/13) — 옮길 것과 버릴 것: 4 카테고리 분류

부제: 30 스크립트를 ✅ 🔧 💎 🗑 네 칸에 분류하는 기준


핵심 요약

  • 기존 자산을 새 플랫폼의 내장 기능과 1:1로 비교할 때 대체 / 부분 대체 / 보존 / 폐기 4 카테고리 분류법이 실용적이다.
  • Hermes의 핵심 설계 포인트는 agent/memory_provider.py의 Pluggable MemoryProvider — 외부 메모리가 1급 시민(first-class citizen)으로 취급된다.
  • 이 분류법을 OpenClaw → Hermes 케이스에 적용한 결과: 약 15개 대체, 12개 부분 대체, 10개 보존(이식), 8개 폐기. 보존 대상이 마이그레이션의 정당성을 결정한다.

분류 기준 — 왜 4 카테고리인가

에이전트 마이그레이션은 "전부 이식 vs 전부 재작성"의 이분법으로 처리되면 실패한다. 실제 자산은 연속적 스펙트럼 위에 분포한다. 4 카테고리는 대상 플랫폼의 인터페이스 존재 여부도메인 고유 로직 존재 여부의 2×2 매트릭스를 단순화한 것이다.

표시 의미 판정 조건
대체 대상 플랫폼 내장이 동일하거나 우월 내장 기능이 커버, 도메인 로직 불필요
🔧 부분 대체 인터페이스는 존재, 판단 로직만 이식 내장 hook/provider 있음, 판정 기준은 고유
💎 보존(이식) 대상 플랫폼에 없음, 고유 자산 내장 없음, 도메인 로직이 핵심 가치
🗑 폐기 원본 전용 + 전환 후 무의미 원본 프레임워크 종속, 이식 불가 또는 무가치

A. 메모리 계층 — 그릇과 내용물의 분리

메모리 관련 자산은 구조상 "저장/검색 메커니즘"과 "판단 로직"이 섞여 있는 경우가 많다. Pluggable MemoryProvider 아키텍처는 이 둘을 강제로 분리시킨다.

OpenClaw Hermes 대응 분류
bank/ 4-tier 구조 MemoryProvider 플러그인 wrapping 🔧
recall-tree / recall-match MemoryProvider.prefetch(query) 🔧
retain-extract / retain-merge on_session_end / on_pre_compress hook 🔧
memory-micro-cycle cron + sync_turn
confidence-decay 없음 💎
topics-validate / topics-expand 없음 💎
user-pattern-stage (U-tag dialectic) 없음 💎
bank-lint / bank-size-watch 없음 💎
entity-audit 없음 💎
Topic-Cued Recall 전체 prefetch + system_prompt_block 🔧

원리: 검색·저장의 그릇은 플랫폼 내장이 제공한다. 판단 로직(무엇을 꺼낼지, 무엇을 폐기할지, 신뢰도를 어떻게 감쇠시킬지)은 도메인 고유 자산으로 남는다. 이 분리는 MemoryProvider 인터페이스 시그니처에서 강제된다 — prefetch(query) -> list[Memory]는 저장소가, 리스트에 들어갈 Memory의 선택/정렬/감쇠는 구현체가 담당한다.

B. 모델·라우팅·컨텍스트 — 거의 다 대체

OpenClaw Hermes 대응 분류
Router_Control 프록시 (포트 3939) smart_model_routing.py
context compaction (safeguard) context_compressor.py
프롬프트 캐시 수동 관리 prompt_caching.py
auth-profiles.json credential_pool.py
모델 fallback 네이티브 fallback

이 영역은 공통 인프라에 해당한다. 모델 라우팅, 프롬프트 캐시, credential pooling, context compaction은 에이전트 도메인에 독립적이다. 커스텀 구현을 유지할 근거는 "내장이 특정 요구를 못 맞출 때"로 제한된다. 그 외 경우엔 ✅ 대체가 합리적이다.

C. Heartbeat / Self-Review — 절반은 보존

OpenClaw 분류 비고
heartbeat-router/tick/health cron + on_turn_start로 흡수
heartbeat 11 escalation reasons 💎 판정 기준은 도메인 자산
self-review-prescan/apply/fix hermes-agent-self-evolution(DSPy+GEPA)으로 업그레이드
daily-audit Phase A (docs-snapshot) 💎 Hermes에 없음
proactive-exception-alerts 💎 11 reason 판정은 보존

패턴: "언제 체크하는가"(heartbeat timing, self-review trigger)는 플랫폼이 제공할 수 있다. 반대로 "무엇을 문제로 판정하는가"(11 escalation reasons, docs-snapshot 기준)는 운영 이력에서 도출된 고유 기준이다. Self-Review의 DSPy+GEPA 기반 업그레이드는 ✅로 분류된 사례 — 내장 구현이 기능적으로 우월하므로 커스텀 로직을 고집할 이유가 없다.

D. 외부 통합

OpenClaw 분류
scrape.py (Scrapling + playwright + curl_cffi) 🔧
researcher Deep Mode (5-round AutoSearch) 💎
gws-wrapper / gws-check 🔧
Telegram Forum 6 토픽 라우팅
Discord 주채널
oMLX 통합

Deep Mode의 5-round AutoSearch는 💎에 속하는 대표 사례다. 검색 프로토콜 자체(쿼리 확장 → 결과 수집 → 크로스 레퍼런스 → 갭 식별 → 재검색)가 플랫폼에 존재하지 않는 도메인 로직이기 때문이다.

E. 워크스페이스 → Profile

11개의 워크스페이스 추상은 Hermes의 profiles 기능에 흡수된다. 구조적으로 워크스페이스의 약 절반이 모델 차이역할 차이로 표현하고 있었기 때문에, profile 5~6개로 기능 집합이 축약된다. 이는 "커스텀 추상이 플랫폼 네이티브에 자연스럽게 매핑되는" 케이스의 예시다.

F. Skills

일반 워크플로우 스킬(brainstorming, verification, code-review 등 9개)은 💎 → optional-skills/로 포팅한다. 이들은 OpenClaw 종속성이 없고 범용 재사용이 가능하다. 반면 oc-* 시리즈(8개)는 🗑 — 플랫폼 자체가 전환되면 호출 전제가 사라진다.

G. Hooks

PostToolUse(JSON 검증·Linter·DOC_SYNC), PreToolUse(git commit gate), SessionStart/End/PreCompact는 모두 🔧 부분 대체. Hermes의 profile/gateway hook 인터페이스로 이식하되 게이트 로직(무엇을 통과시키고 무엇을 차단하는가)은 그대로 가져간다. Hook은 "언제 실행할지"와 "무엇을 할지"가 분리 가능한 전형적 사례다.

분류 결과 집계

  • ✅ 대체: 약 15 항목 → 스크립트/설정 약 30% 감소 예상
  • 🔧 부분 대체: 약 12 항목
  • 💎 보존(이식): 약 10 항목 — 마이그레이션의 정당성은 사실상 이 칸에 달린다
  • 🗑 폐기: 약 8 항목

💎 항목이 0에 가까우면 마이그레이션 자체가 불필요하다(내장만으로 커버된다는 뜻). 반대로 💎 비중이 과반이면 플랫폼 교체보다 자체 유지가 더 합리적일 수 있다. 10/45 ≈ 22% 수준은 "플랫폼 교체 + 핵심 로직 이식"이 정당화되는 전형적 비율이다.

정리 — 적용 가능 범위

이 분류 프레임워크는 다음 조건에서 재사용 가능하다:

  • 소스와 대상 플랫폼이 명확히 구분될 때 (여기서는 OpenClaw → Hermes)
  • 양쪽 자산의 인터페이스 시그니처를 직접 비교할 수 있을 때
  • "도메인 고유 로직"과 "공통 인프라"의 경계가 코드 수준에서 식별 가능할 때

반면 다음 경우엔 이 방식이 잘 맞지 않는다: 두 플랫폼의 추상화 레벨이 크게 다를 때, 또는 자산의 가치가 개별 코드가 아닌 데이터(학습된 임베딩, 누적된 상호작용)에 있을 때.

열린 질문: 💎 10개의 이식 비용을 정량화하면 어떻게 되는가. LOC, 테스트 커버리지, 의존성 개수를 실측하면 "보존 가치"의 상한을 추정할 수 있다. 다음 글에서 이 실측을 다룬다.

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

댓글

이 블로그의 인기 게시물

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

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

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