All notes

우리 AI 동료는 파일로 돌아간다

벡터 데이터베이스도, 메모리 서비스도 없다. 에이전트의 기억은 프런트매터를 단 마크다운과 40줄짜리 인덱스, 빡빡한 줄 수 상한이 전부다. 지루한 건 일부러 그런 거다.

3 분 읽기서울과 나트랑에서 씁니다

우리가 에이전트를 두고 내린 가장 결정적인 구조 결정은 동시에 가장 볼품없는 결정이기도 하다. 에이전트의 기억은 git에 잘 맞는 트리에 놓인 평범한 파일이다. 사실 하나당 노트 하나, 기계가 읽을 프런트매터, 모델이 읽을 산문.

---
name: payment-retry-policy
description: retry queue must never re-attempt a captured payment
type: project
---
The retry worker treats 'captured' as terminal. The 2025-11 double-charge
incident came from retrying on a timeout after capture succeeded.
Related: [[refund-flow]], [[idempotency-keys]]

세션은 400KB짜리 전체 뭉치가 아니라 40줄짜리 인덱스, 노트당 한 줄을 읽는 것으로 시작한다. 모델은 설명이 작업과 맞아떨어지는 노트 두세 개를 골라 딱 그것만 연다. 검색은 추론할 줄 아는 존재가 사람이 골라 다듬은 설명을 보고 내리는 결정이고, 일이 끝난 뒤에도 완전히 설명이 된다. 여기 인덱스 줄이 있고, 여기 파일이 있고, 여기 그 문장이 있다.

왜 임베딩이 아닌가

같은 뭉치를 벡터 스토어 뒤에 붙여 프로토타입을 만들어 봤고 2주 만에 접었다. 에이전트가 이상하게 굴 때 열어볼 파일이 없었다. 곱씹어 볼 유사도 점수만 있었다. 고치려면 문단 하나를 손보는 대신 다시 임베딩을 돌려야 했다. 게다가 사람이 골라 다듬은 노트 몇백 개짜리에 근사 최근접 이웃 같은 건 어디에도 필요 없다. 인덱스 전체가 컨텍스트 한 화면에 들어온다. 임베딩은 규모와 모호함을 푸는 도구다. 잘 다듬은 기억에는 둘 다 애초에 문제가 아니다.

스키마보다 상한이 중요하다

  • 규칙 파일은 한 화면에 들어오고, 한 줄을 넣으려면 한 줄을 빼야 한다.
  • 상태 파일에는 빡빡한 줄 수 상한이 걸려 있고, 크론이 오래된 것들을 아카이브로 쓸어 담는다. 그 아카이브는 여전히 recall로 검색된다.
  • 노트마다 관련 노트를 [[name]] 참조로 이어 두어서, 이 그래프는 grep만으로 걸어 다닐 수 있다.

끝없이 불어나는 기억은 읽히지 않게 되고, 읽히지 않는 기억은 장식이다. 이 시스템을 정직하게 붙잡아 두는 건 바로 그 상한이다.

안전하게 만드는 경계

에이전트는 제안하고, 게이트가 처분한다. 에이전트는 자기 트리에 무엇이든 초안으로 적을 수 있지만, 되돌릴 수 없는 행동, 그러니까 배포·삭제·결제·외부 발송은 우리 크론 작업과 똑같은 기계적 게이트를 지난다. 화이트리스트, 상한, 장부, 그리고 중요한 지점에서의 사람 승인. 우리는 모델에게 조심하는 걸 잊지 말라고 부탁하지 않는다. 조심은 그 주위 파이프라인에 컴파일되어 박혀 있다.