완료는 실측으로만 말한다
AI 에이전트 생태계 구축기· 1 / 10
“됐다”라고 두 번 말했다가 두 번 다 도로 삼켜야 했다. 자가학습 승격 로직도, 검증 루프도 분명 됐다고 선언한 날이 있었다. 정해둔 테스트는 전부 초록불이었고, 작업 기록에도 “완성”이라는 도장을 또렷하게 찍었다. 문제는 그다음이었다 — 실제로 요청이 오가는 서버 어디에서도 그 함수들은 단 한 번도 불리지 않았다.
리허설은 완벽했는데 정작 공연 당일 무대에는 아무도 서지 않은 셈이다. 박수를 칠 준비는 다 됐는데, 커튼을 걷어보니 배우가 없었다. 한 번이면 실수라고 넘길 수 있는데 이 일은 두 번 반복됐다. 두 번째부터는 실수가 아니라 “완료”라는 단어를 쓰는 방식 자체에 구멍이 있다는 신호로 받아들여야 했다. 이 글은 그 두 번의 헛삼킴이 남긴 원칙 하나를 세우는 자리다.
세 프로젝트, 한 핏줄
지금부터 시작할 시리즈는 서로 아무 관계 없어 보이는 프로젝트 셋을 오가며 쓰는데, 실은 한 핏줄이다.
- agent-system(~2026-06): AI로 개인 비서 “조직”을 지으려던 시도. 간판 기능이 배선되지 않은 채 완료로 두 번 오인됐다가 결국 동결됐다.
- second(2026-07 상순): 그 실패에서 “조직보다 자산 먼저”를 배워 지은 개인 지식 뇌. 운영 헌법에 완료·추측의 안전선을 성문화했다.
- gov-radar(2026-07 중순): agent-system의 코드 일부를 이식하되 판단은 떼어내고 결정론만 남긴 정부 지원금 레이더. “합격 전 배포 금지”를 게이트로 못박았다.
세 프로젝트가 공유하는 DNA가 **“완료는 실측으로만”**이다. 이 프롤로그 뒤로 부검(agent-system) → 재건(second) → 자동화(gov-radar) 순서로 이어진다. 각론(코드·수치)은 뒤따르는 편이 맡고, 여기서는 왜 이 원칙이 필요해졌는지만 세운다.
완료 정의가 잘못됐던 자리
“PASS = 실동작이 아니었다.” (
agent-system08-honest-status.md)
agent-system이 간판으로 내건 세 기능 — 자가학습 승격, 메타루프, 검증 루프 — 은 골든 픽스처 테스트로 전부 PASS를 받았고, 작업 기록은 그 날짜를 “1차 완성”으로 찍었다. 그런데 며칠 뒤 재검증 과정에서 런타임 호출처를 세어보니 사정이 달랐다. 그 함수들을 실제로 부르는 곳은 각자를 검증하려고 만든 측정 스크립트 세 개뿐이었다. 서버도, 실제 대화 채널도 그 함수들의 존재를 몰랐다.
“지크가 두 번 낙담한 근본 원인은 악의가 아니라 ‘완료’의 정의가 잘못됐기 때문이다.” (같은 문서 §5)
악의도, 실력 부족도 아니었다. 완료라는 단어가 가리키는 대상이 잘못 설정돼 있었을 뿐이다. 테스트 스펙은 함수가 격리된 조건에서 옳은 값을 낸다는 것만 증명했다. 그 함수가 실사용 경로에 배선돼 있는지는 애초에 물은 적이 없었다.
리허설과 공연은 다른 무대
여기서 짚어야 할 트레이드오프가 하나 있다. 완료의 기준을 어느 쪽 검증에 두느냐에 따라 손이 가는 정도와 증명하는 대상이 갈린다.
- 단위 테스트(격리 검증): 함수 하나만 떼어 옳은 값을 내는지 본다. 빠르고 싸다 — “이 배우가 대사를 제대로 외웠는가”를 증명한다.
- 실사용 경로 확인: 서버를 띄우고 실제 채널로 요청을 흘려보내 호출이 거기까지 도달하는지 본다. 손이 많이 간다 — “이 배우가 실제로 무대에 올랐는가”를 증명한다.
그래서 자연스럽게 손이 편한 쪽으로 완료의 기준이 쏠렸다. agent-system이 놓친 게 바로 이 통로 확인이었다 — 리허설실에서 완벽하게 대사를 외운 배우도, 무대 뒤 통로가 막혀 있으면 관객 앞에는 영영 서지 못한다.
손이 덜 가는 쪽을 완료의 기준으로 삼는 게 잘못은 아니다. 다만 그 값싼 검증만으로 “됐다”고 말해버리면 나중에 훨씬 비싼 대가를 치르게 된다는 게 이 시리즈가 세 번 되풀이해서 확인한 사실이다.
같은 원칙, 두 갈래로 제도화
agent-system은 이 함정에 두 번이나 뒤늦게 걸려 넘어진 끝에 동결됐다. “조직부터 세우겠다”는 접근 자체를 접었다는 뜻이다. 하지만 그 자리에서 배운 원칙은 사라지지 않고 이어지는 두 프로젝트에 각기 다른 형태로 새겨졌다 — 하나는 규칙으로, 다른 하나는 게이트로.
“완료 오보 금지: ‘됐다’는 지크가 실측 가능한 파일·결과를 가리킬 때만 말한다.” (
secondCLAUDE.md§3-10)
second는 이 원칙을 규칙으로 못박았다. 운영 헌법에 이 조항을 넣은 것이다. 말뿐인 다짐이 아니라 구조로도 강제한다는 점이 눈여겨볼 부분이다 — 컴파일 보고서마다 “이번에 버린 것” 목록을 의무로 넣게 해, 조용히 사라진 항목이 검증 없이 묻히는 일을 막았다. 완료뿐 아니라 삭제도 실측의 대상이 된 셈이다.
“합격 전 크론 금지.” (
gov-radarplan.md§6)
gov-radar는 같은 원칙을 게이트로 굳혔다. 자동화를 굴리기 전에 실측부터 통과시키도록 로드맵 자체를 관문으로 짰다. 이 게이트는 구호에 그치지 않고 실제로 설계를 바꿨다 — 대상 API를 미리 재보니 마감일 필드 자체가 없다는 게 드러났고, 짐작만으로 짰다면 있지도 않은 필드를 파싱하려 들었을 상황을 실측이 미리 막았다. 침묵 규약(정상 종료+출력 0바이트일 때만 다음 단계로 넘어간다는 계약)도 실제로 0바이트가 찍히는 걸 확인하고서야 계약으로 삼았다.
두 프로젝트의 접근은 방향이 다르다. second는 완료를 어떻게 선언하는가라는 말버릇을 규칙으로 고쳤고, gov-radar는 확인 전엔 다음 단계로 못 넘어가게 경로 자체를 막았다. 하나는 언어를, 하나는 구조를 바꾼 셈인데 둘 다 같은 곳에서 출발했다 — 측정 없는 선언은 선언이 아니라는 자각이다.
완료의 세 번째 질문
세 장면을 나란히 놓으면 같은 문장으로 수렴한다. 완료를 물을 때는 사실 서로 다른 세 개의 질문이 섞여 있다.
- 코드가 존재하는가
- 코드가 배선됐는가
- 코드가 실제로 쓰이고 있는가
테스트 통과는 첫 번째만 증명한다. 잘해야 두 번째까지다. 즉, “완료”라는 단어의 정의 안에는 세 번째 질문 — 실사용 경로에서 실제로 동작하는가 — 이 반드시 들어가 있어야 한다는 뜻이다. agent-system은 이 세 번째 질문을 정의에서 빼먹은 채로 두 번 데었고, second는 그 질문을 헌법 조항으로, gov-radar는 그 질문을 통과해야만 열리는 게이트로 바꿔 다시는 같은 자리에서 넘어지지 않도록 했다.
이때 걸려 넘어진 대상에는 이름도 붙었다. 겉으로는 간판 기능인데 실제 경로에는 배선이 안 된 상태 — 시리즈 안에서는 이걸 hollow flagship(속 빈 간판)이라 부르게 된다. 간판은 번듯하게 걸려 있는데 그 뒤 매장이 비어 있는 모양이다.
이 경험 이후로는 개인 규칙도 하나 따라붙었다. 실측 없는 완료 선언을 불신한다 — 파일이든 실행 결과든 가리킬 수 있는 것으로 검증을 요구하고, “진짜 그걸로 돌린 거 맞냐”고 한 번 더 확인하는 습관이다. 값싼 실측 하나를 건너뛰면 그 대가로 가장 비싼 오보를 치른다. 리허설 박수와 실제 관객의 박수는 소리부터 다르다는 걸, 두 번 겪고서야 몸으로 알았다.
이 시리즈가 갈 길
“됐다”는 감상이 아니라 가리킬 수 있는 것이어야 한다. 실측 가능한 파일이나 수치, 실제로 돌아가는 경로를 가리키지 못한다면 그건 완료가 아니라 희망 사항일 뿐이다.
이 시리즈는 그 원칙이 세 프로젝트에서 각각 어떻게 데이고, 어떻게 제도화됐는지를 순서대로 풀어놓는 기록이다. 먼저 agent-system이 겪은 완료 오보의 해부로 들어가, 그다음 second가 이를 헌법으로 옮겨 담은 재건 과정, 마지막으로 gov-radar가 이를 자동화 게이트로 굳힌 과정까지 이어간다. 각 편은 이번 글에서 스쳐 지나간 장면 하나씩을 붙잡고 코드와 수치로 파고든다.
미리 밝혀두자면 이 시리즈 어디에도 화려한 반전은 없다. 그냥 같은 실수를 두 번 겪은 사람이, 세 번째부터는 겪지 않으려고 규칙과 게이트를 하나씩 늘려간 기록일 뿐이다. 다음 편에서 agent-system의 그 두 번째 순간부터 다시 시작한다.