"필터링 기능을 추가하라"라는 계획을 받은 AI는 코드를 작성할 수 있지만, 완성 후 할 수 있는 건 "추가했습니다"라고 보고하는 것뿐입니다. 실제로 동작하는지는 AI도 알 수 없습니다.
모호한 성공 기준
기사님이 해석을 채움
“강남역”
같은 이름, 다른 역?
서울 강남역의 어느 출구?
같은 출구의 어느 계단?
기사님이 “그럴듯한” 해석 하나를 고름
구체적 성공 기준
지점이 특정됨
“강남역 2번 출구 남쪽 계단 앞”
단일 지점으로 확정
창밖과 대조 가능
기사님이 해석할 자리가 없음
목적지가 구체적일수록 AI 가 판정할 자리가 생깁니다
택시에 빗대 보겠습니다. 손님이 "강남역 가주세요" 라고만 말하면, 기사님은 같은 이름의 다른 역으로 갈 수도 있고, 같은 서울 강남역이라도 어느 출구에 세울지 판단할 근거가 없습니다. 반면 "강남역 2번 출구 앞 횡단보도"까지 정해두면 기사님이 창밖을 보며 스스로 "여기 맞다/아니다"를 판정할 수 있습니다.
계획에 "이 조건이 충족되면 완료"라는 구체적 체크리스트를 포함하면, AI는 코드 작성 후 그 조건을 직접 확인하고 스스로 루프를 돌 수 있습니다. 이것이 검증 가능한 성공 기준(Acceptance Criteria)입니다.
요구사항 형식("사용자가 ~하면, 시스템이 ~한다")과 범위 제한에 성공 기준을 붙입니다.
AI 가 실행할 수 있는 계획
요구사항
무엇을 만들 것인가
'완료' 필터 선택 시 완료 항목만 표시된다
성공 기준
어떻게 검증할 것인가
Todo 5개 (완료 2, 미완료 3)
'완료' 필터 선택
→ 2개 표시
→ 모두 완료 항목
범위 제한
무엇을 안 할 것인가
필터 조합 ×
필터 애니메이션 ×
구체적 입력과 기대 출력이 있어야 AI 가 pass/fail 을 판단할 수 있습니다
요구사항·성공 기준·범위 제한 세 가지를 갖춘 계획이 AI가 가장 잘 실행하는 계획입니다. 요구사항은 무엇을, 성공 기준은 어떻게 검증할지, 범위 제한은 무엇을 안 할지 답합니다. 성공 기준 하나를 구체적으로 쓰는 3분이 AI가 생성하는 코드 수십 줄의 방향을 결정합니다.
AI가 코드를 먼저 쓰고, 자기가 쓴 코드를 보고 테스트를 만듭니다. 정비 비유로 보면 정비사의 머릿속 점검과 같습니다.
정비사가 작업을 마치며 말합니다. "이상 없습니다." 그런데 사이드 미러 각도가 어긋난 채로 마무리됐습니다. 판정 기준이 정비사 머릿속에만 있으니 "내가 만진 부품 = 점검 대상"으로 좁게 해석됩니다. 다른 부품의 상태는 기준에 없습니다.
코드로 돌아오면, AI가 "우선순위를 선택하지 않았을 때" 처리를 빠뜨린 채 테스트를 작성하면 그 케이스는 테스트에도 들어있지 않습니다. 테스트는 전부 초록색이지만 버그는 그대로 남습니다. 이를 자기 점검 편향이라고 합니다. 자기가 쓴 코드에 맞춰 테스트를 만들다 실수를 함께 놓치는 현상입니다.
성공 기준에서 테스트를 먼저 만듭니다. 정비 비유로 보면 작업 전 점검표를 손에 드는 것과 같습니다.
점검표에 적혀 있습니다. "브레이크 패드 두께 4mm 이상, 사이드 미러 좌우 정렬, 와이퍼 양쪽 작동." 정비사가 사이드 미러를 그대로 두고 마무리해도 점검표 기준으로 대조하면 '사이드 미러 정렬' 항목이 통과하지 못합니다. 정비사가 점검표를 자기가 고칠 권한이 없으니, 사이드 미러를 다시 잡아야 비로소 통과입니다.
코드로 돌아오면, "우선순위 미선택 시 기본값이 '보통'이어야 한다"는 테스트가 먼저 존재하면, AI는 그 테스트를 통과시키기 위해 빈 값 처리를 반드시 구현합니다. 테스트가 코드보다 먼저 존재하면, AI가 자기 실수를 가릴 수 없습니다.
처음 실행하면 당연히 실패하는데, 토큰 낭비 아닌가요?
이 실패는 낭비가 아니라 테스트가 실제로 무언가를 검증하고 있다는 증거입니다. 처음부터 통과하는 테스트는 아무것도 검증하지 않을 수 있습니다.
아래 요구사항대로 필터링 기능을 추가해줘.Red Green Refactor 사이클을 따라줘. 성공 기준을 한 번에 모두 구현하지 말고, 하나씩 테스트로 바꿔 Red와 Green을 확인해줘.## 기능: Todo 필터링### 요구사항1. 사용자가 '전체' 필터를 선택하면, 모든 항목이 표시된다2. 사용자가 '진행중' 필터를 선택하면, 미완료 항목만 표시된다3. 사용자가 '완료' 필터를 선택하면, 완료 항목만 표시된다4. 현재 선택된 필터가 시각적으로 구분된다### 성공 기준- Todo 5개 (완료 2, 미완료 3) 상태에서 '전체' 선택 -> 5개 표시- 같은 상태에서 '진행중' 선택 -> 3개 표시, 모두 미완료 항목- 같은 상태에서 '완료' 선택 -> 2개 표시, 모두 완료 항목- Todo가 0개일 때 '진행중' 선택 -> '할 일이 없습니다' 메시지 표시- '완료' 필터 선택 중 Todo를 미완료로 변경 -> 해당 항목이 목록에서 사라짐- 현재 필터 버튼에 active 스타일 적용### 범위 제한- 필터 상태는 URL 파라미터로 저장하지 않는다- 필터 조합(완료 + 특정 카테고리)은 구현하지 않는다- 필터 애니메이션은 구현하지 않는다
AI가 코드베이스를 탐색한 뒤 구현 계획을 제안합니다. 이때 AI의 계획이 성공 기준(점검표)을 담았는지 다음 항목으로 확인합니다.
성공 기준의 모든 항목이 계획에 반영되었는가
범위 제한을 넘어서는 구현이 포함되지 않았는가
AI가 미해결 질문을 던졌다면 답변
계획을 승인하면 AI가 성공 기준 목록을 확인하고, 그중 하나를 실행할 수 있는 테스트로 변환합니다. 테스트가 통과하면 다음 기준으로 넘어갑니다. 모든 성공 기준이 통과하면 실제 사용자 흐름을 확인한 뒤 커밋합니다.
구체적인 입력과 기대 출력: 성공 기준은 "잘 동작한다"가 아니라 "5개 중 완료 2개 → '완료' 필터 → 2개 표시"처럼 AI가 pass/fail을 판단할 수 있는 형태로 작성합니다. "강남역"이 아니라 "강남역 2번 출구 앞 횡단보도"까지 구체적으로 정해야 합니다.
Test-First: 성공 기준(점검표)이 코드보다 먼저 존재하면, AI가 그 기준을 고칠 수 없어서 누락 없이 구현합니다. 코드 후에 테스트를 쓰면(정비사의 머릿속 점검) 자기 코드의 빈틈이 테스트에도 그대로 남습니다.
작은 검증 단위: 성공 기준 목록은 먼저 정리하되, 실행할 수 있는 테스트는 하나씩 작성합니다. Green은 기능 완성이 아니라 선택한 기준 하나의 통과를 뜻합니다. 모든 기준이 통과하면 실제 사용자 흐름을 확인합니다.
계획은 반복: 실행하면 계획 단계에서 보이지 않던 것이 보입니다. 작은 변경은 같은 세션에서 이어가고, 큰 변경은 새 세션에서 새 계획으로 다시 세웁니다.
Tip: 매번 "테스트를 먼저 작성해줘"라고 프롬프트에 쓰는 대신, CLAUDE.md에 한 번 명세하면 모든 세션에 자동 적용됩니다.
## Development Workflow- Red Green Refactor 사이클을 따른다- 성공 기준 목록을 먼저 정리한다- 실행할 수 있는 테스트는 한 번에 하나씩 작성한다- 새 테스트가 실패하는 것을 확인한 뒤(Red), 그 테스트를 통과할 만큼만 구현한다(Green)- 하나의 Green은 기능 완성이 아니라 선택한 기준 하나의 통과로 본다- 모든 기준이 통과하면 실제 사용자 흐름을 확인한다- 하나의 기능이 끝날 때마다 커밋한다
성공 기준이 포함된 계획을 세우고 Red Green Refactor로 실행하는 워크플로우를 배웠습니다. 하지만 계획에 기능이 7개, 10개씩 들어가면 context window가 가득 차고, auto-compact로 구조 정보가 유실될 수 있습니다. 다음 레슨에서는 긴 계획이 context 안에서 흐려지는 문제를 줄이기 위해, 작업을 Task로 나눠 AI가 순서와 진행 상태를 따라가게 만드는 방법을 배웁니다.