AX 노트 · 측정

Co-Authored-By 트레일러 없는 커밋, 확인한 29개 중 26개는 에이전트가 만들었다

트레일러 수를 AI 코드 비율로 보고하지 마십시오. 세션 기록과 대조한 트레일러 없는 커밋 29개 중 26개도 에이전트가 만들었습니다.

작성 SugarMount 에이전트와 일하는 법 읽는 시간 13분 최종 업데이트

맞춤법 앱 저장소에서 에이전트가 낸 git 명령과 시각이 맞는 커밋 26개(병합 25, revert 1)에 Co-Authored-By: Claude 트레일러가 없습니다. 기간은 Claude Code 세션 기록이 남아 있는 2026년 9월 13일 저녁부터 10월 24일까지이고, 이 기간 트레일러 없는 커밋 29개 중 세션 기록에 대응하는 명령이 없는 것은 3개뿐입니다. 2025년 8월 이후로 넓히면 트레일러 없는 커밋은 89개이고, 제목과 날짜로 나눠 보니 52개가 병합 커밋과 stash 항목이었습니다. 에이전트에게 병합과 revert를 맡긴다면 그때도 -m으로 트레일러를 넣게 지침에 적으십시오.

근거는 저장소 4개의 git 기록(2026-10-25에 기준 시각을 2026-10-24로 고정해 다시 셈), 이 PC에 남은 Claude Code 세션 기록, GitHub의 PR 목록입니다. 작성자 이름과 세션 ID는 적지 않았습니다.

목차 (9)
  1. 9월 13일 저녁 이후 트레일러 없는 29개 중 26개에 에이전트 git 명령이 있었습니다
  2. 2025년 8월 이후 트레일러 없는 89개: 병합 50, stash 2, 첫 트레일러 전 7, 단일 커밋 30
  3. 채굴 메모는 89개 중 약 40개만 병합으로 보고 나머지를 손 커밋으로 적었습니다
  4. 유틸리티 앱 7개와 퍼즐 게임 10개도 모두 에이전트 명령과 맞았습니다
  5. codex 라벨이 붙은 PR 2개는 git log --all에 나오지 않습니다
  6. --exclude=refs/stash를 붙인 git log 여섯 줄
  7. 세션 기록이 없는 기간과 squash 병합에서는 판정이 안 됩니다
  8. 다음에 확인할 것
  9. 자주 묻는 질문

9월 13일 저녁 이후 트레일러 없는 29개 중 26개에 에이전트 git 명령이 있었습니다

트레일러가 없다는 사실만으로는 누가 커밋했는지 알 수 없습니다. 그래서 Claude Code가 남기는 세션 기록(jsonl)에서 에이전트가 실행한 명령 중 git commit, merge, revert, stash, tag 등이 들어 있고 작업 폴더나 명령에 저장소 이름이 들어간 것을 모았습니다. 커밋 시각 10분 전부터 30초 뒤 사이에 그런 명령이 있으면 "에이전트 명령 있음"으로 쳤습니다.

이 저장소에 대한 첫 에이전트 git 쓰기 명령은 2026년 9월 13일 20시 41분입니다. 그 뒤 10월 24일까지 커밋 282개 중 트레일러가 있는 253개는 253개 모두 에이전트 명령과 맞았습니다(대조 방법 검증).

막대그림: 세션 기록이 남은 2026년 9월 13일 20시 41분부터 10월 24일까지 커밋 282개 중 트레일러 있음 253개, 트레일러 없지만 에이전트 명령이 있음 26개, 트레일러도 명령 기록도 없음 3개.
맞춤법 앱 저장소, 2026년 9월 13일 20시 41분~10월 24일 커밋 282개를 트레일러와 세션 기록 명령으로 나눈 것.

이 구간의 트레일러 비율은 89.7%인데, 에이전트의 git 명령이 확인된 커밋은 279개, 98.9%입니다(트레일러 없는 쪽은 병합 25, revert 1). 9월 30일 10시 47분의 revert(d378829)는 세션 기록에 git revert --no-edit aa2d224가 그대로 남아 있습니다. 되돌려진 aa2d224는 28분 전에 들어간 트레일러 커밋이고, 되돌린 쪽에는 트레일러가 없습니다. 10월 17일 병합 2b9d3a1은 git merge --no-edit main이었습니다. 같은 날 b356c72는 에이전트가 -m으로 병합 메시지를 직접 줬는데도 트레일러 줄을 넣지 않았습니다.

