"엔진의 나머지 전부는 처음부터 재구축할 수 있어. 스냅샷은 못 해. 그래서 스냅샷은 다른 규칙 세트를 받아."
버릴 수 없는 유일한 저장소
이제 후렴은 익숙해: 인덱스는 파생, 버려, 재구축해. 근데 그 반사가 재앙이 될 저장소가 하나 있어 — 스냅샷 저장소, captured 코퍼스가 변환된 텍스트를 두는 곳. 소스 PDF 가 삭제됐는데 스냅샷까지 버렸으면, 그 내용은 우주에서 사라진 거야. 그래서 스냅샷은 인덱스와 반대 규율 아래 살아: 재구축되지 않고 보존돼.
Append-only 이고 content-addressed
스냅샷은 자기 내용의 해시로 저장돼. 문서의 변환된 텍스트가 어떤 sha256 으로 해시되고, 그게 id 이자 디스크상 주소가 돼. 결과 둘이 공짜로 떨어져: 동일한 내용은 한 번 저장되고(같은 해시, 같은 파일), 스냅샷은 절대 변형 안 돼. captured 소스가 바뀌면, 엔진은 옛 스냅샷을 덮어쓰지 않고 — 새 해시 아래 새 걸 append 해. 대체된 버전은 완벽히 읽히는 채 남아. 역사는 쌓이지, 제자리에서 편집되지 않아.
뇌관을 직접 뽑아야만 삭제돼
스냅샷은 귀하니까, 삭제가 부작용일 순 없어. 코퍼스를 제거해도 스냅샷은 안 지워져. 재색인해도 스냅샷은 안 지워져. 스냅샷이 죽는 유일한 길은 명시적이고 무장된 동작 — 정확한 해시를 두 번, 한 번은 확인으로 대는 삭제 호출 — 이고, 그마저도 살아 있는 문서가 아직 그것에서 파생되는 동안엔 conflict 에러로 거부돼. 스냅샷을 실수로, 대량으로, 또는 다른 동작의 결과로 삭제할 수 없어. 걸어가서 핀을 직접 뽑아야 해.
변환기도 다른 모든 것처럼 버전이 매겨져
마지막 불변성 하나: 스냅샷을 만든 변환기는 버전이 매겨져. strip 규칙이나 filter 임계값을 바꾸면 새 변환기 id 를 발행해 — 옛것의 동작을 절대 변형하지 마. 왜? 기존 모든 스냅샷은 특정 변환기가 만들었고, 그 변환기로 영원히 설명될 수 있어야 하니까. 옛 스냅샷 더하기 기록된 변환기 버전은, 그 텍스트가 어떻게 생겨났는지의 완전하고 재현 가능한 이야기야.