본문 바로가기
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/69 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, <app-data>/ 아래. dedup, 무결성, payload 가 DB 를 절대 부풀리지 않음.
  • DB ref 컬럼 — 파일 layer 를 가리키는 sha / artifact-id 포인터. 필요할 때만 load해서 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 (주가): 안전하게 다시 fetch해. 최악의 결과도 중복 call이야.
  • Class 3 — non-deterministic snapshot (web search): snapshot 재사용, 절대 re-search 안 함 — 다시 돌리면 drift 나고, 그걸 인용한 본문이 stale 해져.
  • Class 4 — derived render-out (widget / chart): side-effect는 없지만 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

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

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