Split View: AI 시대의 프로젝트 일정 관리: 견적·벨로시티·스프린트 계획이 무너진 자리에서 다시 세우기
AI 시대의 프로젝트 일정 관리: 견적·벨로시티·스프린트 계획이 무너진 자리에서 다시 세우기
프롤로그 — 견적이 망가진 건 추정을 못해서가 아니다
2024년 어느 스프린트 회고. 한 팀의 벨로시티가 갑자기 두 배가 됐다. 누구도 더 오래 일하지 않았다. Cursor와 Claude Code가 팀에 들어왔을 뿐이다. 다음 스프린트, 벨로시티는 다시 절반으로 떨어졌다. 어려운 티켓만 남았기 때문이다.
이 팀의 PM은 회고에서 이렇게 말했다. "우리 벨로시티 그래프가 더 이상 아무것도 예측하지 못한다."
맞는 말이다. 하지만 원인을 오해하면 안 된다. 추정을 못하게 된 게 아니다. 추정의 단위였던 '사람의 노력'이라는 양이 더 이상 안정적이지 않게 된 것이다.
스토리 포인트는 한 번도 시간이 아니었다. 그것은 노력·복잡도·불확실성의 묶음이었고, 그 묶음이 팀 안에서 비교적 일관됐기 때문에 작동했다. "3점짜리"는 팀 모두에게 대략 비슷한 무게였다. AI 에이전트가 루프에 들어오면서 이 일관성이 깨졌다. 같은 3점짜리가 어떤 날은 4초 만에 초안이 나오고, 어떤 날은 여전히 이틀이 걸린다. 평균을 내도 의미가 없다. 분포 자체가 두 개의 봉우리로 갈라졌기 때문이다.
이 글은 그 갈라진 분포 위에서 일정을 다시 세우는 방법을 다룬다. 대상 독자는 테크리드, EM, 그리고 시니어 IC다. 추상적인 "AI가 바꾼 미래" 이야기가 아니라, 다음 스프린트 계획 회의에서 바로 쓸 수 있는 것들을 정리한다.
다룰 내용:
- 스토리 포인트가 의미를 잃은 정확한 메커니즘
- 새 병목은 구현이 아니라 리뷰·통합이다
- AI 보조 작업을 견적하는 법 — 점이 아니라 범위, 스파이크 우선
- 벨로시티는 이제 바이모달이다
- 에이전트가 하룻밤에 5티켓을 끝낼 때의 스프린트 계획
- AI 보조 작업 vs 사람 작업을 추적하기
- 에이전트 산출물의 "90% 완료" 함정
- 리뷰가 제약일 때의 용량 계획
- 여전히 의미 있는 지표 — 리드 타임, 탈출률, 리뷰 지연
- 에필로그 — 체크리스트와 안티패턴
1장 · 스토리 포인트가 의미를 잃은 정확한 메커니즘
스토리 포인트를 비난하기 전에, 왜 그게 원래 작동했는지부터 짚자. 스토리 포인트는 세 가지 가정 위에 서 있었다.
| 가정 | 내용 | AI 이전 |
|---|---|---|
| 노력 일관성 | "3점"은 팀 안에서 대략 같은 무게다 | 성립 |
| 노력 = 시간의 프록시 | 노력을 합하면 캘린더 시간으로 환산된다 | 성립 (속도 상수로) |
| 복잡도 ≈ 구현 비용 | 어려운 문제는 코드 짜기도 오래 걸린다 | 성립 |
세 가정이 전부 동시에 흔들렸다.
노력 일관성이 깨졌다. CRUD 엔드포인트 추가는 예전엔 2점이었다. 지금은 에이전트가 스키마를 보고 5분 만에 초안을 만든다. 하지만 분산 락 경합을 디버깅하는 5점짜리는 여전히 5점이다. AI가 거기서 별 도움이 안 되기 때문이다. 같은 척도 안에 5분짜리와 이틀짜리가 같은 숫자를 달고 있다.
노력이 시간의 프록시이길 멈췄다. 구현 시간이 0에 수렴해도 캘린더 시간은 줄지 않는다. 에이전트가 4초 만에 짠 코드도 사람이 리뷰하고, 통합하고, QA하는 데는 똑같은 시간이 든다. 노력을 합산해서 시간을 예측하던 공식의 분모가 사라졌다.
복잡도와 구현 비용이 분리됐다. 이게 가장 근본적이다. 예전엔 "어려운 문제"와 "코드 많이 짜야 하는 문제"가 강하게 상관됐다. 지금은 아니다. 명세가 명확하고 패턴이 흔한 작업은 — 복잡하든 단순하든 — 에이전트가 빠르게 처리한다. 반대로 명세가 모호하거나 시스템 맥락이 깊게 얽힌 작업은 — 코드 양이 적어도 — 여전히 사람의 시간을 통째로 먹는다.
결론: 스토리 포인트를 버릴 필요는 없다. 하지만 무엇을 추정하는지 다시 정의해야 한다. 생성 시간이 아니라 — 그건 거의 0이다 — 명세 비용과 검증 비용을 추정해야 한다.
옛 견적 = f(구현 노력)
새 견적 = f(명세 명확도) + f(리뷰·통합·QA 노력)
다음 장에서 이 두 번째 항이 왜 새 병목인지 본다.
2장 · 새 병목은 구현이 아니라 리뷰·통합이다
제약 이론(Theory of Constraints)의 한 줄 요약: 시스템의 처리량은 가장 느린 단계가 결정한다. 다른 단계를 아무리 빠르게 해도 소용없다.
AI 이전, 소프트웨어 전달의 단계별 시간 비중은 대략 이랬다.
[설계 15%] → [구현 50%] → [리뷰 10%] → [통합·QA 20%] → [배포 5%]
↑ 병목
구현이 가장 큰 덩어리였고, 그래서 우리는 구현을 빠르게 하는 데 모든 도구를 투자했다. IDE, 자동완성, 보일러플레이트 생성기. 에이전트는 그 흐름의 정점이다 — 구현을 거의 공짜로 만들었다.
그런데 구현이 공짜가 되면 어떻게 될까. 병목이 옮겨간다.
[설계 25%] → [구현 5%] → [리뷰 35%] → [통합·QA 30%] → [배포 5%]
↑ 새 병목
리뷰가 새 병목이다. 이유는 단순하다. 리뷰는 본질적으로 사람의 인지 작업이고, 그 양은 검토할 코드의 양에 비례하는데 에이전트는 코드를 더 많이, 더 빠르게 만든다. 게다가 에이전트 코드는 사람 코드와 리뷰 부담이 다르다.
| 측면 | 사람이 짠 PR | 에이전트가 짠 PR |
|---|---|---|
| 작성자의 의도 | 작성자에게 물으면 됨 | 작성자(사람)도 전부는 모름 |
| 미묘한 버그 위치 | 작성자가 "여기 좀 봐달라" 함 | 어디가 약한지 신호 없음 |
| 일관성 | 작성자 스타일대로 일관 | 파일마다 패턴이 다를 수 있음 |
| 분량 | 작업에 필요한 만큼 | 종종 필요 이상 (과잉 생성) |
| 테스트 | 작성자가 의도대로 작성 | 그럴듯하지만 빈틈을 가릴 수 있음 |
리뷰어는 이제 "코드를 읽는" 게 아니라 "코드가 맞다는 걸 증명"해야 한다. 작성자의 의도라는 지름길이 없기 때문이다. 이건 더 느리고, 더 피곤하고, 더 쉽게 놓친다.
실전 함의 하나. 팀에 에이전트를 도입하면서 리뷰 용량을 그대로 두면, 처리량은 거의 그대로다. 구현이 빨라진 만큼 PR이 리뷰 큐에 쌓일 뿐이다. 큐는 길어지고, 리드 타임은 오히려 늘 수 있다. 빨라진 건 "PR 생성 속도"지 "전달 속도"가 아니다.
실전 함의 둘. 통합·QA도 같이 부풀어 오른다. PR이 많아지면 머지 충돌이 많아지고, 통합 환경에서 깨지는 조합이 많아진다. 에이전트는 자기 PR이 다른 사람의 미머지 PR과 어떻게 충돌할지 모른다.
그래서 다음 장의 견적 원칙이 나온다: 에이전트가 만드는 단계가 아니라, 사람이 검증하는 단계를 추정하라.
3장 · AI 보조 작업을 견적하는 법 — 점이 아니라 범위, 스파이크 우선
AI 보조 작업의 견적이 어려운 진짜 이유는 결과의 분산이 크다는 것이다. 같은 티켓이 30분에 끝날 수도, 이틀이 걸릴 수도 있다. 그 분기점은 작업을 시작하기 전엔 잘 안 보인다.
분산이 큰 양을 단일 숫자로 추정하면 거의 항상 틀린다. 그래서 두 가지 원칙.
원칙 1: 점이 아니라 범위로 견적한다
단일 포인트 대신 낙관-비관 범위를 낸다. 핵심은 범위의 폭 자체가 정보라는 것이다.
| 견적 | 폭 | 의미 |
|---|---|---|
| 0.5 ~ 1일 | 좁음 | 명세 명확, 패턴 흔함. 에이전트가 잘할 것 |
| 1 ~ 4일 | 넓음 | 어딘가 모름. 스파이크가 필요할 수 있음 |
| 2 ~ 10일 | 매우 넓음 | 사실상 견적 불가. 쪼개거나 스파이크 |
폭이 넓다는 건 "더 큰 작업"이라는 뜻이 아니라 **"우리가 이 작업을 아직 이해 못 했다"**는 뜻이다. 넓은 범위를 본 스프린트 계획자는 숫자를 키울 게 아니라 불확실성을 줄일 행동을 해야 한다.
원칙 2: 스파이크 우선 (spike-first)
폭이 넓은 티켓은 곧장 스프린트에 넣지 않는다. 먼저 타임박스된 스파이크를 넣는다.
넓은 견적 (1~4일) 발견
│
▼
타임박스 스파이크 (2~4시간)
├─ 에이전트에게 프로토타입 시켜본다
├─ 명세의 빈 곳을 찾는다
└─ 통합 지점을 확인한다
│
▼
재견적 → 보통 좁은 범위로 수렴
AI 시대에 스파이크는 예전보다 훨씬 싸졌다. 에이전트에게 "이거 일단 만들어봐"라고 시키면 30분 만에 작동하는 프로토타입이 나온다. 그 프로토타입은 버리더라도, 그것을 만드는 과정에서 명세의 모호함과 통합 위험이 드러난다. 이게 스파이크의 진짜 가치다 — 코드가 아니라 학습.
스파이크 후 재견적하면 대부분 범위가 좁아진다. 좁아지지 않으면? 그것 자체가 강력한 신호다. 이 작업은 본질적으로 불확실하니 스프린트 약속에서 빼거나, 더 작게 쪼개야 한다.
견적 워크플로 정리
1. 초안 견적을 범위로 낸다 (낙관 ~ 비관)
2. 폭이 좁으면 → 그대로 스프린트 후보
3. 폭이 넓으면 → 스파이크를 먼저 스프린트에 넣는다
4. 스파이크 후 재견적 → 좁아지면 후보, 안 좁아지면 쪼갠다
5. 스프린트 약속은 "좁은 범위" 티켓들로만 채운다
이 워크플로의 핵심 메시지: 불확실한 걸 확실한 척 추정하지 말고, 불확실성을 줄이는 작업을 먼저 하라.
4장 · 벨로시티는 이제 바이모달이다
벨로시티 그래프가 무의미해진 이유를 통계로 보면 명확하다. 작업 시간 분포가 단봉(unimodal)에서 쌍봉(bimodal)으로 바뀌었다.
AI 이전, 팀의 작업 시간 분포는 대략 정규분포에 가까웠다. 평균 주변에 대부분 몰려 있고, 평균과 중앙값이 비슷했다. 평균을 내는 게 의미 있었다.
AI 이전 — 단봉 분포
빈도
│ ▁▃▅█▅▃▁
│ ▁▃█████████▃▁
└──────────────────────── 작업 소요 시간
평균 ≈ 중앙값 (의미 있음)
AI 이후, 분포가 두 개의 봉우리로 갈라졌다.
AI 이후 — 쌍봉 분포
빈도
│ █ █
│ █▆ ▆█
│ ██▃ ▃██
└──────────────────────────── 작업 소요 시간
봉우리 A 봉우리 B
(사소한 작업, (어려운 작업,
에이전트가 붕괴시킴) 거의 안 변함)
↑ 이 사이의 "평균"은 아무도 살지 않는 곳
- 봉우리 A — 붕괴한 작업. CRUD, 보일러플레이트, 잘 알려진 패턴 적용, 명확한 리팩터링. 에이전트가 시간을 거의 0으로 만들었다.
- 봉우리 B — 변하지 않은 작업. 모호한 명세, 깊은 시스템 맥락, 새로운 설계 결정, 까다로운 디버깅. 에이전트가 별 도움이 안 된다.
평균은 두 봉우리 사이의 골짜기를 가리킨다. 거기엔 실제 작업이 하나도 없다. "이번 스프린트 평균 작업은 1.5일" 같은 문장은 평균 가족 구성원이 2.3명이라는 말처럼 공허하다.
그래서 무엇을 추적하는가
평균 대신 두 봉우리를 따로 추적한다.
| 추적 항목 | 측정 | 왜 |
|---|---|---|
| 봉우리 A 처리량 | 사소한 작업 / 스프린트 | 에이전트 활용도가 보임 |
| 봉우리 B 처리량 | 어려운 작업 / 스프린트 | 진짜 팀 역량이 보임 |
| A:B 비율 | 두 봉우리의 구성비 | 백로그의 성격이 보임 |
| 골짜기 비율 | 중간 어딘가에 끼인 작업 | 견적 실패 신호 (0에 가까워야 함) |
특히 봉우리 B의 처리량이 진짜 신호다. 봉우리 A는 에이전트가 처리하니 거의 무한정 늘릴 수 있다 — 리뷰만 따라준다면. 하지만 봉우리 B는 사람의 깊은 사고가 필요하고, 그게 팀의 실제 상한이다. 분기 계획은 봉우리 B 처리량으로 세워야 한다.
바이모달 인식이 바꾸는 회고 대화
회고에서 "벨로시티가 떨어졌다"는 말이 나오면 이렇게 되묻는다.
"봉우리 A가 떨어졌나, 봉우리 B가 떨어졌나?"
- 봉우리 A가 떨어졌다 → 리뷰 큐가 막혔거나, 에이전트 활용이 줄었다. 도구·프로세스 문제.
- 봉우리 B가 떨어졌다 → 진짜 어려운 일을 하고 있거나, 시니어가 막혔다. 사람·집중 문제.
같은 "벨로시티 하락"이 완전히 다른 두 처방을 부른다. 평균 하나로는 이 구분이 불가능하다.
5장 · 에이전트가 하룻밤에 5티켓을 끝낼 때의 스프린트 계획
이제 현실적인 시나리오. 금요일 저녁, 시니어 IC가 에이전트에게 백로그 상단 5개 티켓을 맡기고 퇴근한다. 월요일 아침, 5개 PR이 올라와 있다.
스프린트 계획의 전제가 흔들린다. "2주에 팀이 N포인트를 한다"는 약속의 의미가 뭔가, PR 생성이 하룻밤에 끝난다면?
흔한 오해: 스프린트는 죽었다
아니다. 스프린트는 살아 있다. 단지 스프린트가 무엇을 약속하는 단위인지가 바뀌었다.
- 옛 스프린트: "이만큼의 코드를 작성하겠다"
- 새 스프린트: "이만큼의 코드를 검증하고, 통합하고, 배포 가능 상태로 만들겠다"
월요일 아침의 5개 PR은 "끝난 일"이 아니다. 그것은 리뷰·통합 큐에 들어온 입력이다. 스프린트 약속은 그 큐를 비우는 능력에 대한 약속이다.
스프린트 계획을 두 트랙으로 나눈다
트랙 1 — 생성 트랙 (에이전트 주도)
├─ 백로그 상단 티켓을 에이전트에게 위임
├─ 빠르고 병렬적, 거의 무제한
└─ 출력: 리뷰 대기 PR
트랙 2 — 검증 트랙 (사람 주도) ← 스프린트 약속은 여기
├─ 리뷰, 통합, QA, 배포
├─ 사람 용량에 엄격히 묶임
└─ 출력: 배포된 가치
스프린트 계획 회의에서 따져야 할 질문이 바뀐다.
| 옛 질문 | 새 질문 |
|---|---|
| 이번 스프린트에 몇 포인트 넣을까? | 이번 스프린트에 리뷰·통합 용량이 얼마인가? |
| 누가 이 티켓을 구현하나? | 누가 이 PR을 검증할 책임을 지나? |
| 구현이 며칠 걸리나? | 검증 트랙에서 며칠 차지하나? |
생성 트랙을 의도적으로 제한한다
직관에 어긋나지만 중요하다: 생성 트랙에 고삐를 채워야 한다.
에이전트가 하룻밤에 5개, 다음 날 5개, 또 5개를 만들면 리뷰 큐는 끝없이 길어진다. 이건 진척이 아니라 재고 과잉이다. 미머지 PR은 자산이 아니라 부채다 — 머지 충돌의 위험을 키우고, 코드베이스에 대한 가정이 오래될수록 리베이스가 어려워진다.
규칙: 검증 트랙이 소화할 수 있는 만큼만 생성 트랙을 돌린다. 리뷰 큐에 일정 수 이상 PR이 쌓이면 에이전트에게 새 작업을 위임하지 않는다. 칸반의 WIP 제한을 리뷰 큐에 적용하는 것이다.
리뷰 큐 WIP 제한 = 3
┌─────────────────────────────────┐
│ 리뷰 대기: [PR][PR][PR] ← 가득 │
│ → 에이전트에 새 위임 중단 │
│ → 리뷰가 하나 빠지면 다시 위임 │
└─────────────────────────────────┘
이게 5장의 핵심: 스프린트는 살아 있되, 약속의 단위가 생성에서 검증으로 옮겨갔고, 생성은 검증 용량에 맞춰 의도적으로 조절해야 한다.
6장 · AI 보조 작업 vs 사람 작업을 추적하기
"우리 팀에서 AI가 얼마나 기여하나"라는 질문은 경영진에게서 반드시 온다. 답하는 방식이 팀 문화를 만들거나 망친다.
추적하지 말아야 할 것
먼저 함정. 다음 지표들은 측정하지 마라. 측정하는 순간 게임당한다.
| 나쁜 지표 | 왜 나쁜가 |
|---|---|
| AI가 작성한 코드 줄 수 | 줄 수는 가치가 아님. 과잉 생성을 보상함 |
| AI 보조 PR 비율 (목표로) | "AI 썼다"고 체크하게 만듦. 의미 없음 |
| 개인별 AI 활용률 | 감시로 느껴짐. 신뢰 파괴 |
| AI vs 사람 커밋 비율 | AI는 도구지 사람의 경쟁자가 아님 |
이 지표들의 공통 문제: AI를 사람과 경쟁시키거나, 도구 사용 자체를 목표로 만든다. AI는 키보드나 컴파일러처럼 도구다. "이번 분기 컴파일러 사용률"을 추적하지 않듯, "AI 활용률"도 그 자체로는 추적할 가치가 없다.
추적해야 할 것
대신 작업의 성격을 추적한다. 개인이 아니라 작업 유형을.
티켓 분류 (개인 평가 아님, 백로그 이해용)
유형 A: 에이전트가 주도, 사람이 검증
→ 봉우리 A. 빠른 처리. 리뷰가 제약.
유형 B: 사람이 주도, 에이전트가 보조
→ 봉우리 B. 깊은 사고. 사람 시간이 제약.
유형 C: 순수 사람 작업 (설계, 디버깅, 협상)
→ 에이전트 부적합. 시니어 시간이 제약.
이 분류는 개인의 성과표가 아니다. 백로그의 구성을 이해하고 용량을 계획하기 위한 것이다. 같은 사람이 어떤 티켓은 유형 A로, 어떤 티켓은 유형 C로 한다. 분류 대상은 사람이 아니라 일이다.
유용한 단 하나의 비율
굳이 "AI 효과" 숫자가 필요하다면, 이것 하나만 본다.
유형 A 처리량 증가분
───────────────────── = 에이전트의 실제 레버리지
유형 A에 든 리뷰 비용
분자가 분모보다 충분히 크면 에이전트가 순이득이다. 분모가 분자를 따라잡으면 — 리뷰 비용이 생성 이득을 먹어버리면 — 도구가 아니라 프로세스를 고쳐야 한다는 신호다.
보고할 때의 프레이밍
경영진에게는 이렇게 보고한다.
"에이전트로 유형 A 작업의 리드 타임이 X% 줄었습니다. 그 결과 병목이 리뷰로 이동했고, 다음 분기에 리뷰 용량에 투자하면 그 이득을 처리량으로 전환할 수 있습니다."
이 프레이밍은 정직하고("줄 수가 늘었다" 같은 허수가 없다), 행동 가능하다(다음 투자처를 지목한다). "AI가 코드의 40%를 짭니다" 같은 문장은 인상적이지만 아무 결정도 못 내리게 한다.
7장 · 에이전트 산출물의 "90% 완료" 함정
소프트웨어 견적의 오래된 농담: "90% 완료됐고, 남은 10%에 또 90%의 시간이 든다." 에이전트는 이 함정을 더 깊고 더 그럴듯하게 만든다.
왜 에이전트 출력은 90%처럼 보이는가
에이전트가 만든 PR을 처음 열면 인상적이다. 코드가 컴파일된다. 테스트가 있다. 통과한다. 변수명이 깔끔하다. 구조가 합리적이다. 완성된 것처럼 보인다.
하지만 "보인다"가 핵심 단어다. 에이전트는 그럴듯해 보이는 것에 최적화돼 있다. 표면적 완성도와 실제 완성도가 사람 코드보다 더 크게 벌어진다.
사람이 짠 코드
표면 완성도 ──────────● 70%
실제 완성도 ─────────● 65%
(작성자가 약한 곳을 안다. 갭이 작다.)
에이전트가 짠 코드
표면 완성도 ───────────────────● 95%
실제 완성도 ──────────● 60%
(갭이 크다. 그리고 갭이 어디 있는지 보이지 않는다.)
표면과 실제 사이의 그 35%가 "남은 10%"의 정체다. 그리고 이 갭은 보통 다음에 숨어 있다.
| 숨은 곳 | 증상 |
|---|---|
| 엣지 케이스 | 행복 경로만 처리. 빈 입력·동시성·실패 경로 누락 |
| 통합 가정 | 다른 서비스·모듈의 동작을 멋대로 가정 |
| 비기능 요구 | 동작은 하지만 느림·메모리 과다·관측 불가 |
| 테스트의 빈틈 | 테스트가 있지만 의도가 아니라 구현을 검증함 |
| 에러 처리 | try/catch는 있지만 복구 전략이 없음 |
특히 마지막에서 두 번째가 위험하다. 에이전트가 만든 테스트는 종종 자기가 짠 코드가 하는 일을 그대로 단언한다. 버그가 있어도 테스트는 그 버그를 "정답"으로 박제한다. 테스트 통과가 정확성을 보장하지 않는다.
함정을 피하는 견적 규칙
규칙 1: "PR 올라옴"은 0% 완료다. 견적의 끝점을 "PR 생성"이 아니라 "배포되어 관측됨"으로 잡는다. 에이전트가 PR을 올린 순간은 검증 작업의 시작점이지 끝점이 아니다.
규칙 2: 검증을 별도 티켓·별도 견적으로. 생성과 검증을 한 티켓에 묶으면 검증이 항상 과소평가된다. 큰 에이전트 산출물은 "구현" 티켓과 "검증·통합" 티켓으로 나누고, 후자를 정직하게 견적한다.
규칙 3: 에이전트 PR에는 "역방향 리뷰"를. 코드를 위에서 아래로 읽지 말고, 위 표의 다섯 가지 숨은 곳을 체크리스트로 먼저 친다. "엣지 케이스는? 통합 가정은? 테스트가 의도를 검증하나?" 표면적 완성도에 속지 않으려면 의도적으로 갭을 찾아야 한다.
규칙 4: 마지막 10%에 버퍼가 아니라 트랙을. 버퍼는 "혹시 모르니 시간을 더"다. 트랙은 "이 작업은 반드시 있고 별도로 계획한다"다. 에이전트 산출물의 마지막 10%는 혹시가 아니라 항상이다. 버퍼로 숨기지 말고 검증 트랙의 일등 시민으로 계획한다.
8장 · 리뷰가 제약일 때의 용량 계획
2장에서 병목이 리뷰로 옮겨갔다고 했다. 8장은 그 사실을 용량 계획에 반영하는 법이다.
옛 용량 계획 vs 새 용량 계획
옛 방식
팀 용량 = Σ (개인별 구현 가능 시간)
계획 = 이 용량에 맞춰 구현 작업을 채운다
새 방식
팀 용량 = MIN(생성 용량, 리뷰 용량, 통합 용량)
계획 = 가장 작은 항(보통 리뷰)에 맞춰 약속한다
제약 이론을 그대로 적용한 것이다. 생성 용량은 에이전트 덕에 사실상 무한에 가깝다. 그러니 그건 더 이상 계획의 기준이 아니다. 가장 작은 항 — 거의 항상 리뷰 — 이 팀의 진짜 처리량이다.
리뷰 용량을 실제로 계산하기
리뷰 용량은 추상적이지 않다. 측정 가능하다.
리뷰 용량 (PR/주)
= 리뷰어 수
× 인당 주간 리뷰 가능 시간
÷ PR당 평균 리뷰 시간
예시:
리뷰어 4명
× 인당 주 6시간 (리뷰에 쓸 수 있는 현실적 시간)
÷ PR당 1.5시간 (에이전트 PR은 더 걸린다)
= 16 PR/주
이 16이라는 숫자가 스프린트 약속의 상한이다. 에이전트가 주에 50개 PR을 만들 수 있어도, 팀이 약속할 수 있는 건 16개 분량이다. 나머지 34개를 만드는 건 진척이 아니라 큐 적체다.
리뷰 용량을 늘리는 레버
리뷰가 제약이면, 개선은 리뷰 용량을 늘리는 데서 온다. 다른 데를 개선하면 낭비다.
| 레버 | 효과 | 비용·위험 |
|---|---|---|
| PR을 작게 | PR당 리뷰 시간 단축. 가장 효과 큼 | 에이전트에 작은 단위로 위임하는 규율 필요 |
| 리뷰어 늘리기 | 리뷰어 수 증가 | 시니어 시간은 희소. 주니어는 에이전트 PR 리뷰가 어려움 |
| 자동 게이트 강화 | 사람 리뷰 전 기계가 거름 | 린트·타입·테스트·정적분석에 선투자 |
| 에이전트 자체 리뷰 | 1차 패스를 에이전트가 | 2차 사람 리뷰는 여전히 필수. 맹신 금물 |
| 명세 명확화 | 애초에 리뷰할 게 줄어듦 | 설계·명세에 시간 선투자 |
가장 효과가 큰 건 보통 PR을 작게 만드는 것이다. 리뷰 시간은 PR 크기에 선형이 아니라 초선형으로 증가한다 — 큰 PR은 사람이 머릿속에 다 담지 못해서 더 느리고 더 부정확하다. 에이전트에게 "이 기능 전체를 한 PR로"가 아니라 "이 기능을 5개 작은 PR로 쪼개서"라고 위임하는 규율이 용량을 가장 크게 늘린다.
용량 계획 회의의 새 안건
스프린트 용량 계획 — 새 체크리스트
□ 이번 스프린트 리뷰 용량은 몇 PR인가? (위 공식으로 계산)
□ 통합·QA 용량은? (머지 충돌·환경 시간 포함)
□ 둘 중 작은 값이 스프린트 약속의 상한
□ 생성 트랙은 그 상한에 맞춰 WIP 제한 설정
□ 시니어 리뷰 시간이 봉우리 B에 충분히 남는가?
마지막 항목이 미묘하지만 중요하다. 시니어가 봉우리 A의 에이전트 PR을 리뷰하느라 시간을 다 쓰면, 봉우리 B의 진짜 어려운 일을 할 사람이 없어진다. 리뷰 용량을 계획할 때 시니어의 깊은 작업 시간을 먼저 떼어 놓아야 한다.
9장 · 여전히 의미 있는 지표 — 리드 타임, 탈출률, 리뷰 지연
스토리 포인트와 벨로시티가 흔들렸다고 측정을 포기할 순 없다. 다행히 흔들리지 않는 지표들이 있다. 공통점: 이들은 "노력"을 측정하지 않고 "흐름"과 "결과"를 측정한다. 그래서 AI가 노력을 바꿔도 의미가 유지된다.
지표 1: 리드 타임 (Lead Time)
작업이 시작된 순간부터 배포되어 사용자에게 닿기까지의 캘린더 시간.
왜 살아남는가: 리드 타임은 생성 시간이 아니라 전체 흐름을 본다. 에이전트가 구현을 0으로 만들어도, 리드 타임이 안 줄면 병목이 다른 데 있다는 뜻이다. 리드 타임은 그 병목을 숨기지 않는다.
리드 타임 분해 (병목 진단용)
[대기] → [생성] → [리뷰 대기] → [리뷰] → [통합] → [배포]
↑
여기가 길어졌으면 리뷰가 제약
리드 타임을 단계별로 쪼개면 어느 단계가 부풀었는지 바로 보인다. AI 시대에는 거의 항상 "리뷰 대기" 구간이 범인이다.
지표 2: 탈출률 (Escape Rate)
프로덕션까지 빠져나간 결함의 비율. 리뷰·QA를 통과했지만 사용자가 발견한 버그.
왜 중요해졌는가: 에이전트 코드의 "90% 완료 함정"(7장)이 정확히 탈출률로 나타난다. 표면적으로 완성돼 보이는 PR이 리뷰를 통과하기 쉽고, 숨은 갭이 프로덕션에서 터진다. 탈출률이 오르면 검증 트랙이 생성 속도를 못 따라가고 있다는 직접 증거다.
탈출률이 오르는데 벨로시티(생성 속도)도 오르고 있다면, 그건 좋은 게 아니다. 검증되지 않은 코드를 빠르게 내보내고 있을 뿐이다.
지표 3: 리뷰 지연 (Review Latency)
PR이 올라온 시각부터 리뷰가 시작되는 시각까지의 시간. 리뷰에 걸리는 시간이 아니라 리뷰를 기다리는 시간.
왜 핵심 지표인가: 리뷰 지연은 리뷰 큐의 길이를 직접 보여준다. 2장·8장에서 본 새 병목의 체온계다.
리뷰 지연이 말해주는 것
지연 ≈ 0 → 리뷰 용량 여유. 생성 트랙을 더 돌려도 됨
지연 증가 추세 → 큐 적체 시작. 생성 트랙 조절 필요
지연 폭증 → 병목 심각. 즉시 WIP 제한 강화
리뷰 지연은 선행 지표다. 리드 타임은 사후에 "느렸다"고 알려주지만, 리뷰 지연은 "지금 막히고 있다"를 실시간으로 알려준다.
지표 4: 봉우리 B 처리량 (4장 재등장)
어려운 작업(유형 B·C)의 스프린트당 완료 수. 4장에서 강조한 그 지표.
왜 분기 계획의 기준인가: 봉우리 A는 에이전트가 처리하니 신축적이다. 하지만 봉우리 B는 사람의 깊은 사고가 상한이고, 그게 팀이 실제로 만들 수 있는 가치의 한계다. 로드맵 약속은 봉우리 A의 빠른 처리에 취하지 말고 봉우리 B 처리량에 근거해야 한다.
지표 종합
| 지표 | 측정하는 것 | AI 시대 역할 |
|---|---|---|
| 리드 타임 | 전체 흐름 시간 | 병목 위치 진단 |
| 탈출률 | 검증을 빠져나간 결함 | 검증 트랙 건강도 |
| 리뷰 지연 | 리뷰 큐 길이 | 병목 선행 경보 |
| 봉우리 B 처리량 | 어려운 일의 속도 | 분기·로드맵 계획 기준 |
이 네 가지의 공통점을 다시 강조한다. 하나도 "코드를 얼마나 빨리 짰나"를 측정하지 않는다. 전부 흐름·결과·역량을 측정한다. 그래서 AI가 구현을 공짜로 만들어도 의미가 그대로 유지된다. 측정해야 할 것은 처음부터 노력이 아니라 흐름이었다 — AI 시대는 그저 그 사실을 더 이상 무시할 수 없게 만들었을 뿐이다.
에필로그 — 무너진 자리에서 다시 세우기
견적이 망가졌다는 말은 절반만 맞다. 노력 기반 견적이 망가졌다. 흐름 기반 계획은 멀쩡하다 — 오히려 AI 시대에 더 또렷해졌다. 우리가 할 일은 측정을 포기하는 게 아니라, 측정의 대상을 노력에서 흐름으로 옮기는 것이다.
핵심을 한 문장으로: 에이전트는 구현을 공짜로 만들었고, 그래서 병목은 리뷰·통합으로 옮겨갔으며, 계획과 측정의 중심도 거기로 옮겨가야 한다.
실전 체크리스트
다음 스프린트 계획 회의 전에 점검할 것들.
- 견적은 범위로. 단일 포인트를 버리고 낙관-비관 범위로 견적한다. 범위의 폭을 불확실성의 신호로 읽는다.
- 넓은 견적엔 스파이크 먼저. 폭이 넓은 티켓은 스프린트에 직접 넣지 말고 타임박스 스파이크를 먼저 넣어 재견적한다.
- 벨로시티를 두 봉우리로 쪼갠다. 평균을 버리고 봉우리 A(사소)와 봉우리 B(어려움)를 따로 추적한다. 분기 계획은 봉우리 B 기준.
- 스프린트 약속을 검증 트랙으로. "코드를 짜겠다"가 아니라 "검증하고 통합하고 배포하겠다"를 약속한다.
- 생성 트랙에 WIP 제한. 리뷰 큐가 소화할 수 있는 만큼만 에이전트에게 위임한다. 미머지 PR은 자산이 아니라 부채다.
- 리뷰 용량을 숫자로 계산한다. 리뷰어 수 × 주간 리뷰 시간 ÷ PR당 리뷰 시간. 이 값이 스프린트 약속의 상한.
- PR을 작게 위임한다. 리뷰 시간은 PR 크기에 초선형. 작은 PR이 리뷰 용량을 가장 크게 늘린다.
- 에이전트 PR은 "0% 완료"로 본다. PR 생성은 검증의 시작점. 검증·통합을 별도 티켓·별도 견적으로.
- 숨은 갭을 체크리스트로 친다. 엣지 케이스, 통합 가정, 비기능 요구, 테스트의 빈틈, 에러 처리 — 위에서 아래로 읽지 말고 갭을 먼저 찾는다.
- 흔들리지 않는 지표를 본다. 리드 타임, 탈출률, 리뷰 지연, 봉우리 B 처리량. 이 넷은 노력이 아니라 흐름을 측정한다.
안티패턴
피해야 할 것들. 하나씩 다 흔한 실수다.
- 벨로시티 평균에 매달리기. 쌍봉 분포의 평균은 아무도 살지 않는 골짜기다. 평균이 올랐다고 좋아하거나 떨어졌다고 걱정하기 전에 어느 봉우리인지 묻는다.
- AI 활용률을 목표로 삼기. "AI 보조 PR 80%" 같은 목표는 도구 사용 자체를 목적으로 만든다. AI는 도구지 목표가 아니다.
- 줄 수로 기여 측정하기. AI가 짠 코드 줄 수를 자랑하는 보고서는 과잉 생성을 보상하고 아무 결정도 못 내리게 한다.
- 생성 트랙을 무제한으로 돌리기. 에이전트가 만들 수 있다고 다 만들게 두면 리뷰 큐가 끝없이 길어진다. 진척처럼 보이는 재고 과잉이다.
- "PR 올라옴 = 완료"로 처리하기. 에이전트 PR은 표면적으로 완성돼 보인다. PR 생성을 완료로 세면 검증이 항상 과소평가된다.
- 시니어를 에이전트 PR 리뷰로 소진하기. 시니어가 봉우리 A 리뷰에 시간을 다 쓰면 봉우리 B의 진짜 어려운 일을 할 사람이 없다. 시니어의 깊은 작업 시간을 먼저 떼어 놓는다.
- 검증이 제약인데 생성 도구에 더 투자하기. 병목이 아닌 곳을 개선하는 건 낭비다. 제약 — 거의 항상 리뷰 — 에 투자한다.
- 탈출률을 무시한 채 속도만 보기. 벨로시티가 오르는데 탈출률도 오르면 그건 빠른 게 아니라 검증 안 된 코드를 빠르게 내보내는 것이다.
다음 글 예고
다음 글은 **"AI 시대의 코드 리뷰: 에이전트 PR을 검증하는 실전 워크플로"**다. 이 글에서 "리뷰가 새 병목"이라고 반복했으니, 다음 글은 그 병목 안으로 들어간다. 에이전트 PR 전용 리뷰 체크리스트, 역방향 리뷰의 구체적 절차, 자동 게이트와 사람 리뷰의 역할 분담, 그리고 주니어가 에이전트 PR을 리뷰할 수 있도록 키우는 법까지 — 리뷰 용량을 실제로 늘리는 방법을 코드 레벨에서 다룬다.
견적이 망가진 자리는 빈터가 아니다. 흐름을 측정하고, 병목을 따라가고, 검증을 일등 시민으로 대접하는 — 더 정직한 계획이 들어설 자리다.
Project Scheduling in the AI Era: Rebuilding Estimation, Velocity, and Sprint Planning From the Rubble
Prologue — Estimation didn't break because we got worse at estimating
A sprint retro, sometime in 2024. A team's velocity suddenly doubled. Nobody worked longer hours. Cursor and Claude Code had simply joined the team. The next sprint, velocity dropped back by half — because only the hard tickets were left.
The team's PM said it plainly in the retro: "Our velocity chart doesn't predict anything anymore."
She was right. But it's easy to misread the cause. We didn't get worse at estimating. The unit of estimation — the quantity of "human effort" — stopped being stable.
Story points were never time. They were a bundle of effort, complexity, and uncertainty, and they worked because that bundle stayed relatively consistent within a team. A "3-pointer" felt roughly the same weight to everyone. When AI agents entered the loop, that consistency shattered. The same 3-pointer now produces a draft in 4 seconds on one day and still takes two days on another. Averaging them is meaningless — the distribution itself split into two peaks.
This post is about rebuilding scheduling on top of that split distribution. The audience is tech leads, EMs, and senior ICs. This is not an abstract "AI changed the future" essay — it's the set of things you can use in your next sprint planning meeting.
What we'll cover:
- The exact mechanism by which story points lost their meaning
- The new bottleneck is review and integration, not implementation
- Estimating AI-assisted work — ranges not points, spike-first
- Velocity is now bimodal
- Sprint planning when an agent can do 5 tickets overnight
- Tracking AI-assisted vs human work
- The "90% done" trap with agent output
- Capacity planning when review is the constraint
- Metrics that still matter — lead time, escape rate, review latency
- Epilogue — checklist and anti-patterns
Chapter 1 · The exact mechanism by which story points lost their meaning
Before blaming story points, let's name why they worked in the first place. Story points stood on three assumptions.
| Assumption | Detail | Before AI |
|---|---|---|
| Effort consistency | A "3" carries roughly the same weight across the team | Held |
| Effort as a proxy for time | Summed effort converts to calendar time | Held (via a velocity constant) |
| Complexity approximates implementation cost | Hard problems also take long to code | Held |
All three wobbled at once.
Effort consistency broke. Adding a CRUD endpoint used to be a 2. Now an agent looks at the schema and drafts it in five minutes. But debugging a distributed lock contention — a 5 — is still a 5, because AI barely helps there. The same scale now has a five-minute task and a two-day task wearing the same number.
Effort stopped being a proxy for time. Even when implementation time converges to zero, calendar time does not shrink. Code an agent wrote in 4 seconds still takes a human the same amount of time to review, integrate, and QA. The denominator of the formula that converted summed effort into time has disappeared.
Complexity and implementation cost decoupled. This is the most fundamental one. Hard problems and write-a-lot-of-code problems used to be strongly correlated. Not anymore. Work with a clear spec and a common pattern — complex or simple — gets handled fast by an agent. Conversely, work with an ambiguous spec or deep system entanglement — even with little code — still eats a whole chunk of human time.
The conclusion: you don't need to throw out story points. But you must redefine what you're estimating. Not generation time — that's near zero — but specification cost and verification cost.
Old estimate = f(implementation effort)
New estimate = f(spec clarity) + f(review + integration + QA effort)
The next chapter shows why that second term is the new bottleneck.
Chapter 2 · The new bottleneck is review and integration, not implementation
Theory of Constraints in one line: a system's throughput is set by its slowest stage. Speeding up any other stage does nothing.
Before AI, the stage-by-stage time breakdown of software delivery looked roughly like this.
[Design 15%] → [Implementation 50%] → [Review 10%] → [Integration + QA 20%] → [Deploy 5%]
^ bottleneck
Implementation was the biggest chunk, so we poured every tool into making it faster. IDEs, autocomplete, boilerplate generators. Agents are the peak of that trend — they made implementation nearly free.
So what happens when implementation becomes free? The bottleneck moves.
[Design 25%] → [Implementation 5%] → [Review 35%] → [Integration + QA 30%] → [Deploy 5%]
^ new bottleneck
Review is the new bottleneck. The reason is simple. Review is fundamentally human cognitive work, and its volume scales with the amount of code to inspect — and agents produce more code, faster. On top of that, agent code carries a different review burden than human code.
| Aspect | Human-written PR | Agent-written PR |
|---|---|---|
| Author's intent | Just ask the author | Even the (human) author doesn't fully know |
| Location of subtle bugs | Author flags "please look here" | No signal about where it's weak |
| Consistency | Consistent with the author's style | Patterns may differ file to file |
| Volume | As much as the task needs | Often more than needed (over-generation) |
| Tests | Written by the author with intent | Plausible, but can paper over gaps |
Reviewers now don't "read code" — they have to "prove the code is correct," because the shortcut of the author's intent is gone. That's slower, more tiring, and easier to slip on.
Practical implication one. If you introduce agents to a team and leave review capacity unchanged, throughput stays roughly flat. Implementation got faster, so PRs just pile up in the review queue. The queue grows, and lead time can actually increase. What got faster is "PR creation rate," not "delivery rate."
Practical implication two. Integration and QA swell along with it. More PRs mean more merge conflicts and more combinations breaking in the integration environment. An agent has no idea how its PR will conflict with someone else's unmerged PR.
That leads straight to the next chapter's estimation principle: estimate the stage humans verify, not the stage agents generate.
Chapter 3 · Estimating AI-assisted work — ranges not points, spike-first
The real reason AI-assisted work is hard to estimate is that the variance of outcomes is large. The same ticket might finish in 30 minutes or take two days. The fork between those isn't visible before you start the work.
Estimating a high-variance quantity with a single number is almost always wrong. So, two principles.
Principle 1: Estimate with ranges, not points
Instead of a single point, give an optimistic-pessimistic range. The key insight is that the width of the range is itself information.
| Estimate | Width | Meaning |
|---|---|---|
| 0.5 to 1 day | Narrow | Clear spec, common pattern. Agent will do well |
| 1 to 4 days | Wide | Something is unknown. May need a spike |
| 2 to 10 days | Very wide | Effectively unestimatable. Split it or spike it |
A wide range doesn't mean "bigger work" — it means "we don't understand this work yet." A sprint planner who sees a wide range should not inflate the number; they should take an action that reduces the uncertainty.
Principle 2: Spike-first
A wide-range ticket does not go straight into the sprint. A timeboxed spike goes in first.
Wide estimate (1 to 4 days) discovered
|
v
Timeboxed spike (2 to 4 hours)
|- have the agent prototype it
|- find the gaps in the spec
|- check the integration points
|
v
Re-estimate -> usually converges to a narrow range
Spikes got far cheaper in the AI era than before. Tell an agent "just build this for now" and you get a working prototype in 30 minutes. Even if you throw that prototype away, the process of building it surfaces the spec's ambiguities and the integration risks. That's the real value of a spike — the learning, not the code.
Re-estimate after the spike and the range usually narrows. And if it doesn't? That itself is a strong signal. This work is intrinsically uncertain, so pull it out of the sprint commitment, or break it down smaller.
The estimation workflow, summarized
1. Give the draft estimate as a range (optimistic to pessimistic)
2. If the width is narrow -> it's a sprint candidate as-is
3. If the width is wide -> put a spike into the sprint first
4. Re-estimate after the spike -> if narrowed it's a candidate, if not split it
5. Fill the sprint commitment only with "narrow range" tickets
The core message of this workflow: don't estimate the uncertain as if it were certain — do the work that reduces the uncertainty first.
Chapter 4 · Velocity is now bimodal
The statistical reason the velocity chart became meaningless is clear: the distribution of task durations shifted from unimodal to bimodal.
Before AI, a team's task-duration distribution was roughly normal. Most of the mass clustered around the mean, and the mean and median were close. Averaging was meaningful.
Before AI -- unimodal distribution
freq
| _-=#=-_
| _-=########=-_
+------------------------ task duration
mean ~ median (meaningful)
After AI, the distribution split into two peaks.
After AI -- bimodal distribution
freq
| # #
| ## ##
| ### ###
+---------------------------- task duration
peak A peak B
(trivial work, (hard work,
collapsed by agent) barely changed)
^ the "mean" between them is where nobody lives
- Peak A — collapsed work. CRUD, boilerplate, applying well-known patterns, clear refactors. Agents drove the time to near zero.
- Peak B — unchanged work. Ambiguous specs, deep system context, novel design decisions, gnarly debugging. Agents barely help.
The mean points at the valley between the two peaks. There is no actual work there. A sentence like "the average task this sprint was 1.5 days" is as hollow as saying the average family has 2.3 members.
So what do you track instead
Instead of the mean, track the two peaks separately.
| Tracked item | Measure | Why |
|---|---|---|
| Peak A throughput | Trivial tasks / sprint | Shows agent utilization |
| Peak B throughput | Hard tasks / sprint | Shows real team capacity |
| A:B ratio | The mix of the two peaks | Shows the character of the backlog |
| Valley ratio | Work stuck somewhere in the middle | Estimation-failure signal (should be near zero) |
In particular, Peak B throughput is the real signal. Peak A is handled by agents, so it can be scaled almost without limit — as long as review keeps up. But Peak B needs deep human thought, and that is the team's actual ceiling. Quarterly planning should be built on Peak B throughput.
How bimodal awareness changes the retro conversation
When "velocity dropped" comes up in a retro, ask back:
"Did Peak A drop, or did Peak B drop?"
- Peak A dropped -> the review queue is clogged, or agent usage went down. A tooling/process problem.
- Peak B dropped -> you're doing genuinely hard work, or a senior is blocked. A people/focus problem.
The same "velocity drop" calls for two completely different prescriptions. With a single mean, that distinction is impossible.
Chapter 5 · Sprint planning when an agent can do 5 tickets overnight
Now a realistic scenario. Friday evening, a senior IC hands the agent the top 5 tickets of the backlog and goes home. Monday morning, 5 PRs are up.
The premise of sprint planning wobbles. What does "the team does N points in two weeks" even mean when PR creation finishes overnight?
The common misread: the sprint is dead
It isn't. The sprint is alive. What changed is what unit the sprint commits to.
- Old sprint: "we will write this much code"
- New sprint: "we will verify, integrate, and make deployable this much code"
The 5 PRs on Monday morning are not "finished work." They are inputs that have entered the review/integration queue. The sprint commitment is a commitment to the team's ability to drain that queue.
Split sprint planning into two tracks
Track 1 -- generation track (agent-driven)
|- delegate top-of-backlog tickets to the agent
|- fast, parallel, nearly unlimited
|- output: PRs awaiting review
Track 2 -- verification track (human-driven) <- the sprint commitment lives here
|- review, integration, QA, deploy
|- strictly bound by human capacity
|- output: deployed value
The questions to weigh in the sprint planning meeting change.
| Old question | New question |
|---|---|
| How many points do we put in this sprint? | How much review/integration capacity do we have this sprint? |
| Who implements this ticket? | Who takes responsibility for verifying this PR? |
| How many days does implementation take? | How many days does it occupy on the verification track? |
Deliberately throttle the generation track
It's counterintuitive but important: you have to rein in the generation track.
If an agent makes 5 overnight, then 5 the next day, then another 5, the review queue grows without end. That isn't progress — it's excess inventory. An unmerged PR is not an asset, it's a liability — it raises the risk of merge conflicts, and the longer its assumptions about the codebase age, the harder the rebase.
The rule: only run the generation track as fast as the verification track can absorb. Once the review queue holds more than some number of PRs, don't delegate new work to the agent. It's applying a Kanban WIP limit to the review queue.
Review queue WIP limit = 3
+---------------------------------+
| Awaiting review: [PR][PR][PR] <- full
| -> stop delegating new work to the agent
| -> resume delegating once one review clears
+---------------------------------+
The core of Chapter 5: the sprint is alive, but the unit of commitment moved from generation to verification, and generation must be deliberately throttled to match verification capacity.
Chapter 6 · Tracking AI-assisted vs human work
The question "how much does AI contribute on our team" will absolutely come from leadership. How you answer it either builds or breaks team culture.
What not to track
First, the traps. Do not measure the following metrics. The moment you measure them, they get gamed.
| Bad metric | Why it's bad |
|---|---|
| Lines of code written by AI | Lines aren't value. Rewards over-generation |
| Share of AI-assisted PRs (as a target) | Makes people check the "used AI" box. Meaningless |
| Per-person AI utilization rate | Feels like surveillance. Destroys trust |
| AI vs human commit ratio | AI is a tool, not a person's competitor |
The shared problem with these metrics: they pit AI against humans, or make tool usage itself the goal. AI is a tool, like a keyboard or a compiler. Just as you don't track "compiler usage rate this quarter," "AI utilization rate" isn't worth tracking on its own.
What to track
Instead, track the character of the work. Work types, not individuals.
Ticket classification (not a personal evaluation, for understanding the backlog)
Type A: agent-driven, human-verified
-> Peak A. Fast throughput. Review is the constraint.
Type B: human-driven, agent-assisted
-> Peak B. Deep thinking. Human time is the constraint.
Type C: pure human work (design, debugging, negotiation)
-> Agent-unsuitable. Senior time is the constraint.
This classification is not an individual's scorecard. It's for understanding the composition of the backlog and planning capacity. The same person does some tickets as Type A and some as Type C. The thing being classified is the work, not the person.
The one ratio worth having
If you genuinely need an "AI impact" number, look at just this one.
Increase in Type A throughput
----------------------------- = the agent's real leverage
Review cost spent on Type A
If the numerator is comfortably larger than the denominator, the agent is a net gain. If the denominator catches up to the numerator — if review cost eats the generation gain — that's a signal to fix the process, not the tool.
How to frame it when reporting
Report to leadership like this:
"With agents, lead time on Type A work dropped by X%. As a result the bottleneck moved to review, and if we invest in review capacity next quarter we can convert that gain into throughput."
This framing is honest (no vanity numbers like "lines went up") and actionable (it points at the next investment). A sentence like "AI writes 40% of our code" is impressive but leaves you unable to make any decision.
Chapter 7 · The "90% done" trap with agent output
An old joke in software estimation: "It's 90% done, and the remaining 10% takes another 90% of the time." Agents make this trap deeper and more convincing.
Why agent output looks 90% done
Open an agent-made PR for the first time and it's impressive. The code compiles. There are tests. They pass. Variable names are clean. The structure is reasonable. It looks finished.
But "looks" is the operative word. Agents are optimized for looking plausible. The gap between surface completeness and actual completeness is wider than with human code.
Human-written code
surface completeness --------------# 70%
actual completeness -------------# 65%
(the author knows the weak spots. the gap is small.)
Agent-written code
surface completeness ----------------------# 95%
actual completeness -----------# 60%
(the gap is large. and you can't see where the gap is.)
That 35% between surface and actual is the true identity of "the remaining 10%." And this gap usually hides in the following places.
| Where it hides | Symptom |
|---|---|
| Edge cases | Only the happy path handled. Empty input, concurrency, failure paths missing |
| Integration assumptions | Freely assumes the behavior of other services or modules |
| Non-functional requirements | Works, but slow, memory-hungry, or unobservable |
| Gaps in tests | Tests exist, but verify the implementation rather than the intent |
| Error handling | There's a try/catch, but no recovery strategy |
The second-to-last one is especially dangerous. Tests an agent writes often assert exactly what the code it wrote does. Even if there's a bug, the test enshrines that bug as the "correct answer." Passing tests do not guarantee correctness.
Estimation rules to avoid the trap
Rule 1: "PR is up" is 0% done. Set the endpoint of the estimate at "deployed and observed," not "PR created." The moment an agent posts a PR is the starting point of verification work, not the endpoint.
Rule 2: Verification as a separate ticket with a separate estimate. Bundle generation and verification into one ticket and verification always gets underestimated. Split large agent output into an "implementation" ticket and a "verification + integration" ticket, and estimate the latter honestly.
Rule 3: Do a "reverse review" on agent PRs. Don't read the code top to bottom — hit the five hiding places from the table above as a checklist first. "Edge cases? Integration assumptions? Do the tests verify intent?" To avoid being fooled by surface completeness, you have to deliberately hunt for the gap.
Rule 4: Give the last 10% a track, not a buffer. A buffer is "extra time, just in case." A track is "this work definitely exists and is planned separately." The last 10% of agent output is not "in case" — it's "always." Don't hide it in a buffer; plan it as a first-class citizen of the verification track.
Chapter 8 · Capacity planning when review is the constraint
Chapter 2 said the bottleneck moved to review. Chapter 8 is about reflecting that fact in capacity planning.
Old capacity planning vs new capacity planning
Old approach
team capacity = sum of (per-person implementation hours)
planning = fill implementation work to match that capacity
New approach
team capacity = MIN(generation capacity, review capacity, integration capacity)
planning = commit to the smallest term (usually review)
This is Theory of Constraints applied directly. Generation capacity is effectively near-infinite thanks to agents. So it is no longer the basis for planning. The smallest term — almost always review — is the team's real throughput.
Actually calculating review capacity
Review capacity isn't abstract. It's measurable.
Review capacity (PRs/week)
= number of reviewers
x weekly review hours per person
/ average review time per PR
Example:
4 reviewers
x 6 hours/person/week (realistic time available for review)
/ 1.5 hours/PR (agent PRs take longer)
= 16 PRs/week
That number, 16, is the ceiling of the sprint commitment. Even if an agent can make 50 PRs a week, the team can only commit to 16 worth. Making the other 34 isn't progress — it's queue backlog.
Levers to raise review capacity
If review is the constraint, improvement comes from raising review capacity. Improving anything else is waste.
| Lever | Effect | Cost / risk |
|---|---|---|
| Smaller PRs | Shortens review time per PR. Biggest effect | Requires the discipline to delegate to the agent in small units |
| More reviewers | Increases the reviewer count | Senior time is scarce. Juniors find agent-PR review hard |
| Stronger automated gates | Machines filter before human review | Upfront investment in lint, types, tests, static analysis |
| Agent self-review | The agent does the first pass | A second human review is still mandatory. No blind faith |
| Spec clarification | Less to review in the first place | Upfront time in design and spec |
The biggest effect usually comes from smaller PRs. Review time grows not linearly but super-linearly with PR size — a large PR is slower and less accurate because a human can't hold it all in their head. The discipline of delegating to the agent as "split this feature into 5 small PRs" rather than "this whole feature as one PR" raises capacity the most.
New agenda items for the capacity planning meeting
Sprint capacity planning -- new checklist
[ ] How many PRs is this sprint's review capacity? (calculate with the formula above)
[ ] What's the integration/QA capacity? (include merge conflicts and environment time)
[ ] The smaller of the two is the ceiling of the sprint commitment
[ ] Set the generation track's WIP limit to match that ceiling
[ ] Is enough senior review time left for Peak B?
The last item is subtle but important. If seniors spend all their time reviewing Peak A agent PRs, there's no one left to do the genuinely hard work of Peak B. When planning review capacity, carve out seniors' deep-work time first.
Chapter 9 · Metrics that still matter — lead time, escape rate, review latency
Just because story points and velocity wobbled doesn't mean we abandon measurement. Fortunately, there are metrics that don't wobble. Their common trait: they don't measure "effort" — they measure "flow" and "outcomes." So even when AI changes effort, their meaning holds.
Metric 1: Lead time
The calendar time from the moment work starts until it's deployed and reaches the user.
Why it survives: lead time looks at the whole flow, not generation time. Even if an agent drives implementation to zero, if lead time doesn't shrink, the bottleneck is somewhere else. Lead time doesn't hide that bottleneck.
Lead time decomposition (for bottleneck diagnosis)
[waiting] -> [generation] -> [awaiting review] -> [review] -> [integration] -> [deploy]
^
if this got longer, review is the constraint
Break lead time down by stage and you immediately see which stage swelled. In the AI era, the culprit is almost always the "awaiting review" segment.
Metric 2: Escape rate
The proportion of defects that escaped all the way to production. Bugs that passed review and QA but were found by users.
Why it matters more now: the "90% done trap" of agent code (Chapter 7) shows up precisely as escape rate. A PR that looks finished on the surface passes review easily, and the hidden gap blows up in production. A rising escape rate is direct evidence that the verification track isn't keeping up with generation speed.
If escape rate is rising while velocity (generation speed) is also rising, that is not a good thing. You're just shipping unverified code quickly.
Metric 3: Review latency
The time from when a PR is posted to when review begins. Not the time review takes — the time spent waiting for review.
Why it's a key metric: review latency directly shows the length of the review queue. It's the thermometer of the new bottleneck from Chapters 2 and 8.
What review latency tells you
latency ~ 0 -> review capacity to spare. you can run the generation track harder
latency trending up -> queue backlog starting. throttle the generation track
latency spiking -> bottleneck is serious. tighten the WIP limit immediately
Review latency is a leading indicator. Lead time tells you after the fact that things "were slow," but review latency tells you in real time that things "are getting clogged."
Metric 4: Peak B throughput (back from Chapter 4)
The number of hard tasks (Type B and C) completed per sprint. The metric emphasized in Chapter 4.
Why it's the basis for quarterly planning: Peak A is handled by agents, so it's elastic. But Peak B is capped by deep human thought, and that is the limit of value the team can actually produce. Roadmap commitments should be grounded in Peak B throughput, not intoxicated by Peak A's fast throughput.
The metrics, together
| Metric | What it measures | Role in the AI era |
|---|---|---|
| Lead time | Total flow time | Diagnose bottleneck location |
| Escape rate | Defects that escaped verification | Health of the verification track |
| Review latency | Length of the review queue | Leading alarm for the bottleneck |
| Peak B throughput | Speed of hard work | Basis for quarterly and roadmap planning |
Let me re-emphasize what these four share. Not one of them measures "how fast you wrote code." They all measure flow, outcomes, and capacity. So even when AI makes implementation free, their meaning holds. What we should have been measuring was never effort but flow — the AI era just made that fact impossible to ignore any longer.
Epilogue — Rebuilding from the rubble
Saying estimation broke is only half right. Effort-based estimation broke. Flow-based planning is fine — it actually got clearer in the AI era. Our job is not to abandon measurement but to move the target of measurement from effort to flow.
The core in one sentence: agents made implementation free, so the bottleneck moved to review and integration, and the center of planning and measurement must move there too.
Practical checklist
Things to check before your next sprint planning meeting.
- Estimate with ranges. Drop the single point and estimate with an optimistic-pessimistic range. Read the width of the range as a signal of uncertainty.
- Wide estimates get a spike first. Don't put a wide-range ticket straight into the sprint; put a timeboxed spike in first and re-estimate.
- Split velocity into two peaks. Drop the mean and track Peak A (trivial) and Peak B (hard) separately. Plan quarters on Peak B.
- Make the sprint commitment the verification track. Commit to "we will verify, integrate, and deploy," not "we will write code."
- Put a WIP limit on the generation track. Delegate to the agent only as much as the review queue can absorb. Unmerged PRs are liabilities, not assets.
- Calculate review capacity as a number. Reviewers x weekly review hours / review time per PR. That value is the ceiling of the sprint commitment.
- Delegate small PRs. Review time is super-linear in PR size. Small PRs raise review capacity the most.
- Treat agent PRs as "0% done." PR creation is the start of verification. Make verification and integration a separate ticket with a separate estimate.
- Hit the hidden gaps with a checklist. Edge cases, integration assumptions, non-functional requirements, gaps in tests, error handling — don't read top to bottom, hunt the gap first.
- Watch the metrics that don't wobble. Lead time, escape rate, review latency, Peak B throughput. These four measure flow, not effort.
Anti-patterns
Things to avoid. Each one is a common mistake.
- Clinging to the velocity mean. The mean of a bimodal distribution is the valley where nobody lives. Before celebrating a rising mean or worrying about a falling one, ask which peak.
- Making AI utilization a target. A target like "80% AI-assisted PRs" makes tool usage itself the goal. AI is a tool, not a goal.
- Measuring contribution by lines of code. A report bragging about AI-written line counts rewards over-generation and leaves you unable to make any decision.
- Running the generation track unlimited. Letting an agent make everything it can make grows the review queue without end. It's excess inventory that looks like progress.
- Treating "PR is up" as "done." Agent PRs look finished on the surface. Counting PR creation as done means verification always gets underestimated.
- Burning seniors on agent-PR review. If seniors spend all their time on Peak A reviews, there's no one to do the genuinely hard work of Peak B. Carve out seniors' deep-work time first.
- Investing in generation tools when verification is the constraint. Improving a non-bottleneck is waste. Invest in the constraint — almost always review.
- Watching only speed while ignoring escape rate. If velocity is rising while escape rate is also rising, that's not fast — it's shipping unverified code quickly.
Next post teaser
The next post is "Code Review in the AI Era: A Practical Workflow for Verifying Agent PRs." Since this post repeated that "review is the new bottleneck," the next one goes inside that bottleneck. A review checklist dedicated to agent PRs, the concrete procedure of reverse review, the division of labor between automated gates and human review, and how to grow juniors so they can review agent PRs — we'll cover, at the code level, how to actually raise review capacity.
The place where estimation broke is not empty ground. It's where a more honest plan can stand — one that measures flow, follows the bottleneck, and treats verification as a first-class citizen.