남은 3개는 9월 26일 20시 7~8분의 버전 커밋(16d9917)과 v16024 릴리스 병합 2개입니다. 세션 기록에 대응하는 명령이 없어 판정하지 않았습니다.

시각만 맞추는 방법이라 우연히 맞을 수도 있습니다. 커밋 시각을 3시간 앞뒤로 옮겨 같은 대조를 돌리자, 트레일러 커밋 253개 중 17개와 15개(6~7%)만 맞았고 트레일러 없는 29개는 0개와 1개였습니다.

같은 기간 트레일러가 붙은 병합 3개(857326b, 08b1f7a, 0458820)는 모두 세션 기록에 에이전트가 트레일러를 메시지에 직접 넣은 명령이 있습니다. 08b1f7a와 0458820은 git merge … -m "… Co-Authored-By: Claude Opus 5.5 …"였고, 857326b는 병합 충돌을 푼 뒤 git commit -m으로 같은 줄을 넣었습니다.

2025년 8월 이후 트레일러 없는 89개: 병합 50, stash 2, 첫 트레일러 전 7, 단일 커밋 30

트레일러는 메시지 줄 머리의 Co-Authored-By: Claude로 세었습니다. git의 트레일러 파서(%(trailers:key=Co-authored-by))로 센 값과 네 저장소 모두 차이가 없었습니다. 2026년 10월 24일까지 맞춤법 앱의 git log --all은 커밋 725개를 보여 주고, 2025년 8월 1일 이후 434개 중 345개(79.5%)에 트레일러가 있습니다. 기존 글 커밋 701개로 본 AI 코딩 1년의 701개는 develop 브랜치만 10월 19일까지 세고 submodule 커밋 1개를 제외한 값이라 이 글의 숫자와 다릅니다.

묶음개수가른 기준
git-flow 릴리스 병합37제목이 Merge branch 'release/…', 'hotfix/…', Merge tag …
기능·동기화·PR 병합13기능 브랜치 9, develop·main 동기화 3, PR 병합 1
stash 항목2On main: …와 그 index on main: …
첫 트레일러 전 커밋78월 3일~7일 오전(첫 트레일러는 02cbb15, 8월 7일 22시 1분)
그 밖의 단일 커밋30코드 24, 자료·설정 5, revert 1
막대그림: 맞춤법 앱 저장소에서 2025년 8월 이후 트레일러 없는 커밋 89개 중 git-flow 릴리스 병합 37개, 기능·동기화·PR 병합 13개, stash 항목 2개, 첫 트레일러 전 커밋 7개, 그 밖의 단일 커밋 30개.
맞춤법 앱 저장소, 2025년 8월 1일~2026년 10월 24일 트레일러 없는 커밋 89개를 제목과 날짜로 나눈 것.

stash 2개는 커밋으로 셀 대상이 아닙니다. git log --all은 refs/stash도 따라가는데, 이 저장소에 쌓인 stash 5개 가운데 맨 위 하나(2026-09-10)와 그 인덱스 커밋만 결과에 들어옵니다. --exclude=refs/stash를 앞에 붙이면 432개 중 345개(79.9%), 트레일러 없음 87개가 됩니다.

병합을 빼고 첫 트레일러 이후로 자르면 비율은 병합 아닌 커밋 372개 중 342개(91.9%)로 올라갑니다.

단일 커밋 30개 중 자료·설정 5개는 이미지·PSD 9개(94773fa), 이미지·PSD 4개와 문구·DB 버전 몇 줄(417259d, 9개 파일 +8/−8), .gitignore 8줄을 한 줄로 합친 것(3c1bdca), build.gradle 버전 두 줄(36a6c23), 퀴즈 데이터 906줄과 버전 두 줄(16d9917)입니다. 코드 24개는 모두 2025년 8월 9일부터 9월 13일 사이에 있습니다. 그중 "fix: 기존 소스 잘못 수정한 거 복구 (claude code가... ㅜ)"(f43dada)는 AI가 잘못 고친 소스를 운영자가 되돌리며 남긴 커밋이고, 경위는 커밋 701개로 본 AI 코딩 1년에 있습니다.

채굴 메모는 89개 중 약 40개만 병합으로 보고 나머지를 손 커밋으로 적었습니다

