"뭐 기준으로 done? 그 질문에 답 못 하는 플래그는 입력이 바뀌길 기다리는 버그야."
한-비트 거짓말
거의 모든 파이프라인이 processed = true 플래그를 키워. 작업 재실행을 피하는 뻔한 방법이야: 항목마다 done 표시하고, 다음엔 done 인 걸 건너뛰어. 괜찮아 — 입력이 바뀔 때까지는. 그럼 플래그가 조용한 거짓말이 돼. 항목은 done 표시됐는데, 뭐 기준으로 done? 이후 재-export 된 source 파일? 이후 바꾼 오디오 설정? 이후 업그레이드한 model config? 단일 boolean 은 못 말해. 열두 개의 다른 질문을 한 비트로 무너뜨리고, 밑의 입력 중 아무거나 움직이면, 비트는 여전히 true 로 읽히고 진짜 바뀐 작업이 조용히 건너뛰어져.
이건 stale cache 랑 같은 함정이야. cache 항목은 '답을 갖고 있어' 라고 말하는데 — 그 답은 특정 입력에 대해 계산됐고, 입력이 바뀌면 cached 답은 여전히 권위 있어 보이면서 틀려. done 플래그는 정확히 key 없는 cache 야: 작업이 일어났다는 걸 기억하지만 뭐에 대해 됐는지는 안 기억해. cache invalidation 은 컴퓨팅의 어려운 문제 중 하나로 유명하고, 벌거벗은 done-flag 는 곧장 거기 걸어 들어가.
'이미 done' 은 identity 기준으로만 뜻이 있어
고침은 '이게 done 이야?' 묻길 멈추고 '이게 이 정확한 identity 기준으로 done 이야?' 묻기 시작하는 거야. 영상의 boolean 대신, Recall 은 정확히 정의된 identity 에 대해 뭐가 됐는지 기록해: 이 source 콘텐츠, 이 오디오 설정, 이 provider 설정, 이 release. 이제 '이미 done' 은 확인 가능한 답 가진 진짜 질문이야: 현재 입력을 hash 하고, 그 정확한 identity 아래 기록을 찾아. 찾음? 진짜 done, 안전하게 건너뛰어. 못 찾음? 뭔가 바뀜, 작업해. 건너뛰기가 작업이 실제로 의존한 것에 묶였으니까 이제 맞아.
차이는 '이 영상에 뭔가 한 번 했다' 랑 '이 정확한 입력에서 이 정확한 출력을 냈다' 의 차이야. 두 번째만 건너뛰기 안전해, 두 번째만 입력이 바뀌는 즉시 false 가 되니까. 이 트랙의 나머지는 그 identity 를 잘 고르는 거야 — 네가 알아채야 할 각 종류의 변화마다 하나씩.
시스템이 커질수록 왜 더 중요해
장난감 프로젝트에선 done-flag 가 대체로 돼, 입력이 밑에서 바뀌는 일이 드무니까. 몇 달에 걸쳐 재-스캔되고, 재-export 되고, 재-설정되고, 재실행되는 진짜 아카이브에선 입력이 끊임없이 바뀌고 — 그 변화 하나하나가 벌거벗은 done-flag 가 재실행 필요한 작업을 건너뛸 기회야. 버그는 자기를 알리지 않아; 원인 한참 뒤에 '왜 이 영상 transcript 가 옛 model 거지?' 로 나타나. 계층 identity 는 그 부류의 조용한 staleness 를 나중에 절대 디버그 안 하려고 앞서 내는 비용이야. 지금 정밀하거나, 영원히 미스터리 skip 이거나.