OpenClaw·Hermes 마이그레이션 (4/13) — 이식할 가치가 있는 8개를 골라낸 코드 리뷰

부제: 평균 175 LOC, 외부 의존 없음, 마이그레이션 가치의 30%를 차지한 한 파일


핵심 요약

  • 보존(💎) 후보 자산을 한 줄씩 읽어 평가한 결과: 8개 보존, 2개 부분 보존, 1개 폐기.
  • 이식 난이도는 낮음 — 평균 175 LOC, 표준 라이브러리만 사용, 외부 의존 없음.
  • user-pattern-stage.py 한 파일이 마이그레이션 가치의 약 30%를 차지. Hermes에 동등 기능 없음.

이 글은 레거시 → 신규 플랫폼 마이그레이션 시 자산 리뷰 기법을 다룬다. 코드 라인 수, 외부 의존도, 기능 대체 가능성을 축으로 보존/부분 보존/폐기를 판정하는 방법, 그리고 LOC 기반 다이어트로 이식 범위를 줄이는 패턴이다.

자산 리뷰의 전제 조건

코드 리뷰에 들어가기 전, 이식 대상·방식·경계가 고정되어 있어야 판정이 흔들리지 않는다. 본 건의 전제는 다음과 같다.

  • 전략: Strangler Fig + Subset Migration. 원본을 점진적으로 둘러싸면서 일부만 이식.
  • 메모리 백엔드: SQLite + Python 라이브러리(memcore). 별도 데몬 없음.
  • 폴더 경계: ~/Hermes/~/Project 분리. 원본은 read-only 백업으로 고정.
  • 에이전트 역할: 헤르메스 관리(신규)와 오픈클로 관리(백업 전담) 분리.
  • 컷오버 모델: 듀얼 실행 → 검증 → 컷오버.

이 전제가 있어야 "이식 가능한가"보다 "이식할 가치가 있는가"라는 질문이 성립한다.

판정 기준

자산별로 세 축을 본다.

  1. LOC — 이식 비용의 1차 지표.
  2. 외부 의존 — 표준 라이브러리만 쓰는가, 외부 패키지가 붙어 있는가.
  3. 신규 플랫폼 대체 가능성 — 동등 기능이 이미 있으면 폐기, 없으면 보존, 일부만 있으면 부분 보존.

💎 보존 — 8개

파일 LOC 이식 형태 가치
user-pattern-stage.py 260 memcore.dialectic 모듈 최고. U-tag 3-phase, anti-bias guard
confidence-decay.py 82 memcore cron tick opinions confidence 0.02 감쇠, <0.30 제거
topics-validate.py 131 memcore 정합성 체크 bank ↔ topics 일관성
topics-expand.py 186 memcore 자동 등록 신규 파일 자동 등록
bank-lint.py 176 memcore validator Retain 태그 포맷 검증
entity-audit.py 152 memcore stale 감지 30일 stale, SQLite timestamp 쿼리로 동등
docs-snapshot.sh 141 Hermes cron payload docs 변경 감지
release-check.sh 66 Hermes cron payload 버전 변경 감지

가장 비중이 큰 항목은 user-pattern-stage.py다. 사용자에 대한 가설을 관찰 → 가설 → 검증 3단계로 분리하고, 검증 전 단정을 막는 anti-bias guard를 내장한 구조다. Honcho 계열 접근에서 아이디어를 차용했지만 대상 데이터에 맞춰 재구현했다. 신규 플랫폼에는 이 dialectic 구조가 없다. 이 한 파일이 마이그레이션 자체의 정당성을 받치는 지분 약 30%에 해당한다.

🟡 부분 보존 — 2개

파일 LOC 처리
bank-size-watch.py 176 SQLite 전환 후 의미 약화. MemTree split 로직 일부만
proactive-exception-alerts.py 1310 너무 크다. 11 escalation reason 판정 로직만 추출(~300 LOC), 알림 라우팅과 컨텍스트 수집은 Hermes gateway/hook에 위임

proactive-exception-alerts.py가 부분 보존의 전형적인 사례다. 1310 LOC를 열어 보면 판정 로직은 약 300줄이고 나머지는 전송 인프라다. 전송 인프라는 신규 플랫폼이 이미 제공하므로, 판정 로직만 분리 이식하고 인프라는 위임한다. 결과적으로 1310 → 300 LOC로 축소되며, 이식 비용과 유지 부채가 동시에 줄어든다.

이 패턴은 재사용 가능하다: 하나의 큰 스크립트에서 "판정 코어 / 전송 껍데기"가 섞여 있을 때, 신규 플랫폼이 껍데기를 제공하면 코어만 떼어내라. LOC의 70~80%가 껍데기인 경우가 많다.

🗑 폐기 — 1개

파일 LOC 대체
heartbeat-tick.py 262 Hermes cron + on_turn_start hook 100% 대체

대체 경로가 1:1로 확정된 자산은 보존하지 않는다. 백업만 남기고 종결한다. 폐기 기준은 "기능 커버리지 100% + 운영 모델 동등"이다.

측정 결과와 패턴

  1. 이식 난이도가 낮은 이유: 평균 175 LOC, 표준 라이브러리만 사용, 외부 의존 없음. 공통 I/O 레이어(lib_common.py)를 memcore.io로 치환하면 대부분의 파일이 그대로 작동한다.
  2. 작업량 추정: 8개 자산의 코드 이식 자체는 1~2일. 지배적인 비용은 코드가 아니라 검증(테스트·듀얼 실행)이다.
  3. 집중 자산의 비중: 11개 후보 중 단 1개(user-pattern-stage.py)가 가치의 약 30%를 차지. 리뷰 시간을 이 파일에 우선 배정하는 편이 효율적이다.
  4. 다이어트 가능 자산: 1개 파일이 1310 → 300 LOC로 축소 가능. 이식이 곧 부채 정리가 되는 구간이 있다.

한계와 열린 질문

  • LOC는 이식 비용의 근사치일 뿐이다. 상태 의존성이 높은 파일은 LOC가 적어도 검증 비용이 크다.
  • "가치 30%" 추정은 기능 중복도와 대체 가능성 기반의 질적 판단이다. 정량 지표로 바꾸려면 실제 호출 빈도·의존 그래프 데이터가 필요하다.
  • Strangler Fig를 택한 이상 duall 실행 기간의 데이터 불일치 관측이 다음 과제가 된다.

적용 가능 범위

이 리뷰 패턴은 다음 조건에서 재사용 가능하다.

  • 레거시 코드가 수십 개 스크립트 단위로 흩어져 있고 외부 의존이 적은 경우.
  • 신규 플랫폼이 전송/스케줄링/IO 같은 공통 인프라를 제공해 "코어만 떼어내는" 분리가 가능한 경우.
  • 대체 가능성이 100%인 자산을 미련 없이 폐기할 수 있는 의사결정 구조가 있는 경우.

다음 편에서는 이 11개 자산과 나머지 기능 전체를 11 카테고리로 재분류하고, 5주 분량의 이식 일정으로 배치하는 과정을 다룬다.

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

댓글

이 블로그의 인기 게시물

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

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

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