수정 2026-07-14
v1.36.23
memory search: 한국어↔영어 동의어(핸드오프 0→38) + BM25 랭킹("앞 N건"→"상위 N건") + JSON 정합
정렬 레이어로만
핵심 변경
**lib/search-core.js 신설** (순수함수 · 0-deps · 산술만): tokenizeForRank(한글은 조사 절단 근사로 prefix 변형 방출 — 핸드오프를 이 핸드오프 쿼리에 스코어를 받음) · expandQuery(동의어 맵 주입 → 순수) · scoreHits(BM25 k1=1.5/b=0.75) · suggestTerms.
**동의어(MEMORY_SYNONYMS, catalogs 단일출처)** — 같은 개념을 다른 언어로 물으면 결과가 갈리던 비대칭 해소: 핸드오프 **0 → 38** hits, 교훈 3 → 18, 결정 4 → 18, 작업 11 → 27, 계획 5 → 19. 메모리 내용은 언어가 섞이기 마련이라(코드·커밋은 영어, 결정·교훈은 모국어) 한쪽 표기만 아는 사용자/에이전트가 존재하는 기록을 못 찾았다. 양방향(어느 쪽으로 물어도 동일). --no-synonyms 로 종전 동작(실측 재현 확인).
**BM25 랭킹** — 종전엔 --limit(기본 5)이 파일당 **"앞 5건"** 임의 절단이었다(최고 5건이 아니라). 이제 히트를 전부 모아 스코어 → 정렬 → limit ⇒ **"상위 N건"**. 파일도 최고점수 순. --include-code(21k줄 소스)에서 특히 자의적이던 절단 해소.