이 글감은 에이전트가 저장소를 읽어 만든 채굴 메모에서 나왔습니다. 메모에는 "트레일러 없는 89개 중 약 40개가 git-flow 병합, 나머지는 손 커밋"이라고 적혀 있었습니다. 다시 세 보니 병합 모양 커밋은 51개였고(그중 1개는 stash), 첫 트레일러보다 앞선 커밋 7개가 기간에 섞여 있었습니다. 대조할 수 있는 29개 중 26개는 에이전트가 낸 명령이었습니다.

메모의 숫자(728개, 348개)도 기준 시각 없이 센 값이었습니다. 10월 25일 오전에만 이 저장소에 새 커밋 5개가 들어와서 같은 명령의 결과가 730개로 바뀌었습니다. 그래서 이 글의 숫자는 모두 --until=2026-10-25T00:00:00으로 고정했습니다. P2P 채팅 저장소를 "2026년 9월에 시작한 저장소"로 적은 것도 틀렸습니다. 첫 커밋은 2025년 8월 21일입니다(그달 8개, 2026년 9월 95개).

유틸리티 앱 7개와 퍼즐 게임 10개도 모두 에이전트 명령과 맞았습니다

저장소첫 커밋커밋트레일러비율트레일러 없음(병합)
맞춤법 앱, 전체2020-12-1672534547.6%380(205)
맞춤법 앱, 2025-08 이후43434579.5%89(51)
유틸리티 앱2026-09-20878092.0%7(6)
퍼즐 게임2026-09-3017016094.1%10(10)
P2P 채팅 앱2025-08-2110310299.0%1(0)

처음부터 에이전트와 시작한 저장소에서도 트레일러가 빠진 자리는 대부분 병합입니다. 퍼즐 게임의 트레일러 없는 10개는 모두 병합이고, 10개 모두 세션 기록의 에이전트 git 명령과 시각이 맞습니다. 같은 저장소에 트레일러가 붙은 병합도 9개 있습니다.

유틸리티 앱의 병합 6개 중 5개는 Merge branch 'worktree-agent-<id>'입니다. 이 병합 5개는 세션 기록에도 에이전트가 낸 git merge --no-edit worktree-agent-<id>로 남아 있고, 첫 명령에 함께 들어 있던 git worktree list 출력에서 이 브랜치들은 Claude Code가 하위 에이전트에게 만들어 준 worktree 폴더 .claude/worktrees/agent-<id>에 걸려 있습니다. 남은 단일 커밋 1171dee는 에이전트가 git commit -m "Ignore local upload keystores"로 메시지를 직접 쓰면서 트레일러를 넣지 않은 커밋입니다. P2P 채팅 앱의 1개는 루트 커밋 "first commit"이고, 첫 트레일러 커밋은 그 3분 뒤입니다.

codex 라벨이 붙은 PR 2개는 git log --all에 나오지 않습니다

작성자 계정은 쓸 수 없었습니다. 2025년 8월 이후 맞춤법 앱의 트레일러 없는 89개는 모두 한 계정이고, 그 계정이 트레일러 커밋 338개도 썼습니다.

PR 라벨은 GitHub에만 있습니다. 맞춤법 앱의 PR은 3개뿐입니다. 2025년 6월 29일의 #1과 #2에는 codex 라벨과 codex/… 브랜치가 있고, 둘 다 병합되지 않고 닫혔습니다. 커밋(09cb9b5, d318e22)은 어느 브랜치에도 없어 git log --all에 나오지 않고, 메시지에 트레일러도 없습니다. 병합된 #3(커밋 20개)에는 라벨이 없습니다.

브랜치 이름(worktree-agent-, codex/)은 병합된 뒤에는 병합 커밋 제목에만 남습니다. 커밋 말투도 봤습니다. 2025년 8월 7일 밤~9월 13일 단일 커밋의 제목 길이 중앙값은 트레일러 커밋 38자, 트레일러 없는 커밋 20자였고, 이 차이로 작성자를 가르지는 않았습니다.

세션 기록은 대조 구간에서 트레일러 커밋 253/253을 맞춰 가장 강한 신호입니다. 다만 이 PC에만 있고, 맞춤법 앱은 2026년 9월 13일 저녁 이후분만 남아 있습니다.

--exclude=refs/stash를 붙인 git log 여섯 줄

Git Bash, macOS, Linux에서 그대로 돌립니다. 기준 시각과 트레일러 문자열에는 자기 저장소 값을 넣습니다.

