C.W.K.
Stream
Lesson 01 of 04 · published

복구는 증거를 재구성해

~12 min · recovery, reconstruct-evidence, no-auto-destruction

Level 0Finder 에서 길 잃음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"크래시 뒤 다시 실행은 앱이 자기를 확신하며 깨는 게 아냐. 앱이 기억상실로 깨는 거고, 제일 먼저 할 일은 자기 일기를 읽는 거야."

위험한 가정

파일 오퍼레이션이 돌고 있었어. 그다음 앱이 크래시났거나, 볼륨이 언마운트됐거나, Mac 이 전원을 잃었어. 이제 Waygate 가 다시 실행돼. 제일 위험한 건 가정하는 거야 — 오퍼레이션이 끝났다고 가정하고 스테이징 항목을 정리하거나, 실패했다고 가정하고 목적지를 지우거나. 어느 가정이든, 눈감고 하면, 엉뚱한 복사본을 파괴할 수 있어. Waygate 의 규칙은 다시 실행이 파괴적인 걸 할 권한을 정확히 0 준다는 거야.

먼저, 이야기를 재구성해

어떤 결정 전에, 복구는 저널을 읽고 뭐가 벌어지고 있었는지 재구성해: 어느 오퍼레이션이 진행 중이었나, 어느 상태에 도달했나, 어떤 증거가 있나 — 검증된 스테이징 복사가 있나? 파괴적 배리어가 건너졌나? 소스가 여전히 있나? 저널은 모든 변형 전에 쓰였으니(Track 3), 항상 디스크만큼은 알아. 복구의 일은 그 질긴 기록을 크래시가 친 순간의 정확한 그림으로 되돌리는 거야.

그다음, 안전한 경로를 골라

이야기가 재구성되고서야 Waygate 는 고르고, 선택지는 안전순으로 정렬돼: 읽기 전용 검사(봐, 아무것도 안 바꿔), 증거로 뒷받침된 전진(증거가 안전하다고 증명한 것만 끝내), 안전한 롤백(결정론적인 데서 알려진-좋은 상태로 되돌려), 아니면 needsReview(멈추고 사람한테 물어). 파괴적 복구는 앱이 다시 돈다고 절대 안 벌어져 — 증거가 결정론적으로 안전하다고 말할 때만 벌어져.

복구는 먼저 저널에서 증거를 재구성하고, 그다음 읽기 전용 검사, 증거로 뒷받침된 전진, 안전한 롤백, 아니면 needsReview 를 골라. Waygate 는 다시 실행됐다고 파괴적 복구를 절대 안 돌려. 모든 변형 전에 쓰인 저널이, 복구가 짐작 대신 읽는 질긴 설명이야.
Waygate 를 안 지은 버전의 나였으면 복구를 '실행 시, 불완전한 오퍼레이션을 확인하고 끝내라' 로 썼을 거야. 아빠가 '끝내다' 란 단어랑 앉아 있게 했어. 어떻게 끝내? 무슨 증명으로? 소스-삭제 배리어 바로 거기서의 크래시를 데리고 걸어줬고, 난 '끝내라' 가 '유일한 좋은 복사를 지워라' 를 의미할 수 있단 걸 깨달았어. 복구는 작업 완료에 관한 게 아냐; 완료가 안전한지라도 알 만큼 진실을 재구성하는 거야. 그 리프레임이 트랙 전체야.

Code

재구성하고, 그다음 안전순으로 골라 — 절대 다시 실행만으로 행동 안 함·swift
func recoverOnLaunch() async {
    for op in journal.incompleteOperations() {
        let evidence = journal.reconstructEvidence(op)   // rebuild the story FIRST
        switch decide(op, evidence) {
        case .inspectReadOnly:
            present(op, mode: .readOnly)                 // look, change nothing
        case .forwardProgress where evidence.isDeterministic:
            try? await engine.resume(op, from: evidence) // finish only the proven-safe part
        case .safeRollback where evidence.rollbackIsDeterministic:
            try? await engine.rollback(op, to: evidence.lastKnownGood)
        default:
            journal.mark(op, .needsReview)               // uncertain -> a human decides
        }
    }
}
// There is no branch that deletes, replaces, or cleans up just because
// `recoverOnLaunch()` ran. Destruction requires deterministic evidence.

External links

Exercise

볼륨 넘는 이동이 네 다른 지점에서 중단된 복구 결정 표를 써: 복사 중, 검증 뒤 publish 전, publish 뒤 소스-삭제 전, 소스-삭제 뒤. 각각에 대해, 저널이 어떤 증거를 쥐고 네 복구 경로(검사 / 전진 / 롤백 / needsReview) 중 어느 게 맞는지 말해봐.
Hint
복사 중: 부분 스테이징 항목만 있어 — 버려, 소스 온전, 안전한 전진-재시도나 검사. 검증 뒤 publish 전: 스테이징 복사가 좋아, publish 는 안전한 전진. publish 뒤 소스-삭제 전: 복사본 둘 다 있고 배리어가 불완전 — 정체성 증거가 결정론적이지 않으면 고전적 needsReview 케이스. 소스-삭제 뒤: 이동이 진짜 끝났어, committed 표시. 위험한 중간이 낙관이 아니라 증거가 정해야 하는 곳이야.

Progress

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

댓글 0

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

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