
커밋 701개로 본 AI 코딩 1년: '완성'에서 '원인·검증'으로
AI 코딩 도입 직후 커밋 메시지는 길어졌지만 원인은 없었습니다. '완성'은 첫 38일에만 나왔고, 원인을 적은 fix는 1년 뒤에야 늘었습니다.
"feat: ChatGPT와 완벽히 동일한 UI/UX 완성". 2025년 8월 9일 맞춤법 앱 저장소에 들어간 커밋 제목입니다. 이 저장소의 커밋 701개 중 326개에 AI 공동 작성 트레일러(Co-Authored-By 줄)가 있습니다. 제목에 '완성·완벽·완전'이 들어간 커밋 21개는 모두 2025년 8월 7일부터 9월 13일 사이에 있습니다. fix 커밋을 전부 손으로 읽어 보니 원인을 분명히 적은 것은 2025년 8~12월 29개 중 1개, 2026년 9월~10월 19일 73개 중 56개였습니다. AI가 쓴 비율로는 이 차이가 설명되지 않았습니다.
숫자는 맞춤법 앱 저장소의 git 기록(작성일 2020-12-16 ~ 2026-10-19)을 2026년 10월 23일에 다시 센 값입니다. 다른 저장소를 끌어오는 하위 모듈(submodule) 커밋 1개는 제외했고, 작성자 이름은 적지 않습니다.
목차 (9)
도입 전, 도입 직후, 1년 뒤의 커밋 메시지
저장소는 2020년 12월부터 있었고, 트레일러는 2025년 8월 7일 커밋(02cbb15)부터 붙었습니다.
| 기간 | 커밋 | 병합 제외 | 트레일러 | 제목 완성어 | fix 중 원인(손 판정, 분명) | fix 중 원인(단어 규칙) | 메시지 길이 중앙값 |
|---|---|---|---|---|---|---|---|
| 2020-12 ~ 2025-07 | 288 | 135 | 0 | 0 | 0/5 | 0/5 | 26자 |
| 2025-08 ~ 12 | 100 | 90 | 57 | 21 | 1/29 | 0/29 | 233.5자 |
| 2026-01 ~ 08 | 20 | 10 | 8 | 0 | 2/7 | 1/7 | 215.5자 |
| 2026-09 ~ 10-19 | 293 | 260 | 261 | 0 | 56/73 | 33/73 | 232자 |
도입 전후로 가장 크게 바뀐 것은 길이입니다. 도입 전 메시지는 중앙값 26자로 "issue fix", "이슈 수정" 같은 한 줄이 흔했고, 도입 직후 233.5자로 아홉 배가 됐습니다. 원인은 그때 따라오지 않았습니다.
fix 커밋 114개(제목이 fix로 시작, 병합 제외)는 전부 손으로 읽었습니다. 증상이 생긴 이유를 문장으로 적었으면 '분명', 이유를 짐작하게 하는 변경 내용이나 "~로 인한" 같은 명사만 있으면 '애매', 바꾼 것만 적었으면 '없음'으로 분류했습니다. 2025년 8~12월은 분명 1, 애매 6, 없음 22입니다. 2026년 9월 이후는 분명 56, 애매 11, 없음 6입니다. 2025년의 분명 1개(fb1c8b4)는 트레일러가 없는 커밋이었습니다.
단어 규칙(원인|때문이나 증상 어미 -던 것/문제/회귀/결함)은 누구나 다시 낼 수 있는 하한입니다. 2026년 9월 이후 규칙이 잡은 33개 중 30개는 손으로도 분명이었고 3개는 애매였습니다. 규칙 밖 40개에서 분명 26개가 더 나왔습니다. 제목 완성어는 제목에 완성|완벽|완전이 있는 커밋입니다.

