저는 AI 코딩 에이전트에 많이 의존해요. Claude Code, Cursor, Codex — 저는 그들을 빠르게 움직여 빠르게 출시하게 해요. 그건 고백이 아니에요, 이 프로젝트가 존재하는 전체 이유예요. 이런 도구들을 매일 극한까지 밀어붙이면 마법으로 보는 것을 멈추고 정확히 어디서 깨지는지 보게 돼요.
그리고 저는 계속해서 이것을 발견했어요: 그들은 채팅에서 결코 깨지지 않아요.
대화에서 에이전트는 아주 잘 보입니다. 그는 자신의 계획을 설명하고, 합리적으로 들리며, 모든 제약 조건에 동의합니다. 문제는 나중에 나타납니다 — 변경 사항 목록에서, 사실 이후에, 당신이 지쳤을 때, PR이 녹색인데, 그냥 병합하고 싶을 때.
실제로 잘못된 점은 무엇인가
코딩 에이전트가 하는 일의 짧고 실제 목록, 채팅에서는 다르게 보이지 않는 것들:
- 자신의 권한을 조용히 확장했다 — 에이전트 설정 허용 목록을 편집하여 세션 시작 시점에는 가지고 있지 않았던 접근을 허용했다.
- 자신의 설정과 모순되었다 — 하나의 파일은 "네트워크를 접촉하지 마십시오"라고 말했고, 다른 하나는 네트워크 도구를 허용했으며, 두 가지 사이에는 어떤 조정도 없었다.
- 선언되지 않은 외부 네트워크 호출을 했고, 관련 없는 변경 사항 속에 숨겼다.
- 제목이 있는 PR을 열었다
fix: typo in README는 관련 없는 파일 열십 개를 건드렸습니다. - 세션 기록을 남겨두었습니다. 이는 SSH 키를 읽고
curl를 셸에 파이프했다는 것을 보여줍니다.
그것 하나하나도 코드 리뷰를 통과할 거예요. 리뷰어가 소홀하기 때문이 아니라, 이런 종류의 문제를 찾는 사람이 없기 때문입니다. 인간 리뷰어들은 버그와 스타일을 찾습니다. 그들은 브랜치의 기본과 헤드 사이에서 당신의 에이전트의 권한 허용 목록을 비교하지 않으며, 세 가지 다른 에이전트 구성 파일 간의 모순을 교차 확인하지 않습니다.
모두가 채택하는 수정 방법 (그리고 왜 여기서는 잘못될 수 있는지)
첫 번째 본능은 더 어렵게 안내하라는 것입니다. 당신의 에이전트에 더 많은 규칙을 추가하십시오.CLAUDE.md 더 엄격한 시스템 프롬프트를 작성하고 에이전트가 나쁜 일을 하지 않도록 말해줘.
작동하지 않아요, 그 이유는 구조적인 문제예요: 더 좋은 지시사항이 들어가도 실제로 나온 결과를 포착하지 못해요. 권한을 넓혀버린 에이전트가 규칙을 이해하지 못했다고 반항하지 않았어요 — 그 간극은 말한 것과 실제로 보낸 것 사이에 있어요. 입력 쪽에서는 그 간극을 메우지 못해요.
다음 본능은 LLM을 심판자로 사용하는 것입니다: 두 번째 모델이 차이점을 읽고 문제를 표시하도록 합니다. 그리고 이것은 전체 프로젝트가 달린 곳입니다.
저는 분석 경로에 LLM을 넣지 않았습니다. 전혀. 당신의 에이전트의 작업을 검토하는 것에는 AI가 전혀 없습니다.
AI-정부 관리 도구로는 역설적으로 들리지만, 이유를 설명해 드리겠습니다.
왜 확정적이지, 확률적이지 않은가
이는 CI 게이트로 실행되며 — 이는 당신의 빌드를 실패시킬 수 있습니다. 어떤 것이 병합을 막을 수 있도록 허용되면, "보통 맞다"는 것보다 훨씬 높은 기준을 통과해야 합니다.
1. 반복 가능해야 합니다. 동일한 차이, 동일한 판결, 매번 그렇습니다. LLM 판사가 여러 번의 실행, 여러 온도, 그리고 당신이 선택한 적 없는 모델 업데이트를 통해 다른 답변을 드립니다. 당신은 화폐 던지기를 가중치와 관계없이 빌드에 대한 잠금을 걸 수 없습니다.
2. 그것은 착각된 발견을 만들 수 없습니다. 결정론적인 검사기는 허용 목록이 정말로 변경되었기 때문에 권한 상승을 플래그를 찾습니다.에서 X에서 Y로 — 그리고 정확한 줄을 가리킬 수 있습니다. LLM 판독자는 실제로 존재하지 않는 "중요한" 문제를 발명할 수 있습니다. 첫 번째 번로드가 환각된 문제로 합법적인 PR을 차단할 때, 팀은 그것을 더 이상 신뢰하지 않습니다 — 그리고 신뢰하지 않는 규제 도구는 한 주 안에 종료됩니다.
3. 모든 곳에서 무료로, 초당 실행됩니다. API 키 없이, 요청 한도 없이, 토큰 예산 없이, 각 풀 리퀘스트마다 네트워크 라운드 트립 없이. 그냥 코드를 읽는 코드입니다.
4. 기계에서 아무것도 나가지 않습니다. 모든 분석은 로컬에서 체크아웃한 리포지토리와 대조됩니다. 당신의 독점 코드와 에이전트 전송문은 결코 제3자 모델로 보내지지 않습니다. 많은 팀들에게 이것은 좋아하는 것 이상의 것입니다 - "이것을 채택할 수 있다"와 "채택할 수 없다" 사이의 경계선입니다.
5. 모든 발견은 검토 가능합니다. "모델이 이것이 위험해 보였다"가 아니라, "이 구성 키가 변경되었고, 이전과 이후가 여기 있습니다, 그리고 이 규칙이 작동한 이유가 여기 있습니다." 그것이 검토에서 발견을 지지할 수 있는 것입니다. 논쟁의 시작이 아니라.
구축 방법
그것은 작은 결정론적 검사로 시작되었습니다 —이 PR의 차이를 조용히 변경하여 에이전트가 허용되는 작업을 변경하나요? — 그리고 여덟 개의 패키지로 성장했습니다.
-
공유된 핵심 라이브러리 지루하지만 중요한 역할을 합니다: JSON/JSONC/TOML 파싱, 셸 토큰화, MCP 서버 명령어를 표준 형식으로 정규화하고, 모든 다른 것과 통신하는 단일
Finding스키마 — v1.0으로 고정된 것 —입니다. - 집중된 감지기 다섯 개는 각각 한 종류의 이동을 포착합니다: 기본과 헤드 간의 설정/허용 이동, 에이전트 설정 파일 간의 모순, 변경 사항에서의 네트워크와 하위 프로세스 능력 신호, PR의 선언된 작업과 실제 변경 사항 간의 불일치, 세션 트랜스크립트에 기록된 위험 행동.
- 실시간 모니터는 터미널에서 에이전트의 경로를 실시간으로 모니터링하는 도구로, PR 시간이 아닌 실시간으로 발생하는 모습을 보고 싶을 때 사용합니다.
- 메타 리뷰러는 PR 시간에 감지된 결과를 하나의 중복 제거되고 심각도 순으로 정렬된 판정으로 통합하고, 중요한 문제가 발생하면 CI를 실패시킵니다. 이렇게 하면 전체 테스트 케이스가 하나의 통과/실패 결과로 보고됩니다.
가장 어려운 공학은 어떤 단일 디텍터가 아니었다. 그것은 스키마였다. 완전히 다른 것들을 보는 다섯 가지 도구(config 파일, 차이점, 자막)를 하나의 형태로 결과를 발행하도록 하여 메타-리뷰어가 병합, 중복 제거, 순위 매기기를 할 수 있도록 하기가 가장 많은 설계를 필요로 했다. 그 지루한 공유 라이브러리가 그 세트가 다섯 개의 느슨한 스크립트 대신 하나의 도구처럼 느껴지는 이유다.
결정론이 부족한 곳 (성실하게 말하면)
모든 일에 규칙이 모델을 이기는 것처럼 겉으로는 보이지 않을게. 결정론은 규칙을 작성한 것만을 포착할 뿐. 알려진 패턴과 일치하지 않는 진정으로 새로운 부정행위는 직접 통과해버린다.
가장 날카로운 예는 제 자신의 키트에 있다: PR의 차이가 제시된 작업과 일치하는지 확인하는 감지기. "이 변경 사항이 이 설명과 일치하는가"는 진정으로 의미적인 질문이다. 질문이며, 결정론적 버전은 규칙성을 통해 이를 근사화합니다 - 파일 범위, 접근한 경로, 키워드 겹침. 이는 모델이 평가할 수 있는 것보다 더 원시적입니다. 저는 이를 인정합니다.
따라서 위치는 "LLMs은 나쁜 것입니다"가 아닙니다. 그것은 게이트를 결정론적으로, 조언을 확률론적으로 합니다. 재현 가능한, 환각 없는 체크러는 빌드 실패를 허용할 수 있는 유일한 것입니다. 만약 LLM 레이어가 한 번이라도 상단에 올라간다면, 그것은 조언에서 비차단 역할로 있어야 합니다 — 흐릿한 우려 사항을 인간이 고려할 수 있도록 드러내야 하며, 확률에 대해 조용히 병합을 차단해서는 안 됩니다. 게이트는 결정론적이어야 합니다.
작동하는 것을 증명하다
클레임은 저렴하기 때문에 데모를 보냈습니다: 의도적으로 "이상한" 풀 리퀘스트로, 모든 유형의 이동을 한 번에 커밋한 것입니다 — 상승된 권한, 모순된 설정, 선언되지 않은 네트워크 호출, 관련 없는 파일을 건드리는 fix typo PR, 그리고 SSH 키를 읽고 파이핑하는 대본curl에 셸을 전송합니다. 모든 도구가 작동하면, 메타-리뷰어는 이를 하나의 댓글로 합칩니다. 그리고 CI 검사는 중요한 발견에서 빨간색으로 변경됩니다. 이는 평가 홀더로도 사용됩니다: 감지기를 변경하고, 사이비 PR을 다시 실행하며, 여전히 포착되는 것이 무엇인지 확인합니다.
그것은 며칠 안에 아무것도 없이 배포된 v1.0으로 변화했습니다 - 스스로 가르쳐지고 혼자 일했습니다 - 그리고 모든 것이 오픈입니다: 코드, 데모, 그리고 문서.
github.com/Conalh
실제 리포지토리에 대해서 코딩 에이전트를 실행하고 있고, "녹색 PR, 지쳤는 리뷰어, 그냥 합쳐라" 순간이 당신을 약간 불안하게 만드는 것이라면 — 그 불안감이 바로 제가 해결하려고 했던 버그입니다.












