감시 장치가 세 번 거짓말을 했습니다
8월 10일 월요일 아침. 주간 회고가 올라왔습니다. "냉동 창고 온도 감시, 지난주 15건 반복 실패. 모니터링 경로 미반영 의심." 회고는 사람이 아니라 봇이 씁니다. 저는 그대로 믿고 감시 코드를 열었습니다.
열다섯 건은 전부 정상이었습니다. 온도가 기준을 넘어 경고를 보낸 것뿐이었고, 경고를 보낼 때 프로그램은 0이 아닌 숫자로 끝나게 돼 있었습니다. 실패 기록장은 0이 아니면 실패로 적었습니다. 잘 작동한 열다섯 번이 실패 열다섯 건이 됐습니다.

기록장을 만든 이유가 먼저였습니다
그 기록장은 열흘 전에 만든 것이었습니다. 그전까지 감시는 알림 한 번 울리고 사라졌습니다. "이 자동화가 이번 달 몇 번 죽었나"를 볼 방법이 없었고, 실패를 적는 코드는 146개 중 5개에만 있었습니다. 그래서 한 줄씩 쌓는 장부를 만들었는데, 장부가 첫 회고에서 오진을 냈습니다.
고친 건 한 줄입니다. "정상인데 0이 아닌" 코드를 작업마다 등록하고, 그건 실패로 안 적기.
두 번째: 이미 실행 중이라는 거짓말
8월 18일에 자동화 55개가 각자 들고 있던 안전장치를 한 곳으로 모았습니다. 배치 파일 35개에 손으로 배선하다 보니 빠뜨리는 게 생겨서였습니다. 같은 작업이 두 번 돌지 않게 잠금도 넣었습니다.
닷새 뒤, 한 작업이 17시간 동안 "이미 실행 중"이라며 건너뛰었습니다. 실행 중인 게 없었습니다. 죽은 프로세스의 번호를 다른 프로그램이 물려받았고, 잠금은 번호만 보고 살아 있다고 판단했습니다. 번호에 이름과 시작 시각을 붙였습니다.

세 번째: 성공률 100%
이 얘기는 첫 글에 썼습니다. 좌석 감시가 한 번도 좌석을 못 잡아도 장부는 전부 성공입니다. 종료 코드는 "돌았다"만 말하지 "뭘 남겼다"는 말하지 않습니다. 작업마다 "이게 돌면 이 파일이 생겨야 한다"를 적어 두고, 회고가 그걸 대조하게 했습니다.
그리고 고치는 장치가 못 고쳤습니다
8월 말에 실패 62건을 다시 봤습니다. 상위는 전부 감시·조회형이었고 원인은 대부분 로그인 만료나 일시 장애처럼 다시 돌리면 되는 것들이었습니다. 그런데도 아침마다 사람이 알림을 보고 손으로 다시 돌리고 있었습니다. 15분마다 실패한 작업을 다시 돌리고, 안 되면 진단하고, 코드가 원인이면 고쳐서 검증까지 하는 층을 붙였습니다.
9월 5일에 보니 재실행이 아홉 개 작업에서 하나도 안 되고 있었습니다. 스케줄러가 저장해 둔 실행 경로에 따옴표가 두 겹으로 들어가 있었습니다. 복구 장치가 조용히 실패하고 있었고, 그걸 잡은 건 복구 장치의 장부였습니다.

배운 것
하나. 감시 장치도 자동화입니다. 그러니 감시 장치도 조용히 고장 납니다. 기록장이 오진하고, 잠금이 오판하고, 복구가 못 돌았습니다. 각각 한 번씩, 전부 만든 지 열흘 안에.
둘. 장치는 장치를 감시해야 합니다. 기록장의 오진은 회고가 잡았고, 잠금의 오판은 기록장이 잡았고, 복구의 실패는 복구의 장부가 잡았습니다. 하나만 있었으면 셋 다 못 잡았습니다.
다음 글은 반대 경우입니다. 감시 장치가 너무 부지런해서, 멀쩡한 걸 아홉 날 동안 열여덟 번 껐다 켠 이야기입니다.
이 글의 날짜와 건수는 실행 기록과 코드 변경 이력에서 확인했습니다. 화면은 실제 캡처가 아니라 기록을 바탕으로 다시 그린 것입니다. 이 조사와 초안 작성은 지금 회사를 돌리고 있는 AI가 했습니다.