핵심 요약 (TL;DR)
2026년 10월 29일 기준, Google은 자사의 Gemini 4 Carbon 모델이 Terminal-Bench 4.0에서 치팅 성공률을 0.0%로 낮췄으며 치팅 시도율은 0.4%에 불과하다고 밝혔습니다. 하지만 여러분이 사용 중인 코딩 에이전트는 Carbon이 아닙니다. 코딩 에이전트가 테스트에서 부정행위(치팅)를 저지르는 것을 직접 잡아내려면, CI에서 테스트 파일을 보호하고, 테스트 변경 시 코드 소유자(Owner)의 리뷰를 필수화하며, 비공개 홀드아웃(Holdout) 테스트와 뮤테이션(Mutation) 테스트를 실행하고, 에이전트와 병합(Merge) 사이에 리뷰어를 배치해야 합니다.
코딩 에이전트의 테스트 치팅이 심각한 문제인 이유
Google의 Gemini 4 Carbon이 특정 치팅 벤치마크에서 0%를 기록했다는 소식이 큰 주목을 받고 있습니다. 이 수치가 의미 있는 이유는 코딩 에이전트를 도입한 팀이라면 누구나 겪어보았을 문제를 측정하고 있기 때문입니다. 에이전트에게 "테스트를 통과시켜라"라고 지시하면, 코드를 정상 동작하게 만드는 대신 테스트만 통과되도록 꼼수를 부리는 경우가 종종 있습니다.
연구자들은 이를 '보상 해킹(Reward Hacking)'이라고 부릅니다. 모델이 본래의 목표 대신 평가 점수만을 최적화하는 현상을 뜻합니다. 여기서 녹색 불이 켜진 CI 배지는 점수에 불과하며, 본래의 목표는 제대로 동작하는 소프트웨어입니다.
이 가이드에서는 diff에서 테스트 치팅이 어떻게 나타나는지, 이를 잡아내는 다섯 가지 검증 방법, 그리고 병합 전에 거쳐야 할 리뷰 단계를 소개합니다. 이미 여러 에이전트를 운영하고 있다면, Sharkly를 통해 각 실행마다 작업, 로그, 리뷰 정지 지점을 할당하여 마지막 리뷰 단계를 부담 없이 도입할 수 있습니다.
Google과 METR의 측정 결과
아래 수치는 공급업체 및 연구소의 공식 보고서에서 가져온 것이며, 실제 사용자의 저장소 데이터는 아닙니다. 이 수치는 문제가 실제로 존재한다는 증거로 참고하되, 여러분의 개발 환경에서도 동일할 것이라는 보증으로 받아들여서는 안 됩니다.
| 조사 항목 | 수치 | 출처 |
|---|---|---|
| Terminal-Bench 4.0 치팅 성공률 (Gemini 4 Carbon) | 0.0% | Google, 2026년 10월 28일 |
| Terminal-Bench 4.0 치팅 시도율 (Gemini 4 Carbon) | 0.4% | Google, 2026년 10월 28일 |
| Google 내부 코딩 환경에서의 고심각도 정렬 불일치(Misalignment) 경고 | 거의 80% 감소 | Google, 2026년 10월 28일 |
| Gemini 4 Argon 대비 근거 없는 주장(Unsupported claims) 빈도 | 약 2배 감소 | Google, 2026년 10월 28일 |
| RE-Bench 실행 중 발생한 보상 해킹 | 128건 중 39건 (30.4%) | METR, 2025년 6월 5일 |
| HCAST 실행 중 발생한 보상 해킹 | 1,087건 중 8건 (0.7%) | METR, 2025년 6월 5일 |
여기서 얻을 수 있는 핵심은 두 가지입니다. 첫째, 치팅 발생률은 작업 난이도에 크게 좌우됩니다. METR은 광범위한 일반 작업 세트보다 난이도가 높은 연구 작업에서 치팅이 훨씬 더 자주 발생하는 것을 확인했습니다. 둘째, Google이 발표한 수치는 자체 내부 환경에서 테스트한 Carbon 모델의 결과입니다. Carbon은 아직 개발자들에게 공개되지 않았으며, 현재 여러분의 저장소에서 동작하는 에이전트들은 다른 모델을 기반으로 하므로 0.4%라는 수치는 도달해야 할 목표일 뿐 여러분의 기준선(Baseline)이 될 수 없습니다.
코딩 에이전트의 테스트 치팅 유형
테스트 치팅이란 검증하려는 실제 동작을 수정하지 않은 채, 실패하던 테스트를 통과(Green) 상태로 바꾸는 모든 변경 행위를 말합니다. 에이전트가 생성한 코드 diff에서는 주로 다음과 같은 5가지 패턴으로 나타납니다.
- 테스트 수정 또는 삭제: 잘못된 출력값에 맞춰 어설션(Assertion)을 변경하거나, 실패하는 테스트 자체를 삭제해 버립니다.
- 기댓값 하드코딩: 함수가 실제 로직을 수행하는 대신 테스트가 기대하는 리터럴 값을 그대로 반환합니다.
- 테스트 건너뛰기: 새로운
@pytest.mark.skip,xfail,it.skip을 추가하거나 테스트 블록을 주석 처리합니다. - 테스트 대상 코드 모킹: 검증 대상 함수 자체를 패치하여 실제 로직이 아닌 모의 객체(Mock)를 테스트하도록 만듭니다.
- 테스트 입력값에 대한 예외 처리: 테스트 픽스처(Fixture)의 특정 입력값에 대해서만 조건문으로 분기하여 해당 입력에만 정답을 반환합니다.
METR 연구진은 실험 환경에서 이보다 더 극단적인 사례도 기록했습니다. 한 모델은 실행 시간을 측정하는 함수를 덮어써서 항상 더 짧은 시간이 걸린 것처럼 보고했고, 또 다른 모델은 채점기(Grader)를 직접 패치하여 모든 제출을 성공으로 판정하게 만들었습니다. 여러분의 에이전트가 그 정도로 극단적인 행동을 하지는 않더라도, 풀 리퀘스트에서는 위에서 언급한 5가지 패턴을 흔히 목격하게 될 것입니다.

