내 레포지토리의 모든 커밋을 두 번째 AI가 검토하게 하는 방법: 실제로 바뀐 것은 무엇인가
요약
AI가 생성한 코드 리뷰 피드백을 효과적으로 관리하는 방법을 제시합니다. 단순히 코드를 수정하는 것을 넘어, 모든 피드백을 '수정', '질문하기', '건너뛰기' 세 가지 버킷으로 분류하여 검토 피로도를 줄이는 것이 핵심입니다. 이 방법은 개발 워크플로우의 효율성을 극대화합니다.
핵심 포인트
- AI 리뷰를 3가지 버킷(Fix, Ask, Skip)으로 분류해 관리하세요.
- 모호한 코멘트를 임의 해석하여 진행하는 것이 가장 큰 비효율을 만듭니다.
- 검토 피로도는 댓글 양이 아니라 의도 파악 실패에서 옵니다.
제 CLAUDE.md 파일 하단 근처에 몇 달 전에 작성한 한 줄이 있습니다. 그 내용을 거의 잊고 있다가, 이 코드가 실제로 어떤 역할을 하는지 주의 깊게 살펴보면서 알게 되었습니다:
## Important Note
after your work done codex will review what you done.
간결하고 구두점도 없으며, 서둘러 작성한 것처럼 명확합니다. 하지만 이것은 이 레포지토리의 모든 세션에서 실행되는 실제 지침입니다. 제가 변경 작업을 마치면, 두 번째 모델이 검토한 후에야 저는 그 작업이 완료되었다고 간주합니다. 처음에는 실험 삼아 추가했습니다. 몇 달이 지나자, 이는 설정 내 다른 어떤 것보다도 제 작업 방식 자체를 바꾸어 놓았는데, 예상했던 방식은 아니었습니다.
저는 이것이 버그를 잡아줄 것이라고 생각했습니다. 실제로 직접적으로 잡는 경우는 거의 없습니다. 이 시스템이 실제로 하는 일은 모든 피드백 조각에 대해 분류(triage) 결정을 강제하는 것이며, 그 분류를 잘못하는 곳에 모든 어려움이 있습니다.
세 가지 버킷
초기에는 모든 검토 코멘트를 똑같이 취급했습니다. 읽고, 반영하는 식이었죠. 하지만 그렇게 한 주 정도 지나지 않아, 두 번째 AI가 제안한 내용 때문에 동의하지 않는 변경을 조용히 하고 있었고, 별도로 잘못되었거나 범위를 벗어난 코멘트들을 재논쟁하느라 엄청난 시간을 낭비하고 있었습니다.
실제로 효과적인 방법은 코드를 건드리기 전에 모든 코멘트를 세 가지 버킷 중 하나로 분류하는 것입니다:
- 수정 (Fix it), 논의 없음. 해당 코멘트가 모호하지 않고, 위험도가 낮으며, 아키텍처적으로 중요한 부분을 건드리지 않는 경우입니다. 그냥 처리하고 넘어갑니다.
- 먼저 질문하기 (Ask first). 해당 코멘트가 모호하거나, 실제 판단이 필요한 부분이 걸리거나, '수정'하는 것이 코멘트가 암시하는 것보다 더 큰 리팩토링(refactor)을 필요로 하는 경우입니다. 행동하기 전에 멈추고 인간의 결정을 받아야 합니다.
- 조용히 건너뛰기 (Skip silently). 해당 코멘트가 이미 처리된 내용과 중복되거나, 실제로 적용되지 않는 경우입니다.
이 명확한 분류 기준들이 생기기 전까지 제가 빠지곤 했던 실패 모드는 2를 1로 합치는 것이었습니다. 즉, '모호함(ambiguous)'을 '그냥 해석 하나 골라서 진행하자'고 취급하는 것이었죠. 실제로 검토 피로도를 유발하는 것은 댓글의 양이 아니라 바로 이 지점입니다. 팀원(인간 또는 AI)은 작고 명확한 수정 사항들을 많이 검토해도 지치지 않습니다. 사람을 지치게 하는 것은 첫 번째 수정에서 의도 파악에 잘못 추측했기 때문에 같은 내용을 세 번이나 재검토하게 만드는 것입니다.
각 카테고리별 실제 사례
Bucket 1은 nodejs/undici PR #5446에서 발생했습니다. 한 검토자가 제가 Dispatcher.md에 추가한 섹션이, 같은 PR에서 추가한 새로운 Interceptors.md 페이지에 속해야 할 내용을 중복하고 있다는 점을 지적했습니다. 모호하지 않고 기계적인 판단만 필요했습니다. 약 285줄 분량의 중복된 섹션을 삭제하고, 세 줄짜리 포인터로 대체하며, 이제 깨진 링크 참조들을 수정하는 것이었습니다. 저는 즉시 처리했습니다:
- ## Pre-built interceptors
- <285 lines of duplicated interceptor docs>
+ For the full list of built-in interceptors, see [Interceptors](./Interceptors.md).
주고받을 대화가 필요 없었습니다. 이것이 바로 Bucket 1의 목적입니다.
Bucket 2는 vercel/eve PR #454에서 발생했습니다. 해당 레포지토리의 CONTRIBUTING.md는 보호된 브랜치에 대해 검증된 커밋 서명(verified commit signatures)을 요구하는데, 저는 그 환경에 서명 키를 설정하지 않은 상태였습니다. 제가 우회할 수는 있었습니다 (로컬에서 서명 확인을 위장하거나 건너뛸 수 있는 방법이 수십 가지가 있습니다). 하지만 'PR 병합을 위해 보안 요구 사항을 무시해야 할까'라는 질문은, 어떤 에이전트가 실행되든 임의로 내릴 결정이 아니어야 하는 종류의 판단입니다. 대신 저는 DCO(Developer Certificate of Origin)로 서명하고, PR 설명에 unsigned-commit 문제를 명시적으로 표시했으며, 실제 서명 결정은 병합 전에 인간에게 맡겼습니다.
버킷 3은 끊임없이 발생하며 논할 가치가 가장 적습니다. 이것이 요점입니다. 이미 diff가 해결한 내용을 반복하는 댓글이나, 파일의 이전 버전을 가정하는 제안 등이 그렇습니다. 이런 것들은 '고맙다, 벌써 처리했다'는 식의 응답을 받지 못하고 0개의 반응만 얻습니다. 모든 답글은 양쪽 모두에게 주의를 기울이는 비용이 발생합니다.
리뷰가 실제로 잡아내는 것 vs. 트리아지(triage)가 잡아내는 것
놀라웠던 부분은 다음과 같습니다. 리뷰 자체는 진정한 로직 버그를 거의 포착하지 못한다는 것입니다. 드리프트(drift), 불일치성, 미완성 작업 등 2차 검토에서 발견하는 종류의 문제는 처리할 만합니다. 이는 첫 번째 검토와 동일한 가정을 가지고 진행하지 않기 때문에 가능한 일입니다. 하지만 좋은 테스트 스위트만큼 깊은 정확성 버그를 잡는 데는 훨씬 취약합니다.
하지만 트리아지 규율(triage discipline)은 리뷰가 할 수 없는 것을 포착합니다. 바로 AI가 코드를 작성하고, 두 번째 AI가 이를 '리뷰'하며, 첫 번째 AI가 그 리뷰 내용을 확인하지 않고 행동하고, 이제는 두 모델이 실제로 방어할 만한 것인지조차 확인하지 않은 방식으로 서로 동의하는 루프를 멈추게 한다는 것입니다. 이 경우 실제로는 단지 상관관계에 기반한 실수들이 복합적으로 쌓이는 것에 불과합니다. 버킷 2는 바로 그 루프를 깨기 위해 존재합니다. 댓글이 맞는지 아닌지를 실제로 분석하지 않고서는 알 수 없다면, 그 분석은 인간이나 저 자신이 패턴 매칭(
제 CLAUDE.md에 있는 한 줄짜리 메모에는 이런 내용은 없습니다. 단지 검토가 이루어진다고만 되어 있습니다. 분류 규칙은 제가 실제로 댓글이 나타났을 때 어떻게 행동하는지에 외에는 어디에도 적혀 있지 않으며, 이것은 아마도 실수일 것이고, 그래서 제가 여기에 대신 적는 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기