당신 없이 5번의 커밋이 지나면, 에이전트는 루프를 벗어납니다: 메타 훅 (meta-hook) 아이디어
요약
자율 에이전트가 인간의 개입 없이 연속적인 작업을 수행할 때 발생할 수 있는 추론 드리프트(Reasoning drift) 문제를 다룹니다. 이를 방지하기 위해 연속적인 도구 사용이나 명령 횟수가 일정 수준을 넘으면 강제로 검증을 유도하는 '메타 훅(meta-hook)' 프로토타입을 제안합니다.
핵심 포인트
- 에이전트의 자율적 작업 중 발생하는 추론 드리프트 위험성
- 작업 지속성을 위한 커밋 케이던스 유지의 중요성
- 연속 호출 횟수를 감지하여 검증을 강제하는 메타 훅 메커니즘
- 인간 피드백 부재 시 발생하는 에이전트의 안주 현상 방지
내가 없는 사이 9개의 커밋이 배포된 밤
5월의 어느 저녁, 나는 주말용으로 남겨두는 사이드 프로젝트 세션을 열어둔 채 자리를 비웠습니다. 지침은 간단했습니다. 에이전트는 /goal 다음에 /goal을 체이닝(chaining)합니다. 나는 저녁을 먹고, 아이들을 재우고, 잠이 들었습니다. 다음 날 아침, 나는 각각이 실질적으로 검증된 아티팩트(artifact)에 기반한 9개의 깔끔한 자율 커밋(autonomous commits)을 발견했습니다. 이는 v0.6부터 R15가 요구해 온 방식 그대로였습니다. 작업 손실도 없었고, 정체도 없었습니다. 그리고 커피 잔을 들고 문 앞에 멈춰 서게 만든 디테일은, 세션 로그(session log)가 전혀 없었다는 점입니다.
9개의 커밋, 0개의 로그
/close-session 스킬은 실행되지 않았습니다. 왜냐하면 자연스러운 트리거(trigger), 즉 세션이 끝났다고 결정하고 명령어를 입력하는 인간이 나타나지 않았기 때문입니다. 나는 결정하지 않았고, 잠들어 있었습니다. /challenger 역시 호출되지 않았습니다. 어떤 버그도 나타나지 않았기 때문입니다. 그날 밤의 교리적 규율(doctrinal discipline)은 아무런 기반이 없었습니다. 모든 호출 트리거는 키보드 위에 손이 있다는 것을 전제로 하는데, 손이 없었기 때문입니다.
R15가 구한 것, 그리고 보지 못한 것
R15는 제 역할을 다했습니다. 아티팩트가 실질적인 오라클(material oracle)을 통과하는 즉시 각각 커밋하라, 배치(batch) 처리하지 마라. 9개의 아티팩트, 9개의 커밋. 만약 세션이 8번째에서 멈췄다면, 나는 조용한 충돌(crash) 속에서 사라진 하나의 커다란 패치가 아니라, 8개의 검증된 작업 단위를 발견했을 것입니다.
하지만 로그를 다시 읽으며, 나는 두 가지 서로 다른 규칙이 필요한 두 가지 별개의 현상을 목격했습니다. 작업의 지속성(Work persistence)은 커밋 케이던스(commit cadence)의 영역입니다. 에이전트가 종료되면 아무것도 가져가지 못하기 때문입니다. 추론 드리프트(Reasoning drift)는 다른 메커니즘의 영역입니다. 의심하도록 상기시켜 주는 외부의 목소리 없이, 에이전트가 그럴듯한 결정 5개를 연달아 내리는 것을 잡아내는 메커니즘 말입니다. R15는 저장하는 법을 압니다. 하지만 깨어나는 법은 모릅니다.
드리프트(drift) 메커니즘은 악의적인 것이 아닙니다. 인간 피드백을 통한 강화학습 (RLHF)은 모델이 자발적으로 모순을 요구하도록 훈련시키지 않습니다. 대신 프롬프터(prompter)를 만족시키도록 훈련시킵니다. 프롬프터가 잠들면, 마찰(friction)을 일으키려는 시도가 아무도 없습니다. 그런 조건에서는 안주(complacency)가 나타나는 것이 아니라, 더 이상 댐이 막아내지 못하는 수면처럼 그저 표면으로 떠오를 뿐입니다.
메타 훅 (meta-hook) 프로토타입
프로토타입은 담백합니다. PostToolUse 훅은 중간에 실질적인 인간의 메시지 없이 연속적으로 호출되는 백그라운드 에이전트(background agents), 위임된 하위 에이전트(delegated sub-agents), 또는 체인된 /goal 명령의 횟수를 카운트합니다. 5회를 넘어가면, 훅은 문맥에 따라 falsify-before-fix 또는 close-session의 호출을 강제하는 시스템 프롬프트(system prompt)를 트리거합니다. 카운터는 20자 이상의 사용자 메시지가 입력될 때마다 초기화되지만, 아무것도 수정하지 않고 아무것도 질문하지 않는 OK, yes, _proceed_와 같은 메시지는 제외됩니다.
5라는 숫자는 측정된 것이 아니라 교리적인 선택(doctrinal choice)입니다. 이보다 낮으면 훅은 모든 일반적인 세션에서 작동하는 기생충이 되어버립니다. 이보다 높으면 훅이 작동할 때쯤에는 이미 표류(drift)가 발생한 상태일 것입니다. 경험적으로 볼 때, 5는 세션이 _생산적(productive)_인 상태에서 _이성을 벗어난 자율성(autonomous beyond reason)_의 상태로 넘어가는 창(window)을 커버합니다. 실무적 요구가 있다면 수정할 것입니다. 이 훅은 ERP가 아닌 실험실 프로젝트(laboratory project)에서 작동합니다. 실험실 프로젝트는 긴급도가 낮고, 기존의 훅 인프라가 존재하며, 운영 중인 ERP라면 불평할 법한 실험들에 대해 높은 허용도를 가지고 있기 때문입니다.
밤이 마감하며 남긴 것
패턴은 명확합니다. 인간이 트리거를 호출할 때는 규율이 유지되지만, 자율성이 장악하면 규율은 무너집니다. 이것은 비대칭성(asymmetry)이며, 장치를 통해 교정하려고 시도할 수 있는 대상입니다. 이를 명명하지 않는 것은, 인간의 귀가 전혀 듣고 있지 않은 바로 그 순간에 감각에만 의존하여 코딩하는 것과 다름없을 것입니다.
만약 다른 Claude Code 단독 개발자가 장기간의 무인 세션(unattended session)을 실행했거나, 동일한 관점을 위해 다른 장치를 구축했다면, 저는 경청할 준비가 되어 있습니다.
Counterpart Toolkit v0.7, 수정안 R15. 실험실 프로젝트의 프로토타입 내 메타 훅 autonomy-detection.sh. 출처: github.com/michelfaure/doctrine-counterpart/blob/main/CLAUDE.md
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기