OpenClaw·Hermes 마이그레이션 (8/13) — 52개 항목 체크리스트로 에이전트 이식하기
7개 블록, 77개 항목. 순서를 틀리면 처음부터 다시 한다.
핵심 요약
- 이 글은 AI 에이전트의 설정 자산을 한 환경에서 다른 환경으로 옮길 때 필요한 7블록 / 77항목 체크리스트 구조를 설명한다. M 블록(17항목)은 원본 플랫폼에 남고, Hermes 쪽으로 이식되는 항목은 52개다.
- 이식 순서는 P → O → G → H → S → I. 하위 계층 없이 상위 블록을 얹으면 참조 오류가 발생하는 이유를 블록 단위로 정리한다.
- 스킬 분류 3티어(Always-On 5 / On-Demand 9 / Archived 45)와 30일·60일 비활성화 기준, Cutover 직전 config/loader 변경 패턴, 잔류 토큰 검증 절차까지 포함한다.
전체 구조: 7블록 77항목
이식 패키지를 다루는 단위는 "파일"이 아니라 "블록"이다. 블록은 기능적 목적이 같은 파일·규칙 묶음이고, 각 블록은 서로 다른 블록의 존재를 전제로 동작한다.
| 블록 | 코드 | 항목 수 | 담당 |
|---|---|---|---|
| Meta | M | 17 | OpenClaw 매니저 |
| Persona | P | 8 | Hermes 매니저 |
| Operational | O | 7 | Hermes 매니저 |
| Governance | G | 18 | Hermes 매니저 |
| Heartbeat | H | 7 | Hermes 매니저 |
| Self-Evolution | S | 6 | Hermes 매니저 |
| Integrations | I | 6 | Hermes 매니저 |
M 블록은 원본 환경에 남는 메타데이터·아카이브 항목이다. 타깃 환경에서 실제로 이식·검증해야 할 범위는 52개(P+O+G+H+S+I)다.
순서가 중요한 이유
블록은 의존 그래프를 가진다. 상위 블록은 하위 블록이 정의한 객체를 참조한다.
- P(Persona) 없이 G(Governance)를 올리면, 거버넌스 규칙이 참조해야 할 에이전트 정체성이 비어 있다.
- O(Operational) 없이 H(Heartbeat)를 올리면, 메모리맵이 존재하지 않는 상태에서 heartbeat가 쓰기 작업을 시도한다.
- S(Self-Evolution)는 G와 O가 모두 설치된 뒤에만 의미가 있다. 변경 델타를 측정할 기준선이 없으면 gating 로직이 무력화된다.
설치 순서: P → O → G → H → S → I. 기반 계층부터 쌓고 그 위에 동작 계층을 얹는다. 역방향 설치는 참조 오류 또는 런타임 경고를 일으킨다.
P 블록 — Persona (8항목)
에이전트 정체성을 정의하는 파일 세트.
P01 IDENTITY + P02 + P04 VALUES + P05 BEING → SOUL.md 통합 관리
- 총 168줄, 8,381바이트.
- 원본 환경에서는 정체성 파일이 분산되어 있었으나, 이번 이식에서는 단일 SOUL.md로 병합한다. 파일 수 감소가 목적이 아니라, 정체성 필드를 한 장의 파일로 읽고 덮어쓰도록 만들어 컨텍스트 로딩 비용을 줄이는 것이 목적이다.
USER.md 압축 - 원본: 128줄 - 압축 후: 1,211자 (한도 1,375자) - 사용자 프로필과 행동 선호를 컨텍스트 창 효율을 위해 압축. 한도까지 164자 여유.
P 블록에서 누락이 가장 흔한 항목은 VALUES와 BEING이다. IDENTITY만 옮기면 에이전트가 "누구인지"는 알지만 "어떻게 판단하는지"는 모르는 상태가 된다.
O 블록 — Operational (7항목)
일상 운영을 위한 인프라 레이어.
- ops board: 현재 작업 상태 추적 파일
- linter: 출력 품질 검사 규칙
- memory-map: 도메인 지식 인덱스
- 25 lessons: 원본 환경에서 축적된 교훈 기록
lessons는 그대로 복사하면 안 된다. 원본 플랫폼 고유 경로·서비스 이름을 참조하는 항목은 타깃 환경에서는 dead reference가 된다. 이식 시 플랫폼 바운드 참조를 스크리닝해 제거하거나 타깃 환경 기준으로 재작성하는 것이 원칙이다.
G 블록 — Governance (18항목)
블록 중 항목 수가 가장 많다. 3계층 실행 거버넌스와 pre-commit 가드를 포함한다.
3계층 구조:
Tier 1 (Always-On) → 매 세션 자동 로드, 비활성화 불가
Tier 2 (On-Demand) → 조건 충족 시 로드
Tier 3 (Archived) → 비활성화 상태, 수동 복구만 가능
계층은 "무엇을 항상 로드할지"를 비용 관점에서 분할한다. Tier 1은 매 세션 비용을 감수하고라도 로드해야 하는 규칙, Tier 2는 특정 키워드/컨텍스트가 감지될 때만 로드되는 규칙, Tier 3은 필요 시 수동으로 불러오는 보관 규칙이다.
pre-commit guard: 커밋 전 자격증명 유출, 개인정보 노출, 금지 패턴을 검사한다. 가드는 governance 규칙을 실행 시점이 아니라 저장 시점에 강제하는 레이어다.
P 블록이 "누구인가"를 정의한다면, G 블록은 "무엇을 해도 되는가"를 정의한다. 두 블록은 쌍으로 성립한다.
H 블록 — Heartbeat (7항목)
자율 동작 루프.
- 14모드 풀: heartbeat가 선택 가능한 동작 유형 14가지
- 에스컬레이션 13개 사유: 자동 처리 불가 판단 기준
14모드 풀은 단순 ping이 아니라 리서치 스캔, 메모리 정리, 일일 브리핑, reflect 등 서로 다른 목적을 가진 동작 집합이다. 각 모드는 자체 빈도·입력 조건·출력 포맷을 가진다.
에스컬레이션 사유 13개는 에이전트가 사용자 개입을 요청해야 하는 조건을 정의한다. 자동 판단 영역과 수동 판단 영역의 경계선이 곧 에스컬레이션 규칙의 목적이다.
S 블록 — Self-Evolution (6항목)
에이전트 자기 개선 파이프라인.
세 가지 게이팅 조건: - reflect: 세션 종료 후 패턴 분석 - research: 외부 정보 수집 필요 판단 - delta gating: 변경이 임계값을 초과할 때만 lessons 업데이트
delta gating은 S 블록의 핵심이다. 모든 세션 종료 시점에 lessons를 갱신하면 시간이 지날수록 시그널 대비 노이즈 비율이 나빠진다. 임계값 미달 변경은 저장하지 않는 것이 저장 전략이다.
I 블록 — Integrations (6항목)
외부 시스템 연결.
| 연결 | 상태 |
|---|---|
| Discord | Active |
| Hub (홈서버) | Active |
| GWS (Google Workspace) | Active |
| Browser | Active |
| 추가 시스템 A | Connected (대기) |
| 추가 시스템 B | Pending |
4개 Active, 1개 Connected(준비 완료·미활성), 1개 Pending(설정 진행 중). Active/Connected/Pending 상태 구분은 "연결 자격증명 존재 여부"와 "런타임 호출 허용 여부"를 분리해 관리하기 위한 것이다.
스킬 분류 체계
전체 77개 스킬의 3티어 분류:
| 티어 | 분류 | 수량 | 조건 |
|---|---|---|---|
| Tier 1 | Always-On | 5 | 매 세션 자동 로드 |
| Tier 2 | On-Demand | 9 | 조건부 로드 |
| Tier 3 | Archived | 45 | 비활성화 상태 |
비활성화 기준: - 30일 미사용 → Archived 후보 - 60일 미사용 → 비활성화 검토
Tier 3의 45개는 필요 시 수동 복구가 가능하다. 파일은 보관되어 있고, 로드 대상에서만 제외된 상태다. 미사용 기간을 기준으로 계층을 내리는 것은 "가능한 스킬"과 "자주 쓰는 스킬"을 분리해 매 세션 초기화 비용을 통제하기 위한 설계다.
Cutover 직전 상태 확인
Cutover 시점 config.yaml 기준 설정:
skills:
disabled: 45 # Tier 3 전량 비활성화
platform_disabled:
discord: 14 # Discord 전용 스킬 14개 별도 비활성화
Tier 3 비활성화와 별개로, 특정 플랫폼 전용 스킬은 플랫폼별 스위치로 한 번 더 차단한다. 계층 기반 비활성화와 플랫폼 기반 비활성화는 축이 다르기 때문에 교차 관리가 필요하다.
loader.sh의 sandbox 대응:
REAL_HOME=$(eval echo ~$USER)
HERMES_HOME="$REAL_HOME/.hermes"
Claude Code sandbox 환경에서는 $HOME이 실제 사용자 홈이 아닌 격리된 경로로 설정될 수 있다. 로더가 $HOME 기반으로 데이터 디렉토리를 계산하면 잘못된 위치에 에이전트 자산이 생성된다. eval echo ~$USER로 REAL_HOME을 명시 고정하는 것이 회피 패턴이다. 이 패턴은 sandbox·chroot·컨테이너 등 HOME이 재정의되는 환경 전반에 적용된다.
잔류 토큰 검증
이식 완료 후 두 가지 잔류 검증 결과:
| 항목 | 결과 |
|---|---|
| mir/Mir 토큰 잔류 | 0 |
| 용진 토큰 잔류 | 0 |
이전 환경의 인증 토큰이 타깃 환경에 섞여 있으면 API 호출이 잘못된 계정으로 나간다. 잔류 토큰 검증은 기능 검증이 아니라 계정 격리 검증이다. Cutover 전 마지막 체크 항목.
체크리스트 요약
52항목 이식 순서를 한 줄로 정리:
- SOUL.md 구성 (P 블록)
- USER.md 압축 및 한도 확인
- ops board / linter / memory-map / lessons 이식 (O 블록)
- 거버넌스 3계층 + pre-commit guard 설정 (G 블록)
- 14모드 heartbeat 풀 + 에스컬레이션 기준 등록 (H 블록)
- reflect / research / delta gating 파이프라인 (S 블록)
- 4개 Active 통합 연결, 나머지 상태 확인 (I 블록)
- config.yaml: disabled 45 / platform_disabled.discord 14
- loader.sh REAL_HOME 고정
- 잔류 토큰 검증
적용 가능 범위와 열린 질문
이 체크리스트는 "에이전트 설정 자산을 한 환경에서 다른 환경으로 옮기는 모든 작업"에 일반화될 수 있다. 플랫폼 이식뿐 아니라 동일 플랫폼 내 재설치, 복수 사용자 환경 복제, 격리된 sandbox 환경 재구축에도 동일 구조가 적용된다. 블록 수와 항목 수는 에이전트마다 다르지만, 블록 의존 순서 / 티어 기반 로드 제어 / 플랫폼 축 분리 / 잔류 토큰 검증은 공통 패턴이다.
남는 질문: 블록 간 의존 그래프를 명시적 DAG로 표현할지, 계속 암묵적 "권장 순서"로 둘지. 전자는 자동 검증이 가능하지만 오버헤드가 있고, 후자는 가볍지만 순서 오류를 런타임까지 미룬다. 규모가 커지면 전자로 이동하는 것이 불가피해 보이지만, 임계점이 어디인지는 아직 열려 있다.
시리즈 전체 안내: 시리즈 목차
댓글
댓글 쓰기