"교체는 merge 가 아냐. 정체성 수술이야. 순서대로, 돌아갈 길을 깔고."
한 아침, 순서대로
2026-09-13 에 레플리카는 리허설을 졸업했어. cutover 는 하나의 순서 있는 수술로 돌았고, 그 순서가 곧 레슨이야. 검증된 백업이 먼저(두 히스토리의 git 번들, 데이터와 서포트 아카이브, 설치된 3.1.0 번들), 그다음 레포 이어 붙이기 — Swift 트리를 기존 Rekindle 레포에 merge 커밋으로 합치는데 첫 parent 가 Tauri head 라서 두 히스토리가 같은 방에 남는 거야 — 그다음 정체성 통일, 그다음 각 Mac 의 일회성 데이터 변환(해시 검증된 백업에서, 원본은 아카이브로), 그다음 설치, 그다음 Firelink 의 버전 기록, 그다음 가족 정합과 fleet 배포. 다음 단계가 착륙하기 전까지 모든 단계는 되돌릴 수 있고, 되돌릴 수 없는 단계에 이르면 돌아가는 길은 이미 기록돼 있어. 아카이브된 3.1.0 번들과 아카이브된 데이터 루트가 그거야.
정체성은 주소의 목록이야
아무도 안 즐거워하는데 건너뛸 수 없는 부분이 있어. 앱의 정체성은 이름이 아냐. 머신이 그 앱을 알아보는 모든 주소지. cutover 테이블은 그걸 전부 뒤집어야 했어. 번들 id(com.cwk.rekindle), 설치된 앱 경로, 데이터 루트(~/cwk-dbs/rekindle-db/), 서포트와 캐시 디렉터리, Keychain 서비스 네임스페이스, URL 스킴, 그리고 — 가족이 실제로 대화하는 통로인 — Pippa host kind 와 brain-control app id 도 전부 rekindle 로. 임시였던 Kindling 정체성은 살아 있는 런타임 전부에서 빠졌어. 역사 문서들은 쓰일 때의 이름을 그대로 간직해. 역사를 다시 쓰는 건 다른 수술이고, 아무도 그걸 주문하지 않았거든.
버전이 3.1.0 에서 4.0.0 으로 뛴 이유
버전은 레플리카 프로그램 내내 0.0.0 에 박혀 있었어. 제품이 아직 번호를 벌지 못했으니까. 그러다가 minor 가 착지할 곳을 훌쩍 넘는 점프를 했지. 가족의 버전 계약이 일한 거야. 구현 교체에 일회성 데이터 변환이 붙으면 그건 MAJOR 변경이고, 사람이 보는 버전은 태그에서 추론하는 게 아니라 릴리스 주인(Firelink)이 써. 빌드 번호, git 커밋, 스키마 개정은 전부 자기 레일에서 자라. 제품 버전은 다른 질문에 답해 — 사용자가 방금 뭘 돌리기로 동의했지? 2026-09-13 의 답은 이거야. 같은 제품, 새 엔진, 그리고 네 데이터는 같이 왔어.