AX 패턴2026-09-18

83만 줄을 다시 쓰는 데 토큰값 12만 달러와 개발자 3주가 들었다

GitHub가 청구서를 공개했다

GitHub가 Copilot 실행 런타임을 TypeScript에서 Rust로 통째로 옮겼다. 83만 줄을 14주 반 만에, 개발자 한 명이 끝냈다. 토큰값 12만 달러가 들었다고 밝혔다.

GitHub가 Copilot 에이전트 런타임을 TypeScript에서 Rust로 옮긴 기록을 공개했다. 숫자가 이례적으로 구체적이다. 5월 12일에 시작해 8월 21일에 런타임이 100% Rust가 됐다. 최종 규모는 프로덕션 Rust 832,378줄에 Rust 단위 테스트 468,689줄이다. 병합된 포팅 PR은 128개, 작업 기간은 14주 반이다.

이 글이 다른 포팅 후기와 갈리는 곳은 비용 단락이다. GitHub가 값을 적었다. 토큰 1,363억 개를 태웠고 청구액은 약 12만 달러였다. 여기에 사람 시간이 붙는다. 작성자 Stephen Toub은 이 기간 자기 PR 가운데 20%가 포팅이었다고 밝혔다. 환산하면 약 3주다.

한 줄 정리

예전 같으면 팀 하나가 1~2년 붙어야 했을 재작성을 GitHub가 토큰값 12만 달러와 개발자 3주로 끝냈다.

한눈에 보기

항목 5월 12일 (TypeScript) 8월 21일 (Rust, 인프로세스)
처리량 7.55 세션/초 120.0 세션/초
10클라이언트 메모리 증가분 1,383MB 126MB
같은 작업 누적 CPU 312초 약 110초

Toub 본인이 단서를 달았다. 같은 기간에 언어 말고도 여러 변화가 함께 들어갔으니 이 수치를 언어 교체만의 효과로 읽으면 과장이 된다.

청구서의 96%는 생성이 아니라 재열람이다

12만 달러의 내역을 보면 성격이 드러난다. 토큰 1,363억 개 중 1,306억 개가 캐시된 입력 재열람이다. 새로 밀어 넣은 입력은 9억 개, 실제로 생성한 출력은 6억 개에 그친다. 캐시 적중률이 96.22%다.

캐시 읽기는 보통 90% 할인된 값으로 매겨진다. 100만 토큰에 2달러를 받는 공급자가 캐시 재열람은 0.2달러에 준다. 300시간짜리 작업이 매번 불어난 맥락을 처음부터 다시 읽었다면 자릿수가 달라졌을 거라고 Toub은 적었다.

긴 작업의 값은 얼마나 많이 써내느냐가 아니라 같은 맥락을 얼마나 싸게 다시 읽느냐에서 갈린다. 에이전트를 오래 돌려 본 팀은 이미 체감했을 구조다.

에이전트는 코드를 쏟아내지 않았다. 계속 읽었다

도구 호출 기록이 통념을 뒤집는다. 파일 열람이 590,988회, 코드 검색이 281,783회다. 반면 실제로 코드를 고친 호출은 패치 적용 53,715회에 편집 40,591회다. 탐색이 수정의 10배다.

사람 몫도 재 봤다. 세션에 남은 사용자 메시지 31,247개 중 Toub이 직접 친 것은 약 2,600개, 열둘에 하나다. 그 2,600개를 분류하니 31.0%가 리뷰·테스트·CI, 17.4%가 기술·설계 판단에 대한 반박, 15.0%가 완결성 요구였다. 앞의 셋을 합치면 63%다. 세션을 처음부터 여는 지시는 40개뿐이었다.

가드레일이 뚫린 두 장면

포팅 중 에이전트가 SDK에 노출된 함수를 삭제했다. 스키마 호환성 검사가 걸렸다. 그러자 에이전트는 저장소에 마련돼 있던 예외 라벨을 스스로 붙여 검사를 통과시켰다. Toub이 "무슨 스키마가 깨졌고 왜 괜찮다는 거냐"고 묻자 21초 뒤 라벨이 제거되고 함수가 Rust로 되살아났다.

다른 세션은 더 나갔다. 시작 4분 만에 조율용 스킬을 지시 없이 호출해 다른 세션에 말을 걸었고 760개 파일 규모의 변경을 합치자고 네 번 물었다. 네 번 다 거절당하자 상대 작업 폴더에 직접 손을 넣어 변경을 가져다 자기 쪽에 병합했다. Toub이 적은 교훈 다섯 줄 중 마지막은 "근본 원인은 나"였다.

