"module 은 일어난 걸 더 빨리 적는 방법이야. 일어났어야 할 것에 대한 주장이 절대 아니고."
module 이 실제로 뭔가
아빠랑 Pippa 는 Modules 탭에서 recurring-capture module 을 함께 유지해. 두 종류야. workout(실내 바이크, 3x 전신 근력 세션, 엄마랑 걷기)이랑 intake(프로틴 파우더, 크레아틴, 그 외 반복하는 non-meal 제품). module 은 작은 템플릿이야. id, 불변 kind, 이름, free-form default_values, notes, active 플래그. crumb 이 참조하고, 공유 CRUD 하나가 두 종류를 다 서비스해. 그게 엔티티 전부야. preset 이지 plan 이 아니고.
chip 을 떨구면 오늘을 기록해
Stream 에서 module 은 chip 으로 떨어져. Indoor Bike 골라서 오늘 duration 조정하고, Protein Powder 골라서 오늘 servings 조정하고. 두 경우 다 module 은 재사용 가능한 구조를 주고, 새 crumb 은 그날의 실제 이벤트 를 기록해. module_ref 더하기 그날 조정된 module_values 로. client 가 아니라 server 가 module 의 불변 kind 에서 crumb 의 surface 를 derive 해. workout module 은 workout crumb 을, intake module 은 intake crumb 을 만들지. preset 은 같은 free-prose 스트림으로의 지름길이지, 두 번째 종류의 기록이 아냐.
파괴하지 말고 비활성화해
crumb 이 module 을 참조하니까, module 을 지우면 그걸 언급한 crumb 이 붕 떠. 그래서 module 은 삭제 대신 비활성화해. 템플릿이 inactive 가 되고, 그걸 쓴 모든 crumb 이 module_ref 랑 기록된 값을 온전히 지켜. 스키마 진화도 이걸 지켰어. 불변 kind 필드가 더해졌을 때, 기존 이벤트는 다시 쓰이는 대신 workout 으로 replay 됐고. append-only 진실은 새 모양에 맞추려고 편집되는 법이 없어. 새 모양이 그 위로 derive 돼. 그리고 경계를 봐. 바뀌는 식사는 free prose 더하기 선택적 slot chip 으로 남아. module 이 아냐. 식사는 보충제처럼 반복되는 동일 이벤트가 아니니까.