내 에이전트가 파일 변경 없이 '성공'을 보고할 수 있었던 문제: 기본값 수정 및 원인 분석
My agent could report "success" for a run that changed zero files. I fixed the default and wrote down why it was there.
핵심 요약
파일 변경이 없어도 성공으로 처리되던 에이전트의 결함을 수정하고, 실행 이력 추적 및 드리프트 감지 기능을 도입했습니다.
- 결함 수정 — 파일 변경이나 검증 없이 성공을 보고하던 기본 로직을 수정함
- 이력 추적 — 누가 승인했는지 명시하는 출처(provenance) 정보를 기록함
- 드리프트 감지 — 에이전트가 같은 작업을 반복하는 루프 현상을 감지함
- 평가 구조 — 평가자와 실행자의 권한을 분리하여 평가의 신뢰성을 확보함
오픈소스 에이전트(Apache-2.0)를 만들고 있는데, 이번 주 릴리즈는 기능보다는 하네스(harness) 작업이 전부였음. 핵심은 내가 배포하고도 쪽팔린 기본 설정 하나 때문임.
버그. 실행 가능한 검증기(verifier)가 설정되어 있지 않으면, 실행 결과에 대한 판정은 "매니저" 모델이 내리게 되어 있었음. 이놈은 (작업, 답변, 컨텍스트)만 받음. diff도 못 보고, 파일도 못 보고, 도구 레지스트리조차 없음. 그러니까 코드를 읽고 수정안에 대해 그럴싸한 설명을 써놓고도, 정작 디스크에는 아무것도 안 바꾸고 성공으로 보고되는 상황이 발생한 거임.
더 웃긴 건 코드베이스에 이미 이 결함이 문서화되어 있었다는 거임. 벤치마크 실행 시 19개 중 11개가 빈 패치였다는 주석이 있는데도, 기본 경로가 그걸 그냥 통과시키고 있었던 거지.
수정. 검증도 안 되고 변경도 안 됐으면 = 실패임. 실행 가능한 검증기가 diff보다 우선순위가 높고(파일을 안 건드려도 작업이 통과될 수 있으니까), 측정 불가능한 diff는 '빈 것'이 아니라 '알 수 없음'으로 처리하게 바꿈. 이제 모든 시도에는 누가 승인했는지가 기록됨: 검증기 / diff+매니저 / 매니저 / 없음. 권한 주체를 명시하지 않은 "성공"이라는 영수증은 보는 사람으로 하여금 가장 강력한 주체가 승인했다고 착각하게 만드니까.
기존 테스트 중 3개가 이 변경 사항 때문에 실패함. 퇴보(regression)는 아니었음. 셋 다 속 빈 강정 같은 성공을 주장하고 있었고, 그중 둘은 검증기가 아예 없는데도 "검증 통과"라고 우기고 있었거든.
나머지 절반: 드리프트(drift). 실행이 길어지면 작업이 쌓이지 않고 뱅뱅 돌기 시작하는데, 아무도 이걸 잡아내지 못함. 대부분의 에이전트(내 것도 포함)가 가진 루프 차단기는 짧은 슬라이딩 윈도우만 감시해서 빡빡한 사이클만 잡아냄. 20턴마다 똑같은 파일 3개를 계속 다시 보는 실행은 그냥 통과해버리는 거지. 그래서 실행의 전반부와 후반부를 비교하는 탐지기를 추가함. 이미 했던 작업을 다시 하거나, 실패가 늘어나거나, 기록이 압축된 직후에 중복이 급증하는 걸 잡아냄. 일단 보고만 하고 일부러 아무 행동도 안 하게 해둠. 멈출지, 재계획할지, 강제로 압축할지 다 그럴듯한 대응인데 뭐가 정답인지 근거가 없어서임.
혹시 관심 있는 사람 있으면 생성기/평가기 분리 작업에 대해 더 자세히 얘기해 줄 수 있음. 권한 비대칭(평가기는 쓰기 도구가 없음)은 이미 구조적으로 잡혀 있었는데, 진짜 문제는 정반대였음. 도구 없는 평가기가 아무것도 건드리지 않은 실행에 대해 유일한 권한을 가지고 있었다는 거임.

