두 AI가 일치 = 하나의 출처: 빈 파이프라인을 방지한 규칙
출처: Dev.to
한밤중, 두 번의 감사, 같은 점수
5월 17일 저녁, 나는 Counterpart Toolkit 0.4.1 버전을 마무리하고 외부 리뷰 두 차례를 진행하기로 했다. 나는 매니페스토와 14가지 규칙을 ChatGPT‑4o 세션에 붙여넣고, 정확히 같은 내용을 Claude.ai 웹 인터페이스에도 붙여넣었다. 기다렸다. 몇 분 뒤, 두 판정이 도착했다. 한쪽은 8/10, 다른 쪽도 8/10. 이론적 장치에 대한 비판(보르디외를 언급했지만 실질적 적용은 없었다), 동일한 간소화 제안, M1‑M5 계측의 신선함에 대한 동일한 시각 등 거의 일치했다. 내 첫 반응은 30초 정도였다. 두 독립적인 리뷰어가 같은 점수와 같은 비판을 내놓았으니, 기준이 정확히 맞춰졌고, 나는 배포해도 된다고 생각했다.
그런데 나는 멈췄다. 너무 뚜렷한 수렴이 마치 같은 공급업체에서 두 부를 사온 바람계와도 같아 보였기 때문이다.
수렴이 무엇을 측정하는지 곧 이해했다. 매우 넓은 비율로 겹치는 코퍼스를 학습한 두 언어 모델은, 기술 문서이든, 공개 GitHub 레포지토리이든, Stack Overflow 토론이든, 지난 10년간의 블로그이든, 공통된 학습 교차점 때문에 오류가 상관관계 있게 나타난다. 그들이 공유하는 것은 외부 현실이 아니라 학습 교차점이다. 두 모델이 이론적 장치가 과도하다고 판단한다면, 내가 배운 것은 “그게 사실이다”가 아니라 “그 형식이 두 코퍼스에서 흔히 결함으로 인식된다”는 것이다.
물론, 인간 리뷰어 두 명이 수렴한다면 이는 두 개의 독립된 측정이다. 하지만 그 비유는 오해의 소지가 있다. 인간 리뷰어는 서로 다른 전기, 다른 독서 경험, 때로는 상반된 사조를 가지고 있다. 두 LLM은 그런 텍스처가 없는 동일한 기반을 공유한다. 고전적 인식론에서 교차 검증은 출처의 독립성을 전제로 한다. 같은 코퍼스로 학습된 두 통계 모델은 독립성을 가정할 수 없으며, 증명도 거의 불가능하다.
이 직관 덕분에 불필요한 재작성 작업을 며칠이나 절약했을지도 모른다. 하지만 여전히 가설에 불과했다. 나는 실제적인 탐지를 원했다.
첫 번째 탐지 – 같은 날 저녁
동시에 진행하던 Godot 기반 게임 개발 프로젝트에서, 나는 지난 주에 WebFetch를 조사하고 있었다. Claude 어시스턴트가 “25 MB PDF의 전체 OCR 텍스트를 반환한다”는 주장을 했고, 나는 그 주장을 기반으로 파이프라인을 구축했다. 현재 세션에서 명령을 다시 실행해 확인해 보니, 콘솔에 maxContentLength size of 10485760 exceeded 라는 오류가 뜨며, 해당 주장은 기술적으로 불가능했다. 파이프라인은 존재하지 않는 메커니즘에 의존하고 있었다. 어시스턴트의 자신감 넘치는, 구조화된, 그리고 그럴듯한 표현 때문에 나는 테스트를 건너뛰었다.
두 번째 탐지 – 다음 날
같은 게임 개발 레포지토리에서, 대화형 감사가 “도메인의 18가지 레지던스 액션을 포함한다”는 기술 블로그를 가리켰다. 스크래핑하기 전에 블로그 인덱스에 WebFetch를 실행했더니, 원시 결과는 “개발 연대기 8개 기사, 선언된 주제와는 전혀 관련 없는 기사”였다. 즉, 주장은 일관된 환각이었다. “블로그 X는 Y를 포함한다”는 형식은 모델이 통계적으로 자주 생성하는 문장일 뿐, 실제 존재 여부를 내부 메커니즘이 검증하지 않는다.
세 번째 탐지 – 오늘 아침, 교리 자체
Claude.ai에 공유된 외부 Claude가 어제 내 doctrine-counterpart 레포를 감사하고, “6개의 SKILL.md 모두 YAML front‑matter가 손상돼 있다”는 스크린샷과 함께 7.5/10 점수를 제시했다. 나는 오늘 아침 yaml.safe_load를 12개의 SKILL.md에 적용해 보니, 11개는 정상, 1개만 손상돼 있었다. 감사자가 본 “시스템적 결함”은 실제 개별 사례가 아니라, GitHub가 front‑matter를 표로 변환해 보여주는 호스트 렌더링 특성에 불과했다.
세 가지 외부 주장 모두 검증했으며, 모두 반증되었다. 부분적인 수렴도, 미묘한 반박도 없었다. 물리적 테스트 없이는 이 비율을 감지할 수 없었을 것이다.
Counterpart Toolkit v0.7
나는 5월 20일, 위 세 사건이 발생한 이틀 뒤에 R12를 수정했다. 공식 문구는 다음과 같다.
**외부 AI(다른 Claude, ChatGPT, 대화형 스파링) 가 (a) 직접 확인 가능한 도구의 동작, (b) 외부 리소스의 내용, (c) 현장 샘플링이 가능한 시스템 구조에 대해 제시하는 모든 주장은, 아키텍처 결정에 입력하기 전에 반드시 물리적으로 테스트되어야 한다. 테스트 비용 ≈ 한 번의 셸 명령. 검증되지 않은 믿음의 비용 = 존재하지 않는 메커니즘에 기반한 전체 파이프라인. 동일한 진단을 내린 두 외부 AI 리뷰는 R5 요구에 부합하는 하나의 출처일 뿐, 두 개가 아니다. 독립적인 교차‑서브스트레이트 검증은 인간 또는 로그·메트릭·샘플 실행과 같은 물리적 탐지가 필요하다.
두 리뷰어가 하나보다 낫다고 주장하는 사람은 없을 것이다. 하지만 이 공식은 해체될 필요가 있다. LLM 두 개의 수렴은 교차 검증이 아니라, 검증되지 않은 외부 주장에 불과한 고립된 교차점이다.
물리적 반론 세 가지
- 공유 학습 통계 – 코퍼스가 크게 겹치는 두 모델은 동일한 구문 영역에서 상관된 오류를 만든다. 그들의 일치는 학습 교차점의 반영이며, 전형적인 문장(사전 학습이 “잘 형성된” 것으로 인식하는 문장)에서는 실제 진실보다 더 높은 수렴을 보인다.
- 도구·리소스에 대한 환각 – 특정 도구 동작이나 외부 리소스의 사실적 내용에 대한 주장은 두 모델이 통계적으로 가장 그럴듯한, 그러나 대개는 거짓인 결과를 내놓는다. 앞서 소개한 세 탐지는 이를 명확히 보여준다.
- 비대칭 비용 – 물리적 탐지는 셸 명령 하나, 15초 정도면 충분하다. 반면, 검증되지 않은 수렴에 기반한 아키텍처 결정은 며칠간의 재작업과 파이프라인 전면 재구축을 초래한다. R12 개정은 이러한 비대칭을 해소하기 위해, 어떠한 커밋도 주장을 입력값으로 삼기 전에 탐지를 의무화한다.
행동 지침
불신이 목표가 아니다. 탐지가 목표다. 그리고 탐지는 먼저 자신에게서 시작한다. R12를 내 주장에 먼저 적용하고, yaml.safe_load로 내 레포를 검증한 뒤에야 시각적 감사 결과를 믿어야 한다. 물리적으로 반증하지 못하는 에이전트는 ‘counterpart’가 아니라 타자를 치는 사람일 뿐이다. 두 에이전트가 테스트 없이 동의한다면, 이는 두 명의 리뷰어가 아니라 같은 타자를 복제한 것과 같다. 이 규칙은 단 한 줄 명령으로 완성된다.
외부 claim(도구/리소스/구조)에 대해 채택하기 전에:
$
레포: github.com/michelfaure/doctrine-counterpart.
R12는 CLAUDE.md에 명시되어 있으며, 세 가지 창시 사건은 v0.7-candidates.md에 문서화되어 있다. 여러분이 내리는