user message, assistant text delta, tool_call 요청과 결과, error를 {conversation_id}.jsonl에 한 줄씩 기록하고 나서 frontend에 보여줘. SQLite의 denormalized messages table은 빠른 query용이고, ChromaDB는 semantic search용 embedding이야.
JSONL을 원본으로 삼아
SQLite와 ChromaDB는 JSONL에서 만든 파생 mirror야. 내용이 다르면 JSONL을 기준으로 SQLite를 비우고 replay해 다시 만들어. 잘못된 row만 patch하면 원인이 남아 다음 복구 때 다시 드러나.
append-only는 과거를 고치지 않는다는 뜻이야
기존 line을 수정하거나 지우지 말고 새 event만 추가해. 사용자가 undo해도 원래 event는 남기고 undo event를 덧붙여. 그러면 사고 경로를 추적하고 같은 방식으로 복구할 수 있어.
cwkPippa의 session 모델
cwkPippa는 JSONL line을 frontend에 보여주기 전에 기록해. SQLite query row와 ChromaDB embedding은 모두 JSONL을 replay해 다시 만들 수 있어.
저장된 JSONL도 암호화해
cwkPippa는 keychain에 보관한 passphrase로 JSONL 각 line을 Fernet 암호화해. 다른 Mac에는 opaque blob 상태로 rsync되고 plaintext 파일로 남지 않아.