코더는 아무것도 하지 않았는데 완료 판정이 두 번 통과했습니다
목차
AI 코더에게 구현을 맡기는 흐름을 자동화하다가 완료 판정이 두 번 연속 거짓으로 통과했습니다. 두 번 모두 코더는 아무것도 하지 않은 상태였습니다. 에러는 없었고 스크립트는 다음 단계로 넘어갔습니다. 이 글은 그 두 번의 원인과 완료 신호를 화면에서 파일로 옮긴 과정을 적습니다. 전체 작업 방식은 AI 코딩, 저는 이렇게 개발하고 있습니다에 있습니다.
완료 신호를 직접 만들어야 했습니다
설계한 작업을 코더에게 보내고 끝나면 결과를 받아 오면 됩니다. 터미널 창을 관리하는 Herdr에는 지원하는 에이전트의 상태가 바뀔 때까지 기다리는 명령이 있습니다.
herdr agent prompt coder "<지시>" --wait --until done제가 쓰는 코더인 Command Code는 지원 목록에 없었습니다. Herdr가 상태를 읽지 못하니 끝났다는 신호를 직접 만들어야 했습니다. 처음 떠올린 방법은 단순했습니다. 끝나면 특정 문자열을 찍게 하고 그 문자열이 화면에 나오길 기다립니다.
herdr pane run "$PANE" cmd -p "... 마지막에 DELEGATE-RESULT 아래에 보고해" ...herdr pane wait-output "$PANE" --match 'DELEGATE-RESULT'돌리자마자 성공했습니다. 너무 빨랐습니다. 코더는 아직 아무것도 하지 않았습니다.
거짓 성공 두 번
첫 번째는 자기 명령어를 결과로 읽었습니다
감지기가 매칭한 줄은 제가 코더에게 보낸 명령어였습니다. 지시문 안에 DELEGATE-RESULT가 들어 있는데 그 명령이 터미널에 그대로 찍히니 감지기는 그것을 결과로 읽었습니다.
두 번째는 지난 실행의 흔적을 읽었습니다
지시를 파일로 빼서 명령줄에서 표식을 없애고 다시 돌렸습니다. 또 곧바로 성공했습니다. 이번에는 조금 전 실행이 남긴 DELEGATE-RESULT가 스크롤백에 그대로 있었습니다. 터미널 버퍼는 지워지지 않으니 고정된 문자열을 기다리면 과거의 성공을 지금의 성공으로 읽습니다.
두 번 다 시스템 입장에서는 정상이었습니다. 에러도 예외도 없이 다음 단계로 넘어갔습니다. 여기서 위임 자동화를 보는 기준이 바뀌었습니다. 실패는 멈추지만 거짓 성공은 계속 갑니다.
표식을 고쳐도 근거는 화면이었습니다
처음에는 표식을 고쳤습니다. 실행할 때마다 번호가 다른 표식을 쓰고 줄바꿈으로 잘리지 않은 원래 줄을 읽게 했습니다. 그걸로 실제 완료 시점에 멈추긴 했습니다.
그런데 코더를 대화형으로 띄워 두고 지시를 타이핑해 넣는 방식으로 바꾸자 한계가 보였습니다. 대화형 화면은 계속 다시 그려집니다. 표식이 나타났다 사라지고 줄이 잘리고 테두리 문자와 섞입니다. 표식을 아무리 다듬어도 근거가 화면이라는 사실은 그대로였습니다.
완료 신호를 결과 파일로 옮겼습니다
그래서 완료 신호를 화면 밖으로 옮겼습니다. 코더에게 모든 작업이 끝난 뒤 마지막 순서로 결과 파일을 쓰게 하고 그 파일이 생기는지만 봅니다.
herdr pane send-text "$PANE" "... 모든 작업이 끝나면 마지막으로 .delegate/result-$TOKEN.md 에 결과를 기록해라."for i in $(seq 1 360); do [ -f ".delegate/result-$TOKEN.md" ] && break sleep 5done화면은 계속 바뀌지만 파일은 있거나 없거나 둘 중 하나입니다. 파일 이름의 번호는 실행할 때마다 바꿉니다. 지난 실행의 결과 파일을 이번 결과로 읽는 일을 막으려는 것이고 두 번째 거짓 성공에서 배운 점입니다.
대화형으로 띄우면 코더가 파일을 쓰거나 명령을 돌릴 때마다 승인 창에서 멈춥니다. 그래서 승인을 건너뛰는 모드로 띄웁니다. 그 대가로 작업 브랜치 위에서만 돌리고 바꾼 것은 diff로 전부 확인합니다.
파일이 생겼다는 것은 끝났다는 뜻까지입니다
결과 파일은 구현 단계가 끝났다는 신호일 뿐입니다. 코더는 틀린 코드를 쓰고도 결과 파일을 만들 수 있습니다. 테스트를 고쳐 놓고 통과라고 적을 수도 있습니다. 그래서 완료 판정과 성공 판정을 나눴고 성공 판정은 다른 모델의 검토와 테스트 재실행이 맡습니다. 이 부분은 작업 방식 글의 4장에 있습니다.
덧붙임: Codex에 DeepSeek를 붙이려던 시도
코더를 고르는 과정에서 막힌 자리도 하나 적어 둡니다. 처음에는 Codex에 DeepSeek를 붙이려 했습니다. 그런데 지금 Codex는 예전 설정(wire_api = "chat")을 거부하고 Responses API 방식만 받습니다. DeepSeek가 그 경로를 지원하는 것까지는 확인했지만 계정 잔액이 없어 402에서 멈췄습니다. 지금은 크레딧으로 결제한 Command Code에 DeepSeek를 고정해 씁니다.
댓글
댓글 수정/삭제는 GitHub Discussions에서 가능합니다.