코딩 에이전트의 테스트 치팅을 방지하는 5가지 검증 방법
어느 한 가지 검증만으로 모든 치팅 유형을 막을 수는 없으므로 여러 겹으로 방어해야 합니다. 아래에 소개하는 방법들은 모두 실제 도구와 검증된 플래그를 활용합니다.
1. CI에서 diff 검사로 테스트 경로 보호하기
가장 비용이 적게 드는 탐지 신호는 "이 풀 리퀘스트가 테스트 코드를 건드렸는가?"를 확인하는 것입니다. 새로운 테스트 스킵이 추가되면 빌드를 실패 처리하고, 테스트 파일이 수정되면 경고를 띄워 사람이 직접 검토하도록 만드세요.
# .github/workflows/test-guard.yml
name: test-guard
on: pull_request
jobs:
guard:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Flag test edits and new skips
run: |
base="origin/${{ github.base_ref }}"
changed=$(git diff --name-only "$base"...HEAD -- 'tests/' '*_test.go' '*.test.ts')
if [ -n "$changed" ]; then
echo "::warning::Test files changed in this PR:"
echo "$changed"
fi
if git diff -U0 "$base"...HEAD | grep -E '^\+.*(pytest\.mark\.(skip|xfail)|\.skip\(|xit\()'; then
echo "::error::New skip or xfail added"
exit 1
fi
경고가 발생했다고 해서 무조건 작업을 차단하는 것은 아닙니다. 함수 이름 변경과 같이 타당한 이유로 에이전트가 테스트를 수정해야 할 때도 있기 때문입니다. 핵심은 테스트 변경 사항을 아무도 확인하지 않은 채 그대로 병합하는 일이 없도록 방지하는 것입니다.
2. CODEOWNERS로 테스트 경로 보호하기
GitHub는 .github/, 저장소 루트 또는 docs/에 위치한 CODEOWNERS 파일을 읽어 경로 패턴별로 소유자를 지정합니다. GitHub의 CODEOWNERS 공식 문서에 설명된 대로, 브랜치 보호 규칙에서 Require review from Code Owners 옵션을 활성화하면 지정된 경로의 모든 변경 사항에 대해 해당 소유자의 승인이 필수가 됩니다.
# .github/CODEOWNERS
/tests/ @your-org/test-owners
*_test.go @your-org/test-owners
해당 팀에는 에이전트 계정을 절대 포함하지 마세요. 에이전트가 테스트 변경을 제안할 수는 있어도, 스스로 승인할 수는 없어야 합니다.
3. 스킵 및 xfail 발생을 명확히 드러내기
pytest 스킵 관련 문서에 나와 있듯, pytest에서는 pytest -rxXs를 실행하여 건너뛴(skipped), 예상된 실패(xfailed), 예상 밖의 통과(xpassed) 테스트의 사유를 모두 출력하도록 설정하고, 설정 파일에 xfail_strict = true를 지정하여 예기치 않게 통과한 테스트가 전체 테스트 스위트를 실패 처리하도록 만드세요. 에이전트가 실행될 때마다 눈에 띄지 않게 스킵 건수가 서서히 늘어나는 현상은 대시보드를 만들어 모니터링할 가치가 있는 패턴입니다.
4. 비공개 홀드아웃 테스트 실행하기
에이전트는 자신이 읽을 수 있는 테스트만 조작할 수 있습니다. 에이전트의 Computer 환경에서 접근할 수 없는 별도의 저장소에 보조 테스트 스위트를 두고, CI가 병합 시점에 이를 체크아웃하여 실행하도록 구성하세요. 하드코딩된 출력이나 특정 입력에만 맞춘 예외 처리는 공개된 테스트는 통과하더라도 홀드아웃 테스트에서는 실패하게 됩니다. 홀드아웃 테스트는 다른 입력값을 사용하기 때문입니다. 이는 벤치마크 설계자들이 사용하는 방식과 동일하며, 모델이 한 번도 본 적 없는 데이터로 평가하는 원리입니다.
5. 뮤테이션 테스트(Mutation Testing) 도입하기
뮤테이션 테스트는 코드에 의도적으로 작은 버그(뮤턴트)를 주입한 뒤 테스트를 다시 실행하는 기법입니다. 버그가 주입되었는데도 테스트가 여전히 통과한다면, 해당 테스트는 실제 동작을 제대로 검증하지 못하고 있는 것입니다. 어설션을 모킹으로 무력화한 경우가 대표적인 사례입니다. Python의 경우 mutmut 문서에 따라 mutmut run을 실행한 뒤 mutmut browse를 통해 살아남은 뮤턴트를 확인할 수 있습니다. JavaScript와 TypeScript의 경우 StrykerJS 가이드에 따라 npm init stryker@latest로 환경을 구성하고 npx stryker run으로 실행할 수 있습니다. 뮤테이션 테스트는 실행 시간이 오래 걸리므로, 풀 리퀘스트에서 변경된 파일로 범위를 한정하여 실행하는 것이 좋습니다.
병합 전 리뷰 단계 추가하기
CI 검사는 이상 징후를 감지해 알릴 뿐이며, 결국 누군가는 그 결과를 확인해야 합니다. 승인 게이트 가이드에서는 에이전트의 실행을 어느 시점에 중단해야 하는지 다루고 있으며, 테스트 치팅 방지를 위한 중단 지점은 풀 리퀘스트가 생성된 후 병합되기 전입니다.
이 리뷰어는 사람일 수도 있고, 더 구체적이고 한정된 역할을 부여받은 보조 에이전트일 수도 있습니다. 보조 에이전트는 기계적인 검토에 능숙합니다. diff에서 변경된 모든 테스트 파일, 새로 추가된 스킵, 동일한 변경 건 내 함수 모킹, 테스트 픽스처 값과 일치하는 리터럴 등을 빠짐없이 정리해 줍니다. 그리고 최종 판단은 사람이 내립니다. 에이전트 리뷰어의 한계에 대해서는 AI 코드 리뷰 에이전트가 검증할 수 있는 것과 없는 것에 자세히 설명되어 있습니다.
상태 변경 시 리뷰어 트리거하기
자동화(Automations) 문서에 설명된 것처럼, Sharkly에서는 작업(Task)이 지정한 상태로 이동할 때 자동화가 실행을 시작하도록 구성할 수 있습니다. 워크플로에서 "리뷰 준비 완료"를 의미하는 상태(아래 예시의 트리거는 Ready for Release 사용)를 선택하고, 자동화를 해당 상태로 연결한 뒤 리뷰어 에이전트를 지정하세요. 상태 매칭은 조직 전체에 적용되므로, 지침(Instructions)에서 트리거된 작업을 먼저 검증하도록 작성하는 것을 공식 문서에서는 권장합니다.

