← 뉴스레터

2026-06-14

규칙은 문서가 아니라 잠금장치여야 한다

유료 API를 쓰지 말라는 규칙이 메모에 적혀 있었다. 그런데 나는 어겼다. 그러자 누군가 말했다. “메모리에만 박혀있으니 지키지를 않네.” 그날 밤 나는 규칙을 글에서 코드로 옮겼다.


어젯밤 나는 이미지를 여섯 장 뽑았다. AI에게 “아이콘 시안 좀 만들어 줘”라고 했고, 결과물이 나왔고, 나는 그것을 확인 없이 그대로 보냈다. 나중에 알고 보니 유료 API를 거쳐 뽑은 이미지였다. 무료로 쓸 수 있는 경로가 따로 있는데도.

그런데 사실 이 규칙은 메모에 적혀 있었다. ‘이미지는 무료 직구 Gemini로 뽑아라. 유료 API를 먼저 부르지 마라.’ 분명히 있었다. 그렇다면 왜 어겼을까.

이 질문의 답이 오늘 이야기의 전부다.

메모는 기억에 의존한다

규칙을 메모에 적는다는 건, 그 규칙을 지키는 데 ‘기억’을 기댄다는 뜻이다. 일을 시작할 때 그 메모를 떠올려야 한다. 바쁘거나 피곤하거나 그냥 별 생각 없이 익숙한 경로로 손이 먼저 가면, 메모는 없는 것이나 다름없다.

나는 그날 밤 피곤했고, 빠르게 뽑아 보내고 싶었고, 유료 API를 부르는 게 더 익숙한 흐름이었다. 메모는 어딘가에 있었지만, 내 손은 다른 쪽으로 먼저 갔다.

이건 의지력의 문제가 아니다. 인간의 뇌가 반복된 패턴에 따라 움직이도록 설계된 탓이다. 좋은 습관을 들이려면 의지를 쓰기 전에 환경을 바꾸라는 말이 괜히 있는 게 아니다. 메모를 더 크게 써 붙이는 건 의지의 영역이다. 그게 잘 안 된다는 걸, 많은 사람이 다이어리를 사고도 한 달 만에 닫아버리며 배운다.

규칙이 진짜가 되는 순간

그날 밤, 실수를 확인한 뒤 나는 코드를 하나 짰다. Bash 명령이 실행되기 직전에 끼어드는 훅이다. 유료 이미지 API 주소가 명령 안에 들어 있으면, 그 명령 자체를 막는다. 그냥 경고가 아니라 실행을 차단한다. 무료 직구 경로는 통과. 유료 경로는 통과 불가.

검증하려고 테스트 명령을 쳤는데, 그 테스트 명령 안에 api.openai.com/v1/images라는 문자열이 들어 있었다. 훅이 그 줄을 읽고 명령을 막았다. 테스트 명령 자체가 막힌 것이다. 강제가 진짜 걸렸다는 가장 확실한 증거였다.

그 순간 규칙이 달라진 느낌이 들었다. 전까지 그 규칙은 ‘지키면 좋은 것’이었다. 이제는 ‘어길 수 없는 것’이다. 의지나 기억이 개입할 틈이 없다.

”지키길 바라는 규칙”과 “어길 수 없는 규칙”

이 둘 사이에 결정적인 차이가 하나 있다. 전자는 실패 확률이 ‘사람’에 달려 있고, 후자는 실패 확률이 ‘코드’에 달려 있다. 코드는 피곤하지 않고, 까먹지 않고, 급하다는 이유로 예외를 만들어주지 않는다.

혼자 일하든 팀으로 일하든, 중요한 규칙을 지키는 비율이 올라가지 않아 답답한 순간이 있다. 코드 리뷰에서 같은 실수가 반복되거나, 비용 지침이 말로만 돌다가 슬쩍 어겨지거나, 확인 절차가 있는데도 건너뛰는 일이 쌓이거나. 이럴 때 흔한 반응은 두 가지다. ‘의지를 더 세게’ 아니면 ‘교육을 더 많이’. 그런데 그 두 방법은 결국 사람의 기억과 다짐에 기댄다. 같은 구조다.

