에이전트 메모리 엔진 (4/10) — memcore: SQLite로 다시 짠 메모리 코어, 51 tests

memcore — SQLite로 다시 짠 메모리 코어, 51 tests pass

부제: bank/ 40 파일 → 236 curated + 4 entities + 15 topics, 0 errors


핵심 요약

  • memcore 라이브러리 완성: SQLite + Python 표준 라이브러리만 사용, WAL 모드, 9 테이블, FTS5 가상 테이블.
  • 보존 자산 7/8 이식 완료. bank/ 40 파일을 단 한 번에 0 에러로 변환했다.
  • Hermes의 MemoryProvider 어댑터까지 붙여 51 tests, 0 failures.
1. memcore 라이브러리

1. memcore 라이브러리

설계 원칙은 두 가지였다. 외부 의존 없음, 단일 파일 DB.

  • SQLite + Python stdlib only
  • WAL mode (동시 읽기·쓰기 안정성)
  • 9 테이블: meta, u_patterns + 3 자식 테이블, identity, curated, entities, topics, topic_curated, episodes
  • FTS5 가상 테이블 curated_ftsunicode61 토크나이저로 한·영 혼용 검색 지원

데몬을 두지 않은 게 중요하다. 프로세스 아닌 파일이 진실의 원본이 된다. 백업·롤백·검증이 단순해진다.

2. 보존 자산 이식 7/8 완료

자산 모듈 상태
user-pattern-stage.py memcore.dialectic
confidence-decay.py memcore.decay
bank-lint.py memcore.lint
entity-audit.py memcore.entities
topics-validate / expand memcore.topics
retain-extract / merge memcore.ingest
recall-tree / match memcore.prefetch
docs-snapshot / release-check Hermes cron payload ⏸ (OS 레벨, 다음 주차)

이식 1~2일이라고 추정했는데 거의 비슷하게 끝났다. 코드 자체는 한나절, 테스트가 더 걸렸다.

3. bank/ → memcore 마이그레이션

3. bank/ → memcore 마이그레이션

마이그레이션 스크립트(memcore.bank_migrate)를 작성하면서 지킨 원칙:

  • READ-ONLY on sourcebank/는 한 글자도 건드리지 않는다.
  • rsync 스냅샷 — 변환 전에 시점 고정.
  • 4-phase parse — 식별 / 청크 / 링크 / 검증.
  • --incremental — 같은 명령으로 재실행 가능.

실제 실행 결과는 한 줄로 끝났다.

40 files → 236 curated + 4 entities + 15 topics + 514 links, 0 errors

curated 분포: - knowledge 150 - pattern 28 - daily 17 - world 14 - identity 13 - experience 10 - opinion 4

이 분포를 보면 시스템이 무엇을 더 많이 기억하고 있었는지가 한눈에 보인다. 지식패턴이 압도적이다. 의견은 의외로 적다.

4. Hermes MemoryProvider 어댑터

~/Hermes/hermes-data/plugins/memory/memcore/__init__.py

MemcoreProvider(MemoryProvider)로 모든 메서드를 구현했다. - prefetch: memcore.prefetch.search 경유 (토픽 → FTS5 → LIKE 폴백) - on_session_end: memcore.ingest를 자동 호출

스모크 테스트는 실제 memcore.db를 대상으로 돌렸고 전부 PASS.

5. 테스트 스위트 — 51 / 51

  • 정식 테스트 5종: dialectic / decay / lint / entities / topics / bank_migrate
  • inline smoke: ingest (11) + prefetch (8) + plugin (9)
  • 총 51 tests, 0 failures

테스트가 51개라는 게 중요한 게 아니라, 마이그레이션 도중 회귀를 잡을 수 있는 안전망이 생겼다는 게 중요하다.

6. Strangler Fig 동작 모델 (확정)

이사 전략을 한 번 더 정리하면 이렇다.

  1. OpenClaw는 계속 굴러간다 (Reflect 03:00 그대로).
  2. memcore incremental sync를 LaunchAgent로 주기 실행.
  3. Hermes는 memcore만 바라본다.
  4. 검증 통과 → OpenClaw 종료 → memcore가 계승.
  5. 롤백은 단순 — OpenClaw 재시작.

두 시스템이 같은 진실을 다른 시점에 보는 형태다. 컷오버가 무서운 이유는 이 동기 시점이 어긋날 때이고, 그래서 incremental sync의 정확성이 다음 주차의 핵심 검증 항목이 된다.

정리

Week 1~2 작업의 끝은 "데이터를 한 번 옮기고, 그게 깨지지 않았는지 51개 테스트로 확인했다"로 요약된다. Hermes는 아직 켜지 않았다. 다음 글에서 그 전에 발견한 솔직한 누락을 정리한다.

댓글

이 블로그의 인기 게시물

"LLM 핵심 학습 (1/6) — 기본: 토큰화·임베딩·어텐션·위치 인코딩"

"LLM 핵심 학습 (2/6) — 파인튜닝: LoRA·QLoRA·증류·Adapter"

"ML 기초 학습 (1/9) — 머신러닝과 sklearn: 학습의 좌표계"