DoorDash, 멀티 에이전트 LLM으로 6만 개 피처 플래그 정리 자동화
DoorDash가 코드베이스에 쌓인 만료된 피처 플래그를 자동으로 걷어내는 멀티 에이전트 LLM 시스템을 만들어 운영 중이라고 밝혔다. 실험 데이터, 엔지니어 승인, 격리된 Git 워크트리, 자동 검증을 하나로 묶은 구조로, 사람이 손으로 처리하던 플래그 정리 작업을 에이전트 파이프라인으로 옮긴 것이 핵심이다.
규모부터 크다. DoorDash의 실험 플랫폼은 약 623개 저장소에 걸쳐 6만 개가 넘는 피처 플래그를 관리하며, 매달 2,300개가량이 새로 추가된다. 이 가운데 1,000개 이상이 만료 상태로 분류됐다. 만료 판정 기준은 90일 동안 변경 이력이 없으면서 코드에서 여전히 참조되고, 보관이나 폐기 처리가 되지 않았고, 명시적으로 제외 목록에 들지 않은 경우다. 시스템은 이렇게 식별된 플래그마다 매일 Jira 티켓을 생성해 작업을 추적한다.
워크플로는 두 단계다. 1단계에서 Claude Sonnet 기반 오케스트레이션 에이전트가 Jira 티켓을 가져와 관련 저장소를 검색하고, Model Context Protocol(MCP)로 실험 플랫폼에 질의해 롤아웃 비율과 목표값 같은 메타데이터를 확보한다. 엔지니어가 생성된 보고서를 검토하고 목표값을 확정한 뒤에야 코드 수정이 시작된다. 2단계에서는 Claude Opus 기반 정리 에이전트가 서로 격리된 Git 워크트리에서 실행된다. 저장소당 최대 4개 에이전트를 동시에 돌리고, 에이전트당 제한 시간은 1시간이며, Gradle은 데몬을 끈 상태로 실행해 워크트리 사이의 상태 공유를 막는다. 에이전트는 플래그 참조를 모두 찾아 정리 전략을 정하고 소스와 테스트를 수정한 뒤 빌드, 테스트, JaCoCo 패치 커버리지 검사, Detekt 정적 분석을 통과해야 Pull Request를 만들 수 있다.
이 작업이 까다로운 이유는 DoorDash가 의존성 주입 방식의 래퍼를 쓰기 때문이다. 플래그 정의와 클라이언트 호출, 비즈니스 로직이 여러 파일에 흩어져 있어 단순한 불리언 플래그 하나를 지우는 데도 테스트 파일을 포함해 5~20개 파일을 손봐야 한다. Uber가 공개한 Piranha는 추상 구문 트리(AST) 기반 변환으로 만료 플래그 코드를 제거하지만, DoorDash는 플래그와 애플리케이션 로직의 연결이 구문이 아니라 의미 수준의 관계라 규칙 기반 방식으로는 자사 의존성 주입 패턴을 덮지 못한다고 판단했다. 그래서 규칙 기반 도구를 대조군으로 두고 LLM 기반 시스템을 택했다.
평가 결과도 함께 공개됐다. 만료 플래그 50개를 대상으로 한 실험에서 45개에 대해 사용할 수 있는 Pull Request가 만들어졌다. 건당 평균 소요 시간은 13.8분, 비용은 4.79달러였다. 회사 측은 같은 작업을 사람이 하면 1~2시간이 걸린다고 추정했다. 생성된 PR 중 31개는 첫 커밋 그대로 병합됐고, 14개는 수정이 필요했으며, 5개는 엔지니어가 직접 개입해야 했다. 성공률은 단순 플래그 100%, 중간 복잡도 94%, 복잡한 플래그 85%였다. 개입이 필요했던 5건은 호출 체인이 깊고 인터페이스를 넘나드는 파라미터 전달이 얽힌 사례였다. DoorDash는 평가 대상 50건의 코드 변경에서 버그나 회귀를 발견하지 못했다고 밝혔다.
실무적으로 눈여겨볼 지점은 자동화의 경계다. 에이전트가 스스로 판단하지 못하는 부분은 사람이 목표값을 확정하는 승인 단계로 남겨두고, 나머지 반복 작업만 병렬 에이전트에 넘기는 식이다. 검증을 빌드·테스트·커버리지·정적 분석까지 묶어 통과 조건으로 삼은 것도, LLM이 만든 변경을 그대로 신뢰하지 않겠다는 전제를 드러낸다.
한계도 분명하다. 복잡한 호출 체인이나 인터페이스를 가로지르는 파라미터 전달이 있는 경우에는 여전히 사람이 필요했고, 성공률도 복잡도에 따라 85%까지 떨어졌다. DoorDash는 저위험 정리 작업에 신뢰도 점수를 도입하고, 정리 이후 코드 품질 검사 단계를 한 차례 더 추가해 플래그 제거 뒤에 남을 수 있는 문제, 예컨대 의미를 오해하게 만드는 변수명 같은 것을 걸러낼 계획이라고 밝혔다. 이 작업은 ICSME 2026 Industry Track에 채택됐다.