콘텐츠로 이동

Memory

이 페이지는 CLAUDE.md의 구현 노트를 미러합니다. 서브시스템 변경 시 양쪽 다 업데이트하세요.

memory.md는 Opus가 유지하는 장기 사용자 프로필입니다. 작고 (300단어 이하 bullet-point), rolling 디지스트 히스토리에서 주기적 업데이트되고, 제안 프롬프트에 주입되어 Cue의 세 제안이 시간이 지남에 따라 사용자가 누구인지 알게 됩니다.

데이터 흐름

graph LR
    Digests[(digests<br/>SQLite rolling timeseries)]
    MemoryMd[(memory.md<br/>plain text)]
    Opus[Claude Opus]
    Suggest[cue.suggest<br/>핫키 경로]

    Digests -->|N 디지스트마다| Opus
    MemoryMd -->|current_memory| Opus
    Opus -->|재작성된 프로필| Scrub[pii.scrub]
    Scrub --> MemoryMd
    MemoryMd -->|memory dump| Suggest

cue.memory._compute_memory():

  1. 현재 memory.md 로드 (첫 실행 시 비어있음).
  2. SQLite에서 가장 최근 N 디지스트 요약 가져옴.
  3. prompts.MEMORY_TEMPLATE.format(current_memory=..., digests=...) 로 Opus 호출.
  4. 반환된 텍스트를 cue.pii.scrub()로 scrub.
  5. memory.md에 atomic 작성.

프롬프트

전체 템플릿은 프롬프트 페이지에 렌더. 핵심:

  • append-style 업데이트 — 교체가 아닌. 최근 디지스트가 지원하지 않으면 기존 패턴이 fade하지만 즉시 제거되지 않음.
  • 캡처: 자주 사용하는 앱/도구, 일반적 작업 패턴, 반복되는 선호, 주목할 만한 습관.
  • 출력: 300단어 이하, bullet-point 형식, 한국어, 프로필 텍스트만 (설명 없음).

실행 시점

메모리 업데이터는 스트리밍 레코더의 디지스트 cadence에 실행 — N 디지스트마다, streaming.memory_every_digests로 설정 가능. 기본값은 사용자가 Opus가 재작성을 요청받기 전에 최소 몇 디지스트의 누적 narrative를 가지도록 가정.

부팅 시 backfill

SQLite의 _meta.scrub_version이 현재 pii_recognizers.CURRENT_SCRUB_VERSION 보다 이전이면 memory.maybe_backfill_memory()가 시작 시 memory.md를 in-place 재 scrub. 같은 아이디어가 SQL digests.summary row에도 store.backfill_scrub() 통해 적용. 버전 관리 — scrub 버전 bump마다 정확히 한 번 실행.

RAG 주입 지점

핫키 경로는 SUGGEST_MEMORY_LABEL ("사용자 프로필 (장기 메모리):") 헤딩 아래 memory.md를 제안 프롬프트에 append. Opus는 다음 디지스트 틱이 재작성할 때까지 매 핫키마다 같은 프로필 봄.

프라이버시 자세

  • 메모리 텍스트는 post-scrub — 재작성 시 PII가 Opus에 도달하지 않고, 제안 경로에서도 PII가 Opus에 도달하지 않음.
  • 이미지 바이트는 memory.md에 절대 쓰이지 않음.
  • memory.md는 Cue 데이터의 나머지와 동일한 권한으로 데이터 루트에 존재 (Unix에서 POSIX 0o700 dir / 0o600 file).

더 보기