2026-07

우리가 폐기한 재읽기 디텍터

데이터셋
Claude Code 세션, 손으로 라벨링한 쌍
사전등록
고정 파라미터
φ=0.514345, N=2, paraphrase-multilingual-MiniLM-L12-v2. 디텍터 고정 설정, /product에 공개
판정
KILL
이 리포트가 보여주지 않는 것
다르게 범위를 잡은 재읽기 디텍터가 통과할 수 있는지 여부. 기준에 맞춰 조정하지 않았고, 디텍터를 제거했습니다.

무엇을 만들었는가

이 디텍터는 한 세션 안에서 두 번 읽힌 파일 경로를 두 개의 관문 뒤에서 표시했습니다. 두 읽기 사이에 그 파일에 쓴 것이 없어야 하고, 그 사이에 실행된 셸 명령도 없어야 했습니다. 하지 않은 것은 두 읽기의 인자를 비교하는 일, 그리고 그것들이 무엇을 돌려주었는지 비교하는 일이었습니다. 결국 그것이 이야기의 전부였습니다.

이것은 오늘 제공되는 redundant read 디텍터가 아니며, 이름이 비슷해서 구분해 둘 값이 있습니다. 지금 제공되는 쪽은 두 호출이 바이트 단위로 동일한 출력을 돌려줄 것을 요구하며 sha256으로 대조합니다. 이쪽은 같은 경로일 것만 요구했습니다. 하나는 에이전트가 같은 질문을 했고 같은 답을 받았는지를 묻고, 다른 하나는 같은 파일을 열었는지만 물었습니다.

기준은 측정 이전에 docs/REREAD_DETECTOR_PREREG.md에 등록되었고 2026-07-21에 lock되었습니다. 정밀도는 0.70에 도달해야 했고, 판정자는 세션 소유자이며, 디텍터 구현 이후 머지 이전에 판정하도록 했습니다. 표본은 Claude Code 세션 28건에서 관문을 통과한 209쌍 중 무작위로 뽑은 30쌍이었고, 난수 시드는 추출 이전에 문서에 적어 두었으며, 결과를 본 뒤 다시 뽑는 것은 §9에서 금지했습니다.

무엇을 보았는가

기준을 lock한 지 사흘 뒤인 2026-07-24에 측정했습니다. 30쌍 중 29쌍은 offset 또는 limit이 달랐습니다. 재읽기가 아예 아니었습니다. 에이전트가 긴 파일을 한 번에 백 줄이나 이백 줄씩 조각내어 읽은 것이었고, 그것이 에이전트가 긴 파일을 읽는 방식입니다.

한 쌍이 남았습니다. 두 호출 모두 동일한 인자를 썼고 동일한 출력을 돌려받았으며, 그 출력은 PDF is password-protected. Please provide an unprotected version. 이었습니다. 에이전트가 잠긴 PDF를 요청했고, 거절당했고, 같은 방식으로 다시 요청했습니다. 다시 읽힌 것은 없습니다. 처음에 읽힌 것이 없기 때문입니다.

그래서 정밀도는 그 쌍을 낭비적 재읽기로 세면 1/30이고, 도구 재시도로 세면 0/30입니다. 0.70이라는 기준 앞에서 둘은 같은 답입니다. 백분율 범위 대신 두 분수를 그대로 적는 이유는, 범위는 신뢰구간처럼 읽히는데 이것은 신뢰구간이 아니기 때문입니다. 이것은 한 쌍을 두 가지로 센 것입니다.

왜인가

전제가 틀렸습니다. “같은 파일이 두 번 열렸다”는 낭비처럼 들리지만 대개 낭비가 아닙니다. 이 디텍터는 평범한 작업을 재면서 그것을 발견이라고 불렀습니다.

좁히면 살릴 수 있는지 물었습니다. 인자와 출력까지 일치할 것을 요구하는 방식입니다. 그 질문은 표본이 아니라 관문을 통과한 209쌍 전체에 대해 답했습니다. 여섯 쌍이 조건을 만족했습니다. 셋은 진짜 재읽기였고(boot.ts, database.hpp, 그리고 생성된 라우트 파일), 나머지 셋은 같은 잠긴 PDF가 다시 거절된 것이었습니다.

진짜였던 셋은 이미 기존 requery 경로가 보고하고 있었습니다. 더 좁힌 관문은 새로운 발견을 하나도 더하지 못하고, 이미 갖고 있던 발견의 중복만 만들었을 것입니다. 그것이 이 건을 닫았습니다. 숫자가 낮아서가 아니라, 숫자를 고쳐도 얻을 것이 없었기 때문입니다.

그래서 무엇을 했는가

통과하는 숫자를 만들 방법이 넷 있었고, 넷 다 쓸 수 있었습니다. 기준을 낮출 수 있었습니다. 우리 문서 밖의 무엇도 우리를 0.70에 묶어두지 않았으니까요. 표본을 새로 뽑을 수 있었습니다. 첫 표본은 서른 쌍뿐이었으니까요. 잠긴 PDF 쌍을 재읽기로 세고 3.3%를 마치 그 범위 자체가 발견인 것처럼 보고할 수 있었습니다. 아니면 좁히기를 추가해 개선된 디텍터로 출시하고, 그것이 기존 디텍터가 이미 찾고 있던 것 외에 아무것도 못 찾았다는 사실을 끝내 말하지 않을 수 있었습니다.

우리는 그중 아무것도 하지 않았습니다. 이것들을 나열하는 이유는 우리는 우리가 세운 기준을 지켰다는 말은 누구나 할 수 있고, 그 말의 값은 구체적인 빠져나갈 구멍들이 정하기 때문입니다.

디텍터는 제거되었습니다. 그것이 있던 브랜치는 push된 적도 머지된 적도 없으므로, 이 코드를 실행한 무엇도 누구에게도 닿지 않았습니다.

머지를 막은 검사는 정밀도 관문이었으므로, 남은 사전등록 검사들은 끝내 실행되지 않았습니다. 이것은 관문 하나가 실패하고 작업이 거기서 멈춘 것이지, 받은 모든 시험에 실패한 디텍터가 아닙니다. 다르게 범위를 잡은 재읽기 디텍터가 통과할 수 있는지는 여전히 열려 있습니다. 우리는 이것을 기준에 맞춰 조정하지 않았고, 제거했습니다.