운영 노하우
예약해 둔 AI 작업이 새벽에 혼자 돌다가 아무 에러 없이 멈춰 있던 적이 있으실 겁니다. 대부분은 코드가 틀린 것이 아니라 권한 프롬프트 앞에서 멈춘 것입니다. Claude Code는 2026년 9월 2일 v2.1.259에 무인 실행 전용 옵션 --permission-prompts none을 추가했고, 이틀 뒤 9월 4일 v2.1.261에는 명령 출력이 잘리는 지점을 조절하는 설정을 더했습니다. 사람이 앉아 있는 세션에서는 티가 나지 않고, 자동화에서만 드러나는 변경입니다.
무인 실행은 에러로 죽지 않고, 거부로 멈춥니다
터미널에 앉아 작업할 때는 Claude가 위험한 명령을 만나면 "이거 실행할까요?"라고 묻고, 우리가 엔터를 칩니다. 그런데 예약 작업이나 CI처럼 아무도 없는 자리에서는 그 질문에 답할 사람이 없습니다. 공식 문서 기준으로 -p(비대화형) 실행의 시작 권한 모드는 모든 플랜에서 Manual입니다. 즉 기본값이 "매번 묻는" 상태라, 권한 모드를 따로 지정하지 않으면 자동화는 첫 번째 민감한 동작에서 걸립니다. 이때 프로그램이 죽는 것이 아니라 그 동작만 조용히 거부되고 나머지는 계속 흘러가기 때문에, 로그만 보면 "품질이 나빠서 결과가 부실하다"처럼 보입니다. 실패의 모양이 에러가 아니라 누락이라는 점이 핵심입니다.
9월 2일에 생긴 --permission-prompts none
v2.1.259에 추가된 이 옵션은 "아무도 답할 수 없다"는 사실을 실행 환경에 명시하는 스위치입니다. 이 플래그를 켜면 프롬프트가 떴을 상황은 자동으로 거부되고, 동시에 Claude에게 승인해 줄 사람이 없으니 재시도하지 말라는 사실이 전달됩니다. 같은 요청을 붙잡고 반복하다 시간을 태우는 일이 줄어듭니다. 권한 규칙과 PermissionRequest 훅, 그리고 설정한 권한 모드는 그대로 먼저 판단하고, 그 무엇으로도 결론이 안 나는 요청만 거부됩니다. 사람의 답이 필요한 도구(AskUserQuestion 등)는 아예 목록에서 빠져 호출 자체가 불가능해집니다. 참고로 이 플래그는 v2.1.259 이상에서만 동작하고, 그 이전 버전은 알 수 없는 옵션이라며 실행을 거부합니다.
거부된 항목을 눈에 보이게 만드는 법
무인 실행에서 가장 곤란한 것은 무엇이 거부됐는지 모른다는 점입니다. 출력 형식을 --output-format stream-json으로 두면 거부가 permission_denied 시스템 메시지로 흐름에 찍히고, 마지막 결과 메시지의 permission_denials 항목에 목록으로 남습니다. 자동화 스크립트에서 이 배열이 비어 있지 않으면 알림을 보내도록 걸어두면, 조용한 실패가 소리 나는 실패로 바뀝니다. 같은 맥락에서 세션 시작 이벤트의 mcp_server_errors 항목도 확인 대상입니다. 설정이 잘못된 MCP 서버는 건너뛰어진 채 실행이 정상 종료되기 때문에, 이 항목을 보지 않으면 연동이 통째로 빠진 결과를 정상으로 오해하게 됩니다.
9월 4일 추가된 출력 상한, 그리고 --bare
v2.1.261에는 bashOutputMaxChars와 taskOutputMaxChars 설정이 들어왔습니다. 명령과 백그라운드 작업의 출력을 파일로 넘기기 전에 Claude가 인라인으로 직접 받는 양을 최대 12만 8천 자까지 올릴 수 있습니다. 빌드 로그나 테스트 결과처럼 뒷부분에 결론이 있는 출력을 다룰 때, 앞부분만 보고 판단이 갈리던 문제를 줄여 줍니다. 한편 스크립트에서 결과를 일정하게 만들고 싶다면 --bare가 답입니다. 훅, 스킬, 커스텀 명령, 서브에이전트, 플러그인, MCP 서버, 자동 메모리, CLAUDE.md의 자동 탐색을 모두 건너뛰어 어느 기계에서 돌려도 같은 결과가 나옵니다. 공식 문서는 이 모드를 스크립트와 SDK 호출의 권장값으로 안내하며, 앞으로 -p의 기본값이 될 예정이라고 밝히고 있습니다. 다만 bare 모드에서는 로그인 자격증명을 읽지 않으므로 ANTHROPIC_API_KEY를 환경변수로 넣어야 합니다.
그냥 -p로 돌리면 폴더의 설정이 그대로 실행됩니다
여기서 짚고 넘어갈 부분이 있습니다. --bare 없이 -p를 쓰면, 한 번도 신뢰한 적 없는 폴더에서도 그 프로젝트의 훅이 실행되고 .mcp.json에 적힌 서버에 연결됩니다. 대화형 세션에서 보던 폴더 신뢰 확인 창도, 서버별 승인 질문도 뜨지 않습니다. 외주로 받은 소스나 남의 저장소를 자동화로 돌릴 계획이라면 이 동작을 먼저 아셔야 합니다. 잠가 두고 싶은 CI라면 권한 모드를 dontAsk로 두는 선택지도 있습니다. 허용 규칙과 읽기 전용 명령 집합에 없는 것은 전부 거부하는 모드입니다. 정리하면, 무인 실행에서 정해야 할 것은 세 가지입니다. 어떤 권한 모드로 돌릴지, 프롬프트가 떴을 때 거부할지, 그리고 그 거부를 어디서 확인할지입니다.
AI 자동화를 붙이는 일은 프롬프트를 잘 쓰는 문제로 시작해서, 결국 권한과 로그를 설계하는 문제로 끝납니다. 저도 매일 새벽에 도는 작업을 여러 개 두고 있는데, 실제로 멈추는 자리는 대부분 모델의 판단이 아니라 승인받지 못한 한 줄이었습니다. 무인 실행 옵션을 켜는 것보다 중요한 것은, 거부된 항목이 아침에 눈에 띄게 만들어 두는 일입니다. 조용한 실패를 없애는 것이 자동화의 절반입니다.
누끼토끼는 1인 운영 기준으로 AI 자동화를 붙이는 과정을 강의와 칼럼으로 계속 정리하고 있습니다. 앞서 다룬 세션 상한선 설정 칼럼이 에이전트가 과하게 도는 것을 막는 이야기였다면, 오늘 글은 반대로 필요한 동작이 조용히 막히는 쪽의 이야기입니다. 화면 앞에 있을 때는 안 보이다가 자동화에서만 드러나는 지점을 중심으로 계속 나누겠습니다.