sanctuary: 크로스보더 이커머스 지원 자동화
Technical Support Engineer @ Global-e · TypeScript, MCP, MSSQL, Snowflake, Coralogix, Playwright
문제
Global-e는 크로스보더 이커머스 플랫폼을 운영한다. 기술 지원은 10개 이상의 분산된 시스템을 넘나들며 조사해야 한다: admin portal, 결제 게이트웨이(Adyen, Stripe, Klarna, PayPal, Worldpay), MSSQL/Snowflake DB, observability, JIRA/Confluence, Zendesk, 이메일 로그, 머천트 Shopify store.
한 티켓 조사가 2시간 이상 걸렸고, 전수되기 어려운 암묵지에 의존했다.
해결
sanctuary를 만들었다. 조사의 전 lifecycle을 인터페이스 하나 뒤로 통합한 MCP 서버. 처음엔 Python + Go 멀티 서비스 스택으로 시작했다가 단일 TypeScript MCP 서버로 재구축했다. 운영 부담을 줄였고, 역설적으로 할 수 있는 일은 오히려 늘었다.
핵심 기능
단일 호출 주문 조사
composite 도구 한 번으로 1분 안에 전체 그림을 얻는다: 6개 가격 필드에 걸친 DB join, 결제 트랜잭션 히스토리, 배송 타임라인, 환불 체인, 머천트 설정, 상업 인보이스(CI) 렌더링, 그리고 자동 discrepancy 탐지까지.
멀티 PSP 결제 진단
Adyen, Stripe, Klarna, PayPal, Worldpay를 넘나드는 자동 조사. 서로 다른 API와 인증 방식, 데이터 포맷을 하나의 진단 view로 정규화한다. MSSQL 보존 기간 너머의 결제 히스토리를 위해 444M-row Snowflake archive도 포함한다.
내 조사의 철저함을 측정하기
내 조사 품질을 측정하는 5단계 프레임워크. false-positive rate, root-cause 발견 빈도, resolution-direction recall을 추적하며, 단계 사이에 데이터 기반 게이트를 둔다. 1-3단계 배포 완료, 4단계는 측정 윈도우 가동 중.
코드화된 룰 기반 응답 품질 검증
모든 머천트 응답이 발송되기 전, checker가 feedback 메모리로 축적된 216개 문서화된 학습에 대해 검증한다. 이 중 109개는 기계 강제 YAML 게이트로 코드화되어 도구 경계에서 위반을 차단한다. 금지 용어, 에스컬레이션 경로 정확성, 사실 정확성, 수신자별 톤 calibration을 커버한다.
실수에서 룰로, 룰에서 hook으로
실수가 재발하면 시스템이 그것을 코드화한다: feedback 메모리 작성 → YAML 게이트 추가 → PreToolUse hook 설치 → 도구 경계에서 실패 모드 차단. 이렇게 100개 이상의 재발 에러 카테고리를 production에서 거의 0 재발까지 끌어내렸다.
로컬, No-Egress 추론
어떤 조사는 머신을 절대 벗어나면 안 되는 민감한 고객 데이터(PII, 결제 정보)를 건드린다. 이런 경우 로컬 LLM 유틸리티(ollama)가 네트워크 egress 없이 추출과 분류를 수행한다. 데이터가 네트워크 경계를 넘지 않는다. 로컬 모델은 추출과 분류만 맡고, 마스킹은 결정론적 regex에 남긴다.
멀티 레이어 안전장치 위의 bulk 작업
주문 상태 변경, 미인보이스 처리, 머천트 데이터 export가 모두 다음 게이트로 보호된다: (a) 기본값 dry-run 모드, (b) 승인 토큰 워크플로우, (c) 비가역 액션을 위한 StatusID block list, (d) write 후 DB 검증, (e) checkpoint DB로의 audit logging.
맨 머신에서 재건
2026년 중반, 메인보드 교체 중 데이터 유실로 머신이 통째로 지워졌다. 시스템 전체를 빈 repository에서 사흘 만에 다시 세웠다. 백업이 먼저였다. 암호화 archive에 더해, 그 백업이 실제로 복원되는지 증명하는 복구 리허설까지. 그다음에 도구를. 이 리셋을 기회 삼아, 관성으로 그냥 두었을 것들을 다시 설계했다: 라우팅 레이어, 데이터 포맷 규약, 경로 처리. 이제 golden-master 하네스가 리팩터를 지킨다. 각 도구의 출력을 바이트 단위로 캡처하기 때문에, 분할이나 정리가 단 1바이트라도 동작을 바꾸면 게이트에서 실패한다. 지나치게 커진 여섯 모듈을 동작 변화 하나 없이 분할할 수 있었던 이유다.
7개 전용 SQLite DB
단일 monolithic store 대신, sanctuary는 7개의 전용 SQLite DB를 쓴다. 각 DB는 단일
관심사를 소유한다: investigation.db(티켓별 checkpoint chain),
tickets.db(full-text search가 되는 캐시 본문),
conversation_log.db(세션 간 메타), mistakes.db(코드화
파이프라인에 입력되는 구조화 실패 로그), metrics.db(자기 instrumented
도구/hook 메트릭), knowledge.db(재사용 도메인 지식), 그리고
forter_learning.db(active learning용 도메인별 티켓 cohort).
관심사별로 나누면 시스템을 들여다볼 수 있다. 실패가 자기 DB에 살기 때문에 "이번 주에 어떤 실수가 일어났나?"를 한 쿼리로 답할 수 있다. generic events 테이블에서 실수를 파낼 필요가 없다.
결과
- 5개 PSP를 단일 진단 view로 통합
- K8s + Docker 위 7개 서비스 → 1개 통합 TypeScript 서버
- 조사 품질 측정: 없음 → 정량 게이트를 갖춘 5단계 프레임워크
배운 것
통합이 오케스트레이션을 이긴다. 이전의 7개 서비스 아키텍처가 기술적으로는 더 인상적이었다. 나중의 것은 더 빨리 ship되고, 디버그가 쉽고, 운영비가 덜 든다.
행동이 도구 개수보다 중요하다. 에이전트에 379개 도구를 주는 건 일의 절반이다. 나머지 절반은 어떻게 행동해야 하는지를 코드화하는 것이다. 결론 전에 무엇을 검증하고, 추측 대신 언제 물어볼지.
내 엔지니어링을 측정한다. Investigation Thoroughness 프레임워크는 내 조사 품질을 측정 가능한 산출물로 다룬다. "철저하다고 생각한다"와 "측정 가능하게 철저하다" 사이의 간격이야말로 메울 가치가 가장 크다.
전부 잃어보면 무엇을 지킬 가치가 있는지 분명해진다. 하드웨어 장애로 머신이 지워졌을 때, 재건은 그 앞선 여섯 달이 아니라 며칠 만에 끝났다. 결과도 더 나았다. 제자리를 스스로 증명한 것만 다시 세웠기 때문이다.
도구 뒤의 학습 시스템
sanctuary의 도구는 일을 빠르게 한다. 학습 시스템은 일이 누적되게 한다.
도메인 학습 루프
각 지원 도메인(결제 사기, 배송, 관세 등)별로 주 2-3회 × 30분 사이클. reference 읽기 → 실제 과거 티켓 회상 → 고객/동료 교환 시뮬레이션. AI가 그 교환의 상대 역할을 한다.
두 repo 포트폴리오
엔지니어링 repo의 비공개 마스터, 공개 Astro 사이트. polished 글은 voice 인터뷰와 IP 마스킹 게이트를 강제하는 슬래시 커맨드를 통해 학습 세션에서 격상된다.
살아있는 회고
회고 글은 EN과 KO으로 함께 발행한다. JA는 voice가 언어의 도약을 견딜 때만 선택적으로 따라온다. 번역의 규율이 명료함을 강제한다.
이 시스템이 포트폴리오가 존재하는 이유다. 이게 없으면 일은 solved로 표시되는 순간 닫힌 티켓 속으로 사라진다. 대신 이 시스템 덕분에 가리킬 수 있는 무언가로 남는다.