세션이 끝나면 모든 걸 잊는 AI에게 파일로 서재를 만들어 줬다. 그 서재가 어떻게 굴러가는지 적었다.
역할이 다른 네 묶음으로 나눠 놨다.
MEMORY.md세션이 켜질 때 가장 먼저 읽히는 한 장짜리 색인. 기억 한 권당 한 줄씩 들어간다. 덕분에 비서는 "이런 기억이 있구나"는 알고 시작한다. 분량 한도를 넘기면 뒷부분이 조용히 잘리는 성질이 있어서, 아래 6번의 사서가 분량을 감시한다.
한 주제가 한 파일이다(memory/*.md). 프로젝트 경과, 일하는 방식에 대한 피드백,
참고자료 위치 같은 것들. 파일끼리 [[다른기억]] 링크로 이어져 있어서,
목차를 보다가 필요해 보이는 권만 그때그때 꺼내 읽는다.
PROJECT_STATUS.md진행 중인 각 프로젝트의 현재 결론과 완료·금지 사항을 한 줄씩. 다른 기억과 달리 세션 시작 때 무조건 통째로 주입된다. 전에 결정한 걸 새 세션이 모르는 게 제일 흔한 사고였는데, 이것만큼은 관련성 판단 운에 맡기지 않기로 했다.
끝났거나 한동안 안 쓰는 기억이 가는 곳. 자동으로 읽히는 범위 밖이라 평소엔 조용하지만, 관련 주제가 다시 나오면 검색해서 꺼낸다. 버리는 대신 옮겨 두는 것.
새 기억을 적을 때는 이 중 하나로 분류해 둔다.
역할·전문성·선호. 예) 비개발자 직장인, 어떤 호칭을 쓰는지, 자주 쓰는 기기.
내가 준 피드백을 왜 그런지, 어떻게 적용하는지와 함께 적는다. 비개발자에겐 일상 비유로 설명하라든가, 추측하지 말라든가 하는 것들.
코드나 이력만 봐서는 알 수 없는 목표, 제약, 그간의 경위. 프로젝트당 한 권씩.
외부 도구의 함정, 운영 절차, 재사용할 패턴. "이 CLI는 이 옵션이 조용히 실패한다" 같이 한 번 당해 본 교훈이 주로 쌓인다.
세션 하나가 켜졌다 꺼질 때마다 이 다섯 단계가 돈다. 앞뒤의 자동 단계는 Claude Code의 hook(정해진 순간에 실행되는 스크립트)으로 만들었다.
상태판 전체 + 목차 + "지금 다른 세션 N개 열려 있음" 인기척 + 지난 세션의 미정리 기억 알림을 자동 주입.
목차를 보고 필요한 낱권만 펼침. 읽은 파일은 "내가 본 판본" 기록이 남아 아래 경비원의 판단 근거가 됨.
기억 파일에 쓰기를 시도하면 경비원이 위험한 쓰기 3종을 문 앞에서 차단. 그 외엔 통과.
끝난 대화에서 "기억할 만한 것"을 가벼운 모델이 자동 추출해 대기열에 항목별로 쌓아 둠.
새 세션이 대기열을 한 건씩 검토해 기억에 반영하거나, 사유와 함께 건너뛰고, 사서가 목차를 다시 씀.
자동 요약이 곧바로 기억이 되지는 않는다. 다음 세션의 Claude가 한 건씩 읽고 승격 여부를 판단한다. 잘못된 자동 기억이 쌓이는 걸 여기서 거른다.
세션 종료 때 자동 추출된 후보. 아직 검토 전.
다음 세션이 한 건씩 읽고 "새 정보인가? 이미 있나?" 판단.
새 정보 → 낱권·목차에 반영 완료.
이미 있거나 가치 낮음 → 표준 사유 코드와 함께 종결(이력 보존).
처음엔 후보를 통째로 비우는 방식이었는데, 어떤 항목을 반영했고 어떤 항목을 버렸는지
추적이 안 돼 유실·중복이 생겼다. 지금은 항목마다 상태(new / applied / skipped)와
건너뛴 사유(중복·이미 반영·가치 낮음 등)를 남긴다. 나중에 "그때 왜 저장 안 했지"를 복원할 수 있다.
나는 보통 세션을 3~10개 띄워 놓고 일한다. 그러다 보면 두 세션이 같은 수첩에 동시에 펜을 대는 일이 생기고, 나중 저장이 앞 저장을 덮어쓰면 그 사이의 기억은 그냥 사라진다. 그래서 경비원을 세웠다. 11일 동안 832건의 쓰기를 지켜보면서 규칙을 다듬었고, 지금은 아래 세 가지만 골라 막는다.
이 세션이 읽지도 않은 기존 기억 파일을 전체 덮어쓰려 하면 차단. 새 파일 만들기는 허용. 먼저 읽고 다시 쓰면 풀린다.
내가 읽은 뒤 다른 세션이 그 파일을 바꿨는데, 모르고 그 위에 쓰려 하면 차단. 최신본을 다시 읽으면 통과된다.
다른 세션(또는 병렬 보조 에이전트)이 지금 그 파일을 쓰는 중이면 잠시 차단. 몇 초 뒤 다시 시도하면 대개 풀려 있다. 잠금이 남아도 몇 분 안에 자동 해제.
· 급할 땐 통행증 파일을 만들어 차단을 잠시 경고로 낮출 수 있다. 대신 사용 기록이 반드시 남고, "지금 다른 세션이 쓰는 중"인 경우만큼은 통행증으로도 못 뚫는다.
· 경비원 자신이 고장 나면 작업을 막지 않고 통과시킨다(fail-open). 오류 기록과 알림만 남긴다. 보호 장치가 본업을 방해하기 시작하면 결국 보호 장치를 꺼 버리게 되기 때문이다.
· 읽기는 어떤 경우에도 차단하지 않는다. 차단이 작동하는 건 기억 파일에 쓸 때뿐이다.
목차를 손으로 고치다 한도를 넘긴 적이 있다. 뒷부분 4분의 1이 몇 주 동안 조용히 잘려 있었다. 존재하는 기억이 떠오르지 않는데, 그 사실을 아무도 모르는 상태. 그 뒤로는 사서가 각 기억 파일의 요약을 모아 목차를 다시 쓰고, 분량도 같이 감시한다.
기억이 더 늘면 사서는 목차 반영을 거부하고, 보관함으로 보낼 후보 목록을 보고한다. 실제로 옮기는 건 사람 일로 남겨 뒀다. 어떤 기억이 덜 중요한지는 기계가 정할 문제가 아니라서다.
기억이 틀리거나 사라지는 게 최악이다. 빠름과 토큰 절약은 그 다음.
안전장치는 자기가 고장 나면 조용히 비켜선다(fail-open). 막는 건 위에서 말한 세 가지뿐이다.
기계는 후보를 보고하고 기록할 뿐이다. 기억을 줄이거나 버리는 결정은 사람이 한다.
경고, 차단, 통행증 사용, 목차 갱신까지 전부 감사 로그에 남는다. 나중에 "왜 이렇게 됐지"를 복원할 수 있다.
다른 환경에 옮겨 심는다면 파일 이름이 아니라 이쪽이다.
색인은 가볍게 항상 읽히고, 낱권은 필요할 때만, 상태판은 무조건. 이렇게 역할을 나눈 뒤로 컨텍스트 비용과 기억 신뢰도를 따로 손볼 수 있게 됐다.
AI가 만든 요약을 검토 없이 영구 기억으로 쌓으면 오염이 누적된다. 대기열에 두고 다음 세션이 한 번 거르게 한 뒤로는 그런 일이 없다.
색인이 한도를 넘으면 조용히 잘린다는 걸 사고가 난 다음에야 알았다. 침묵 손실이 가능한 지점에는 자동 검사를 먼저 박아 두는 편이 싸게 먹힌다.
안전장치가 고장 나서 본업이 멈추면 결국 안전장치를 꺼 버리게 된다. 막는 조건은 좁고 명확하게 두고, 고장 나면 기록만 남기고 비켜서게 했다.