v4.0.0
v4.0.0은 v3.2.0 이후의 모든 patch·minor 변경을 단일 메이저 릴리즈로 통합한다. 외부 호출자 인터페이스와 DB 스키마는 호환된다. major 표시는 storage 어댑터 계층 도입과 lib/memory 6서브디렉토리 재편 등 내부 surface가 새로 추가됐기 때문이다.
Added
lib/storage/어댑터 계층.getStorage()팩토리가MEMENTO_STORAGE환경변수에 따라 PgVectorStore(기본) 또는 SqliteVecStore(v4.1 본격 구현 예정 stub)를 반환한다. 인터페이스:query/queryAsAgent/transaction/migrate/close+engine/vectorSupport프로퍼티.lib/memory/read/SearchScope.js. workspace·caseId·resolutionStatus·phase·affect·keyId를 캡슐화한 값객체. L1/HotCache/L2/L3/Graph 검색 레이어가 처음부터 정합 필터링한다.lib/memory/read/SearchSideEffects.js.commitSearchSideEffects(query, sq, cleanResult, ctx) → searchEventId함수로 검색 이벤트 영속화·SearchParamAdaptor 학습을 격리.lib/llm/index.js의dispatchChain(chain, prompt, options, deps)export.llmJson은 chain 빌드·redact만 담당하고 dispatcher에 위임.scripts/lint-migrations.js+npm run lint:migrations. 신규 마이그레이션 파일의 body-only 규약과 파일명 형식을 PR 시점에 강제.- 신규 환경변수:
MEMENTO_REMEMBER_ATOMIC,MEMENTO_CASE_BACKPROP_ENABLED,MEMENTO_STORAGE,MIGRATION_LINT_FROM. - 신규 문서:
docs/concurrency.md,docs/features.md,docs/migration-conventions.md,docs/operations/agent-worktree.md,docs/operations/upstream-porting.md.
Changed
MemoryRememberer.remember의 PolicyRules 게이트 평가를_runPolicyGate헬퍼로 통일. dryRun·atomic·non-atomic 분기 모두 동일 시점에 평가하며 hard gate(api_keys.symbolic_hard_gate=true) 위반 시SymbolicPolicyViolationError를 throw해 트랜잭션 시작을 차단한다.apiKeyStore조회 실패는 fail-open.MemoryRememberer._finalizeRemember응답에validation_warnings노출. atomic·non-atomic 응답 형식이 정합화됐다.MemoryConsolidator._mergeDuplicates그룹 키를(key_id, workspace, content_hash)로 한정.WHERE key_id IS NOT NULL로 master 키 자동 병합 제외. linked_to UPDATE와store.delete에 key_id 전달. 그룹 동질성 어설션 추가.MemoryConsolidator._runConsolidationCycle을 선언형stageDefs배열로 재구성. 21개 stage.TOTAL_STAGES = stageDefs.length. SSE/관리 콘솔 진행률 정합.lib/memory/14개 핵심 모듈을 6 서브디렉토리(read/,write/,link/,consolidate/,embedding/,signals/)로 분류 이동. 기존 위치(lib/memory/<File>.js)에 stub re-export 14개 유지로 외부 import 경로 호환. 신규 코드는 직접 서브디렉토리 경로 권장.FragmentSearch의 부작용 처리를SearchSideEffects모듈로 외부화. 메서드 추출(v3.8.0) → 모듈 외부화(v3.9.0) 두 단계._searchEventId동기 반환 계약 유지.FragmentSearch._executeSearch의 후처리 보정 4블록(workspace/caseId/resolutionStatus/phase/affect) 제거. SearchScope contract 적용으로 검색 레이어가 처음부터 정합 결과를 반환한다.CaseRewardBackprop.backprop이 매 호출 시process.env.MEMENTO_CASE_BACKPROP_ENABLED를 평가. 기본 off, 호출이 즉시 반환되어 DB·메트릭 영향 0. 런타임 토글 가능.lib/llm/util/parse-json.js에 reasoning 모델(MiniMax-M2.7, DeepSeek-R1, Qwen-QwQ 등) 응답의<think>...</think>사전 제거 도입. 닫힘 태그만 남은 비대칭 응답도 처리.package.jsontest:ci를npm test && npm run test:integration으로 변경. 통합·e2e 테스트가 CI 단일 게이트에 포함된다.scripts/migrate.js의 인라인 BEGIN/COMMIT·schema_migrations INSERT 제거 정규식을 삭제하고, 기존 14개 마이그레이션 파일을 body-only 규약으로 일괄 normalize. opclass placeholder 치환은 유지.docs/features.md실험 플래그 표 정합화. 실험 플래그(SpreadingActivation, CaseRewardBackprop)와 dual-mode/항상 활성(NLIClassifier, AutoReflect, ReconsolidationEngine, storage 어댑터)을 분리.
Tests
- 신규 회귀 가드 케이스 누적 다수. 핵심:
tests/unit/atomic-remember-policy-gate.test.js— atomic+hard gate+dryRun 5 케이스tests/unit/consolidator-merge-tenant-scope.test.js—_mergeDuplicatesSQL/scope 6 케이스tests/unit/consolidator-stage-declarative.test.js— stageDefs 산출 + progress 정합 4 케이스tests/unit/llm-dispatcher-concurrency.test.js재작성 — dispatchChain을 실제 검증(인라인 mirror 제거)tests/unit/llm-dispatcher-no-inline-mirror.test.js— 인라인 mirror 재발 방지 정적 가드tests/unit/fragment-search-side-effect-split.test.js— SearchSideEffects 외부화 정적 가드tests/unit/search-scope-contract.test.js— SearchScope contract + 후처리 보정 잔존 0tests/unit/storage-adapter.test.js— 어댑터 인터페이스/팩토리/not-implemented throwtests/unit/case-reward-backprop.test.js— ENV 활성·미설정·false명시 3축 (7 케이스)
- 누적 단위 테스트 영향권 회귀 0.
Docs
- v4.0 기준 단일 sweep으로 17개 문서 정합화. 본문 갱신 대상:
README.md,SKILL.md,CONTRIBUTING.md,docs/architecture.md/.en.md,docs/internals.md/.en.md,docs/concurrency.md,docs/features.md,docs/api-reference.md/.en.md,docs/configuration.md/.en.md,docs/INSTALL.md/.en.md,docs/testing.md,docs/admin-console-guide.md.
호환성·이식 안내
- 외부 호출자 인터페이스(
search응답,_searchEventId,remember응답,recall응답) 무변경. - DB 스키마 무변경.
- 기존
import { X } from "lib/memory/<File>.js"는 stub re-export로 동일하게 동작. 신규 코드는lib/memory/<sub>/<File>.js직접 경로 권장. lib/storage/어댑터 도입. 기존 데이터 액세스 코드는 그대로 동작. 호출 사이트의 어댑터 마이그레이션은 v4.1에서 점진 수행.
v4.x 후속
- v4.1: SqliteVecStore 본격 구현 (sqlite-vec npm 의존, SQLite 마이그레이션 변환, lite 모드 e2e). 기존
lib/memory/*호출 사이트의getStorage()어댑터 마이그레이션. - v4.x:
lib/memory/stub re-export 14개의 점진 제거(외부 호출 사이트가 서브디렉토리 경로로 직접 import 전환 후).
상세 커밋 히스토리: 8c4fb81(v4.0.0), 25eb61f, b9f312d, 345d511, 79d741c, 7d49215, ea1e1b3, 1e9ac29, b8275c5, aadee7a, cc6b191 (origin/main).