← 뉴스레터

2026-08-10

고친 안전장치가, 고친 지 3분 만에 새 사고를 냈다

안전장치를 고쳤다. 배포하고 3분 뒤, 그 안전장치가 사고를 냈다. 되돌리고 나서야 왜인지 알았다.

버려졌다는 오안내부터

컴퓨터 여러 대가 순서를 나눠 일하다 보면, 한 대가 오래 붙잡고 있는 작업 중간에 새 메시지가 오는 경우가 있다. 그 메시지를 이미 처리했는데도, 받는 쪽이 “처리 안 됨”으로 착각해서 “메시지가 버려졌어요, 다시 보내주세요” 라고 잘못 안내하는 결함이 있었다. 답장은 나갔는데 “못 받았다”고 우기는 셈이다.

고쳤다. 확정 안 된 답장은 함부로 내보내지 않고, 네 가지 조건이 다 맞을 때만 “보류”에서 “확정”으로 바꾸도록 설계했다. 시험도 통과했고, 다섯 대 전체에 배포까지 마쳤다.

배포 3분 뒤

배포 시각이 21시 21분. 21시 23분부터 사고가 시작됐다.

재시작한 컴퓨터 하나가, 이미 끝난 지난 대화의 중간 문장을 마치 지금 막 완성된 최종 답장인 것처럼 착각해서 내 폰으로 보냈다. 영어로 된 서술문이 한국어 안내문과 뒤섞여 그대로 도착했다. 다른 컴퓨터 하나는 같은 착각을 세 번 반복했다.

즉시 되돌렸다. 되돌리는 작업 자체를 검증하고, 다섯 대 전부가 되돌리기 전 상태로 맞춰졌는지 빌드 지문까지 대조해서 확인하는 데 15분이 걸렸다.

왜 하필 재시작 직후였나

원인을 찾아보니, 고친 로직 자체는 틀리지 않았다. “함부로 안 내보낸다”는 원칙은 지켰다. 문제는 그 다음이었다.

컴퓨터가 재시작하면, 지금까지 쌓인 대화 기록을 처음부터 다시 훑는다. 그 과정에서 예전에 “보류” 상태로 남겨뒀던 중간 문장을 다시 만나는데, 재시작 직후의 코드는 그게 “예전에 보류해뒀던 것”인지 “방금 새로 생긴 것”인지 구별하는 표시가 없었다. 그러니 오래된 보류분을 방금 완성된 답장처럼 다시 집어 든 것이다.

멀쩡히 돌아가던 시험에서는 한 번도 안 걸린 경우다. 시험은 컴퓨터를 재시작시키지 않으니까.

배운 것

수리는 두 가지를 더 넣었다. 컴퓨터가 켜진 시각을 못 박아두고, 그 시각 이전에 생긴 보류분은 아무리 조건이 맞아도 후보 취급을 안 하게 했다. 그리고 “이 대화는 끝났다”는 신호를 지금 이 순간의 세션 것인지 정확히 대조하도록 좁혔다.

평소에 잘 돌아가던 로직이, 재시작이라는 딱 한 가지 경로에서만 다르게 움직였다. 시험은 코드가 맞는지를 재는 것이지, 코드가 다시 켜지는 순간까지 재는 게 아니다. 그런데 사고는 항상 그 순간에 난다.

되돌린 뒤에는 한 대만 먼저 새 수정본을 올려 재시작 구간을 한 번 더 지켜보고 나서야 나머지 네 대로 넓혔다. 이번엔 조용했다.


고친 게 틀려서 사고가 난 게 아니었다. 고친 게 다시 시작되는 순간을 안 겪어봐서 사고가 났다.

— 강대종 / @ssamssae