수집은 의외로 쉬웠다. 세션이든 메모든 raw 폴더에 떨어뜨리면 됐으니까. (어디서 던져도 자동으로 쌓이는 채널을 짜는 게 그 앞 단계였다.) 어려운 건 그다음이었다. raw를 읽어서 쓸 만한 걸 골라 위키 페이지로 만드는 일, 그러니까 소화가 자꾸 어긋났다.
한번은 이러고 또 왔다.
“안녕 소화가 오래결러서 내가 또왓음” “로우 데이터 밖에서 수집하고있어 근데 생각보다 별게 없긴하네 내가 따로 지식 관리를 안해서”
뼈대는 두 폴더가 전부
raw/와 wiki/, 딱 둘로 시작했다. 규칙은 하나. raw는 절대 수정하지 않는다. 원본 대화, 메모, 붙여넣기 — 뭐가 들어와도 raw엔 손 안 댄다. wiki는 LLM이 만들고 유지하는 소화본이다. “원본 vs 소화된 결과물”을 처음부터 갈라놔야 나중에 안 헷갈린다. 폴더 골격 자체는 /docs-init 스킬로 한 번에 잡았다.
소화 기준은 한 번에 안 정해졌다
기준이 모호하면 LLM은 둘 중 하나로 간다. 다 정리하거나, 다 버리거나. 처음이 딱 그랬다. 잡담까지 페이지로 만들거나, 정작 쓸 만한 결정은 흘리거나.
그래서 기준을 글로 박았다. CLAUDE.md에. 처음엔 느슨했다. “일단 뭔가 얻은 게 있으면 뽑아줘” 정도. 그걸로 부족해서 “재사용할 수 있거나 지식이 될 만한 것”으로 좁혔다. 거기서 또 손봤다. 신호 평가(도구 사용·문제에서 결론으로 가는 아크·보존 언급은 정리, 단발 잡담·일회성 계산은 버림), 버려야 할 것 목록, content_potential 태그(처음엔 story·lesson·tip, 나중에 method 추가)로 블로그 소재까지 같이 잡게. 프로젝트 세션이면 overview 인덱스도 갱신하라는 규칙도 뒤에 붙였다. 한 번에 정한 게 아니라 digest를 돌릴 때마다 어긋난 데를 고쳐 나간 결과다.
기준을 CLAUDE.md에 다 넣었더니 또 다른 문제가 생겼다. 소화랑 상관없는 규칙까지 매 세션 컨텍스트에 로드됐다. 그래서 소화 기준은 /digest 커맨드로 따로 빼서, 필요할 때만 불러오게 했다.
기준만으론 안 뽑혀서, 직접 찍기로 했다
기준을 아무리 다듬어도 한계가 있었다. 대화가 길거나 한 번에 많이 쌓이면, 정작 중요한 신호가 그래도 안 뽑혔다. 소화가 알아서 골라주길 기다리는 대신 내가 직접 찍어주기로 했다. 그래서 만든 게 pin이랑 capture 스킬이다. 중요한 순간을 그 자리에서 raw/inbox/pinned.md에 찍어두면, 소화할 때 그걸 먼저 처리한다. “이건 꼭 챙겨” 하고 표시를 남겨두는 거다.
파이프라인: ingest → scrub → digest → lint
소화 앞뒤로 단계가 붙는다.
ingest-chats가 시작이다. CLI 세션을 manifest 증분으로 가져온다. 이건 LLM 안 시키고 결정론적 스크립트로 처리했다. “파일 복사”에 가까운 일이라 그게 더 빠르고 안전하다.
scrub은 API 키·주민번호·비밀번호 같은 시크릿을 치환한다. 이게 왜 필요한가 했는데, obsidian-git이 자동 커밋할 때 네이티브 pre-commit 훅을 안 돌린다는 걸 발견하고 납득했다(isomorphic-git 구현이라 그렇다). git 훅을 믿으면 안 된다. 소화 직전에 도는 PreToolUse 훅이 실제 방어선이다.
digest가 raw에서 wiki로 변환하는 단계, lint가 마무리 건강검진이다(고아 페이지·모순·교차참조 누락 점검).
훅으로 못 박기
digest 실행 직전에 raw/wiki 변경분을 스캔해서, sk-ant-·ghp_·AWS 키·주민번호 패턴이 고신뢰로 걸리면 exit 2로 막는다. 모델이 판단하는 게 아니라 스크립트가 차단해서 실수가 없다.
결국
핵심은 단순하다. 반복하는 일은 한 단어 커맨드로 만들고, 판단이 필요한 기준은 글로 박는 것. 수집은 스크립트가 하고, 소화는 글로 박은 기준이 한다. 처음엔 소화가 제일 안 풀렸는데, 기준을 말이 아니라 파일로 적고 나서야 돌아가기 시작했다.