"모두가 딛고 선 바닥을 옮기는 건 세상 제일 무서운 campaign 이야. 바닥을 새로 지어서 하지, 제자리에서 고쳐서 절대 안 해."
고쳐 쓰지 말고 새로 지어
fleet 의 두 번째 큰 campaign 은 레거시 클라우드-provider root, 그러니까 모든 프로젝트가 살던 폴더를 은퇴시키고 보통 폴더로 바꿨어. 유혹은 옛 데이터를 제자리에서 변환 하는 거야. 최대한 빨리 새 모양으로 mutate. 그건 리마스터고 함정이야. 이주는 대신 root 를 현재 ground truth 에서 새로 지었어. authoritative 호스트의 live 프로젝트가 유일한 소스였고, 각 peer 의 active project tree 는 옛 바이트에서 변형하는 대신 거기서 새로 rebuild 했어.
writer 는 destination 을 검증하고 fail closed
cutover 가 시작하기도 전에, 더 좁은 guard 가 먼저 모든 곳에 깔렸어. 모든 local·cross-host writer 가 destination root 를 identity 로 검증하고, 틀리면 fail closed 해야 했어. 옛 root 를 다시 만드는 일 없이. 이 guard 는 데이터를 옮기지도 authority 를 주지도 않았어. 하는 일 전부가, 진짜 이주가 아직 준비되는 동안 stray 재부팅이나 백그라운드 sync 가 두 번째 split-brain root 를 조용히 못 낳게 하는 거였어.
보인다고 로컬 바이트가 아냐
클라우드 file provider 가 Finder 에 파일을 보여준다고 그 바이트가 디스크에 있는 건 아냐. 그래서 complete copy 는 빈 placeholder 를 조용히 복사하는 대신 예상 못 한 dataless object 에서 멈췄어. 클라우드가 여기 있어 라고 말하는 걸 증거로 받지 않았어. 파일이 보인다는 걸 진짜 내려받았다는 뜻으로 믿으면, 이주는 자신만만하게 빈 파일만 가득한 디렉토리로 끝나.
소스를 보존하고, 다시 나타난 옛 root 는 drift 야
원본 provider 랑 어떤 split-brain root 도 안 건드린 채, 별도의 나중 cleanup campaign 을 위해 retained 로 남았어. cutover 승인은 삭제를 명시적으로 안 담았어. 그리고 나중에 어떤 stale writer 가 다시 만들어서 옛 root 가 다시 나타나면, 그건 audit 할 observed drift 로 적혔지, 시스템이 기댈 fallback 이 절대 아냐. 과거를 증거로 곁에 두고, 예상 못 한 귀환은 안전망이 아니라 신호로 다뤄.