무인 에이전트 실패 신호 설계: 침묵과 성공의 구분
무인으로 도는 에이전트를 붙일 때 제일 먼저 정할 것은 「무엇을 시킬까」가 아니다. 실패했을 때 어떻게 보이느냐다.
웹소설 집필용 Claude Code 플러그인을 하나 굴리고 있다. 거기에 매일 아침 올라온 개선 제안을 판정하는 레인을 붙였다. 열린 이슈를 읽고, 기각 이력과 대조하고, 반영·이월·기각 중 하나로 판정해 코멘트를 남긴다. 그게 전부다.
그런데 여기에 조용히 망가지는 자리가 하나 있다.
gh issue list → 실패
→ "열린 제안 없음"
→ 정상 종료
→ 초록
토큰이 만료됐거나 네트워크가 끊겼거나 권한이 바뀌었을 때, 「아무것도 못 읽었다」와 「읽었는데 아무것도 없다」가 같은 모양이 된다. 매일 초록이 쌓인다. 실제로는 몇 주째 아무것도 안 보고 있는 상황.
우리 저장소는 이 형태로 한 번 데었다. CI 를 껐던 게 그것 때문이다 — 크레딧이 막혀 job 이 시작조차 못 하는데 PR 에는 빨간 X 만 남았고, 「코드가 깨진 것」과 「CI 를 못 돌린 것」이 구분되지 않았다. 실패가 신호를 못 주면 게이트가 아니라 소음이다.
무인 레인은 반대 방향으로 같은 병을 앓는다. 성공이 신호를 못 주면 그것도 소음이다.
그래서 종료 코드를 셋으로 나눴다
판정 대기열을 고르는 부분만 스크립트로 뺐다. 이 스크립트는 판단하지 않는다. 무엇을 판정해야 하는지만 결정적으로 정한다.
| 코드 | 뜻 |
|---|---|
| 0 | 대기열을 정상 계산했다 (비어 있어도 0) |
| 2 | GitHub 를 못 읽었다 — 「할 일 없음」이 아니다 |
| 3 | 저장소 설정이 잘못됐다 |
그리고 스킬 문서에 한 줄을 박았다. 「침묵을 통과로 읽지 마라.」
붙이고 나서 확인해봤다. 토큰을 망가뜨려 돌리니 종료 코드 3 과 함께 「저장소를 못 읽었다」가 나온다. 이슈가 0건일 때는 0 과 함께 「판정 대기 0」이 나온다. 검사가 통과하는 것만 봐서는 아무것도 증명되지 않는다. 물리는지를 봐야 한다.
클라우드에서 돌리지 않은 이유
스케줄 실행은 클라우드에서 돌리거나, 내 기계에서 돌리거나, 세션 안에서 돌린다.
세션 안에서 도는 건 세션이 닫히면 사라진다. 매일 도는 일에 못 쓴다.
클라우드는 컴퓨터가 꺼져 있어도 도는 게 매력이다. 그런데 매 실행마다 저장소를 새로 clone
한다. 우리 기각 이력의 절반은 posts/ 에 있고 그 폴더는 gitignore 다. clone 에 없다.
그럼 레인은 규정을 지키면서 반쪽만 본다. 우리 절차가 「posts/ 가 없으면 없다고 말하고
CHANGELOG 만으로 진행한다」로 적혀 있으니까. 매일 규정대로 반쪽만 보고, 매일 초록이다.
거기에 하나 더. 클라우드 루틴의 GitHub 이벤트 트리거는 pull request 와 release 만 지원한다. 이슈로는 애초에 안 뜬다.
그래서 내 기계에서 도는 로컬 예약 작업을 골랐다. 「컴퓨터가 켜진 시점에 돌게 해달라」는 요구도 여기서 그냥 풀린다 — 앱이 시작되거나 컴퓨터가 깨어날 때, 지난 7일 안에 놓친 실행이 있으면 가장 최근 것 하나를 따라 돈다. 9시에 꺼져 있었으면 켤 때 한 번 돈다.
판정까지만 맡겼다
이 레인은 이슈에 코멘트를 달고 라벨을 붙이는 데서 멈춘다. 반영도, 검증도, 릴리스도 안 한다.
경계를 여기 그은 건 되돌릴 수 있느냐 때문이다.
잘못 판정하면 코멘트를 하나 더 달면 된다. 잘못 릴리스하면 이미 받아 간 사람이 있다.
무인 릴리스에는 구체적인 실패 경로가 있다. 검토 레인 두 개를 띄웠는데 하나가 조용히 죽는다. 살아남은 하나가 지적을 안 낸다. 게이트는 「유효 지적 0건」을 보고 전진한다. 태그가 나가고, 릴리스 노트에는 「독립 검토 2레인, 회수 0」이 남는다. 한 레인은 실행조차 안 됐는데.
다음 릴리스가 그 기록을 근거로 삼는 순간 거짓말이 된다.
권한도 실패 모드다
무인 레인은 승인을 기다릴 사람이 없다. 권한 프롬프트가 뜨면 그냥 멈춰 있고, 그 사이 결과는 아무 데도 안 남는다.
그래서 저장소 설정에 필요한 것을 미리 열었다. 이슈 읽기, 코멘트, 라벨, 판정 스크립트.
일부러 안 넣은 쪽이 더 중요하다. 파일 쓰기, 편집, 임의 스크립트 실행. 이 레인은 저장소를 고치면 안 되고, 고칠 수 없어야 한다. 프롬프트에 「고치지 마라」라고 적는 것과 고칠 권한이 없는 것은 다르다.
webnovel-toolkit 의 이슈 판정 레인 작업 기록. 이 툴킷이 무엇인지는
네 번의 릴리스에서 배운 것에 적어 뒀다.