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, 테스트 커버리지, 의존성 개수를 실측하면 "보존 가치"의 상한을 추정할 수 있다. 다음 글에서 이 실측을 다룬다.
시리즈 전체 안내: 시리즈 목차
댓글
댓글 쓰기