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

re-filing 은 재작성이 아니라 revision 이야

~10 min · append-only, revision, identity, history

Level 0식은 화로
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"target_date 를 바꾸는 건 같은 crumb 에 revision 을 append 하는 거야. 절대 tombstone 후 재생성 안 해."

crumb 를 잃지 않고 옮기기

바꿔도 되는 유일한 날짜는 target_date 야 — crumb 를 한 날에서 다른 날로 re-file 하거나, 다른 저널로 옮기거나, 텍스트를 고칠 수 있어. 질문은 어떻게 야. 게으른 답은 필드를 제자리에서 덮어쓰거나, 더 나쁘게는 crumb 를 지우고 새 날에 새로 만드는 거야. Vesta 는 둘 다 안 해. re-filing 은 append-only revision 이야. 이전 값과 revision 타임스탬프를 보존하는 CrumbRevision 레코드가 append 되고, crumb 의 ULID, captured_at, 타임존, 미디어 참조는 있던 그대로 남아. crumb 는 같은 crumb 야 — 배정만 옮겼고, 그 이동이 이제 그 history 의 일부야.

파괴가 아니라 append 로 바꿔. 중요한 모든 변형 — re-file, 저널 이동, 텍스트 수정 — 은 이전 걸 보존하는 새 event 로 기록되지, 그걸 지우는 제자리 덮어쓰기가 절대 아냐. 원천 로그는 절대 다시 쓰이지 않아. 이게 store 전체를 복구 가능하게 만드는 바로 그 append-only 규율이고, crumb 자신의 history 도 그걸 따라.

왜 삭제-후-재생성이 독이야

crumb 를 tombstone 하고 새로 만드는 건 동등해 보여 — 같은 텍스트, 새 날짜 — 근데 조용히 세 가지를 파괴해. 첫째, 정체성: 새 crumb 는 새 ULID 라서, 옛것을 가리키던 모든 게 이제 매달려 있어. 둘째, provenance: 원래 crumb 의 ID 를 source_crumb_ids 에 인용한 draft 가 갑자기 더는 존재하지 않는 crumb 를 참조하고, 문단의 lineage 가 깨져. 셋째, history: 이 조각이 원래 다른 날에 파일링됐다가 옮겨졌다는 기록이 사라져 — 마음을 바꿨다는 걸 더는 볼 수 없어. append-only revision 은 셋 다 보존하고, 삭제-후-재생성은 row 하나 아끼자고 셋 다 버려.

정체성은 날짜가 아니라 ULID 야

이게 되는 깊은 이유는 crumb 의 정체성이 태어날 때 고정된 ULID 지 어떤 가변 필드도 아니라서야. 날짜가 바뀌고, 저널이 바뀌고, 텍스트가 고쳐져도 — 그 전부를 관통해 ULID 가 절대 안 움직여서 같은 crumb 로 남아. 그게 draft 가 crumb 를 한 번 인용하고 그 인용을 영원히 믿게 하는 것 — crumb 가 두 번 re-file 된 뒤에도. 표현(어느 날, 어느 저널, 무슨 텍스트)은 유동적이고, 정체성은 기반암이야.

Code

append 된 revision 으로서의 re-file (정체성 보존)·json
// the crumb, born on 2026-03-14
{ "id": "01J8Z...", "target_date": "2026-03-14", "captured_at": "2026-07-24T09:15Z" }

// re-file to 2026-03-13 — append a revision, do NOT overwrite
{ "event": "revise", "crumb_id": "01J8Z...",
  "field": "target_date", "from": "2026-03-14", "to": "2026-03-13",
  "at": "2026-07-25T20:02Z" }

// live state folds to target_date = 2026-03-13, but:
//   - the ULID 01J8Z... is unchanged  -> every citation still resolves
//   - captured_at is unchanged          -> the write-truth survives
//   - the move itself is now history    -> you can see you changed your mind

External links

Exercise

네가 아는 시스템의 '수정' 연산을 골라 — task 를 project 사이 옮기기, 레코드 소유자 바꾸기, 오타 고치기. 제자리 덮어쓰기인지 revision append 인지 물어봐. 그다음 누가 그 레코드를 ID 로 가리키는지 찾고, 그 수정이 삭제-후-재생성으로 구현되면 그 포인터들에 뭐가 일어나는지 추론해봐. 누구의 인용이 썩어?
Hint
위험은 뭔가가 레코드를 안정된 ID 로 참조하는 곳마다 드러나 — foreign key, 인용 목록, 캐시. 제자리 덮어쓰기는 ID 를 유지해 보통 괜찮고, 삭제-후-재생성은 새 ID 를 발행해 옛것을 향한 모든 참조를 고아로 만들어.

Progress

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

댓글 0

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

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