모든 사후 검사를 부수는 비대칭
쓰기랑 읽기는 대칭 쌍처럼 느껴지는데, 강제라는 목적에선 전혀 안 닮았어. 쓰기는 차이를 남겨. 게이트가 트리를 이전 상태랑 비교해서 파일이 안 바뀌었다고 확신할 수 있어. 읽기는 게이트가 닿을 수 있는 자리엔 아무것도 안 남겨. 차이도, 믿을 만한 시각도, 트리 안의 산출물도 없어. 운영체제는 파일 열기를 전부 기록하게 계측할 수 있어. 그건 진짜로 있는 수단이고, 이 작업장 밖에 있어. 게이트가 가진 건 저장소뿐이야. 금지된 파일을 읽은 세션의 결과물이랑 안 읽은 세션의 결과물은 구조적으로 같은 종류의 물건이야.
그러니까 "원어 파일이 하나도 수정되지 않았다"를 증명하는 게이트는 참이고, 싸고, 쓸모 있고 — 사람들이 실제로 궁금해하는 질문, 그러니까 저자가 봤느냐에 대해선 완전히 침묵해. 한동안 그 게이트가 둘 다 답하는 것처럼 취급됐어. 아니고, 그렇다고 믿은 게 문제를 계속 굴러가게 한 거야.
사건 셋, 원인 하나
이틀 동안 이 작업장에서 서로 다른 실행 셋이 같은 봉인을 깼어. 서로 다른 집필 시스템 둘, 서로 다른 작업 묶음 둘에 걸쳐서.
첫 번째는 콜드 리뷰어가 방향을 잡으려고 대상 디렉터리 목록을 봤고, 그 목록이 금지된 파일 이름을 출력했어. 두 번째는 리뷰 도중 너무 넓게 잡은 검색이 금지된 파일의 제목을 드러냈고. 세 번째는 유출 문자열을 찾던 스윕이 디렉터리 전체에 범위 없는 검색을 돌려서, 금지된 짝의 산문 필드 하나를 통째로 작업 맥락에 찍어버렸어.
셋 중 어느 것도 고의로 열어본 게 아냐. 셋 중 어느 것도 파일 열기 도구 호출이 아니었고. 전부 예외 없이, 짝을 배제할 만큼 좁은 필터 없이 디렉터리를 겨눈 셸 명령이었어. 그리고 그 실행들 전부 쓰기 차이 게이트를 초록으로 통과했어. 아무것도 안 썼으니까.
세 번이면 빠진 가드야
한 번은 사고야. 두 번은 메모할 값어치가 있는 패턴이고. 독립된 행위자 둘, 작업 묶음 둘에 걸친 세 번은 구조적 발견이야. 규칙은 정확했고, 이해됐고, 그걸 쥔 사람이 강제할 수 없었어. 위반이 기본 동작이 친절하게 넓은 도구를 통해 벌어지니까.
위반한 명령들이 얼마나 평범한지 봐. 아무도 무모해서 위험한 버전을 치는 게 아냐. 그게 답이 나오는 버전이라서 치는 거고, 안전하게 만들어줄 필터는 눈앞의 작업이 기억할 이유를 하나도 안 주는 선택 깃발이거든.