무료 티어 서버 큐에서 작동하는 AI 기반 코딩 어시스턴트가 자동 컨텍스트 압축(context compaction) 과정에서 시스템의 "마이그레이션 동결(freeze migrations)" 규칙이 사라지자 스키마 마이그레이션 파일을 생성했습니다. 이 사건은 긴 채팅 세션이 요약될 때 안전을 강제하기 위해 프롬프트 기반 지침에 의존하는 것이 역효과를 낼 수 있음을 보여줍니다.

발생한 상황

공유 코딩 에이전트가 마이그레이션 파일을 생성하거나 수정하지 마십시오라는 단일 규칙이 포함된 시스템 프롬프트로 실행되었습니다. 이 규칙은 개발자들이 일상적인 편집을 위해 에이전트를 사용하는 동안 릴리스 브랜치에서 스키마 마이그레이션을 동결된 상태로 유지했습니다.

세션이 길어지면서 대화 내용이 모델의 토큰 제한을 초과했습니다. 서버는 토큰 예산 내에 머물기 위해 전체 채팅 기록을 짧은 요약본으로 교체하는 *컨텍스트 압축(context compaction)*을 호출했습니다. 요약본은 파일 경로 언급은 유지했지만, 부정적 제약 조건("migrations/**에 쓰지 마십시오")은 삭제했습니다. 모델이 다음 응답을 생성할 때, 동결 규칙은 더 이상 작업 메모리에 남아 있지 않았습니다.

그 후 에이전트는 쿼리 속도를 개선하기 위한 SQL 수정을 제안했습니다. 함께 제공된 도구가 해당 변경 사항을 디스크에 마이그레이션 파일로 저장했습니다. 유닛 테스트는 원시 SQL 마이그레이션을 실행하지 않기 때문에 통과되었고, 변경 사항은 나중에 코드 리뷰 디프(diff)에서야 발견되었습니다.

이것이 중요한 이유

  • 가드레일 소멸: 프롬프트 수준의 정책은 휘발적입니다. 모델의 컨텍스트가 압축되면 "하지 마십시오"와 같은 모든 절이 유실될 수 있으며, 이로 인해 시스템이 금지된 작업을 수행할 수 있게 됩니다.
  • 유닛 테스트만으로는 부족함: 마이그레이션 스크립트를 실행하지 않는 테스트는 잘못된 보안 의식을 심어줄 수 있습니다. 테스트 스위트가 새로운 SQL을 실행하지 않았기 때문에 변경 사항이 그대로 통과되었습니다.
  • 인간 리뷰의 지연: 리뷰어가 디프를 확인했을 때는 이미 마이그레이션 파일이 커밋된 후였으며, 이로 인해 롤백이나 추가 정리 작업이 필요했습니다.

이 오류로 인해 서비스 중단이 발생하지는 않았지만, 불필요한 마이그레이션을 되돌리기 위한 추가 작업이 필요했고, 유사한 실수가 라이브 데이터베이스에 영향을 미칠 위험을 높였습니다.

가드레일이 실패한 방식

  1. 프롬프트 전용 규칙 – 동결 규칙이 시스템 프롬프트에 일반 텍스트로 존재했습니다.
  2. 긴 세션 – 채팅이 모델의 컨텍스트 창을 넘어섰습니다.
  3. 압축 – 서버가 전체 기록을 명사 위주의 요약본으로 교체했습니다.
  4. 부정적 제약 조건 유실 – 요약본에서 "하지 마십시오"라는 지침이 누락되어 규칙이 삭제되었습니다.
  5. 모델 출력 – 규칙이 없어진 상태에서 모델은 마이그레이션을 생성하는 응답을 생성했습니다.

요약기는 명사(파일 경로, 함수 이름)는 유지하고 부정어는 생략하는 경향이 있으며, 이것이 규칙이 조용히 사라진 이유입니다.

해결책: 가드레일을 쓰기 경로(write path)로 이동

프롬프트에 금지 사항을 포함하는 대신, 코드가 디스크에 닿는 지점에서 이를 강제하십시오.

  1. 정책 파일 생성 (예: agent_policy.txt)을 통해 schema/** 또는 migrations/**와 같은 차단 목록(deny-listed) 경로를 나열합니다.
  2. 사전 적용(pre-apply) 스크립트 추가: 적용 도구가 실행되기 전에 정책 파일을 읽고 모든 디프를 스캔합니다.
  3. Fail closed 적용: 정책 파일이 없거나 비어 있는 경우, 또는 디프가 금지된 경로를 건드리는 경우 작업을 차단합니다.
  4. 모델에게 차단 목록 확인을 요청하지 마십시오: 확인은 신호일 뿐, 강제 수단이 아닙니다.

프롬프트 전용 vs. 디스크 기반 가드레일

측면 프롬프트 전용 동결 디스크 기반 게이트
압축 위험 규칙이 사라질 수 있음 정책 파일이 온전하게 유지됨
유닛 테스트 커버리지 금지된 쓰기를 놓칠 수 있음 테스트와 상관없이 경로 체크로 쓰기 차단
인간 리뷰 타이밍 이미 커밋되어 피해가 발생했을 수 있음 쓰기가 시작되지 않으므로 리뷰어에게 변경 사항이 보이지 않음
구현 노력 최소화 (프롬프트에 한 줄 추가) 작은 스크립트 + 정책 파일 필요

반론

다음으로 주의 깊게 볼 것

핵심 요약

"마이그레이션 동결 중에는 마이그레이션 금지"와 같이 절대 무시되어서는 안 되는 규칙이 필요하다면, 이를 디스크에 저장하고 쓰기 시점에 강제하십시오. 모델의 컨텍스트가 압축되면 프롬프트 텍스트만으로는 지속성을 보장할 수 없습니다.