아카이브가 절대 실행하지 않는 두 명령
작업 디렉토리에서 덮어쓰기와 삭제는 평범한 위생이야. 아카이브에서는, 그것들이 아카이브가 쥐고 있으라고 존재하는 것을 파괴하는 두 방법이야. 훈련은 무뚝뚝해: 절대 덮어쓰지 않고, 절대 삭제하지 않는다. 새 것은 전임 옆에 착지해. 디스크는 역사에 쓰여. 그리고 공간이 정말 바닥나면 제거는 명시적이고 기록된 결정이야 — 갱신이나 정리 스크립트의 조용한 부수효과가 절대 아니지.
왜 이렇게 절대적인가? 모든 무심한 덮어쓰기 이야기가 같게 끝나니까. 상류 리포가 파일을 "고쳤"고, 그 고침을 동기화하면서 네가 고정하고 검증했던 revision을 파괴했어. 정리 스크립트가 실제로는 그 변형의 유일한 사본이던 "중복"을 지웠어. 파일명이 같다는 이유로 재다운로드가 검증된 원본 위에 내려앉았어. 각각은 키 입력 순간엔 합리적으로 보였고, 각각은 증거를 파괴했지.
revision 디렉토리가 불변성을 자연스럽게 만든다
둘째 레슨의 레이아웃이 이걸 실어: 모든 수집은 자기 변형-revision 디렉토리에 착지해. 새 revision은 새 디렉토리야 — 옛 것은 무손상, 여전히 고정되고, 여전히 NOTES와 다이제스트 검증돼. 아카이브에서 모델을 "갱신"하는 건 변이가 아니라 추가야. 나중에 두 revision을 비교할 때(리프레시가 텐서를 바꿨어? 라이선스 파일이 바뀌었어?), 그 비교가 가능한 건 정확히 어느 쪽도 덮어쓰이지 않았기 때문이야.
같은 규칙이 파일까지 축소돼: .part 파일은 절대 최종 이름을 입지 않아. 다이제스트는 편집되지 않고 이어 붙여지는 파일에 기록돼. 걸어 나가기 로그는 자라기만 해. 추가-모양의 아카이브는 감사 가능한 아카이브야 — 그 안의 모든 사실은 추가이거나 여전히 참이야.
정직한 예외들
두 케이스는 독단 대신 정직한 취급이 필요해. 진짜 잘못된 수집(애초에 착지하면 안 됐던 파일(라이선스 폭탄, 잘못 라벨된 파생형))은 제거될 수 있어, 그러나 기록된 사건으로: 무엇이 왜 떠났는지 말하는 걸어 나가기식 항목 하나가, 거절이 제거를 survive하게 해. 디스크 고갈(예산이 정말로 역사와 미래를 둘 다 못 담을 때)은 분류(triage)를 강제해. 그 분류 결정들(무엇이 떠났는지, 무엇이 정당화했는지)은 카탈로그에 속해, 조용한 삭제가 있는 줄어든 아카이브는 그냥 더 느린 정크 서랍이니까. 두 경우 모두 원칙은 온전히 살아: 행동은 명시적이고, 이유가 있고, 기록에 보여.
훈련을 기계적으로 지키기
훈련은 썩어. 권한은 안 썩어. 가장 강한 가드는 아카이브의 정준 사본을 무심하게 쓰기 어렵게 만드는 거야: 수집 과정을 제외한 모든 것에 읽기 전용 공유, 아니면 한 방향(원천 → 아카이브)으로만 도는 동기화 도구 — 아카이브 안의 무엇도 결정 덮어쓰기 위치로 역전파되지 않게. 벨트: 주기적 다이제스트 스윕 — 그게 트립와이어이기도 해, 덮어쓰기나 삭제가 FAILED 또는 실종 항목으로 나타나고, 그때 기록이 그게 결정이었는지 말해 주니까.