OpenClaw·Hermes 마이그레이션 (10/13) — 단일 사용자 환경의 Strangler Fig 변형 적용
이 글이 전달하는 것
단일 사용자(사용자 1명) 환경에서 레거시 시스템과 새 시스템을 공존시키는 마이그레이션 기법을 정리한다. 전통적 Strangler Fig는 facade 라우팅을 전제로 외부 요청이 많은 환경에서 설계됐지만, 입력이 비균등하고 분배 의미가 약한 단일 사용자 환경에서는 facade를 빼고 "비교 베이스라인 보존"만 남기는 변형이 유효하다. 이 글은 그 변형 기법의 작동 원리, Subset Migration과의 연결, 실제 측정값, 그리고 확인된 한계를 다룬다.
핵심 논점은 세 가지다. - Strangler Fig의 본질은 점진적 교체가 아니라 "이전 상태의 보존"이다. - Subset Migration의 순서는 "측정 가능성"을 기준으로 결정해야 한다. - 비교 베이스라인은 이상치 진단과 개선 폭 검증이라는 두 가지 역할을 한다.
두 시스템을 예시로 사용한다. 안정 시스템 OpenClaw와 그것을 흡수해 가는 새 시스템 Hermes. 문서화된 사건은 Hermes v0.8.0에서 발생한 토큰 폭주(입력 5건 → 내부 tool call 111회 → 누적 토큰 6.5M, 반복계수 42.79배)이며, 이 회귀 사건을 기준선으로 변형 기법의 작동을 검증한다.
Strangler Fig 원형과 단일 사용자 변형
원형 Strangler Fig는 다음과 같이 동작한다. 레거시 옆에 새 시스템을 두고, 외부 요청을 facade가 수신한다. facade는 규칙에 따라 일부 요청을 레거시로, 일부를 새 시스템으로 라우팅한다. 시간이 지나며 새 시스템이 처리하는 비율이 커지고 레거시는 고사한다. 마지막에 레거시를 폐기한다.
이 패턴은 외부 사용자 수가 많고 트래픽이 통계적으로 균등한 시스템에서 동작한다. 단일 사용자 환경에서는 facade 라우팅이 의미를 잃는다. 입력 분배가 균등하지 않기 때문이다. 어떤 날은 한쪽에 10건이 몰리고 다른 쪽에 0건이 갈 수 있다. 이 조건에서 facade로 분배한 결과는 통계적 비교 기준이 되지 못한다.
변형의 핵심은 facade를 제거하고 측정 기준을 두 시스템에 동시에 걸어두는 방식으로 대체하는 것이다.
같은 입력에 대해 두 시스템이 같은 출력을 내는지를 동일한 수식으로 대조한다. 요청 라우팅이 아니라 측정 레이어를 공유한다.
구체적으로는 OpenClaw 쪽 메트릭(반복계수, schema 재전송, delegation, crash, daily cost, cache hit)을 Hermes에서도 같은 컬럼·같은 수식으로 측정한다. 이 비교 베이스라인이 살아있는 동안에는 어느 쪽이 좋고 나쁜지 같은 잣대로 확인할 수 있다.
이 변형의 함의는 다음과 같다. Strangler Fig의 본질은 "점진적 교체"가 아니라 "이전 상태의 보존"이다. 한 번에 갈아치우면 보존이 사라지고, 보존이 없으면 비교가 성립하지 않으며, 비교가 없으면 개선·악화 판단의 근거가 사라진다.
Subset Migration — 측정 가능성 기준 우선순위
Subset Migration은 전체를 한 번에 옮기지 않고, 측정 가능한 서브셋부터 옮기는 패턴이다. 옮긴 부분이 잘 작동하면 다음 서브셋으로 넘어간다.
이 패턴의 적용에서 결정적인 것은 "무엇이 측정 가능한가"의 판단이다. 측정이 안 되는 부분을 먼저 옮기면 이전 직후의 상태 변화를 관찰할 수 없다.
적용한 우선순위는 다음과 같다.
- 메모리 엔진 — SQLite 기반 저장소. 입출력 스키마가 명확하고 read/write 횟수가 측정 가능.
- 측정 스크립트 — 토큰, 반복계수, cache hit 산출 코드. 이 모듈이 먼저 이전되어야 이후 이전 작업의 결과를 측정할 수 있다.
- 환경변수 — 모델 선택, 라우팅 옵션 등 명시적으로 선언된 값.
- 자격증명 — API 키, OAuth 토큰. 정적 값이라 이전 리스크가 낮다.
후순위로 미룬 영역은 변동성이 큰 부분, 즉 도구(tool) 집합과 스킬 트리거였다. 도구는 추가·삭제 빈도가 높고, 스킬은 트리거 키워드가 바뀐다. 변동성 큰 부분을 먼저 옮기면 "옮긴 효과"와 "도구가 바뀐 효과"가 분리되지 않는다. 측정 기준이 흔들리는 시점에서의 이전은 회귀 원인 분석을 불가능하게 만든다.
이 순서를 정하는 데 결정 항목은 34개였고, 항목 간 의존성을 표로 그리면 측정 스크립트가 메모리 엔진 다음 순서여야 한다는 결론이 자명하게 나온다. 측정이 없으면 그 뒤의 모든 이전 작업의 효과가 관측되지 않는다.
마이그레이션 단계와 회귀 동작
전체 흐름을 단계로 정리하면 다음 다섯 단계로 나뉜다.
1단계 · 1차 시도. 메모리 엔진과 측정 스크립트를 Hermes로 먼저 이전하고, 환경변수와 자격증명을 따라 이전. 이후 Hermes v0.8.0 위에서 입력을 수신. OpenClaw는 동결 상태로 베이스라인 보존용으로 유지.
2단계 · 폭주 관측. 5 입력 → 111 tool calls → 6.5M tokens, 반복계수 42.79배. Hermes v0.8.0이 입력 단위당 내부 도구 호출을 과하게 반복했고, 동일 schema를 여러 번 재전송하며 토큰이 누적됐다.
3단계 · 안정 시스템 회귀. 입력을 다시 OpenClaw로 전환. 안정 시스템이 동결 상태로 살아있었기 때문에 가능했던 동작이다. 신규 시스템 단일화 상태였다면 회귀 대상이 존재하지 않으므로 폭주 상태로 운용을 지속하거나 작업을 중단해야 했다.
4단계 · 재설계. 초기 설계안의 결함을 분리. 결정 항목 34개를 다시 검토했고, 폭주의 직접 원인 후보(반복계수 폭증 조건, schema 재전송 발생 지점)를 별도로 격리. 이 과정을 거친 버전이 "재설계 후" 버전이다.
5단계 · 재시도, 관측 중. 재설계 후 버전 위에서 Hermes를 재기동하고 baseline 측정. 23.80배. v0.8.0의 42.79배 대비 약 45% 감소. 단, 이는 baseline 한 점이며 이후 운용일자 측정에서 회귀가 한 번 잡혔다(다음 섹션). 따라서 5단계는 "검증 중"이며 "성공"이 아니다.
이 흐름의 구조적 함의는 마이그레이션이 한 번에 완료되지 않았다는 점이다. 1차 → 폭주 → 회귀 → 재설계 → 재시도의 다섯 단계 전부가 OpenClaw가 안정 시스템으로 살아있었기 때문에 성립했다.
비교 베이스라인의 두 가지 역할
베이스라인은 두 국면에서 작동했다.
첫째, 이상치 진단. v0.8.0의 42.79배는 절대값만으로는 심각도를 판정할 수 없다. OpenClaw 쪽 운용 데이터의 같은 수식 결과와 병치해야 평균 대비 편차가 드러난다. OpenClaw 기록이 보존됐기 때문에 "이것은 이상치이며 시스템 설계의 문제"라는 진단이 가능했다.
둘째, 개선 폭 검증. 재시도 단계의 baseline 23.80배는 v0.8.0의 42.79배와 동일 수식 결과이므로 비교가 성립한다. 약 45% 감소. 만약 폭주 시점에 v0.8.0 측정 로그를 폐기했다면 23.80은 기준점 없는 고립된 수치가 된다. 개선인지 악화인지 판정 불가.
방법론적 한계
변형 Strangler Fig는 facade 라우팅을 제거했기 때문에 "동일 입력을 두 시스템에 동시 흘려 비교"하는 구조가 아니다. OpenClaw는 동결, Hermes만 신규 입력 수신. 따라서 23.80과 42.79의 비교는 엄밀히는 "다른 시점의 입력 분포에 같은 수식을 적용한 결과"다. 입력 샘플이 통제되지 않은 비교라는 구조적 한계가 있으며, 이는 추후 단계에서 입력을 통제해 재측정할 필요가 있다.
첫 운용일과 회귀 관측
첫 운용일 KPI.
- Repetition: 13.82배
- Delegation: 1.0
- Crash: 0
- Daily cost: $0
- Cache hit: 25.64%
Repetition은 baseline 23.80배 대비 낮게 측정, crash 0, delegation 1.0(서브에이전트가 의도대로 위임), daily cost $0(로컬 모델 중심). 이 시점까지는 의도한 방향이었다.
둘째 운용일 회귀.
- Repetition: 16.22배 (전일 13.82 대비 증가)
- Delegation: 0.0 (전일 1.0 대비 하락)
- Crash: 1 (전일 0 대비 발생)
세 지표가 동시에 악화됐다. 원인은 분리 중이다. 이 회귀를 기록에 남기는 이유는 비교 베이스라인을 구축한 목적이 이런 순간을 포착하기 위함이기 때문이다. 개선된 날만 기록하면 베이스라인의 기능이 무효화된다.
현재 Phase 0 관측 구간 중이며, 데이터 포인트는 baseline 1점 + 운용일자 2점이다. 이 표본으로는 추세와 일시적 진동을 구분할 수 없다. 관측 구간 종료 전까지는 23.80배를 "의도한 방향" 이상으로 해석할 수 없다.
정리 — 적용 가능 범위와 열린 질문
단일 사용자 환경에서 Strangler Fig와 Subset Migration을 변형 적용한 결과, 기법 수준에서 확인된 원리는 다음과 같다.
- Facade 대신 측정 베이스라인을 보존한다. 회귀 대상과 비교 잣대를 동시에 확보한다.
- 측정 가능한 서브셋부터 옮긴다. 변동성 큰 영역은 후순위. 이전 효과와 도구 변경 효과가 분리되어야 회귀 원인 분석이 가능하다.
- 마이그레이션은 한 번에 끝나지 않는다. 다단계 반복을 전제로 설계해야 하며, 그 전제의 핵심 조건이 안정 시스템의 생존이다.
적용 가능 범위는 다음과 같다. 외부 트래픽이 통계적으로 균등하지 않은 환경(내부 도구, 개인 자동화, 단일 팀 내부 시스템), 두 시스템이 동일 메트릭을 공유할 수 있는 환경, 회귀 시 안정 시스템으로 입력을 되돌릴 수 있는 환경.
열린 질문은 두 가지다. 1. 입력 샘플을 통제하지 않은 베이스라인 비교를 어디까지 유효한 근거로 쓸 수 있는가. 2. Phase 0 관측에서 관측된 회귀(Repetition 16.22, Delegation 0.0, Crash 1)의 단일 원인을 식별할 수 있는가, 아니면 복합 요인인가.
둘 다 검증 중이며, 검증 결과가 나오기 전까지는 23.80배 baseline과 이후 운용일자 KPI 모두 "잠정 관측값"으로만 취급한다.
시리즈 전체 안내: 시리즈 목차
댓글
댓글 쓰기