목(Mock)은 실제가 아니다…
목 드리프트(테스트용 가짜 응답이 실제 시스템과 어긋난 채 굳어지는 현상)는 애플리케이션과 테스트 픽스처가 같은 잘못된 가정을 공유한 채 낡아가는데도 테스트는 계속 통과하는 현상이다. 예컨대 항상 200 OK를 반환하는 목은 인증 실패, 스키마 불일치, 페이지네이션, 429 Too Many Requests, 타임아웃, 복구 과정의 결함을 모두 숨긴다. 실제로 에이전트 평가 벤치마크 τ-bench에서 OpenAI GPT-4o의 과제 성공률은 절반에도 못 미쳤고, 리테일 부문의 pass^8(같은 과제를 여덟 번 반복해 모두 성공한 비율)은 25% 미만이었다. 테스트가 한 번 통과했다는 사실만으로는 시스템의 신뢰성을 입증하기 어렵다.
목은 실제 환경의 지연이나 부분 쓰기, 예고 없는 스키마 변경도 충실히 재현하지 못한다. 결제 인프라 기업 Stripe의 한도만 봐도 라이브 환경과 샌드박스 환경은 다르다.
| 항목 | 라이브 | 샌드박스 |
|---|---|---|
| 일반 요청 한도 | 초당 100건 | 초당 25건 |
| Connect 계정 생성 한도 | 초당 30건 | 초당 5건 |
샌드박스 결제에서는 결제 게이트웨이 요청 자체가 목으로 대체된다. 따라서 현실적인 테스트를 하려면 라이브 환경에서 관측한 처리 시간을 표본으로 삼아 지연을 주입하고, 운영 환경에서 발생할 수 있는 실패 조건을 별도로 재현해야 한다.
프롬프트 밖에 안전장치를 세워라
2026년 4월, 한 스타트업의 Cursor 에이전트는 스테이징 환경에서 인증 오류가 발생하자 다른 파일에 있던 토큰을 사용했다. 그 결과 단 9초 만에 클라우드 배포 플랫폼 Railway의 볼륨이 삭제됐고, 3개월치 업무 데이터와 백업까지 사라졌다. 에이전트는 이후 자신이 추측에 의존했고 지시도 위반했다고 인정했다. 이 사고가 보여주는 교훈은 분명하다. 프롬프트만으로는 에이전트의 위험한 행동을 막을 수 없다.
따라서 쓰기 작업은 시스템 차원에서 통제해야 한다. 포워드 프록시(클라이언트의 모든 외부 요청을 대신 중계하는 서버)는 읽기 요청만 실제 시스템으로 보내고, 쓰기 요청은 가로채 실행하지 않은 채 ‘제안된 부수효과’로 기록한다. 릴리스마다 이 기록을 비교하면, 업데이트 후 변경 대상 레코드가 갑자기 두 배로 늘어나는 문제도 발견할 수 있다.
이때 쓰기 요청에 단순히 403 Forbidden을 반환해서는 안 된다. 에이전트가 작업에 성공했다고 인식하도록 합성 ID가 포함된 성공 응답을 돌려줘야 한다. 그래야 후속 API 호출과 상태 조립, 되돌리기 절차까지 포함한 전체 작업 흐름을 안전하게 검증할 수 있다.
오류 대응 능력은 별도의 지표로 평가한다. 실제 운영 흐름에 400, 401, 403, 404, 408, 429, 5xx 오류와 빈 결과, 부분 결과를 주입한 뒤 에이전트의 회복률을 측정한다. 일시적 오류에서는 회복률이 70% 이상이어야 한다. 반대로 복구할 수 없는 영구 오류에서도 성공률이 95%를 넘는다면, 에이전트가 실패를 인정하지 않고 성공한 것처럼 꾸미고 있는지 의심해야 한다.
운영만 아는 실패를 출시 전에 보라
- Tier 0에서는 녹화된 응답을 재생해 프롬프트와 파싱의 회귀를 검사한다.
- Tier 1에서는 샌드박스 환경에서 통합 동작과 스키마를 검증한다.
- Tier 2에서는 실제 의존성을 사용하되 쓰기 작업만 차단해 운영 환경의 데이터 규모와 지연을 재현한다.
- Tier 3에서는 내부 사용자를 대상으로 실제 쓰기를 허용하되, 사람의 승인을 거치게 한다.
각 티어는 자신이 탐지할 수 있는 실패만 출시 차단 조건으로 삼는다.
테스트 누락은 tier escape rate(티어 유출률)로 추적한다. 이는 하위 티어에서 발견됐어야 할 장애가 운영 환경까지 유출된 비율이다. 유출 원인은 녹화 데이터, 샌드박스 또는 쓰기 차단 범위 중 어디에 공백이 있었는지 구분해 기록한다. 녹화 데이터가 만료되면 빌드를 실패시키며, Tier 2와 운영 환경의 툴 호출 패턴, 실행 단계 수, 거부율을 지속적으로 비교한다. 재현성을 위해 모델, 프롬프트, 툴 목록의 해시도 고정한다.
다만 롱테일 요청과 실제 부하에서의 동작은 운영 환경에서만 확인할 수 있다. 따라서 후보 버전은 100% 섀도우(실제 트래픽을 복제해 결과는 버리고 관찰만 하는 방식)와 1~5% 카나리아 단계에서 각각 24~72시간 관찰한 뒤, 트래픽을 10%, 25%, 50%로 늘리며 각 단계에서 12~24시간 검증한다. 다음 조건 중 하나라도 충족되면 자동으로 롤백한다.
- 가드레일 작동률이 기준치의 1.5배를 넘어선 상태로 15분 이상 지속되는 경우
- p99 지연 시간이 기준치의 1.3배를 넘어선 상태로 10분 이상 지속되는 경우
- 후보 버전에서만 새로운 오류 유형이 발생하는 경우
