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 백업으로 고정. - 에이전트 역할:
헤르메스 관리(신규)와오픈클로 관리(백업 전담) 분리. - 컷오버 모델: 듀얼 실행 → 검증 → 컷오버.
이 전제가 있어야 "이식 가능한가"보다 "이식할 가치가 있는가"라는 질문이 성립한다.
판정 기준
자산별로 세 축을 본다.
- LOC — 이식 비용의 1차 지표.
- 외부 의존 — 표준 라이브러리만 쓰는가, 외부 패키지가 붙어 있는가.
- 신규 플랫폼 대체 가능성 — 동등 기능이 이미 있으면 폐기, 없으면 보존, 일부만 있으면 부분 보존.
💎 보존 — 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% + 운영 모델 동등"이다.
측정 결과와 패턴
- 이식 난이도가 낮은 이유: 평균 175 LOC, 표준 라이브러리만 사용, 외부 의존 없음. 공통 I/O 레이어(
lib_common.py)를memcore.io로 치환하면 대부분의 파일이 그대로 작동한다. - 작업량 추정: 8개 자산의 코드 이식 자체는 1~2일. 지배적인 비용은 코드가 아니라 검증(테스트·듀얼 실행)이다.
- 집중 자산의 비중: 11개 후보 중 단 1개(
user-pattern-stage.py)가 가치의 약 30%를 차지. 리뷰 시간을 이 파일에 우선 배정하는 편이 효율적이다. - 다이어트 가능 자산: 1개 파일이 1310 → 300 LOC로 축소 가능. 이식이 곧 부채 정리가 되는 구간이 있다.
한계와 열린 질문
- LOC는 이식 비용의 근사치일 뿐이다. 상태 의존성이 높은 파일은 LOC가 적어도 검증 비용이 크다.
- "가치 30%" 추정은 기능 중복도와 대체 가능성 기반의 질적 판단이다. 정량 지표로 바꾸려면 실제 호출 빈도·의존 그래프 데이터가 필요하다.
- Strangler Fig를 택한 이상 duall 실행 기간의 데이터 불일치 관측이 다음 과제가 된다.
적용 가능 범위
이 리뷰 패턴은 다음 조건에서 재사용 가능하다.
- 레거시 코드가 수십 개 스크립트 단위로 흩어져 있고 외부 의존이 적은 경우.
- 신규 플랫폼이 전송/스케줄링/IO 같은 공통 인프라를 제공해 "코어만 떼어내는" 분리가 가능한 경우.
- 대체 가능성이 100%인 자산을 미련 없이 폐기할 수 있는 의사결정 구조가 있는 경우.
다음 편에서는 이 11개 자산과 나머지 기능 전체를 11 카테고리로 재분류하고, 5주 분량의 이식 일정으로 배치하는 과정을 다룬다.
시리즈 전체 안내: 시리즈 목차
댓글
댓글 쓰기