[태그:] silent failure

  • ‘다 됐습니다’를 믿지 마라 — 도구가 조용히 실패하는 다섯 가지 방식

    ‘다 됐습니다’를 믿지 마라 — 도구가 조용히 실패하는 다섯 가지 방식

    자동화를 굴리기 시작하면 화면에 이런 말이 뜬다. 다 됐습니다. 완료했습니다. 전송했습니다. 그런데 나중에 확인해 보면 안 돼 있다. 오류도 없었고 빨간 글자도 없었다. 이 글은 그 자리에 대한 것이다.

    먼저 이 글이 하지 않는 말을 밝혀 둔다. 여기 적는 다섯 형태는 전부 도구와 배달과 검사 층에서 일어난 것이다. 모델이 판단을 잘못한 사례가 아니다. 우리는 모델의 판단 실패를 재지 않았고, 그러므로 이 글에는 그 이야기가 없다. 그리고 여기 적는 것은 우리가 쓰는 특정 도구들에 대한 관측이다 — 모든 자동화가 이렇다고 쓰지 않는다.

    논지는 한 줄이다. 도구가 성공을 반환한 것과 일이 실제로 된 것은 다른 사실이다. 그리고 그 둘이 갈릴 때 도구는 거짓말을 하지 않는다. 도구는 자기가 잰 것을 정직하게 말한다. 어긋난 것은 우리가 알고 싶은 것이 그것과 달랐다는 점이다. 이 구분이 이 글의 축이다.

    날짜를 밝혀 둔다. 아래 다섯 형태는 2026년 9월 8일 하루 안에 각각 관측됐다. 여러 달에 걸쳐 모은 목록이 아니다. 하루치라는 사실 자체가 이 글의 근거이고, 그래서 날짜를 뭉개지 않고 적는다.

    이 글에서 쓰는 말 몇 개를 풀어 둔다. 반환값은 명령을 실행한 도구가 돌려주는 결과 표시다. 배달은 한쪽이 보낸 것이 다른 쪽에 실제로 도착하는 일이다. 장부는 무슨 일이 어떤 순서로 있었는지를 적어 두는 기록 파일이다. 관할은 어떤 검사가 재겠다고 선언한 대상 범위다. 모의는 실제로 하지 않고 하는 척만 하는 것이다.

    앞선 편과의 경계. 같은 계열의 문제를 돈이 어떻게 새는가의 자리에서 본 것은 앞 편에 적었고, 이 글은 비용을 다루지 않는다. 그리고 긴 대화에서 무엇을 관리할지는 그 앞 편에 있다.

    도구가 조용히 실패한 다섯 형태를 정리한 도식. 첫 칸은 형태 하나로, 반환값은 정상이었는데 상대가 받지 못한 세 사례다. 자동 배달 큐에 넣고 반환값이 정상이었는데 3612초 미배달이었고, 역할 이름으로 보낸 지시가 에이전트가 붙지 않은 빈 셸로 가서 셸 파서 오류가 났고, 긴 본문이 붙여넣기 항목으로 바뀌어 제출 키를 보내도 제출되지 않은 일이 같은 자리에서 다섯 번 반복됐다고 적었다. 세 사례 모두 반환값은 정상이었다. 둘째 칸은 형태 둘로, 실행 없이 돌리는 모드로 실행했더니 외부 서비스는 모의했는데 내부 장부는 실제로 기록한 일이다. 모드 인자가 표시 필드에만 쓰였고, 연습 한 번이 실제 실행을 봉쇄했으며, 같은 날 두 번 밟아서 경고가 아니라 거부하는 검사를 넣었다고 적었다. 셋째 칸은 형태 셋으로, 비우는 도구가 다섯 단계 전부 통과와 완료를 출력했는데 실제 수치는 그대로였던 일이다. 그 도구가 잰 것은 입력을 타이핑했는가이고 우리가 알고 싶은 것은 비워졌는가였다고 적었다. 넷째 칸은 형태 넷으로, 목록이 종료된 자리를 8초간 살아 있다고 표시하고 같은 시점 다른 경로는 없다고 답한 일, 그리고 검증 자리 세 개가 약 6일간 수행 불능인데 목록은 정상 대기로 표시한 일이다. 점유를 세는 지표는 능력을 세지 않는다고 적었다. 아래 칸은 형태 다섯과 공통 논지다. 하루에 여섯 번 실패로 나온 검사의 원인이 산출물이 아니라 검사 쪽이었고, 다섯은 계수 규칙이 틀렸으며 하나는 규칙은 맞는데 관할 밖에 적용한 것이었다. 공통 논지는 도구가 거짓말을 하지 않는다는 것이며 도구는 자기가 잰 것을 정직하게 말하는데 우리가 알고 싶은 것이 그것과 달랐다는 것이다. 그리고 다섯 형태 중 완전히 닫힌 것은 없다고 적었다. 맨 아래에는 전부 2026년 9월 8일 하루 안에 관측된 우리 한 팀의 기록이며 모델의 판단 실패를 잰 것이 아니라고 적었다.
    모델의 판단 실패를 잰 그림이 아니라 도구와 배달과 검사 층에서 우리가 겪은 다섯 형태다. 전부 2026년 9월 8일 하루 안에 각각 관측됐고, 다섯 중 완전히 닫힌 것은 없다. 우리가 쓰는 특정 도구들에 대한 기록이므로 모든 자동화가 이렇다는 뜻이 아니다.

    다 됐다는 말이 어긋난 대목

    1. 다 됐다는 말과 실제로 됐다는 것은 다른 사실이다

    증상. 도구가 완료를 알렸다. 오류 표시는 없었다. 그런데 결과물을 열어 보면 안 돼 있거나, 상대가 못 받았거나, 숫자가 그대로다. 무엇이 잘못됐는지 화면에는 단서가 없다.

    여기서 갈리는 두 가지 반응. 하나는 도구를 의심하는 것이다. 다른 하나는 자기 사용법을 의심하는 것이다. 둘 다 자연스러운데, 우리 기록에서는 둘 다 원인을 비껴갔다. 도구는 고장 나지 않았고 사용법도 틀리지 않은 경우가 많았다.

    우리가 내린 결론. 어긋난 자리는 도구가 무엇을 재고 있었는가였다. 도구는 자기가 잰 것을 정확히 말했다. 배달 큐에 넣었다고 말했고, 실제로 넣었다. 타이핑했다고 말했고, 실제로 타이핑했다. 문제는 우리가 그 말을 도착했다거나 비워졌다로 읽었다는 점이다. 재는 것과 알고 싶은 것이 다른데 표시는 하나였다.

    그래서 이 글이 쓰는 형태는 이렇다. 도구를 탓하지 않는다. 도구가 무엇을 재는 물건인지 확인하고, 우리가 알고 싶은 것을 따로 재는 방법을 붙인다. 아래 다섯 형태는 각각 그 어긋남이 다른 자리에서 났다.

    다섯 형태를 한 줄로 늘어놓으면 어긋남의 자리가 보인다. 왼쪽이 도구가 실제로 잰 것이고, 오른쪽이 우리가 알고 싶었던 것이다. 어느 줄에서도 왼쪽이 거짓이 아니다.

    
    도구가 잰 것              우리가 알고 싶었던 것
    ------------------------  ------------------------
    배달 큐에 넣었다          상대가 받았다
    모드를 모의로 적었다      아무것도 바뀌지 않았다
    입력을 타이핑했다         작업 기억이 비워졌다
    자리가 켜져 있다          그 자리가 일할 수 있다
    규칙에 걸린 개수가 있다   산출물에 결함이 있다
    

    왼쪽과 오른쪽이 대개는 같은 답을 준다. 그래서 평소에는 왼쪽을 보고 오른쪽을 판단해도 틀리지 않는다. 문제는 둘이 갈리는 순간에 화면에 표시되는 것은 왼쪽뿐이라는 데 있다. 오른쪽을 보고 싶으면 오른쪽을 재는 값을 따로 붙여야 한다. 이 글의 다섯 절은 그 값을 각각 무엇으로 잡았는지에 대한 기록이다.

    초보용으로 옮기면 이렇다. 우리는 완료 표시를 결과의 증거로 쓰지 않고 진행의 신호로 쓴다. 결과의 증거는 결과물 쪽에서 따로 구해야 한다 — 파일을 열어 보거나, 상대에게 물어보거나, 숫자를 다시 읽는 식이다. 표시와 증거를 같은 것으로 두면 갈리는 순간에 알 방법이 없다.

    확인 방법. 지금 완료 표시를 보고 있다면, 그 표시가 무엇을 근거로 나오는지 한 줄로 적어 보라. 그 자리에 실제로 알고 싶은 것과 다른 말이 적히면, 그 둘 사이가 이 글이 다루는 틈이다.

    2. 반환값은 정상이었는데 상대가 받지 못했다

    이 항목은 사례 셋이고, 세 사례 모두 반환값이 정상이었다.

    사례 하나. 자동 배달 큐에 넣었고 반환값은 정상이었는데 3,612초 동안 배달되지 않았다. 그 자동 배달의 계약은 대상이 조용해지면 배달한다는 것이었고, 대상은 그 시간 대부분 조용했다. 조건이 충족돼 있었는데 배달이 일어나지 않은 것이다. 뒤에 규명해 보니 정체는 표준이 아닌 연결 방식을 쓰는 자리 전부에서 나타났고 표준 방식을 쓰는 자리는 정상이었다. 즉 특정 한 자리의 사고가 아니라 그 연결 방식 계열의 결함이었다.

    사례 둘. 이름으로 보낸 지시가 비어 있는 자리로 갔다. 여기서 이 축에 필요한 것은 하나다 — 이름으로 된 주소는 그 이름이 실제로 일하는 쪽을 가리킬 때만 주소다. 사고의 전말은 역할 이름으로 보냈는데 아무도 못 받았다 에 적었다.

    사례 셋. 본문이 길면 입력이 한 줄이 아니라 붙여넣기 항목으로 변환된다. 그 상태에서는 제출 키를 보내도 제출로 이어지지 않는다. 같은 자리에서 다섯 번 반복됐다. 보내는 쪽에서는 두 동작이 모두 성공으로 돌아왔다.

    
    보냈다      반환값 정상
    넣었다      반환값 정상
    그런데      상대의 화면은 그대로였다
    

    세 사례가 갈린 자리는 서로 다르다. 하나는 배달 조건이 충족됐는데 배달이 일어나지 않은 것이고, 둘은 주소가 가리키는 대상이 비어 있던 것이고, 셋은 입력이 다른 형태로 변환돼 제출 동작이 그 형태에 닿지 않은 것이다. 셋을 하나의 원인으로 묶지 않는다 — 우리가 잰 것은 각각의 관측이고, 공통점은 원인이 아니라 반환값이 정상이었다는 표면이다.

    초보용으로 옮기면 이렇다. 사람에게 메시지를 보낼 때 전송됨이라는 표시와 상대가 읽음이라는 표시가 다른 것과 같다. 자동화 도구는 대개 앞쪽만 준다. 뒤쪽을 원하면 뒤쪽을 볼 방법을 따로 만들어야 하고, 만들 수 없는 경로라면 그 경로는 도달을 확인할 수 없는 경로라고 적어 두는 것이 정확하다.

    여기서 우리가 바꾼 것. 도달을 반환값으로 확인하지 않기로 했다. 대신 상대 쪽의 활동 변화를 본다 — 화면 줄 수가 늘었는지, 대기 상태가 풀렸는지 같은 것이다. 그리고 배달 결함 자체는 우회로 넘겼다. 원인 계열은 짚었지만 그 계열을 고친 것이 아니다.

    확인 방법. 무언가를 보낸 뒤에는 보낸 쪽의 성공 표시가 아니라 받는 쪽의 변화를 확인하라. 받는 쪽에서 볼 수 있는 변화가 하나도 없으면, 그 경로는 도달을 확인할 수 없는 경로다. 확인할 수 없다는 것은 도달하지 않았다는 뜻이 아니고, 확인되지 않았다는 뜻이다.

    3. 모드를 정직하게 적으면서 실제로 했다

    이 항목은 우리가 겪은 것이고, 이 글의 논지가 그대로 드러난 자리다.

    관측. 발행 절차를 실행 없이 돌리는 모드로 실행했다. 외부 서비스 호출은 모의됐다 — 여기까지는 약속대로였다. 그런데 내부 장부는 실제로 기록됐다. 원인은 좁았다. 모드 인자가 기록 항목의 표시 필드에만 쓰이고, 그 아래에서 상태를 바꾸는 부분은 모드와 무관하게 실행됐다.

    여기서 도구는 거짓말을 하지 않았다. 장부에는 모의 모드라고 정직하게 적혀 있었다. 적힌 그대로 모의였다고 읽으면 되는데, 적으면서 실제로 했다. 표시는 참이고 부작용도 참이었다. 둘이 함께 참일 수 있다는 것을 우리가 몰랐다.

    파급. 허용된 상태 전이 표에 같은 상태로의 재전이가 없었다. 그래서 연습으로 한 번 돌린 것이 그 항목을 이미 처리된 상태로 만들고, 실제 실행을 봉쇄했다. 연습이 실전을 막은 것이다.

    같은 날 두 번 밟았다. 원인을 알고 난 뒤에 두 번째가 났다. 그래서 우리가 넣은 것은 경고문이 아니라 거부하는 검사다. 실제 장부를 대상으로 그 모드를 걸면 실행 전에 멈춘다. 다만 그 검사가 막지 못하는 경로도 같은 자리에 적어 두었다 — 상태를 바꾸는 함수를 직접 호출하는 경로는 그 검사를 지나지 않는다. 막은 것은 한 경로이고, 우리는 그것을 닫았다고 쓰지 않는다.

    초보용으로 옮기면 이렇다. 연습 모드가 붙은 기능을 쓸 때 무엇이 모의되고 무엇이 실제인지를 확인하라. 대개 모의되는 것은 바깥으로 나가는 호출이고, 안쪽에 남는 기록은 실제일 수 있다. 그 둘이 갈려 있다는 것을 모르면, 연습이 안전하다는 가정 위에서 연습을 여러 번 돌리게 된다.

    확인 방법. 연습 모드가 있는 도구를 쓸 때는 연습을 한 번 돌린 뒤 남는 것이 있는지 확인하라. 파일 수정 시각, 장부 줄 수, 항목 상태 같은 것을 앞뒤로 비교하면 된다. 표시가 연습이라고 되어 있는 것과 부작용이 없는 것은 별개다.

    4. 완료를 선언했는데 수치는 그대로였다

    이 항목도 우리가 겪은 것이다.

    관측. 작업 기억을 비우는 도구가 다섯 단계 전부 통과완료를 출력했다. 그런데 실제 사용률은 그대로였다. 비우는 명령이 입력줄에 대기로 걸려 있다가 나중에 반영됐기 때문이다.

    그 도구가 잰 것. 입력을 타이핑했는가였다. 그것은 정확히 재고 정확히 보고했다. 우리가 알고 싶은 것은 비워졌는가였다. 두 질문은 대개 같은 답을 주지만, 입력이 대기에 걸리는 순간 갈린다. 도구를 고칠 문제가 아니라 판정 근거를 바꿀 문제였다.

    그래서 우리가 바꾼 것. 비우기의 완료 판정을 도구 출력이 아니라 수치가 실제로 떨어졌는지로만 한다. 출력이 완료라고 해도 수치가 그대로면 완료로 세지 않는다. 이것은 도구를 불신하는 것이 아니다 — 도구가 답하는 질문과 우리 질문이 다르다는 것을 인정하고, 우리 질문에 답하는 값을 따로 본 것이다.

    이 형태가 특히 미끄러운 이유. 출력이 단계별로 나왔다는 점이다. 다섯 단계가 하나씩 통과 표시를 내고 마지막에 완료가 붙으면, 읽는 쪽은 그 다섯 개를 결과에 대한 증거로 읽는다. 그런데 그 단계들이 확인한 것은 절차의 각 칸을 지났는가였고, 목표 값은 그 칸들 어디에서도 읽히지 않았다. 단계 수가 많다는 것이 증거의 강도를 높이지 않는다 — 같은 질문을 다섯 번 물은 것에 가깝다.

    확인 방법. 완료 표시를 주는 작업마다 그 작업이 바꾸기로 한 값을 하나 정하고, 완료 표시와 그 값을 따로 확인하라. 값이 움직이지 않았으면 완료 표시가 있어도 완료가 아니다. 값이 무엇인지 정할 수 없는 작업이면, 그 작업의 완료는 원래 확인할 수 없는 것이다.

    5. 목록은 살아 있다고 했고 다른 경로는 없다고 했다

    이 항목은 사례 둘이고, 뒤쪽이 더 오래 숨어 있었다.

    사례 하나. 어떤 자리를 종료한 직후, 목록은 8초간 그 자리를 살아 있다고 표시했다. 같은 시점에 다른 경로로 물었더니 없다고 답했다. 두 경로의 판정이 갈린 것이다. 우리는 어느 쪽이 참인지 재지 않았다 — 종료가 실제로 언제 완료됐는지를 따로 잰 값이 우리에게 없다.

    사례 둘. 검증을 맡는 자리 세 개가 약 6일간 수행 불능이었는데, 목록에는 정상 대기로 표시돼 있었다. 켜져 있었고 응답도 했다. 다만 일을 할 수 없는 상태였다. 그 사실을 알게 된 경위는 실제로 작업을 의뢰한 것이었다. 의뢰하지 않았으면 그 6일을 더 몰랐을 것이다.

    여기서 배운 것. 점유를 세는 지표는 능력을 세지 않는다. 켜져 있음과 응답함은 점유의 신호다. 일할 수 있음은 별개의 신호이고, 그것을 재는 방법은 일을 주는 것뿐이었다. 대기 표시를 능력의 근거로 읽으면 없는 사실을 읽는 것이 된다.

    왜 이쪽이 더 오래 숨는가. 앞의 8초는 짧고, 다시 물어보면 답이 바뀌므로 금방 눈에 걸린다. 뒤의 6일은 그렇지 않다. 표시가 계속 정상이었고 응답도 계속 있었으니 다시 물어볼 이유가 없었다. 조용한 실패가 오래 숨는 조건은 오류가 아니라 정상으로 보이는 표시가 계속 유지되는 것이었다.

    초보용으로 옮기면 이렇다. 혼자 쓰는 사람에게도 같은 형태가 있다. 연결이 되어 있다는 표시, 로그인이 되어 있다는 표시, 설정이 적용됐다는 표시는 전부 점유의 표시다. 그것이 실제로 내가 하려는 일에 쓸 수 있는 상태인지는 작은 일을 한 번 시켜 봐야 안다. 우리 경우 그 작은 일을 던지지 않은 동안이 6일이었다.

    확인 방법. 어떤 자리가 준비돼 있다고 표시될 때, 그 표시가 무엇을 확인해서 나온 것인지 확인하라. 켜져 있는지만 확인한 표시라면 그것은 켜져 있다는 뜻이고 일할 수 있다는 뜻이 아니다. 일할 수 있는지는 작은 일을 하나 던져 봐야 안다.

    6. 검사가 틀렸는데 우리는 산출물을 의심했다

    이 항목은 앞의 넷과 결이 다르다. 여기서 조용히 실패한 것은 검사다.

    관측. 그 하루에 여섯 번, 실패로 나온 검사의 원인이 산출물이 아니라 검사 쪽이었다. 갈라 보면 두 종류였다.

    다섯은 계수 규칙이 틀렸다. 인용문 안에 정상적으로 들어간 물음표를 손상으로 셌고, 그림 제목에 정상적으로 쓰인 의문부호를 손상으로 셌다. 그리고 기대값을 상수로 박아 둔 탓에 그 값이 낡아 실패한 것이 세 번 있었다.

    하나는 규칙은 맞는데 관할 밖에 적용했다. 우리 집필 형식 규칙을 남이 생성한 마크업에 걸었다. 규칙 자체는 옳고 우리 원고에 걸면 맞는 규칙인데, 우리가 쓰지 않은 부분에 걸었으니 그 축이 관할한다고 선언한 적 없는 것을 잰 것이다.

    둘을 갈라 두는 이유. 틀린 자를 쓴 것과 맞는 자를 남의 물건에 댄 것은 다른 결함이다. 앞쪽은 자를 고쳐야 하고, 뒤쪽은 자를 고칠 것이 없다 — 관할을 먼저 물어야 잡힌다. 통과냐 실패냐만 보고 있으면 뒤쪽은 계속 산출물 탓으로 읽힌다.

    여기에는 위험한 지점이 하나 있다. 검사를 의심하라는 말은 검사를 고쳐 통과시키라는 말과 한 글자 차이다. 우리가 쓰는 판별 기준은 이렇다 — 그 수정이 재는 대상을 바로잡는가, 아니면 올바른 측정에서 사례를 면제하는가. 앞쪽이면 고칠 자리가 검사이고, 뒤쪽이면 그것은 검사에 구멍을 내는 것이다. 인용문 안의 정상 물음표를 손상에서 빼는 것은 앞쪽이었고, 그 근거는 손상을 재는 축들은 그대로 남겨 두었다는 점이었다. 구멍을 내는 것이라면 손상 축을 좁혔을 것이다.

    그래서 우리가 쓰는 순서. 검사가 실패하면 셋을 한다. 첫째 개수만 보지 말고 걸린 항목을 전수 분류한다. 둘째 그 축이 선언한 대상이 무엇인지 확인한다. 셋째 범위를 좁혀 고칠 때는 좁힌 밖을 참고값으로 함께 출력한다 — 안 보이게 만든 것과 없는 것은 다르기 때문이다.

    기대값을 상수로 박아 낡은 세 번에 대해. 이 셋은 계수 규칙이 틀린 다른 두 건과 결이 조금 다르다. 처음 쓸 때는 맞는 값이었고, 회차가 바뀌면서 낡았다. 그래서 우리가 바꾼 것은 값이 아니라 값을 얻는 방법이다 — 기대값을 실행 결과나 설정 정본에서 파생시킨다. 상수로 박아 둔 값은 회차가 바뀌면 낡을 수 있고, 우리 기록에서는 세 번 낡았다. 그때 실패는 산출물 탓으로 읽힌다.

    확인 방법. 검사가 실패했을 때 걸린 항목을 하나씩 열어 보라. 항목이 실제로 결함이면 산출물을 고칠 자리이고, 항목이 정상인데 걸렸으면 고칠 자리는 검사다. 그리고 걸린 항목이 애초에 그 검사가 재겠다고 한 범위 안인지 확인하라. 범위 밖이면 통과도 실패도 답이 아니다.

    7. 다섯 형태를 하루 안에 겪었고 닫힌 것은 없다

    하루치라는 사실. 위 다섯 형태는 2026년 9월 8일 하루 안에 각각 관측됐다. 오래 모은 수집품이 아니다. 우리가 이 사실을 그대로 적는 이유는, 조용한 실패가 특별한 사고로만 일어나는 것이 아니라 자동화를 굴리는 동안 같이 굴러가는 것이었다는 우리 경험을 정확히 적기 위해서다. 그것이 다른 환경에서도 그런지는 우리가 재지 않았다.

    그리고 닫힌 것은 없다. 다섯 형태 가운데 완전히 해결된 것은 하나도 없다. 하나씩 적으면 이렇다.

    • 배달 결함은 우회로 넘겼다. 원인 계열은 짚었지만 그 계열을 고치지 않았다
    • 연습 모드의 부작용은 한 경로만 막았다. 상태를 바꾸는 함수를 직접 부르는 경로는 그 검사를 지나지 않는다
    • 완료 판정은 수치로 바꿨지만, 입력이 대기에 걸리는 원인 자체는 그대로
    • 목록과 다른 경로의 판정이 갈린 것은 어느 쪽이 참인지 재지 않았다
    • 검사 쪽 결함은 그때그때 고쳤고, 같은 형태가 다시 나오지 않는다는 보장을 우리는 갖고 있지 않다

    그래서 이 글이 쓸 수 있는 형태는 하나다. 해결했다가 아니라 우리는 이렇게 발견하고 이렇게 줄였다다. 발견 방법이 이 글의 내용이고, 줄인 정도는 위 목록만큼이다. 이제 안전하다고 쓰지 않고, 넣은 검사가 있으므로 무해하다고도 쓰지 않는다. 우리는 이 형태들에 이르는 모든 진입 경로를 세지 않았다 — 세지 않은 것을 닫았다고 말할 수는 없다.

    왜 이것을 굳이 적는가. 조용한 실패를 다루는 글이 스스로 조용히 실패하는 방식이 하나 있다. 발견 사례를 나열하고 처방을 적고 끝내면, 읽는 쪽은 그 처방으로 이 형태가 닫혔다고 읽는다. 우리 목록에서 닫힌 것은 없으므로, 그렇게 읽히면 이 글 자체가 성공을 반환하고 실제로는 되지 않은 물건이 된다. 그래서 남은 것을 위에 목록으로 적었다.

    확인 방법. 자기 기록에서 조용한 실패를 하나 찾았다면, 고친 뒤에 무엇이 남았는지를 같은 자리에 적어 보라. 막은 경로와 막지 못한 경로를 나란히 적으면, 다음에 같은 형태가 나왔을 때 어디를 먼저 볼지가 이미 적혀 있다.

    정리 — 확인할 것 다섯 가지

    첫째, 우리는 도달을 반환값이 아니라 상대의 활동 변화로 확인한다. 보낸 쪽의 성공 표시는 보냈다는 뜻이고 도착했다는 뜻이 아니다. 우리 기록에서는 반환값이 정상인 채로 세 사례가 도착하지 않았다.

    둘째, 우리는 완료를 도구 출력이 아니라 목표 수치로 판정한다. 작업마다 바뀌기로 한 값을 하나 정해 두고 그 값을 따로 본다. 우리 경우 다섯 단계 통과와 완료가 함께 출력됐는데 수치는 그대로였다.

    셋째, 우리는 경고를 적는 것으로 끝내지 말고 거부하는 검사로 바꾼다. 그리고 그 검사가 막지 못하는 것을 같은 자리에 적는다. 우리는 원인을 알고도 같은 날 두 번 밟았고, 그때 넣은 것이 경고문이 아니라 멈추는 검사였다. 그 검사도 한 경로만 막는다는 것을 함께 적어 두었다.

    넷째, 우리는 점유 지표를 능력 근거로 쓰지 않는다. 켜져 있음과 일할 수 있음은 별개 신호다. 우리 경우 검증을 맡는 자리 세 개가 약 6일간 수행 불능인데 정상 대기로 표시됐고, 알게 된 경위는 실제로 일을 의뢰한 것이었다.

    다섯째, 우리는 검사가 실패하면 검사부터 의심한다 — 다만 개수가 아니라 걸린 항목을 분류해서. 그 하루에 여섯 번, 실패의 원인은 산출물이 아니라 검사 쪽이었다. 그리고 계수 규칙이 틀린 것과 맞는 규칙을 관할 밖에 적용한 것은 고칠 자리가 다르다.

    마지막으로 하나만 덧붙인다. 이 글은 도구를 탓하는 이야기가 아니다. 다섯 형태에서 도구는 자기가 잰 것을 정직하게 말했다. 우리가 한 일은 도구가 답하는 질문과 우리가 묻고 싶은 질문을 갈라 놓고, 우리 질문에 답하는 값을 따로 붙인 것이다. 그리고 그 다섯 가운데 완전히 닫힌 것은 없다.

    하루치 기록과 남은 구멍

    우리 운영 기록에서 확인한 것 (전부 2026년 9월 8일 하루 안 · 우리 한 팀의 기록이다)

    • 자동 배달 큐에 넣고 반환값이 정상이었는데 3,612초 동안 배달되지 않은 것. 대상은 그 시간 대부분 조용했고 그 자동 배달의 계약은 대상이 조용해지면 배달한다는 것이었다. 정체는 표준이 아닌 연결 방식을 쓰는 자리 전부에서 나타났고 표준 방식을 쓰는 자리는 정상이었다
    • 사례 둘 — 이름이 가리키는 자리가 비어 있던 건. 같은 사고를 역할 이름으로 보냈는데 아무도 못 받았다 에서 따로 다뤘다
    • 본문이 길면 입력이 붙여넣기 항목으로 변환되고 그 상태에서는 제출 키를 보내도 제출로 이어지지 않는 것. 같은 자리에서 다섯 번 반복됐다
    • 형태 둘 — 연습이 실제 장부를 바꾼 건. 사건의 전말과 코드 원인은 연습이 장부를 바꿨다 에 있다
    • 형태 셋 — 완료 출력과 실제 수치가 갈린 건. 전후 수치는 대화를 비웠는데 메모리는 그대로였다 에 있다
    • 형태 넷 — 목록과 다른 경로의 답이 갈린 건. 그 경로의 기록은 역할 이름으로 보냈는데 아무도 못 받았다 에 있다
    • 형태 넷의 다른 얼굴 — 자리는 정상 표시인데 일하지 못한 건. 엿새의 기록은 리뷰어 세 좌석이 동시에 멈췄다 에 있다
    • 그 하루에 여섯 번, 실패로 나온 검사의 원인이 산출물이 아니라 검사 쪽이었던 것. 다섯은 계수 규칙이 틀렸고(인용문 안 물음표를 손상으로 셈 · 그림 제목의 정상 의문부호를 손상으로 셈 · 기대값을 상수로 박아 낡음 세 번), 하나는 규칙은 맞는데 우리 집필 형식 규칙을 남이 생성한 마크업에 걸어 관할 밖에 적용한 것이었다

    우리가 측정하지 않아 쓰지 않은 것

    • 모델의 판단 실패. 위 다섯 형태는 전부 도구와 배달과 검사 층이다. 모델이 조용히 잘못 판단하는지 여부는 우리가 재지 않았고, 그래서 이 글에는 그 서술이 없다
    • 다른 도구에서도 같은 일이 생기는지 여부. 사례 하나와 사례 셋, 그리고 연습 모드 관측은 우리가 쓰는 특정 도구들에 대한 것이다. 모든 자동화가 이렇다고 쓰지 않는다
    • 조용한 실패의 빈도. 하루 안에 다섯 형태를 겪었다는 것은 우리 기록이고, 그것이 흔한 일인지 아닌지는 재지 않았다
    • 목록과 다른 경로의 판정이 갈렸을 때 어느 쪽이 참인지. 종료가 실제로 언제 완료됐는지를 따로 잰 값이 없다
    • 넣은 검사가 같은 형태의 재발을 막는지 여부. 한 경로를 막았다는 것만 확인했고, 그 검사를 지나지 않는 경로가 있다는 것도 함께 확인했다
    • 이 다섯 형태가 다른 환경에서도 같은 모양으로 나타나는지 여부. 우리 구성은 여러 실행 단위를 함께 돌리는 쪽이다

    같은 계열을 다른 자리에서 다룬 글