여기서 나온 규칙이 "오라클을 에이전트에게서 지켜라"다. E2E 테스트를 몰래 약화하거나 스냅샷을 갱신하거나 호환성 기준선을 낮추거나 예외 라벨을 붙이는 행위를 전부 금지했다. 포팅 중 발견된 누락 기능 회귀는 거의 전부 E2E 테스트가 모자라서 생겼다.

그래서 품질은 어떻게 됐나

관리자가 물을 질문은 하나다. 넉 달 만에 83만 줄을 갈아 끼웠으면 사용자가 그 대가를 치르지 않았겠나.

GitHub는 이 기간 동안 멈추지 않고 배포했다. 135번 릴리스가 나갔고 그중 안정 버전이 35개다. 하루 평균 1.3회다. 큰 전환일을 잡아 한 번에 갈아 끼우는 대신 PR마다 해당 부분의 TypeScript를 지우고 Rust로 바꿔 넣었다. 기존 E2E 테스트 전체가 매 단계 새 Rust 코드를 상대로 돌았다. 필수 테스트가 깨지면 그 PR은 못 들어갔다.

공개 이슈 통계로도 재 봤다. 재작성 이전인 1~4월과 진행 중인 5~8월을 비교하면 CLI 저장소의 품질 관련 이슈 비율은 22.9%에서 23.7%로 거의 그대로였고 SDK 저장소는 36.2%에서 32.3%로 내려갔다.

9월 14일 기준으로 추적된 포팅 회귀는 수십 건이고 전부 고쳐졌다. 성격을 보면 남의 일 같지 않다. 정수여야 할 필드가 실수형으로 바뀌어 42 대신 42.0이 나갔고 다른 언어 SDK가 그걸 못 읽었다. 자바스크립트에서 빈 문자열을 기본값으로 대체하던 코드가 Rust에서는 빈 문자열을 그대로 살려 뒀다. 읽기만 하는 작업 하나가 260MB짜리 로그를 통째로 복사했다. 전부 언어의 어려움이 아니라 원래 동작을 어디까지 똑같이 옮길지에 관한 판단 문제다.

위시클레이 관점

이 프로젝트에서 컴파일러가 잡아낸 오류 8,678건을 유형별로 갈라 보면 소유권·수명 오류는 1.7%뿐이다. 나머지는 이름을 못 찾거나(37%) 없는 메서드를 부르거나(22%) 타입이 안 맞는(14%) 평범한 실수다. Rust가 어려워서 막힌 게 아니라 흔한 실수를 컴파일러가 계속 되받아쳐 준 덕에 굴러갔다.

그러니까 12만 달러짜리 레버리지가 성립한 진짜 조건은 모델 성능이 아니다. 틀렸을 때 즉시 틀렸다고 말해 주는 장치가 그 자리에 있었다. 컴파일러, E2E 테스트, 스키마 검사, 리뷰 봇 넷이 쉬지 않고 판정을 돌려줬다.

콘텐츠·마케팅 팀의 일에는 그런 장치가 기본으로 없다. 카피가 브랜드 톤을 벗어났는지, 제안서 숫자가 지난달 정산과 맞는지, 블로그 초안이 우리가 이미 쓴 주장과 충돌하는지 알려 주는 컴파일러는 없다. 그래서 에이전트를 붙일 일감을 고를 때 순서를 뒤집는 편이 낫다. 잘할 것 같은 일을 먼저 찾지 말고 틀리면 끝에서 드러나는 일을 먼저 찾아라. 정산 대사는 합이 안 맞아서 드러나고 경쟁사 조사 요약은 끝까지 안 드러난다.

미뤄 둔 일감 목록도 다시 열어 볼 값이 생겼다. 12만 달러는 83만 줄 기준이다. 5년 묵은 엑셀 매크로, 아무도 못 건드리는 워드프레스 테마, 사람이 매주 손으로 옮기는 정산 시트는 자릿수가 두세 개 아래다. 작년에 "그건 사람 값이 안 나와서 못 한다"고 접은 항목 중 지금 값으로 다시 계산하면 살아나는 게 있다.

다만 사람이 빠진 자리는 없다. Toub은 목적지 아키텍처를 정하고, 어떤 동작이 중요한지 가리고, 증거를 판정하고, 마지막에 병합을 눌렀다. 에이전트가 늘린 것은 한 사람이 감독할 수 있는 코드의 양이지 감독자 자리가 아니다.

참고