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

Storage & 네 가지 artifact class — resume 하는 네 가지 방식

~15 min · storage, artifact-taxonomy, event-log, resume-rules

Level 0호기심
0 XP0/65 lessons0/17 achievements
0/100 XP to next level100 XP to go0% complete

네 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 를 들고 있는지 아는 게, 그걸 다시 가져와도 되는지 아는 거야.

Code

네 storage layer — DB 는 ref 를 들지 payload 안 들어·text
SQLite (WAL)          state-machine 스냅샷       '내가 어디 있나'; atomic lease
append-only event log  모든 transition + envelope   forensic + uncertain-state 탐지기
content-addressed file step output payload (sha-keyed)  dedup, 무결성, DB 안 부풂
DB ref 컬럼            sha / artifact-id 포인터   load-on-demand; row 작게 유지
네 artifact class -> 네 resume 규칙·text
Class 1  externally persisted   image (Nano Banana)   파일 재사용; 사라졌을 때만 재생성
Class 2  idempotent fetch       주가 (Polygon)        안전 re-fetch; 최악이 중복 call
Class 3  nondeterministic snap  web search            snapshot 재사용, 절대 re-search 안 함
Class 4  derived render-out     show_widget (svg/chart) sha 멀쩡하면 재사용;
                                                       source_refs 살아있을 때만 re-render

Progress

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

댓글 0

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

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