문장으로 적은 정책은 잊힌다
"앞으로 이 값은 설정 파일에서만 읽어라"라고 적어 두었다고 하자. 그 문장은 세 번째 대화까지는 지켜지고, 열 번째에는 사라진다. 대화가 길어지면 앞의 지시는 뒤로 밀리고, 새 창을 열면 아예 없던 일이 된다.
같은 정책을 시험(test)으로 적으면 이야기가 달라진다. 문장은 잊히지만 시험은 깨진다. 깨지면 소리가 난다. AI가 규칙을 어겼는지 내가 기억해서 확인하는 대신, 규칙이 스스로 손을 든다.
AI와 만들 때 가장 값싼 투자는 확인을 자동으로 만드는 일이다. 확인을 사람이 하면 열 번 중 아홉 번은 건너뛴다. 그 한 번에서 사고가 난다.
붙잡아 두는 장치 다섯
1. 값은 한 곳에만 둔다
같은 숫자가 다섯 군데에 있으면 AI는 하나를 빼먹고도 다 고쳤다고 답한다. 잘 시키는 것이 아니라 고칠 곳을 하나로 줄이는 것이 해법이다. → 자세히는 L2 · 06 한 곳만 고치면 되게 만든다
2. 정책마다 시험 한 줄
"번호는 0부터 시작한다", "값이 최대치를 넘으면 더 늘지 않고 멈춘다" 같은 결정은 주석이 아니라 시험으로 남긴다. 다음에 누가(또는 AI가) 반대로 고치면 그 자리에서 빨간 줄이 뜬다.
# 정책: 점수는 최대치에서 멈춘다 (넘어가서 0으로 돌지 않는다)
def test_score_clamp():
s = Score(value=MAX_SCORE)
s.add(10)
assert s.value == MAX_SCORE # 0 으로 돌면 여기서 깨진다
시험을 직접 쓸 줄 몰라도 된다 — "이 규칙이 깨지면 알 수 있게 시험을 만들어 줘" 라고 시키면 된다. 중요한 것은 규칙을 시험으로 옮겨 두겠다는 결정이다.
3. 요구는 내 말 그대로 박아 둔다
요구사항을 정리해서 옮겨 적으면, 정리하는 과정에서 조건이 한두 개 증발한다. 실제로 한 말을 그대로 주석이나 메모에 박아 둔다. 나중에 "왜 이렇게 만들었지"를 되짚을 때, 다듬은 문장보다 날것의 한 줄이 훨씬 정확하다.
4. 문서가 아니라 대상을 잰다
"메모대로 맞는지 확인해 줘"라고 하면 메모를 읽고 맞다고 답한다. 메모가 낡았을 수 있다. 확인은 늘 실제 파일 · 실제 화면 · 실제 실행 결과를 대상으로 한다. → 자세히는 L2 · 04 문서가 아니라 대상을 재라
5. 되돌릴 수 있게 지운다
지운 것을 되살릴 수 없으면 겁이 나서 손을 못 댄다.
지우는 대신 한 칸(attic/) 옆으로 옮겨 두면 과감하게 걷어낼 수 있다.
→ 자세히는 L2 · 05 되돌릴 수 있게 지운다
중복된 설정과 잘못된 순서를 걷어낸 적이 있다. 고친 뒤 "수정 완료"라는 답을 받았지만, 실제로 확인한 것은 경고 0건 · 오류 횟수 · 실제로 돌려 본 결과값 세 가지였다. 말이 아니라 숫자가 바뀌어야 고쳐진 것이다.
정리 — 세 줄
- 문장으로 적은 정책은 잊히고, 시험으로 적은 정책은 깨진다.
- 고칠 곳을 하나로 줄이면 "빼먹고 했다고 답하는" 일이 구조적으로 사라진다.
- 완료 보고가 아니라 숫자를 확인한다. 바뀐 숫자가 없으면 안 고쳐진 것이다.
- 지금 만들고 있는 것(없으면 Claude 과정 STEP 13 의 스크립트)에서 "이건 꼭 지켜야 한다" 는 규칙 하나를 고른다.
- "이 규칙이 깨지면 알 수 있게 시험을 만들어 줘. 어떻게 돌리는지도" 라고 시킨다.
- 일부러 규칙을 어기게 한 줄 바꿔 보고 시험이 실제로 깨지는지 본다. 되돌린다.
시험이 안 깨지면 그 시험은 아무것도 지키지 않는 것이다. 3단계를 건너뛰지 않는다.
문장으로 적은 정책과 시험으로 적은 정책의 차이는?
문장은 잊히고, 시험은 깨진다. 깨지면 소리가 난다.
확인을 사람이 하면 무엇이 문제인가?
열 번 중 아홉 번은 건너뛴다. 그 한 번에서 사고가 난다. 그래서 확인을 자동으로 만든다.
"수정 완료" 라는 답을 받은 뒤 무엇을 보나?
바뀐 숫자. 경고 수, 오류 횟수, 실제 결과값. 바뀐 숫자가 없으면 안 고쳐진 것이다.