클로드 코드로 자동화 만들기 #10

무인 claude -p가 "커밋할까요?"로 끝날 때 끝줄로 잡는 법

클로드 코드로 자동화 만들기10편 중 10번째

사람 없이 도는 claude -p 작업에는 마지막 줄 모양(고침 N 같은)을 약속시키고, 그 줄이 없는 실행은 실패로 센다. 질문으로 끝난 실행도 이 검사 하나에 걸린다.

밤에 혼자 도는 브레인

회사를 그만두고 AI에게 일을 맡겨 1인 회사를 꾸리고 있다. 흩어져 있던 메모와 결정 기록을 한 곳에 모으는 회사 브레인을 저녁 한나절에 세웠고, 그 브레인을 밤마다 AI가 알아서 채우고 고치게 하려다 한 번 걸렸다.

구조는 Tina Huang의 “Obsidian in 24 Minutes” 영상에서 가져왔다. 원본 문서는 제자리에 두고 마크다운만 raw 폴더로 복사하고, wiki 폴더는 AI만 쓴다(Karpathy의 LLM Wiki 방식, 보는 건 마크다운 메모 앱 Obsidian). 첫날 wiki는 164쪽, raw는 567개가 됐다. 이걸 두 작업으로 굴린다. 매일 밤 새 원본을 80개씩 읽어 페이지에 반영하는 ingest, 일요일마다 끊긴 링크와 아무도 안 거는 고아 페이지를 고치는 fix다. 둘 다 사람이 자는 시간에 돈다.

사람이 없으니 끝났는지를 대신 알려줄 표시가 필요했다. 그래서 프롬프트 끝에 마지막 줄 모양을 정해 줬다. 정리 절차를 시킨 요청의 끝부분이 이렇다.

끝나면 log.md 에 lint 한 줄, 마지막 줄에 '고침: N'

ingest는 반영:, fix는 고침:으로 끝나야 한다. 마지막 한 줄만 읽으면 되니 스크립트가 셀 수 있고, N이 숫자라 몇 개를 손댔는지도 같이 남는다.

끝줄 자리에 “커밋할까요?”

fix를 처음 돌렸을 때 마지막 줄은 고침: N이 아니었다. “커밋할까요?“였다.

바꾼 내용을 git에 저장할지 묻는 문장이다. 사람 앞에서라면 친절한 질문인데, 일요일 밤 배치에서는 대답할 사람이 없고 그 질문은 출력 파일 맨 끝에 남은 채 아침까지 아무도 읽지 않는다. 낯선 모양도 아니었다. 그날 기록에는 “writer 질문 패턴 그대로”라고 적었다. 이 블로그 초안을 쓰는 에이전트(writer)가 전에 보인 끝맺음과 같다는 뜻이다.

끝줄이 없으면 실패로 센다

고친 곳은 두 군데다. 프롬프트에 “질문 금지·git 금지”를 넣었다. 저장 여부는 사람이 정할 일이라, AI는 묻지도 하지도 않게 했다. 그리고 약속한 끝줄(반영:/고침:)이 없으면 그 실행을 실패로 친다.

두 번째가 본체다. 금지어를 넣어도 모델은 또 다른 모양으로 끝맺을 수 있고, 그 모양을 전부 미리 적어 둘 방법은 없는데, “이 줄로 끝나야 성공”은 한 줄이라 질문이든 요약이든 중간에 끊긴 출력이든 그 줄이 없으면 한꺼번에 걸린다. 실패가 잡히면 텔레그램으로 알림이 오고, 밤 배치의 나머지 단계는 멈추지 않고 계속 돈다.

claude -p로 밤에 AI 작업을 돌린다면, 프롬프트 끝에 마지막 줄 모양을 하나 정해 두고 그 줄이 없는 실행은 실패로 세세요.

아직 확인 못 한 것

첫 lint는 문제 15개를 찍었고 15개 전부 고아 페이지였다. 그날 저녁 기록 기준으로 lint는 문제 0이다. 끝줄 검사가 실제 밤 배치에서 돈 적은 아직 없다. ingest는 밤에 한 번도 돌지 않았다. 9월 27일 아침에 ~/jaksim-brain/log.md와 .brain/ingest-*.out을 열어 마지막 줄이 반영:으로 시작하는지부터 본다.

← 전체 글