지난 4월 어느 수요일 저녁부터 금요일 오후 사이, 코크로치랩스의 데이터베이스 마이그레이션 도구 MOLT에 IBM Db2 소스를 지원하는 기능이 추가됐다. Db2는 상용 관계형 데이터베이스의 초기 세대로 풍부한 SQL 방언과 복잡한 타입 시스템, 고유의 와이어 프로토콜을 갖고 있다. 이를 지원하려면 새 스키마 변환기, 행을 뽑아 CockroachDB로 넣는 Fetch 경로, 적재 후 비교하는 Verify 경로, 벤더링한 ANTLR 문법, CI용 도커 이미지, 그리고 1만 줄이 넘는 테스트 픽스처가 필요했다. 2024년 오라클 지원을 추가할 때 비슷한 작업에는 9개월과 약 16만 달러의 엔지니어링 비용이 들었다. 반면 Db2는 이틀이 채 걸리지 않았고, 사람이 코드를 한 줄도 쓰지 않았다. 토큰 비용은 4,172달러였다. 회사는 이를 164배 빠르고 38배 저렴한 결과라고 설명한다.
시작은 요구사항을 적은 깃허브 이슈 하나였다. 계획 담당 에이전트가 이를 읽고 한 번에 다루기엔 너무 크다고 판단해 명시적 의존성 그래프를 가진 15개의 하위 이슈로 쪼갰다. 기반 작업, 타입 시스템, 행 이터레이터, Fetch, Verify, Convert, CI, 테스트 데이터 순서였다. 그중 둘은 다시 분해됐고, 작업 도중 에이전트들은 픽스처 공백, 타입 매핑 버그, 격리 수준 문제 등 열두 건의 이슈를 스스로에게 추가로 제기했다. 부모 이슈가 닫힐 무렵 하위 이슈는 32개로 늘었고, 27개의 PR이 병합됐으며, 리뷰어가 작업을 55번 돌려보냈고, 9건이 에스컬레이션됐는데 그중 둘만 사람에게 올라갔다. 테스트 커버리지는 가장 잘 검증된 방언인 PostgreSQL과 동등한 수준이었다.
왜 공장이 아니라 병원인가
이 파이프라인의 이름은 MOLT Sinai다. 토론토와 뉴욕에 있는 유명 교육병원 마운트 사이나이에서 따온 이름으로, 이슈는 환자, 병합은 퇴원, 책임자인 사람은 '의료부장(Chief of Medicine)'으로 불린다. 업계에는 에이전트를 병렬로 돌려 처리량을 극대화하는 '소프트웨어 공장' 실험이 많다. 여러 에이전트를 동시에 돌리고 충돌을 병합 계층으로 정리하는 방식이나, SQLite를 빠르게 재구축하느라 자체 버전 관리 시스템까지 만든 사례가 대표적이다. 그러나 코크로치랩스의 질문은 달랐다. '시간당 몇 개의 PR인가'가 아니라 '우리가 직접 병합했다면 부끄러웠을 PR이 몇 개인가'였다. 마이그레이션 도구의 미묘한 버그는 정확성을 최우선으로 하는 데이터베이스로 들어가는 고객 데이터를 손상시킬 수 있기 때문이다. 그래서 속도가 10배 느려지더라도 품질을 택하겠다는 것이 전제였고, 실력이 고르지 않은 인력, 필수 인수인계, 필수 세컨드 오피니언을 오래 관리해 온 교육병원이 적절한 모델로 선택됐다.
병원은 전부 깃허브 액션 위에서 돌아간다. 각 환자의 상태는 이슈에 붙은 라벨과 진행 상황을 적은 스크래치 파일에 담긴다. 단계마다 '입력 라벨'이 붙으면 해당 워크플로가 시작되고, 에이전트가 작업을 마치면 '출력 라벨'을 다는데 이것이 다음 단계의 입력 라벨이 된다. 계획이 반려되거나 CI가 깨지거나 변경 요청이 오면 이전 단계로 되돌아간다. 흐름 바깥에서는 네 개의 부서가 독자적인 주기로 움직인다. 30분마다 순회하며 멈춘 환자를 찾는 수간호사, main이 깨지면 전체를 봉쇄하는 감염관리, 주간 프로세스 리뷰와 사후 회의를 하는 안전부, 새 작업을 제안하는 연구부다.
안전장치는 규칙에 있다
품질의 대부분은 스킬 파일에 인코딩된 몇 가지 규칙에서 나온다. 첫째, 계획 없이 코드 없고 리뷰 없이 계획 없다. 담당 에이전트(Fellow)는 문제를 재현하고 감별 진단을 한 뒤 진단명, 수정할 파일, 추가할 테스트, 위험, 미해결 질문을 담은 치료 계획을 올린다. 결함을 찾도록 설계된 별도 프롬프트의 리뷰 에이전트가 이를 승인하거나 반려한 뒤에야 작업이 시작된다. 둘째, 즉흥 금지. 작업 중 범위가 바뀌면 멈추고 계획을 다시 올려 재검토를 받는다. 셋째, 테스트에 지름길을 두지 않는다. 테스트를 끄거나 약화시킬 수 없고, 실패한 테스트는 틀렸다고 증명되기 전까지 옳다고 간주된다. 모든 코드 리뷰는 변경을 비활성화해 새 테스트가 실패하는지 먼저 확인한다. 넷째, 막혀도 허둥대지 않는다. 막힌 에이전트는 교육병원에서 쓰는 I-PASS 형식의 인수인계서를 쓰고 상급자에게 넘기며, 받는 쪽은 이해한 내용을 먼저 적어야 한다. 마지막으로 퇴원 간호사는 코드가 아니라 리뷰 자체를 감사한다. 승인이 있는지, 템플릿이 채워졌는지, 미해결 스레드가 없는지, CI가 녹색인지를 체크리스트로 검증한다. 또한 사람이 내린 일반화 가능한 결정은 추가 전용 선례 로그에 기록되고, 에이전트는 책임자에게 올리기 전 선례를 먼저 확인해야 한다.
4월 21일부터 9월 11일까지 미러 저장소에서 이 파이프라인은 백만 줄이 넘는 코드를, 에이전트가 자신 있게 검토할 만큼 작은 단위로 쪼개 병합했다. 눈에 띄는 숫자는 1,299다. 저장소에 올라온 이슈의 거의 절반이 병원이 스스로를 위해 만든 것이었다. 분해된 하위 이슈, 계획에서 떨어져 나온 후속 작업, 연구부의 제안, 안전부의 시정 조치 등이다. 사람이 무엇을 받아들일지 결정하지만, 두 번째 달부터 사람은 더 이상 작업의 주된 원천이 아니었다. Db2는 첫 실험이었고, 첫 주의 자율 운영 뒤에는 모든 병합에 사람의 눈을 요구하는 '인간 승인 모드'를 켰다. 이 모드에서 비로소 고객에게 출시할 품질을 확신할 수 있었다. 현재 프리뷰 중인 Postgres용 마이그레이션 어시스턴트는 거의 전부 이 병원 인력이 작성한 결과물이다.
비용 측면에서 MOLT Sinai는 4월 이후 클로드 토큰에 13만 5천 달러가 조금 넘게 들었고, 환자 하나당 평균 약 84달러다. 이슈는 보통 하루나 이틀 병원에 머무는데, 그 시간의 상당 부분은 사람 리뷰어를 기다리는 데 쓰인다. 모델 구성도 진화했다. 처음에는 모든 단계에 오푸스를 썼지만, 지금은 계획은 Fable로 세우고 그 계획이 구현에 쓸 모델을 고른다. 소넷이나 오푸스에서 구현이 막히면 Fable 모델로 에스컬레이션한다. 비용을 낮추면서도 품질을 유지하려는 설계다.
한국의 실무자에게 이 실험이 던지는 메시지는 '에이전트에게 빨리 코드를 짜게 하라'가 아니다. 핵심은 에이전트와 메인 브랜치 사이에 무엇을 세울 것인가다. 계획-리뷰 분리, 테스트 무력화 금지, 구조화된 인수인계, 리뷰 자체에 대한 감사, 선례 축적 같은 장치는 사실 사람 조직의 소프트웨어 공정에서도 통하는 원칙이다. 다만 이 모델은 관료주의와 대기 시간, 비용이라는 교육병원의 단점도 그대로 물려받는다. 저렴하지도 단순하지도 않으며, 데이터 정확성이 생명인 영역에서나 기꺼이 치를 만한 대가다. 자신의 도메인에서 잘못된 결과물의 비용이 그만큼 큰지 먼저 따져보는 것이 이 사례를 빌려오기 전의 출발점이 될 것이다.