이 블로그는 밤에 사람 없이 글을 낸다. 여러 저장소의 그날 커밋을 긁어 서술로 바꾸고, 검수를 통과하면 발행한다. 며칠 껐다가 다시 켰고, 다음 날 아침에 확인했는데 새 글이 없었다.

실패 알림은 안 왔다. 실행 기록을 열어 보니 초록색이었다. 소요 시간이 14초.

처음엔 게이트를 의심했다

이 파이프라인은 검수 게이트가 여러 겹이라, 뭔가 걸려서 발행이 막혔겠거니 했다. 차단되면 알림이 오게 해 뒀지만 그 알림 경로가 죽었을 수도 있으니까. 게이트 로그부터 봤는데 아예 실행된 적이 없었다. 그 앞 단계에서 이미 끝나 있었다.

로그를 위로 올리니 두 줄이었다.

수집 대상: 2026-08-08 (KST) = 2026-08-07T15:00:00Z ~ 2026-08-08T15:00:00Z (UTC)
그날 커밋 없음 — 글은 만들지 않는다.

커밋이 없다니. 그날 작업을 한참 했는데.

두 번째 헛다리를 여기서 짚었다. 저장소 접근 권한이 빠졌나 싶었다. 실제로 같은 로그에 저장소 하나가 404로 건너뛴 흔적이 있어서 한동안 그쪽을 팠다. 그건 맞는 문제였지만 이 문제는 아니었다.

수집 대상 날짜를 다시 봤다. 8월 8일. 예약은 8월 7일 밤 11시 30분이다.

하루가 26분밖에 안 지났다

예약 시각은 23시 30분인데, 실제로 실행이 시작된 시각은 자정을 26분 넘긴 뒤였다. 56분이 밀렸다. GitHub 은 예약 작업을 정시에 띄워 준다고 보장하지 않는다. 문서에도 그렇게 적혀 있고, 알고는 있었다.

문제는 날짜를 실행 시각에서 가져오고 있었다는 것이다. 자정을 넘겼으니 대상이 어제가 아니라 시작한 지 26분 된 오늘이 됐다. 26분 동안 커밋이 없는 건 당연하고, 파이프라인은 규칙대로 “쓸 게 없으니 안 쓴다"고 판단했다.

아무것도 고장나지 않았다. 코드는 시킨 대로 했다. 23시 30분에 돌 거라는 전제 하나만 틀렸고, 그 전제는 코드 어디에도 안 적혀 있었다.

23시 30분 예약은 지연 여유가 30분이다. 한 번 밀린 게 아니라 앞으로도 밀릴 구조였다.

두 곳을 같이 고쳤다. 예약을 새벽 1시로 옮기고, 대상을 이미 끝난 어제로 바꿨다. 이제 몇 시간이 밀려도 대상은 안 변한다. 하는 김에 23시 30분부터 자정 사이 커밋도 담기게 됐다 — 전에는 매일 그 30분이 통째로 빠지고 있었는데, 이건 이번에 알았다.

고쳤더니 다음 게 나왔다

날짜를 고치니 글은 만들어지는데 매번 통계 표로 떨어졌다. 서술을 쓰는 모델은 멀쩡히 돌았고, 그걸 다른 모델이 검수한 뒤 반송하고 있었다. 사유가 늘 같았다.

판정: REJECT
- (F) "+278줄을 늘리고 -58줄을 줄였다" → 제공된 재료에서 찾을 수 없는 숫자임

지어낸 수치를 막는 항목이다. 자동 생성 글에서 제일 위험한 게 원본에 없는 숫자를 만들어 내는 일이라 넣어 둔 규칙이고, 이건 제 일을 한 것처럼 보였다. 모델이 또 헛소리를 하는구나 싶었다. 세 번째 헛다리다.

필자 쪽 프롬프트를 열어 보니 그 숫자가 있었다. 커밋마다 - 메시지 (+278/-58) 형태로 들어가 있다. 모델은 받은 걸 그대로 썼다.

검수 쪽 프롬프트에는 커밋 제목만 있었다. 숫자가 없다. 필자에게 준 재료를 검수자에게 안 준 것이다. 검수자 입장에서는 정말로 재료에 없는 숫자였고, 판정은 정확했다.

그 함수 주석에 이렇게 적혀 있었다.

판정 기준이 재료라면 재료를 다 보여줘야 한다.

같은 사유의 반송이 그날만 세 번이었다. 세 번 다 이 한 줄 때문이었고, 원칙은 이미 문서에 적혀 있었는데 구현이 반만 따르고 있었다. 이런 게 제일 안 보인다. 규칙이 없어서 생긴 구멍은 규칙을 읽으면 보이는데, 규칙은 있고 구현이 반쪽인 건 양쪽을 나란히 놓고 봐야 보인다.

아직 모르는 것

고치고 나서 며칠 돌려 봐야 안다. 지연이 몇 시간까지 나는지 실제 분포를 모른다. 한 번 56분을 봤을 뿐이고, 그게 평범한 편차인지 이상한 날이었는지 표본이 하나다. 지금 구조는 몇 시간이 밀려도 버티게 해 뒀지만, 그건 대응이지 이해가 아니다.

날짜 때문에 하루를 통째로 건너뛴 게 이번이 처음인지도 모른다. 그전 기록을 뒤지면 알 수 있을 텐데 아직 안 봤다.

지금은 종료 코드를 덜 믿는다. 이 두 건 다 exit 0 이었다. 실패 알림이 안 왔다는 건 성공했다는 뜻이 아니라 아무 일도 안 일어났다는 뜻일 수 있다는 걸 이번에 알았다. 그래서 요즘은 로그에서 뭐가 있는지보다 뭐가 없는지를 먼저 본다.