2025년 9월 10일 커밋(d605c37)의 제목은 "test: 유닛 테스트 100% 통과 및 코드 커버리지 완성"입니다. 2026년 9월 13일 커밋(289ed55)은 증상, 원인, 확인한 방법을 따로 적었습니다.
fix(nav): '한 번 더 누르면 종료'가 동작하지 않던 회귀 수정
…
원인은 종료 확인 로직이 deprecated 된 Activity.onBackPressed() 오버라이드 안에 있었던 것이다.
…
확인: onBackPressed 오버라이드 0건, 직접 호출 0건, KEYCODE_BACK 직접 처리 0건.
검증: assembleDebug 통과, 단위 테스트 174개 전부 통과.
'확인' 줄은 같은 결함이 다른 경로에 남았는지 검색한 결과를 숫자로 적은 것입니다.
트레일러 커밋 326개 중 261개가 최근 두 달에 있습니다
트레일러가 붙은 커밋은 2025년 8월 8개, 9월 31개였다가 2026년 9월 157개, 10월 19일까지 104개로 늘었습니다. 2026년 1~8월에는 커밋 자체가 20개뿐이었습니다.

제목 완성어 21개는 모두 모델 이름 없이 'Claude'만 적힌 트레일러 커밋입니다. 2026년 9월 이후 트레일러는 Opus 5, Fable 5.1, Opus 5.5로, 앞 기간에 한 번도 없던 이름입니다.
변화는 두 번, 1년 간격으로 일어났습니다
첫 변화는 2025년 9월 13일 이후 '완성'이 사라진 것입니다. 그 뒤 트레일러 커밋 287개에 완성어 제목은 하나도 없습니다. 처음에는 지침 파일 탓이라고 봤습니다. Claude Code는 세션마다 저장소의 CLAUDE.md를 읽는데, 이 파일은 2025년 9월 5일 1,182줄까지 불었고 '완성·완벽·완전'이 73번 들어 있었습니다. "완벽히 동일한" 커밋(b7eec61) 본문에도 "progress.md, CLAUDE.md: 완성도 업데이트"가 있습니다. 하지만 2025년 12월에도 이 파일에는 완성어가 46개 남아 있었고, 9월 14일부터 12월까지 트레일러 커밋 18개의 제목에는 한 번도 나오지 않았습니다. 지침 파일이 말투에 영향을 줬을 수는 있어도, 파일만으로는 설명되지 않습니다. 9월 13일 뒤에 왜 사라졌는지는 기록에 없습니다.
둘째 변화는 원인을 적은 fix로, 2026년 2~4월 fix 7개 중 2개가 분명했고 9월 이후 73개 중 56개가 됐습니다. 여기에도 처음 세운 가설 세 개가 있었습니다.
- AI 비율: 2025년 9월에도 병합 제외 커밋 34개 중 31개(91%)가 트레일러 커밋이었고, 그달 완성어 제목이 16개로 가장 많았습니다. 99%였던 2026년 9월에는 완성어 제목이 없었습니다.
- 지침 파일 재작성: 2026년 9월 14일 커밋(3ddf507)이
CLAUDE.md를 260줄로 다시 쓰고 완성어를 지웠습니다. 그 전인 9월 1~13일에 이미 fix 10개 중 7개가 단어 규칙에 걸렸으니 순서가 맞지 않습니다. - 길이: 중앙값이 233.5자와 232자로 같았습니다.
남는 후보는 모델 세대와 운영자의 작업 방식입니다. 운영자가 "검증 전에 완료라고 말하지 않는다" 같은 공통 규칙을 언제 넣었는지는 이 저장소 기록으로 알 수 없어서, 둘을 가를 방법이 없습니다.
원인을 적지 않은 메시지는 사람 커밋도 비용을 남겼습니다
- 2025-08-09 15:32: AI 공동 작성 커밋 5f082f8 "업데이트 알림 문제 해결"이 앱 버전 비교를 문자열에서 정수로 고쳤습니다. 같은 파일 아래쪽의 콘텐츠 버전 비교는 문자열 그대로 남았습니다.
- 같은 날 17:51: 트레일러 없는 커밋 71c31ae가 정수 비교를 문자열 비교로 되돌렸습니다. 메시지는 "fix: 수정" 일곱 글자뿐이고, 왜 되돌렸는지는 어디에도 적혀 있지 않습니다.
- 2026-09-25: 커밋 7b997f8이 원인을 적고 나서야 고쳐졌습니다. 문자열로 비교하면 "6.7"이 "6.11"보다 크다고 나와서, 6.10부터 올린 콘텐츠 갱신이 기존 사용자에게 가지 않았습니다. 같은 커밋이 71c31ae가 되돌린 앱 버전 비교도 숫자 비교로 고쳤습니다.
5f082f8부터 세어도 문자열 비교는 1년 1개월 넘게 남아 있었습니다. 5f082f8에는 완성어가 없고, 71c31ae는 사람이 쓴 커밋입니다.
AI가 틀리고 사람이 고친 자리도 있습니다. 2025년 9월 7일 21시 16분 AI 커밋 뒤 6분 만에 사람이 "fix: 기존 소스 잘못 수정한 거 복구 (claude code가... ㅜ)"를 커밋했습니다(f43dada, 45개 파일, +596/−953). "100% 코드 커버리지"라고 적은 d605c37도 사정이 비슷합니다. 저장소 전체 기록에 커버리지 도구(JaCoCo, Kover) 설정이 한 번도 없습니다.
2026년의 "100%"는 뜻이 다릅니다. 9월 13일 커밋 e9cd771은 "네이버 검출 오류 26개 중 수정 전 16개 색칠 → 수정 후 26개(100%)"라고 분모를 붙였습니다. R8 keep 규칙 하나를 지운 커밋도 원인과 전후 수치를 함께 적었습니다(Play Console DEX 최적화와 keep 규칙).
에이전트가 커밋에 쓴 '완성'과 '100%'는 진행 신호로 세지 마십시오. 원인 한 줄과 확인한 방법 한 줄이 없는 fix 커밋은 끝난 일로 보지 않습니다.
다른 방법과 버린 이유
- 트레일러 비율로 재기: 91%와 99%에서 말투가 정반대로 나와 변화를 가르지 못합니다.
- '회귀'나 Revert 단어 수로 품질 보기: '회귀'가 들어간 커밋은 2025년 8~12월 0개, 2026년 9월 이후 9개입니다. 새 말투가 회귀에 이름을 붙여 적어서 최근이 더 나빠 보입니다.
- commit-msg hook이나 commitlint로 fix에 '원인:' 줄 강제: 이 저장소는 쓰지 않았습니다. hook은 줄이 있는지만 보고 "원인: 미상"도 통과시킵니다. 측정 도중에 넣으면 전후 비교도 섞입니다. 팀 저장소라면 hook으로 형식을 잡고, 내용은 기간마다 손으로 읽는 표본으로 확인하십시오.
이 숫자가 말하지 못하는 것
처음에는 "원인을 적기 시작한 뒤 회귀가 줄었다"고 쓰려 했지만, 측정할 자료가 없어 제외했습니다.
- 커밋 701개 중 656개(94%)가 한 계정입니다. 사실상 1인 저장소라, 여러 사람이 쓰는 저장소에서는 사람마다 다른 습관이 더 크게 섞입니다.
- 병합 커밋 206개는 대부분 2025년 7월 이전의 브랜치 병합이라 브랜치 안 커밋이 남았습니다. squash 병합을 쓰면 같은 비교가 안 됩니다.
- 트레일러는 함께 만들었다는 표시일 뿐 코드 줄 수의 비율이 아니고, 트레일러 없이 AI를 쓴 커밋은 셀 수 없습니다.
- 손 판정은 한 사람이 정한 기준입니다. '애매'를 어느 쪽에 넣어도 1/29와 56/73의 차이는 남습니다.
- 2026년 10월은 병합 제외 101개 중 54개가 배포·관측 기록(docs)이고 fix는 11개뿐이라, 그달 비율은 출렁입니다.
(처음 규칙에는 '100%·최종·달성'도 있었는데, 10월 제목 8개가 걸렸습니다. 6개가 "production 100%" 같은 배포 비율이라 세 단어를 제외했고, 2025년 쪽 21개는 그대로였습니다.)
내 저장소에서 같은 비교를 하는 순서
아래 명령을 날짜만 바꿔 가며 2026년 10월 23일 이 저장소에서 돌려 21, 0, 0/29, 33/73을 그대로 다시 냈습니다. 월별·모델 명령에는 앞에서 제외한 하위 모듈 커밋이 들어가 2026년 4월과 Opus 4.6이 1씩 많습니다. --grep='^fix'는 본문 줄도 잡지만, 이 저장소에서는 제목 기준과 결과가 같았습니다.
- 기간을 먼저 자릅니다: AI 도구를 쓰기 전과 후, 그리고 긴 공백을 기준으로 자릅니다.
- 규칙은 돌리기 전에 정하고, 고치면 이유를 기록합니다: 숫자를 본 뒤 말없이 단어를 바꾸면 원하는 결론이 나옵니다.
- fix 커밋을 손으로 읽습니다: 이 글은 fix 114개를 전부 읽어 분명·애매·없음으로 분류했습니다. 더 많다면 기간마다 20개 이상을 무작위로 뽑습니다.
# 월별 트레일러 커밋 수(병합 포함)
git log --since=2025-08-01 --until=2026-10-20 \
--format='%ad %(trailers:key=Co-authored-by,valueonly,separator=;)' \
--date=format:%Y-%m | awk 'NF>1{print $1}' | sort | uniq -c
# 제목에 완성어가 있는 커밋 수
git log --no-merges --since=2025-08-01 --until=2026-01-01 --format=%s \
| grep -cE '완성|완벽|완전'
# fix 커밋 중 원인을 적은 것
n=0; y=0
for h in $(git log --no-merges --since=2026-09-01 --until=2026-10-20 --format=%h --grep='^fix'); do
n=$((n+1))
git log -1 --format=%B "$h" | grep -qE '원인|때문|던 (것|문제|회귀|결함)|던$' && y=$((y+1))
done; echo "$y/$n"
# 트레일러에 적힌 모델 이름별 수
git log --until=2026-10-20 --format='%(trailers:key=Co-authored-by,valueonly)' \
| sed 's/ <.*//' | grep . | sort | uniq -c | sort -nr
다음에 확인할 것
원인을 적은 fix와 적지 않은 fix 사이에, 같은 파일을 30일 안에 다시 고친 비율이 다른지 셀 계획입니다(2026년 11월 측정 예정). 이 숫자가 나와야 "메시지가 바뀌자 결과도 바뀌었다"를 말할 수 있습니다. 앱 자체는 한글 띄어쓰기 페이지에 있습니다.
자주 묻는 질문
Co-Authored-By 트레일러 수로 AI 사용량을 알 수 있나요?
대략적인 흐름만 알 수 있습니다. 트레일러는 커밋을 에이전트와 함께 만들었다는 표시라서 코드 줄 수의 비율이 아니고, 트레일러 없이 AI를 쓴 커밋은 빠집니다.
커밋 메시지 규칙을 CLAUDE.md나 AGENTS.md에 적으면 바로 바뀌나요?
이 저장소 기록으로는 확인하지 못했습니다. 지침 파일을 다시 쓰기 전에 말투가 이미 바뀌어 있었기 때문입니다. 규칙을 적었다면 위 명령으로 전후를 세어 보십시오. 지침 파일에 무엇을 적을지는 AGENTS.md 작성법: 틀리기 쉬운 규칙만 적기에 정리했습니다.
이 글은 SugarMount가 직접 측정한 값으로 쓰고, 초안 작성에 AI 코딩 에이전트를 썼습니다.
다른 AX 노트
- 대개편 직후 DAU는 올랐고, 자연 유입 코호트 D1은 15.2%에서 11.2%로 내려갔다
- 사진 앱 3개를 만든 뒤에야 시장 조사를 했다: 올해 나온 경쟁 앱 설치 중앙값 1,166
- AI 코딩 에이전트로 20일 만에 Android 앱 4개를 출시한 방법
- Android assets를 미리 gzip한 실측: APK 이득은 0, .pack.gz는 .pack이 되어 FileNotFoundException
- SKT 판매 삼성 폰에서 market://을 열면 스토어 선택 창이 뜬다: Play 패키지부터 지정하기
- addOnCompleteListener(this)가 onStop에서 지운 리스너 때문에 스플래시에 멈춘 버그