U=2026-10-25T00:00:00; S=2025-08-01T00:00:00
P='^Co-Authored-By: Claude'
# 1. total and trailer commits (stash excluded)
git log --exclude=refs/stash --all --since=$S --until=$U --format=%h | wc -l
git log --exclude=refs/stash --all --since=$S --until=$U -i -E --grep="$P" --format=%h | wc -l
# 2. commits without the trailer, merges among them
git log --exclude=refs/stash --all --since=$S --until=$U -i -E --grep="$P" --invert-grep --format=%h | wc -l
git log --exclude=refs/stash --all --merges --since=$S --until=$U -i -E --grep="$P" --invert-grep --format='%h %s'
# 3. cross-check with git's trailer parser
git log --exclude=refs/stash --all --until=$U --format='%(trailers:key=Co-authored-by,valueonly)' | grep -ci claude
# 4. single-parent commits without the trailer, with size
git log --exclude=refs/stash --all --no-merges --since=$S --until=$U -i -E --grep="$P" --invert-grep --stat --format='%h %ad %s' --date=short
  1. 기준 시각을 --until로 고정합니다. 매일 커밋이 들어오는 저장소는 몇 시간 만에 숫자가 달라집니다.
  2. 첫 트레일러 날짜를 찾아 기간을 자릅니다(--reverse로 첫 줄).
  3. 트레일러 없는 커밋을 병합, stash, 자료·설정, 코드로 나눠 봅니다.
  4. 세션 기록이 있으면 커밋 시각과 에이전트의 git 명령 시각을 맞춰 보고, 시각을 몇 시간 옮긴 대조로 우연히 맞는 비율도 구합니다.
  5. 에이전트에게 병합과 revert를 맡긴다면 -m으로 트레일러를 넣으라고 지침 파일에 적습니다.

세션 기록이 없는 기간과 squash 병합에서는 판정이 안 됩니다

맞춤법 앱에서 첫 트레일러 뒤, 세션 기록이 시작되기 전의 트레일러 없는 커밋 51개(병합 23, 단일 커밋 28)는 누가 만들었는지 판정하지 않았습니다. 그중 코드 커밋 24개는 Kotlin·Java 5,749줄을 더했고, 같은 기간(8월 7일 밤~9월 13일) 트레일러 커밋 39개는 14,762줄을 더했습니다. 트레일러가 코드 줄의 비율을 말해 주지 않는다는 점은 커밋 701개 글에 적었습니다.

이 측정이 맞지 않는 저장소도 있습니다. squash 병합을 쓰면 PR 하나가 커밋 하나가 되고, 트레일러는 병합 버튼을 누른 쪽의 도구에 달립니다. 여러 사람이 쓰는 저장소라면 작성자마다 커밋 습관이 달라 비율 해석이 더 어렵습니다. 세션 기록을 남기지 않는 도구나 기록을 지우는 환경에서는 대조 자체가 안 됩니다. GitLab이 2026년 6월 23일 낸 조사(6개국 1,528명)에서도 응답자 43%가 AI가 만든 코드와 사람이 쓴 코드를 믿을 만하게 구분하지 못한다고 답했고, 39%는 코드 출처를 추적하지 않는 시스템을 문제로 꼽았습니다(GitLab 보도자료).

다음에 확인할 것

맞춤법 앱의 지침 파일과 전역 지침에는 트레일러 규칙이 한 줄도 없습니다(10월 25일 확인). 병합과 revert에 트레일러를 넣는 규칙을 적은 뒤 트레일러 없는 병합 수가 실제로 주는지 다시 세야 합니다.

자주 묻는 질문

Co-Authored-By 트레일러가 없으면 사람이 쓴 커밋인가요?

아닙니다. 에이전트가 git merge나 git revert --no-edit을 기본 메시지로 돌리거나, 트레일러 줄 없이 -m을 주면 에이전트가 만든 커밋에도 트레일러가 없습니다.

git log --all로 세면 무엇이 더 들어가나요?

모든 브랜치와 태그 외에 refs/stash도 들어갑니다. stash 맨 위 항목과 그 인덱스 커밋, 두 개가 커밋처럼 세집니다. git log --exclude=refs/stash --all로 빼면 됩니다.

병합 커밋에도 트레일러를 붙일 수 있나요?

붙일 수 있습니다. git merge --no-ff -m "메시지"로 메시지를 직접 주고 마지막 줄에 트레일러를 넣습니다. 충돌이 나면 충돌을 푼 뒤 git commit -m에 같은 줄을 넣습니다.

이 글은 SugarMount가 직접 측정한 값으로 쓰고, 초안 작성에 AI 코딩 에이전트를 썼습니다.

에이전트와 일하는 법 글 전체 보기 · AX 노트 전체 보기