mindvault-v3
Health Uyari
- No license — Repository has no license file
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Basarisiz
- eval() — Dynamic code execution via eval() in scripts/arctic_ko_server.py
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
Claude Code의 영구 기억 시스템 — 4-layer 파이프라인 (세션 검색 + 메모리 회수 + Memory Compiler). Karpathy LLM-as-Compiler 패턴 실증판.
MindVault v3
Claude Code의 영구 기억 시스템. 5-layer 파이프라인으로 세션 요약 자동 주입 · 자연어 검색 · Memory Compiler · 자동 회수 · 모순 감지까지.
v3.9.0 · gbrain 차용 — Contextual Retrieval(body 임베딩에 맥락 선붙임, 로컬 Gemma synopsis, off 기본·회귀 0) + Eval Gate(라벨 코퍼스 P@k/R@k/MRR 회귀 게이트) · A/B 실측 = MV 의 description 별도벡터가 이미 맥락 내장이라 CR 검색개선 0 → 기본 off·게이트는 회귀보호 · 2-track 적대검증(Claude 15R + codex 5패스, ~33결함 수정) · 이전: MEMORY.md 200줄 회피·Gemma 12B 교체·6R 적대점검 · macOS (Apple Silicon) · MIT license · 927 passed + 41 subtests
무엇인가
Claude Code는 매 세션마다 컨텍스트 윈도우가 초기화됩니다. 어제 결정한 사실, 만들어 둔 CLI 위치, 진행 중인 프로젝트 상태 — 다음 세션을 열면 모두 사라집니다.
MindVault v3는 그 망각의 빈 자리를 네 축으로 메웁니다:
- 세션 검색 — 모든 과거 .jsonl 로그를 SQLite FTS5 + 임베딩으로 인덱싱,
/recall자연어 검색 - 메모리 회수 — UserPromptSubmit 마다 hybrid 검색으로 관련 메모리를 system-reminder에 자동 주입
- 자동 컴파일 — SessionEnd 마다 로컬 Gemma가 그 세션에서 영구로 남길 가치가 있는 결정/노하우/사실을 추출, 검토 후 영구 메모리에 진입
- 모순 감지 (v3.4+) — 신규 메모리가 기존과 충돌 (metric 갱신·결정 반전·사실 정정) 시 Gemma 4-way 분류로 검출, 검토 후 신규가 옛 항목 deprecate / 본문 update / dismiss
로컬 Gemma + Arctic-ko 임베딩 서버라 API 비용 0원, 데이터 외부 전송 없음.
왜 이렇게 만들었나 (Karpathy LLM-as-Compiler)
"매 쿼리마다 모든 원문을 LLM에 다시 던지지 말고, LLM을 한 번 컴파일러처럼 써서 지식을 정제한 뒤 그 결과를 작은 메모리로 축적해 가라. 다음부터는 정제된 결과만 조회하면 된다."
— Andrej Karpathy, LLM Wiki gist (요약)
# 기존 RAG 패턴
질문 → 외부 문서 N개 검색 → 그대로 컨텍스트에 붙임 → LLM이 매번 재해석
↑ 매번 비용. 매번 같은 노이즈. 매번 같은 추론.
# LLM-as-Compiler 패턴 (MindVault v3)
세션 끝 → Gemma가 한 번 정제 → 작은 .md로 저장 → 다음부턴 정제본만 조회
↑ 한 번 비용. 추출 후엔 깨끗한 신호. 누적되며 자기 강화.
핵심 개념 네 가지
| 개념 | 정의 |
|---|---|
| Session | Claude Code 한 번의 대화 단위. ~/.claude/projects/*/<uuid>.jsonl 한 파일이 한 세션. |
| Memory | 다음 세션에도 쓸 가치가 있는 사실/결정/노하우. memory/<kebab-name>.md 한 파일이 한 메모리. |
| Recall | UserPromptSubmit 시 hybrid 검색으로 관련 메모리를 자동 회수해 system-reminder로 주입. |
| Compile | SessionEnd 시 Gemma가 로그를 읽고 새 메모리 후보를 _procedural/_staged/ 에 자동 추출. |
5-Layer 아키텍처
| Layer | 책임 |
|---|---|
| L1 — SessionStart 자동 주입 | 최근 5 세션을 Gemma로 요약해 새 세션에 자동 주입. 캐시 히트 ~50ms. compaction 직후(source=compact)엔 요약 대신 현재 세션 관련 메모리만 경량 재주입 (v3.5+) — 압축으로 사라진 회수 맥락 복원 |
L2 — /recall 자연어 검색 |
JSONL FTS5 + Gemma 재순위 (sessions), Arctic-ko 임베딩 + FTS5 hybrid RRF (memory) |
| L3 — Memory Compiler | SessionEnd → Gemma 정제 → memory/_procedural/_staged/ → /memory_review 승인 후 영구 진입 |
| L4 — UserPromptSubmit hook | 매 메시지 hybrid 검색 → 관련 메모리 system-reminder 주입. raw cosine 게이트 + query intent classifier가 잡담 차단 (false positive 0%) |
| L5 — Contradiction Detection (v3.4+) | 신규 메모리가 기존과 충돌 (metric 갱신·결정 반전·사실 정정) 시 Gemma 4-way 분류로 자동 검출. python -m src.contradiction_review_cli 로 검토 후 신규가 옛 항목 deprecate / 본문 update / dismiss. deprecated_by 메모리는 L4 회수 시 raw_cosine + score 둘 다 × 0.3 감쇠 |
v3 본체 (Sprint 1316 + NEXT-120)
| Sprint | 주제 | 상태 |
|---|---|---|
| 13 | Procedural Memory Slot (memory/_procedural/_staged/) |
✅ |
| 14 | Memory Compiler (SessionEnd → Gemma 정제 → staged) | ✅ MV3_AUTO_COMPILE=1 |
| 15 | Self-eval Loop (internal effort · false positive · 자기충족 탐지) | ✅ |
| 16 | Query Intent Classifier + Multi-source 인덱싱 | ✅ |
| NEXT-1~7 | 자동 trigger · embed match · Gemma classifier · type-gate · diff color · slug conflict · scan cache | ✅ |
| NEXT-8 | PROJECTS_ROOT fix (dogfooding gap 해소, LLM-as-Compiler 첫 실증) | ✅ |
| NEXT-10~20 | ACK trigger · backfill · always-fire · cache · stats CLI · launchd 영구화 | ✅ |
실측 (v3.2.0, 2026-05-25): 360 passed + 13 subtests (v3.1.3 의 340 → 360, 신규 zero-touch install 테스트 20건 추가, 회귀 0). false positive 0.0%, internal effort 0.60, hook 실효 hit rate picked>0 = 66.3% (n=3,193, 2026-05-23~25 carry-forward — hook 로직 변경 없음). 자기충족 메모리 탐지 8건, extractor nonzero rate 20% → 47%. v3.2.0 변경은 install.sh / uninstall.sh / 신규 plist·runner·convert 헬퍼만이라 측정 그대로 적용.
Latency (n=3,193): p50=40ms, p95=400ms, p99=471ms. timeout(≥400ms) skip ~6%. v3.0.x post-ship perf 회귀 (avg 452ms) 는 해소 (NEXT-27/28 fix + alias_index/intent cache 운영 누적).
옛 표기 추적:
- "295 passed" (v3.0.0) → "307" (v3.0.1) → "311" (v3.0.2) → "327" (v3.1.0) → "340" (v3.1.1/v3.1.2/v3.1.3) → "360" (v3.2.0/v3.2.1) → "363" (v3.2.2) → "384" (v3.2.3/v3.2.4) → "392" (v3.2.5/v3.2.6)
- "hit rate 2.6%" (measurement artifact) → "55.7%" (v3.0.2 audit 시점) → "66.3%" (v3.2.0 cohort n=3,193) → "83.0%" (v3.2.5 누적 n=6,781)
- "avg 452ms" (NEXT-27 이전) → "p50=40ms" (현재)
- "Gemma 수동 사전 설치" (v3.0~v3.1.3) → "install.sh 자동" (v3.2.0)
- "Arctic-ko 모델 수동 변환" (v3.0~v3.1.3) → "install.sh 자동 변환" (v3.2.0)
- "Apple Silicon 전용 (v3.2.0~) — v3.3.0 백엔드 추상화 이후 가능" (v3.2.0 README) → "Intel/Linux/Windows 사용 불가, 로컬 LLM 은 Gemma 4 E4B 만 지원" (v3.2.1 README 정확화, 미래 예고 제거)
요구사항 / 지원 환경
운영체제 / 하드웨어
- ✅ macOS, Apple Silicon (M1 / M2 / M3 / M4) — 유일한 fully-supported 환경
- ⚠️ Intel Mac —
install.sh가드가 인프라-only 설치 (MV3_SKIP_MODELS=1) 를 옵션으로 제공하지만 MLX 모델은 동작 안 함 → 메모리 회수·Memory Compiler 둘 다 비활성 (FTS5 만) - ❌ Linux / Windows — 사용 불가 (launchd 의존)
로컬 LLM
- ✅ Gemma 4 E4B (
mlx-community/gemma-4-e4b-it-4bit) — 유일한 지원 모델- 사전 설치 안 된 환경:
install.sh가 자동 다운로드 + launchd 등록 (com.mindvault.gemma-mlx, port 8080, ~3GB) - 사전 설치된 환경 (예:
com.<user>.gemma-mlx가 이미 port 8080 점유 중):install.sh가 자동 감지 후 재사용 (신규 plist 설치 skip)
- 사전 설치 안 된 환경:
- ❌ ollama / LM Studio / llama.cpp / OpenAI API / Qwen / Llama / 기타 LLM — 사용 불가
임베딩 모델
- ✅ Arctic-ko (
dragonkue/snowflake-arctic-embed-l-v2.0-ko, MLX 4bit) — 유일한 지원 모델install.sh가 자동 다운로드 + 4bit 양자화 변환 + launchd 등록 (port 8081, ~322MB)
기타
- Python 3.10+
- Claude Code (hook 등록을 위해)
설치
git clone https://github.com/etinpres/mindvault-v3.git
cd mindvault-v3
./install.sh
설치 내용:
~/.claude/hooks/에 hook 스크립트들 복사~/.claude/scripts/mindvault/에 인덱서/검색 모듈 배포~/.claude/commands/에/recall,/memory_review,/close-session,/cs스킬 등록~/.claude/settings.json의 hook 배열에 등록 (.bak자동 백업)- Arctic-ko launchd 서비스 등록 (사용자별
$HOME자동 치환) - (v3.2.0) Sprint 4.5 — Arctic-ko 4bit 모델 자동 변환 (원본 ~1.1GB DL + ~322MB 4bit 양자화)
- (v3.2.0) Sprint 17 — Gemma 자동 설치 (
mlx-lmpip + 모델 ~3GB DL + launchdcom.mindvault.gemma-mlx) - (v3.2.0) Apple Silicon 가드 — 비 arm64 환경에서는 인프라만 설치 (모델 자동 설치 skip)
- (v3.2.0) Resumable checkpoint — 중간 실패 시 step 파일 (
~/.cache/{mv3-gemma,mlx-arctic-ko}/.mv3-step) 기반으로 재실행 시 이어감 - 초기 인덱싱 1회 실행
첫 실행 소요: 8~12분 (모델 DL/변환). 재실행은 idempotent — 이미 있는 자산 자동 skip.
설치 확인: 새 claude 세션을 열면 system-reminder에 # 지난 세션 요약 (MindVault v3) 블록이 나타납니다.
Codex와 기억 공유
./install.sh가 ~/.codex/를 감지하면 Codex 통합을 자동으로 설치합니다 — 회수 훅 등록, $close-session 스킬(~/.agents/skills/close-session/) 배포, AGENTS.md에 MindVault 메모리 규약 삽입(<!-- MINDVAULT_MEMORY_* --> 마커 사이 idempotent 갱신, 기존 내용 보존). Codex가 없는 환경에서는 이 단계가 조용히 생략됩니다. 훅만 수동으로 다루려면:
python3 scripts/manage_codex_recall.py install
이 명령은 기존 ~/.codex/hooks.json 항목을 보존하면서 UserPromptSubmit에 배포된 ~/.claude/hooks/memory-recall.py를 읽기 전용 회수 훅으로 연결합니다. Codex는 최초 실행 전 /hooks에서 새 훅을 검토·신뢰해야 하며, 변경 사항은 새 Codex 세션부터 적용됩니다.
python3 scripts/manage_codex_recall.py status
python3 scripts/manage_codex_recall.py uninstall
Codex와 Claude Code가 같은 메모리 디렉토리에 쓰는 환경에서는 이 연결로 양쪽 모두 같은 hybrid FTS5+vector 검색 결과를 자동 주입받습니다. 이는 영구 메모리 공유이며, 아직 저장되지 않은 실시간 대화 전체를 동기화하지는 않습니다.
사용
/recall — 자연어 검색
/recall 영어 학습 망각곡선
/recall 이메일 SMTP 설정
/recall MindVault 마이그레이션 결정
FTS5 (키워드) + Arctic-ko 임베딩 (의미) 두 결과를 RRF로 결합한 뒤 Gemma가 재순위. 관련 세션 + 메모리 동시 검색.
/memory_review — staged 메모리 검토
SessionEnd마다 Gemma가 자동 추출한 메모리 후보는 memory/_procedural/_staged/ 에 임시 저장됩니다. 자동으로 영구 메모리에 들어가지 않습니다 (silent failure 방지).
/memory_review # staged 후보 목록 (메인 Claude 가 인터랙티브 처리)
명령은 인자 없음. 메인 Claude 가 후보 목록을 보여준 뒤 사용자가 번호+코드로 응답:
1y— 1번 항목 승인 (영구 메모리로 진입)2n— 2번 항목 폐기3e— 3번 항목 본문 편집 후 승인4s— 4번 항목 다음 세션으로 건너뜀
내부적으로 python3 memory_review_cli.py {approve|reject} <file> 만 호출 (subcommand 직접 입력 불가).
자동 회수
UserPromptSubmit hook이 매 메시지마다 hybrid 검색을 돌립니다. 관련 메모리는 <system-reminder> 태그로 Claude의 컨텍스트에 자동 주입되며, 사용자가 명령을 내릴 필요가 없습니다.
raw cosine 게이트 (Arctic-ko 기준 default 0.32, 회수 단서어 시 0.27 완화 — NEXT-30.1 운영 누적 후 fine-tune) + query intent classifier (chat/meta/code/recall/unknown) 가 잡담 쿼리에서 무관 메모리 끼는 false positive를 차단합니다. 임계값은 hooks/memory-recall.py 의 RAW_COSINE_MIN_* 상수.
자기-수정 메커니즘
메모리 시스템의 echo chamber (잘못된 메모리가 자기를 강화) 방지 장치:
- 자기충족 메모리 자동 탐지 —
scan_self_affirming_memories가 "v1 폐기 / v2 운영" 류 자기-진화 표현을 후보로 표시 - False positive 측정 — 회수 직후 사용자가 negative cue ("그거 아니야") 발화하는지 추적
- 자기 모순 메모리 — 운영 누적 시 자동 탐지 → 검토 큐 진입
- Type-gate 분리 — procedural 타입은 raw cosine 게이트 0.05 더 엄격하게 (운영 노이즈 차단)
설정
src/session_memory.py 상단 상수 섹션:
| 상수 | 기본값 | 설명 |
|---|---|---|
MAX_SESSIONS |
5 | L1 요약 대상 세션 수 |
MAX_HEAD_TURNS |
6 | 각 세션 앞쪽 턴 수 |
MAX_TAIL_TURNS |
6 | 각 세션 뒤쪽 턴 수 |
MAX_MSG_CHARS |
200 | 각 메시지 최대 글자 |
GEMMA_MAX_TOKENS |
2000 | Gemma 응답 토큰 한도 |
GEMMA_TIMEOUT |
45 | Gemma 호출 타임아웃(초) |
CACHE_DAYS |
7 | 캐시 보존 기간 |
환경 변수
| 변수 | 기본 | 설명 |
|---|---|---|
MV3_AUTO_COMPILE |
0 | SessionEnd Memory Compiler opt-in |
MV3_EXTRACTOR_ALWAYS_FIRE |
0 | trigger 휴리스틱 없이도 항상 추출 시도 |
MV3_GEMMA_INTENT |
0 | Query intent classifier에 Gemma 보강 opt-in |
MV3_EXTRA_MEMORY_DIRS |
(empty) | 추가 메모리 디렉토리 (: 구분) |
MV3_EXTRACTOR_CACHE_DISABLE |
0 | extractor 결과 캐시 비활성화 |
MV3_PROJECTS_DIR |
derived | primary memory base 디렉토리 (기본: $HOME 에서 자동 derive) |
테스트
pytest tests/
470 passed + 25 subtests (회귀 0, v3.3.0 기준 카운트). functional 전부 OK, v3.0.x 의 e2e perf 회귀 (avg 452ms > 150ms) 는 NEXT-27/28 fix 로 해소 (현재 p50=39ms). 네트워크/Gemma 불필요 (mocked).
제거
./uninstall.sh
훅 등록 + 스크립트 + 스킬 + launchd 서비스 일괄 제거:
- 선택 설치한 Codex
UserPromptSubmitMindVault 회수 훅 com.mindvault.gemma-mlx(v3.2.0+ Gemma)com.mindvault.arctic-ko-mlx(v3.2.3+ Arctic-ko)- legacy:
com.yonghaekim.{arctic-ko-mlx,bge-m3-mlx,mv3-env,mv3-gemma-intent,mv3-stats-daily}(옛 설치자 호환 cleanup)
Settings backup 은 ~/.claude/settings.json.bak 으로 자동 저장. install.sh 가 사용자 personal ~/.claude/skills/{close-session,cs}/ 를 attic 으로 displace 했었다면 uninstall.sh 가 manifest 보고 자동 복원합니다 (v3.2.3 #15).
캐시 + 인덱스는 보존 (수동 삭제):
rm -rf ~/.claude/mindvault-v3
rm -rf ~/.cache/mlx-arctic-ko
알려진 한계
- Apple Silicon Mac 전용 — Intel Mac / Linux / Windows 사용 불가. MLX (
mlx-lm,mlx-embeddings) 가 Apple Silicon 만 지원하고 launchd 도 macOS 전용. - 로컬 LLM 은 Gemma 4 E4B (
mlx-community/gemma-4-e4b-it-4bit) 만 지원 — ollama / LM Studio / llama.cpp / OpenAI API / 기타 LLM 사용 불가. 사전 설치 안 된 환경은install.sh가 자동 설치, 사전 설치된 환경은 자동 감지. - 임베딩은 Arctic-ko (
dragonkue/snowflake-arctic-embed-l-v2.0-ko, MLX 4bit) 만 지원 — 다른 임베딩 모델 사용 불가. - Gemma 4 E4B는 reasoning 모델 — 내부 사고에 토큰 많이 소비,
GEMMA_MAX_TOKENS크게 잡아야 함 - 한국어 특화 프롬프트 — 프롬프트가 한국어로 최적화. 영어 도메인은 검색 품질 일부 저하 가능
- PII 필터는 키 패턴만 — 이메일/전화는 로컬 전용이라 통과
- 세션 경계 = JSONL 파일 — 한 파일 안에서 주제 바뀌어도 하나로 간주
디버깅
# 훅 실행 로그
tail ~/.claude/mindvault-v3/debug.log
# 캐시
ls ~/.claude/mindvault-v3/cache/
# Arctic-ko 헬스체크
curl http://localhost:8081/health
# {"ok":true,"model":"arctic-ko-mlx-4bit","dim":1024}
# Arctic-ko 재기동
launchctl kickstart -k gui/$(id -u)/com.<author>.arctic-ko-mlx
# 메모리 인덱스 강제 재구축
python3 -c "
import sys; from pathlib import Path
sys.path.insert(0, str(Path.home() / '.claude/scripts/mindvault'))
from memory_indexer import full_rebuild
full_rebuild()
"
# DB 상태
python3 -c "
import sqlite3
from pathlib import Path
db = Path.home() / '.claude/mindvault-v3/index.db'
c = sqlite3.connect(db)
for t in ('sessions','memories','memories_fts','memories_vec'):
print(t, c.execute(f'SELECT COUNT(*) FROM {t}').fetchone()[0])
"
라이선스
MIT — 자세한 내용은 LICENSE 참조 (또는 별도 LICENSE 파일이 없는 경우 표준 MIT 적용).
기여 / 영감
이 프로젝트는 Andrej Karpathy의 LLM Wiki gist 의 LLM-as-Compiler 패턴을 Claude Code 환경에서 실증한 결과입니다.
이전에 같은 저자가 만든 etinpres/mindvault (deprecated) 는 이 패턴을 잘못 이해한 채 진행한 첫 시도였습니다. v3는 그 postmortem 교훈을 반영한 재시도입니다 — Gemma가 실제로 메모리를 정제·합성하는 구조로.
이슈와 PR을 환영합니다. macOS 외 플랫폼 포팅에 관심 있다면 환영합니다.
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi