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