AI 에이전트의 최고의 성과는 아무런 출력도 내지 않는 것이다 — 그리고 그것이 핵심이다
요약
AI 에이전트 모니터링 시 불필요한 텍스트 출력을 줄이고 Unix 철학을 적용하여 효율성을 높이는 설계 방식을 제안합니다. 정상 동작 시에는 침묵하고 종료 코드(Exit Code)를 통해 상태를 전달함으로써 컨텍스트 윈도우 낭비를 방지하고 에러 식별력을 높입니다.
핵심 포인트
- 정상 동작 시 출력을 생략하여 컨텍스트 윈도우 소음 방지
- Unix 철학을 적용하여 에러 발생 시에만 stdout 사용
- 종료 코드(Exit Code)를 통한 상태 통신 방식 채택
- 결정론적 체크와 제로 토큰 경로를 통한 신뢰성 확보
- 설정 무결성과 품질 게이트를 분리한 이중 레이어 설계
나의 Stop hook은 아무것도 생성하지 않습니다. "모두 좋습니다."라거나 "체크 통과." 같은 말도 없습니다. 완전한 침묵입니다. 그리고 그것이 바로 내가 설계한 방식입니다.
대부분의 AI 모니터링은 소음이 심합니다. 모든 hook이 무언가를 출력합니다. "세션 완료!" "모든 체크 통과!" "상태: 정상." 이를 5개의 hook × 30개의 세션으로 곱하면, 아무도 읽지 않는 소음으로 컨텍스트 윈도우 (context window)를 낭비하게 됩니다.
더 나쁜 점은, 모든 것이 항상 "좋음"이라고 말할 때 당신은 읽기를 멈춘다는 것입니다. 그러다 단 한 번 무언가 고장 났을 때, 당신은 그것을 놓치게 됩니다.
아무도 AI 모니터링에 적용하지 않은 Unix 철학
Unix 명령어들은 성공했을 때 침묵합니다. cp는 "파일이 성공적으로 복사되었습니다!"라고 출력하지 않습니다. ls는 "디렉토리가 나열되었습니다!"라고 알리지 않습니다. 그들은 그저 자신의 일을 하고 입을 다뭅니다.
이것은 게으름이 아닙니다. 이것은 설계 철학입니다: 정상적인 동작은 보이지 않아야 합니다. 오직 이상 징후만이 주의를 기울일 가치가 있습니다.
그 근거는 실용적입니다: 모든 명령어가 성공 메시지를 출력하면, 중요한 에러 메시지가 거짓 안도감의 바다 속에 잠겨버립니다. 침묵은 정보의 부재가 아니라, 소음의 부재입니다.
하지만 AI 모니터링 도구들은 정반대의 패턴을 채택했습니다. 모든 hook이 출력을 생성합니다. 모든 체크가 결과를 발표합니다. 모든 세션은 아무도 읽지 않는 초록색 불빛의 벽과 함께 종료됩니다.
해결책: Stdout이 아닌 종료 코드 (Exit Code)를 통해 통신하기
delivery-gate의 두 hook은 Unix 관례를 따릅니다:
# 정상 경로: exit 0, 출력 없음
python3 ~/.claude/scripts/config-health.py --hook
# → (아무것도 출력되지 않음, 컨텍스트 윈도우 유지)
...
핵심 통찰: hook은 종료 코드 (exit code)를 통해 통신합니다. 0 = 진행. 0이 아님 = 무언가 잘못됨. stdout은 사람이 읽을 수 있는 진단용으로 예약되어 있으며, 실제로 주의가 필요한 경우에만 사용됩니다.
이것을 작동하게 만드는 세 가지 설계 결정이 있습니다:
- 결정론적 체크 (Deterministic checks)만 수행. 정규 표현식 (Regex) 패턴과 파일 수정 타임스탬프를 사용합니다. AI 추론 (Inference)은 사용하지 않습니다. 체크 과정에서 환각 (Hallucination)이 발생해서는 안 되며, 밀리초 단위로 완료되어야 합니다.
- 제로 토큰 정상 경로 (Zero-token normal path).
config-health.py는 항상 종료 코드 0을 반환합니다 (프로세스 모니터링은 소프트(soft) 방식).quality-gate.py는 모든 것이 최신 상태일 때 종료 코드 0을 반환합니다 (출력 강제는 하드(hard) 방식). 두 파일 모두 성공 시에는 아무것도 출력하지 않습니다. - 관심사의 분리 (Separation of concerns).
config-health는 프로세스(규칙, 검증, 설정 무결성)를 추적합니다.quality-gate는 출력(5개 라이브러리의 최신성, 디스크 공간)을 강제합니다. 두 개의 레이어가 각각 하나의 작업만 수행하며, 어느 쪽도 모든 것을 하려고 시도하지 않습니다.
이중 레이어 설계 (The Double-Layer Design)
단일 레이어 게이트는 너무 느슨하거나(알림 → 무시됨), 너무 엄격하여(빈번한 차단 → 우회됨) 문제가 됩니다. 두 개의 레이어는 각각 한 가지 일만 수행합니다:
| 레이어 | 문제 | 방법 | 차단 여부? |
|---|---|---|---|
| config-health | 올바르게 수행하고 있는가 | 규칙 마커(rule markers)를 카운트함 | 차단 안 함 (권고 사항일 뿐임) |
| quality-gate | 수행이 완료되었는가 | 파일 최신성을 확인함 | 3개 이상 오래된 경우 → 하드 차단 |
경계 기준은 "중요성"이 아니라 **"나중에 수정할 수 있는가?"**입니다. 누락된 규칙 실행은 소급하여 표시할 수 있습니다. 하지만 누락된 출력 기록은 영원히 사라집니다. 프로세스는 소프트(soft)하며, 출력은 하드(hard)합니다.
발생한 일
지난 2주 동안 훅(hook) 출력을 본 적이 없습니다. 아무런 문제가 없어서가 아니라, 시스템이 문제가 있을 때만 말을 하기 때문입니다.
지난주에 quality-gate가 디스크 공간이 15GB 미만이라며 세션을 차단했습니다. 만약 매 세션마다 "disk: OK"라고 출력했다면, 저는 그것을 정신적으로 필터링해 버렸을 것입니다. 하지만 99%의 시간 동안 침묵했기 때문에, 단 한 번의 알림을 놓치는 것이 불가능했습니다.
일반 원칙
정상 경로는 침묵해야 합니다. 이상 경로(Anomaly paths)는 시끄러워야 합니다. 신호 대 잡음비 (Silence-to-noise ratio)가 누군가가 실제로 알림을 읽을지 여부를 결정합니다.
이는 AI 설정 (AI config) 너머에도 적용됩니다. 당신의 모니터링 대시보드(monitoring dashboard)를 보세요. 단 하나의 빨간색 박스를 찾기 위해 얼마나 많은 초록색 박스들을 지나쳐 스크롤하고 있나요? 당신의 CI 파이프라인(CI pipeline)은 어떤가요? 읽지도 않고 아카이브(archive)해 버린 "빌드 성공" 이메일이 몇 통이나 되나요? 당신의 코드 리뷰 체크리스트(code review checklist)는 어떤가요? "좋아 보입니다(looks good)"라는 댓글 중 얼마나 많은 것들이 자동 조종(auto-pilot) 상태인가요?
침묵은 정보가 누락된 것이 아닙니다. 중요한 정보를 위한 공간을 만드는 것입니다.
직접 시도해 보세요
당신의 훅(hooks)을 점검해 보세요. 모든 "이상 없음(all good)" 또는 "성공(success)" 출력을 살펴보세요:
# 노이즈가 많은 훅 찾기
grep -r "success\|passed\|all good\|complete" ~/.claude/settings.json
성공 메시지를 삭제하세요. 에러 경로(error paths)만 남겨두세요. 미래의 당신은 실제로 그 에러들을 읽게 될 것입니다.
_delivery-gate는 Claude Code를 위한 이중 레이어 기계식 게이트(dual-layer mechanical gate)입니다. 두 개의 Python 스크립트로 구성되며, 의존성(dependencies)이 없고, MIT 라이선스를 따릅니다. checkgrow에서 자세히 살펴보세요.
이 기사는 *Engineering Trustworthy AI Output* 시리즈의 일부입니다:*
- Part 1: I Made My AI Rules Self-Verifiable — Here's How
- Part 2: Your AI Agent's Best Work Produces Zero Output — And That's the Point ← 현재 위치
- Part 3: I Built a Closed-Loop Self-Healing System for My AI Config — By Accident
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기