본문 바로가기
C.W.K.
Stream
Lesson 05 of 05 · published

절대 덮어쓰지 않고, 절대 삭제하지 않는다

~11 min · immutability, append-only, revisions, safety

Level 0Kindling
0 XP0/32 lessons0/10 achievements
0/100 XP to next level100 XP to go0% complete

아카이브가 절대 실행하지 않는 두 명령

작업 디렉토리에서 덮어쓰기와 삭제는 평범한 위생이야. 아카이브에서는, 그것들이 아카이브가 쥐고 있으라고 존재하는 것을 파괴하는 두 방법이야. 훈련은 무뚝뚝해: 절대 덮어쓰지 않고, 절대 삭제하지 않는다. 새 것은 전임 옆에 착지해. 디스크는 역사에 쓰여. 그리고 공간이 정말 바닥나면 제거는 명시적이고 기록된 결정이야 — 갱신이나 정리 스크립트의 조용한 부수효과가 절대 아니지.

왜 이렇게 절대적인가? 모든 무심한 덮어쓰기 이야기가 같게 끝나니까. 상류 리포가 파일을 "고쳤"고, 그 고침을 동기화하면서 네가 고정하고 검증했던 revision을 파괴했어. 정리 스크립트가 실제로는 그 변형의 유일한 사본이던 "중복"을 지웠어. 파일명이 같다는 이유로 재다운로드가 검증된 원본 위에 내려앉았어. 각각은 키 입력 순간엔 합리적으로 보였고, 각각은 증거를 파괴했지.

revision 디렉토리가 불변성을 자연스럽게 만든다

둘째 레슨의 레이아웃이 이걸 실어: 모든 수집은 자기 변형-revision 디렉토리에 착지해. 새 revision은 새 디렉토리야 — 옛 것은 무손상, 여전히 고정되고, 여전히 NOTES와 다이제스트 검증돼. 아카이브에서 모델을 "갱신"하는 건 변이가 아니라 추가야. 나중에 두 revision을 비교할 때(리프레시가 텐서를 바꿨어? 라이선스 파일이 바뀌었어?), 그 비교가 가능한 건 정확히 어느 쪽도 덮어쓰이지 않았기 때문이야.

같은 규칙이 파일까지 축소돼: .part 파일은 절대 최종 이름을 입지 않아. 다이제스트는 편집되지 않고 이어 붙여지는 파일에 기록돼. 걸어 나가기 로그는 자라기만 해. 추가-모양의 아카이브는 감사 가능한 아카이브야 — 그 안의 모든 사실은 추가이거나 여전히 참이야.

수정은 명시적이고 기록된 행동이다 — 절대 부수효과가 아니다. 뭔가 바뀌어야 하면, 그 변화는 새 항목으로 착지하고 이유가 그 옆에 적혀. 아카이브는 실수를 담을 수 있어. 은폐를 담아서는 절대 안 돼.

정직한 예외들

두 케이스는 독단 대신 정직한 취급이 필요해. 진짜 잘못된 수집(애초에 착지하면 안 됐던 파일(라이선스 폭탄, 잘못 라벨된 파생형))은 제거될 수 있어, 그러나 기록된 사건으로: 무엇이 왜 떠났는지 말하는 걸어 나가기식 항목 하나가, 거절이 제거를 survive하게 해. 디스크 고갈(예산이 정말로 역사와 미래를 둘 다 못 담을 때)은 분류(triage)를 강제해. 그 분류 결정들(무엇이 떠났는지, 무엇이 정당화했는지)은 카탈로그에 속해, 조용한 삭제가 있는 줄어든 아카이브는 그냥 더 느린 정크 서랍이니까. 두 경우 모두 원칙은 온전히 살아: 행동은 명시적이고, 이유가 있고, 기록에 보여.

훈련을 기계적으로 지키기

훈련은 썩어. 권한은 안 썩어. 가장 강한 가드는 아카이브의 정준 사본을 무심하게 쓰기 어렵게 만드는 거야: 수집 과정을 제외한 모든 것에 읽기 전용 공유, 아니면 한 방향(원천 → 아카이브)으로만 도는 동기화 도구 — 아카이브 안의 무엇도 결정 덮어쓰기 위치로 역전파되지 않게. 벨트: 주기적 다이제스트 스윕 — 그게 트립와이어이기도 해, 덮어쓰기나 삭제가 FAILED 또는 실종 항목으로 나타나고, 그때 기록이 그게 결정이었는지 말해 주니까.

Code

절대-절대 규칙의 기계적 가드·bash
# 1) 새 revision은 전임 옆에 착지 — 절대 안에가 아니라:
NEW=bf16-250301          # 새 revision 디렉토리
mkdir -p "archive/$MAKER/$MODEL/$NEW"
# (옛 revision 디렉토리는 정확히 있던 자리에 남아)

# 2) 정준 사본을 수집 외 모든 것에 읽기 전용으로:
chmod -R a-w archive/  # 착지 + 검증 뒤에; 실행마다 다시 활성화
#   또는 NAS 공유를 읽기 전용으로 export하고 수집 과정에
#   자기만의 쓰기 가능한 스테이징 루트를 줘.

# 3) 단방향 동기화 (원천 -> 아카이브), 절대 양방향 아님:
rsync -a --ignore-existing staging/ archive/
#   --ignore-existing: 아카이브에 이미 있는 파일은 원천이
#   지금 뭐라든 절대 안 건드려.

# 4) 트립와이어 스윕 (무결성 트랙에서) — 덮어쓰기나 조용한
#    삭제가 여기 먼저 나타나:
shasum -a 256 -c SHA256SUMS | grep -v ': OK$' || echo "아카이브 깨끗"
find archive -name '*.safetensors' | wc -l   # 개수는 자라기만 해야

External links

Exercise

이번 주에 권한 가드를 설치해: 정준 사본을 읽기 전용으로 만들고(수집마다 재활성화), 원하면 그 위에 단방향 동기화나 추가-전용 로그를 얹어. 그다음 테스트: 아카이브된 파일의 무심한 덮어쓰기를 시도하고 무슨 일이 일어났는지 문서화해. 두 정직한-예외 정책(잘못된 수집, 디스크 고갈)을 두 문장씩 적어 마무리해.
Hint
덮어쓰기 시도는 실패해야 해 — 그게 요점이야. 성공하면 가드가 장식이야. 계속하기 전에 고쳐. 두 정책은 모두 '...그리고 제거는 이유와 함께 카탈로그에 기록된다'로 끝나야 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.