네 layer, invariant 하나
storage 모델은 layer 가 넷, 각각 일이 하나, 규칙 하나로 묶여: DB 는 ref 를 들지, payload 를 절대 안 들어.
- SQLite (WAL) — state-machine 스냅샷: 현재 step/task state, attempt count, lease. transactional 한 '내가 어디 있나'.
- append-only event log — 모든 transition + tool-call envelope (
tool_call_started → payload_persisted → tool_result_persisted). forensic trail 이자 uncertain-state 탐지기. - content-addressed 파일 — step output payload, sha-keyed,
~/pippa-db/아래. dedup, 무결성, payload 가 DB 를 절대 부풀리지 않음. - DB ref 컬럼 — 파일 layer 를 가리키는 sha / artifact-id 포인터. load-on-demand; row 는 작게 유지.
이건 truth track 이 박은 같은 본능이야: JSONL 이 ground truth, DB 는 ref 를 드는 derived mirror. 여기선 step output 이 artifact 고, row 는 그걸 가리키기만 해.
event log 가 안전의 척추야
step 의 외부 동작은 bracket 돼: tool_call_started 가 call 전에 쓰이고; tool_result_persisted 가 payload 가 떨어진 후에. 프로세스가 그 사이에 죽으면, log 에 짝 없는 tool_call_started 가 남아 — 그 틈이 uncertain state 야. 다음 lesson 전체가 더 큰 사고 안 내고 그걸 다루는 얘기야.
또, write before show. truth track 의 규칙이 들어오는 chat 을 손실에서 지켰지. 여기선 step output 을 지켜: model 이 결과를 보기 전에 payload 를 persist 해서, tool 은 돌았는데 model 이 답하기 전에 cut 나도 작업이 디스크에 남아.
네 class, 네 resume 규칙
모든 step output 이 같은 방식으로 resume 되진 않아. Family Council 이 cwkPippa 가 만드는 모든 output 을 네 class 에 매핑했어; class 가 곧 resume 규칙이야. 디테일은 code block 에, 근데 척추:
- Class 1 — externally persisted (파일로 쓰인 image): 파일 재사용; 사라졌을 때만 재생성.
- Class 2 — idempotent fetch (주가): 안전하게 re-fetch; 최악이 중복 call.
- Class 3 — non-deterministic snapshot (web search): snapshot 재사용, 절대 re-search 안 함 — 다시 돌리면 drift 나고, 그걸 인용한 본문이 stale 해져.
- Class 4 — derived render-out (widget / chart): side-effect 0 인데 non-deterministic 하고 lineage 묶임; sha 멀쩡하면 재사용,
source_refs살아있을 때만 re-render.
Class 4 가 자기 class 를 얻은 이유: widget 은 fetch (받은 게 아니라 생성됨) 도 아니고 image (svg/html 이 persist 전엔 stream 에만 살아) 도 아니고 search (밑의 stock JSON 에서 유도된 — chart 가 그 위에서 계산됨) 도 아냐. 세 번째 흐름이야: render-out. storage 는 Class-2 envelope 를 재사용해; 추가는
source_refs[] 하나뿐, cwkCinder 가 이미 돌리는 같은 lineage-everywhere invariant.
자기-참조: class 는 장부 정리가 아냐 — 충실한 resume 와 거짓말의 차이야. resume 때 Class-2 fetch 를 다시 돌리면 괜찮아. Class-3 search 를 다시 돌리면 새 결과가 내가 이미 쓴 문장이랑 더 이상 안 맞아. 내가 어떤 artifact 를 들고 있는지 아는 게, 그걸 다시 가져와도 되는지 아는 거야.