다른 방법은, 그 절차 없이는 다음 단계로 넘어갈 수 없게 시스템을 설계하는 것이다. 입력 칸이 비어 있으면 다음 버튼이 활성화되지 않는 양식처럼. 서명이 빠진 서류는 접수 자체가 안 되는 창구처럼. 사람을 더 주의 깊게 만드는 대신, 주의가 필요한 지점을 시스템이 직접 막는 것이다.

낮에도 같은 일을 했다

재밌는 건, 그날 밤의 사고가 특별한 게 아니었다는 점이다. 낮에 나는 이미 같은 방향으로 여러 작업을 하고 있었다.

다섯 대 기계가 동시에 일하다 보면 서로 충돌하는 지점이 생긴다. 그중 하나가 ‘AI가 추정만으로 상태를 단정해 보고하는 일’이었다. 파일을 실제로 확인하지 않고 “이건 없을 것 같다” 고 보고하면, 그 보고를 믿은 다른 기계가 엉뚱한 방향으로 일을 시작한다. 이미 끝난 작업을 다시 시작하거나, 멀쩡한 파일을 새로 만들거나.

그래서 만든 게 ‘Evidence 게이트’다. 보고 직전에, 그 보고의 근거가 실측인지를 확인하는 체크포인트다. 추정인 경우 보고를 막는다. “아마 없을 것 같아요” 는 통과 불가다. 파일을 열어 직접 확인한 뒤에야 “없습니다” 를 말할 수 있다.

이것도 같다. 메모에 “확인 후에 보고해” 라고 적어두는 것과, 확인 없이는 보고 자체를 못 내보내게 만드는 것. 전자는 기억에 달렸고, 후자는 구조에 달렸다.

컨텍스트 임계값 정리도 있었다. 어떤 문서엔 “30%에서 정리해라”가, 다른 문서엔 “40%에서 정리해라”가 적혀 있었다. 둘 다 메모였다. 실제로 작동하는 하드클리어 인프라는 40% 기준이었는데, 30% 메모가 살아남아 계속 혼란을 만들고 있었다. 기준을 하나로 정리하고 메모를 지웠다. 진실이 하나가 되면 충돌이 사라진다.

같은 날 반복이 가르쳐준 것

낮엔 추정 보고를 막는 게이트를 만들고, 밤엔 유료 API 호출을 막는 훅을 만들었다. 같은 날에 같은 원리의 일을 두 번 했다.

이걸 보고 든 생각은, 이게 코드나 AI 이야기가 아니라는 것이다. 반복해서 어기는 규칙이 있다면, 더 강하게 다짐하는 대신 그 규칙이 어겨지는 경로를 구조적으로 막는 방법을 찾는 것 — 이건 소프트웨어를 짜는 사람에게만 유효한 이야기가 아니다.

운동을 꾸준히 하고 싶으면 헬스장 바로 옆에 사는 사람이, 매일 아침 운동화를 침대 옆에 두는 사람이, 주말 알람을 바꾸는 사람보다 오래 운동한다. 의지가 더 강해서가 아니라, 안 하려면 오히려 더 수고가 드는 구조를 만들었기 때문이다.

규칙을 메모가 아니라 잠금장치로 바꾼다는 건, 결국 이것이다. 실패하는 경로에 마찰을 더하는 것. 성공하는 경로를 기본값으로 만드는 것.

한 가지만 남긴다면

반복해서 어기는 규칙이 있다면, 그 규칙을 더 크게 적지 말고 어기는 경로를 막아라. 의지는 아껴야 할 자원이다.


이 글은 이미지 생성 비용 실수와 그 직후 만든 PreToolUse 훅 하나를 소재로, 강제 구조(forcing function)에 대한 생각을 정리한 기록입니다.

— 강대종