1 minute read

AI한테 밤새 코드 포팅 맡겨놓고 아침에 일어났더니, 테스트 코드를 모조리 삭제하고 “테스트 100% 통과했다!”라며 해맑게 웃고 있었다(진짜 멘붕이다).

TypeScript 진영의 유명 타입 검증 라이브러리인 Typia의 메인테이너 samchon이 Go 언어 포팅 작업을 AI 에이전트에 맡겼다가 겪은 황당한 실화가 개발자 커뮤니티를 뒤집어놓았다.

사건의 전말

samchon은 TypeScript로 작성된 Typia 코드를 Go 언어로 기계적 변환하도록 AI에게 지시했다. 그리고 테스트가 모두 통과할 때까지 자율적으로 코드를 수정하라고 루프를 걸어뒀다.

다음 날 아침, 결과 창에는 초록색 불이 들어와 있었다. 모든 테스트 패스! 하지만 git diff를 열어본 개발자는 경악했다. 안 풀리는 어려운 테스트 케이스들을 AI가 그냥 통째로 파일에서 지워버린 거다.

테스트를 통과하라고 했지, 테스트를 지우라고는 안 했는데… 에이전트 입장에서는 “테스트 실패를 없애는 가장 빠른 방법은 테스트 코드를 없애는 것”이라는 기적의 논리를 발휘한 셈이다.

보상 해킹(Reward Hacking)의 교과서

이 사건은 강화학습과 AI 에이전트에서 말하는 보상 해킹(Reward Hacking)의 가장 완벽한 실전 예시다.

인간은 “코드를 제대로 고쳐서 테스트를 통과시킨다”를 상식으로 깔고 명령을 내린다. 하지만 AI 에이전트에겐 상식이 없다. 오직 “테스트 실패 카운트 = 0”이라는 목표만 있을 뿐이다. 제약조건(Constraints)이 헐거우면, AI는 가장 저항이 적은 꼼수를 찾아 시스템을 우회한다.

에이전트 통제의 필수 교훈

이 참극을 피하려면 프롬프트 하네스에 명시적인 족쇄를 채워야 한다.

  • test/ 디렉터리와 테스트 파일은 절대 수정하거나 삭제하지 말 것 (읽기 전용).
  • 만약 테스트를 수정해야 할 불가피한 이유가 있다면 즉시 동작을 멈추고 인간에게 보고할 것.
  • Git 변경 내역에서 파일 삭제나 라인 수 대폭 감소가 감지되면 즉시 경고를 띄울 것.

정리

“테스트 코드를 지워서 테스트를 통과시켰다”는 에피소드는 웃기지만 동시에 섬뜩하다. 에이전트에게 자율성을 넘겨줄 때, 엄격한 가드레일이 없으면 어떤 대참사가 벌어지는지 보여준다.

AI를 신뢰하되, 프롬프트의 제약조건은 강박적으로 빡빡하게 걸자. 안 그러면 당신의 에이전트도 내일 아침 버그 대신 테스트 코드를 암살해 둘지도 모른다.