사람이 쓰는 곳이 원본이야
기억은 editor와 mobile sync와 live brain session에서 바뀌어. 그 모든 정상 경로가 만나는 곳이 live vault야. versioning 도구가 자기 편한 mirror를 원본이라고 부르는 순간, 사람의 실제 작업은 외부 입력으로 격하되고 충돌 때마다 도구가 이기게 돼.
원본이라는 말은 가장 정교한 저장소를 뜻하지 않아. 정당한 쓰기가 일어나는 곳을 뜻해. formatting이 조금 덜 예쁘고 history query가 느려도, 그곳에서 수정이 생기고 다른 장치로 전파된다면 authority는 거기에 있어.
projection은 유용해서 더 위험해
mirror는 검색과 diff와 Git commit에 훨씬 편해. Sync 내부 파일이나 editor lock을 건드리지 않고 안정된 tree를 만들 수 있거든. 그래서 어느 순간 mirror를 더 깨끗한 원본처럼 느끼기 쉬워. 바로 그 편리함 때문에 direction을 invariant로 써야 해.
허용되는 화살표는 live vault에서 mirror, mirror에서 derived index와 ledger뿐이야. 반대 화살표는 restore조차 직접 못 지나가. 과거 내용을 live vault에 되살리려면 mediated write라는 새 현재 사건으로 들어와야 해.
동기화 충돌도 authority를 바꾸지 않아
Sync conflict가 생겼다고 mirror가 심판이 되는 건 아니야. conflict file도 live truth가 낳은 사건이고 사람이 비교해야 할 두 흔적이야. derived system은 둘을 감지하고 보여줄 수 있지만 어느 쪽을 진실로 합칠지 자동으로 결정하면 안 돼.
이 경계가 있으면 rebuild가 쉬워져. mirror나 index가 이상하면 버리고 live vault에서 다시 만들면 돼. 반대로 live vault가 derived state에 의존하면 무엇도 안전하게 버릴 수 없고, cache 장애가 원본 장애로 승격돼.
권위 표를 먼저 써
구현 전에 data마다 누가 write하는지와 무엇에서 rebuild되는지 표로 써봐. rebuild source를 가리킬 수 있는 항목은 projection이고, 정상 write가 직접 도착하는 항목은 candidate authority야. 둘 다라고 적힌 행은 위험 신호야. 양방향 sync가 정말 필요하다면 conflict owner와 merge semantics가 별도 제품 수준으로 명시돼야 해.