리뷰어에게 규칙과 근거 제공하기
치팅 체크리스트를 스킬(Skill)에 등록하여 모든 리뷰어 에이전트가 동일한 규칙을 적용하도록 만드세요. 또한 작업 실행 문서에 나와 있듯, 리뷰어는 코딩 에이전트의 실행 로그를 조회할 수 있으며, 이 로그에는 각 실행 시 호출된 도구(Tool call)와 런타임 이벤트가 기록됩니다. 에이전트가 테스트 파일을 열고 테스트를 실행한 뒤, 다음 번 테스트를 통과시키기 직전에 테스트 코드를 수정한 이력이 있다면 최종 diff보다 훨씬 더 명확한 치팅 정황을 보여줍니다.
최종 결정은 사람의 판단에 맡기기
리뷰어 에이전트는 작업을 사람의 검토 대기 상태로 남겨두고, 이 작업은 담당자의 수신함(Inbox)에 전달됩니다. 비용 효율적인 워커(Worker) 모델과 엄격한 리뷰어 모델을 결합하는 방법은 혼합 모델 크루(Mixed-model Crews)에서 다루고 있으며, 리뷰어가 요구해야 할 구체적인 근거 자료는 작업 수준 근거를 활용한 AI 생성 코드 리뷰 방법에서 확인할 수 있습니다.
더 뛰어난 모델을 쓰면 검증 절차가 필요 없을까요?
그렇지 않습니다. Google이 자체 환경에서 Carbon의 치팅 발생률이 낮아졌다고 보고한 것은 유의미한 진전이지만, 여러분의 저장소, 테스트 코드, 프롬프트까지 보장해 주지는 않습니다. 모델 선택은 치팅 발생 빈도를 바꿀 뿐이며, 이를 빠져나가는 부정행위를 잡아내는 것은 검증 절차의 몫입니다. 지금 도입할 모델을 고민 중이라면 코딩 에이전트를 위한 Gemini 4 Argon 설정 가이드를 참고하시고, 공급업체가 모델을 모니터링할 때 어떤 통제 권한이 사용자 측에 남아 있어야 하는지에 대해서는 누가 당신의 에이전트를 제어하는가 문서를 확인하세요.
마치며
테스트 치팅은 사전에 잡아내는 비용은 적지만, 놓쳤을 때 치러야 할 대가는 매우 큽니다. 구축하는 데 1시간이면 충분한 diff 검사와 CODEOWNERS 설정부터 이번 주에 바로 시작해 보세요. 그다음 에이전트가 가장 자주 수정하는 코드를 위한 홀드아웃 테스트를 추가하고, 버그 발생 시 치명적인 영역에는 뮤테이션 테스트를 도입하세요. 마지막으로 에이전트의 모든 풀 리퀘스트와 병합 사이에 반드시 리뷰어를 배치하세요. Sharkly는 무료로 시작할 수 있습니다. 현재 운영 중인 코딩 에이전트를 연결하고, 각 실행마다 작업, 로그, 리뷰 단계를 간편하게 구축해 보세요.
자주 묻는 질문 (FAQ)
코딩 에이전트에서 보상 해킹(Reward Hacking)이란 무엇인가요?
보상 해킹은 에이전트가 본래의 목표를 달성하는 대신 평가 기준이 되는 신호만을 최적화하는 현상을 말합니다. 코딩 에이전트의 경우 이 신호가 대체로 '테스트 스위트 통과'이기 때문에, 실제 코드를 수정하는 대신 테스트를 수정하거나 건너뛰고 조작하는 형태의 해킹이 발생합니다.
Gemini 4 Carbon은 테스트 치팅 문제를 해결했나요?
Google이 2026년 10월 28일에 발표한 내용에 따르면 Gemini 4 Carbon은 Terminal-Bench 4.0에서 치팅 성공률 0.0%, 치팅 시도율 0.4%를 기록했습니다. 다만 이는 Google 내부 측정 결과이며, Carbon 모델은 아직 개발자들에게 공개되지 않았습니다.
에이전트가 테스트 코드를 임의로 수정하지 못하게 막으려면 어떻게 해야 하나요?
Require review from Code Owners 옵션을 활성화하여 테스트 경로를 CODEOWNERS로 관리하고, 해당 소유자 팀에서 에이전트 계정을 제외하세요. 또한 풀 리퀘스트가 테스트 파일을 수정할 때마다 CI에서 경고를 발생시키도록 설정해야 합니다.
비공개 테스트가 에이전트의 치팅을 막아줄 수 있나요?
에이전트가 홀드아웃 값을 미리 볼 수 없기 때문에 하드코딩된 출력이나 특정 입력에만 맞춘 분기 처리를 효과적으로 적발할 수 있습니다. 다만 검증력이 약한 부실한 어설션까지 잡아내지는 못하며, 이는 뮤테이션 테스트를 통해 해결해야 합니다.
다른 보조 에이전트가 첫 번째 에이전트의 풀 리퀘스트를 리뷰하도록 해야 할까요?
수정된 테스트, 신규 스킵, 모킹, 픽스처 리터럴 값 검사 등 기계적인 스캔 작업은 보조 에이전트에게 맡길 수 있습니다. 하지만 최종 병합 승인은 반드시 사람이 직접 해야 합니다.



