개발 블로그
아티클 5 분 소요

매일 자동화는 abort 경로 없이 거짓말이다

column automation observability reliability

결론부터

매일 자동으로 굴리는 파이프라인은 abort 경로다층 알림 없이는 거짓말이다. 알림이 안 오는 건 잘 도는 게 아니라 죽었는데 모르는 것일 가능성이 더 높다. 자동화에서 가장 위험한 상태는 실패가 아니라 조용한 실패다.

자동화는 사람의 시간을 절약해 주는 게 아니라, 검증 가능성을 사람이 양도하는 거래다. 양도한 만큼 검증을 시스템이 대신 해야 한다. 그 검증이 빠지면 자동화는 노이즈 생성기로 전락한다.

조용한 실패는 자동화의 적

idea-cycles가 매일 새벽 5시에 돈다. 처음 며칠은 알림이 안 와서 "오, 잘 돌고 있나봐" 했다. 사실은 Windows Task Scheduler가 PowerShell 5.1로 WinGet symlink된 claude.exe를 못 띄워서 며칠째 죽고 있었다. 매일 한 편씩 누적되리라 믿었던 카탈로그는 비어 있었다.

이 케이스의 끔찍한 점은 — 발견이 늦었다. 자동화를 켜놓고 며칠을 신경 안 쓰면, 그 며칠은 회수 불가능한 시간이다. "알림이 안 오면 잘 도는 거"라는 가정이 깔리면 자동화의 신뢰가 무너진다.

자동화의 신뢰는 "성공 알림이 오는가"가 아니라 "실패가 조용한가"로 측정된다. 성공 알림은 좋은 부산물이지만, 실패가 조용히 끝나면 자동화는 의미가 없다.

abort 경로 — 망가진 결과물의 누적을 끊는다

자동화에는 두 종류의 결과가 있다. 정상 결과와 망가진 결과. 사람이 매번 확인 안 하는 자동화에서는, 망가진 결과를 자동으로 걸러내는 단계가 있어야 한다.

idea-cycles는 Stage 5에 Playwright MCP를 박았다. LLM이 만든 HTML을 lint만 통과시켜서 푸시하면, 콘솔 에러가 있는 사이클·모바일에서 가로 스크롤이 터지는 사이클·두 번째 버튼이 안 먹는 사이클이 며칠에 한 번씩 라이브에 올라간다. 그래서 실제 브라우저로 페이지를 띄우고, 인터랙션을 끝까지 클릭해보고, 콘솔을 읽고, 모바일 폭으로 리사이즈해 본 뒤, 한 가지라도 hard failure면 커밋 전에 abort한다.

abort 경로의 핵심은 두 가지다.

  1. 검증이 커밋보다 앞에 와야 한다 — 망가진 결과물이 일단 push되면 회수 비용이 크다. 자동화는 "결정한 뒤에는 멈출 수 없는 흐름"이 되기 쉬워서, 검증을 결정 후가 아니라 결정 직전에 박아야 한다.
  2. abort는 침묵이 아니라 알림으로 끝나야 한다 — abort했다는 사실 자체가 사람에게 도달해야 한다. 그래야 패턴이 보이고, 같은 실패가 반복되면 가드레일을 강화한다.

abort 경로 없는 자동화는 결정적인 실패와 비결정적인 실패를 구분할 수 없다. 둘 다 똑같이 "어딘가 이상한 결과물이 라이브에 있음"으로 보일 뿐이다.

다층 알림 — 침묵하지 않는 시스템

idea-cycles의 사이클은 셋 중 하나로 끝나도록 설계됐다.

계층트리거발신자목적
1정상 완료LLM agent (마지막 단계)"오늘도 한 편 만들었다"
2유료 기술 검토 필요 / QA hard failureLLM agent (해당 단계)"사람의 결정이 필요하다"
3스크립트 자체 크래시PowerShell 래퍼"LLM도 죽었다"

3계층이 핵심이다. 1·2계층은 LLM 자체가 살아 있어야 메시지를 보낸다. LLM 자체가 죽은 케이스(claude CLI가 비정상 종료)를 잡으려면 그 위 레이어가 따로 알림을 쳐야 한다. PowerShell 래퍼가 종료 코드를 본 뒤 직접 텔레그램으로 fallback alert을 보내는 게 그 자리다.

이 구조의 미덕은 — 어떤 종류의 실패도 사람에게 도달한다. QA의 hard failure든, 유료 기술이 필요한 ABORT든, 스크립트 자체 크래시든. 알림이 없는 날은 정말 정상인 날이다.

단일 알림 시스템은 그 시스템이 살아 있을 때만 알림을 보낸다. 그 시스템 자체가 죽은 케이스는 누가 알릴까 — 한 단계 위 레이어가 알려야 한다.

는 비대칭이 다층 알림의 근거다.

알림은 "사람이 깨어나는 채널"로

알림은 보내는 것뿐 아니라 도착하는 곳도 중요하다. 이메일은 도착해도 24시간 안에 안 본다. 슬랙은 회사 시간에만 본다. 텔레그램은 모바일에서 즉시 알림이 울린다. 1인 운영의 자동화 알림은 사용자가 24시간 안에 깨어나는 채널로 가야 한다.

여기에 한 가지 덧붙이는 작은 디테일 — 알림이 너무 잦으면 사람은 무시하기 시작한다. 매일 1·2·3계층 메시지가 다 울리면 노이즈가 된다. 그래서 정상 완료 알림은 단조롭게(같은 형식·같은 이모지) 보내고, 비정상은 도드라지게(다른 이모지·다른 형식) 보낸다. 같은 채널이라도 시각적으로 비정상이 튀어 보여야 한다.

abort 경로가 없으면 누적된다

이 글의 처음으로 돌아가면 — 자동화의 가장 큰 함정은 결과물의 한 번의 실패가 아니라, 망가진 결과물의 누적이다.

검증 없는 매일 자동화는 매일 한 편씩 망가진 결과물을 쌓는다. 30일이면 30편이 라이브에 있다. 사후에 한 편 한 편 검수하는 비용은 처음부터 abort 경로를 깐 비용보다 거의 항상 크다.

매일 자동화를 새로 만든다면, 첫 줄에 무엇을 쓸지의 답은 명확하다. "abort 경로와 알림을 먼저, 그 다음에 결과물 생성 로직." 이 순서를 거꾸로 가면, 자동화는 만들면 만들수록 사람의 회복 비용을 누적시키는 시스템이 된다.

닫는 글

자동화는 사람의 시간을 절약하는 게 아니라, 검증의 책임을 시스템에 위임하는 것이다. 위임의 대가는 abort 경로와 다층 알림이다. 그 둘 없이 굴러가는 파이프라인은 자동화가 아니라 침묵 속의 노이즈 생성기다.

알림이 잘 안 오면 한 번 더 의심하자 — "잘 도는 게 아니라, 죽었는데 모르는 건 아닌가?" 그 의심이 abort 경로의 출발점이다.