|
| 1 | +# Changelog |
| 2 | + |
| 3 | +All notable changes to [MemPalace](https://github.com/MemPalace/mempalace) are documented in this file. |
| 4 | + |
| 5 | +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/). |
| 6 | + |
| 7 | +--- |
| 8 | + |
| 9 | +## [Unreleased] — v3.3.0 (on develop) |
| 10 | + |
| 11 | +### New Features |
| 12 | +- Closet layer — a compact searchable index of pointers to verbatim drawers, enabling fast topical lookup without reading all content (#788) |
| 13 | +- BM25 hybrid search — closets boost ranking, drawers remain the source of truth (#795, #829) |
| 14 | +- Entity metadata on every drawer for filterable search (#829) |
| 15 | +- Diary ingest — day-based rooms for conversation transcripts (#829) |
| 16 | +- Cross-wing tunnels — explicit links between rooms in different wings for multi-project agents (#829) |
| 17 | +- Drawer-grep — returns the best-matching chunk plus adjacent context drawers (#829) |
| 18 | +- Offline fact checker against the entity registry and knowledge graph (#829) |
| 19 | +- LLM-based closet regeneration — optional, bring-your-own endpoint, no mandatory API key (#793) |
| 20 | +- Hall detection — routes drawer content to `emotions` / `technical` / `family` / `memory` / `identity` / `consciousness` / `creative` halls, enabling hall-based graph connectivity within wings (#835) |
| 21 | + |
| 22 | +### Bug Fixes |
| 23 | +- Set `hnsw:space=cosine` metadata on all collection creation sites — fixes broken similarity scoring under ChromaDB's default L2 distance (#807, #218) |
| 24 | +- File-level locking prevents duplicate drawers when agents mine the same file concurrently (#784, #826) |
| 25 | +- Hybrid closet+drawer retrieval — closets boost ranking, never gate results (#795) |
| 26 | +- Stop hooks from making agents write in chat — saves tokens on every turn (#786) |
| 27 | +- Strip system tags, hook output, and Claude UI chrome from drawers before filing (#785) |
| 28 | +- Verbatim-safe `strip_noise` scoped to Claude Code JSONL only (#785) |
| 29 | +- Prevent diary entry ID collisions via microsecond timestamp and full content hash (#819) |
| 30 | +- Auto-rebuild stale drawers via `NORMALIZE_VERSION` schema gate |
| 31 | +- Enforce atomic topics in closets and extract richer pointers |
| 32 | +- Sync `version.py` to match `pyproject.toml` (#820) |
| 33 | +- Remove unused `main` import from `mempalace/__init__.py` (#827) |
| 34 | +- README audit — fix 7 stale claims (tool count, version badge, wake-up token cost, `dialect.py` lossless disclaimer, `pyproject.toml` version) with 42 regression-guard tests (#835) |
| 35 | + |
| 36 | +### Improvements |
| 37 | +- Optimize entity detection with regex caching and pre-compilation (#828) |
| 38 | +- Extract locked filing block into helper to keep `mine_convos` under C901 complexity |
| 39 | + |
| 40 | +### Documentation |
| 41 | +- Add `docs/CLOSETS.md` — closet layer overview |
| 42 | +- Fix stale `milla-jovovich/*` org URLs in website and plugin manifests (#787) |
| 43 | +- Fix remaining stale org URLs in contributor docs (#808) |
| 44 | + |
| 45 | +### Internal |
| 46 | +- Add test coverage for `mine_lock`, closets, entity metadata, BM25, and diary |
| 47 | +- Verify `mine_lock` via disjoint critical-section intervals |
| 48 | +- Serialize `mine_lock` concurrency test with multiprocessing |
| 49 | +- Make diary state path assertion platform-neutral |
| 50 | +- Add `TestTunnels` coverage for cross-wing tunnel operations |
| 51 | +- Ruff format with CI-pinned version (0.4.x); format `mempalace/palace.py` |
| 52 | + |
| 53 | +--- |
| 54 | + |
| 55 | +## [3.2.0] — 2026-04-12 |
| 56 | + |
| 57 | +### Packaging |
| 58 | +- Remove `chromadb<0.7` upper bound — unblocks installs against chromadb 1.x palaces (#690) |
| 59 | +- Bump version to 3.2.0 across `pyproject.toml`, `mempalace/version.py`, README badge, and OpenClaw SKILL (#761) |
| 60 | + |
| 61 | +### Security |
| 62 | +- Harden palace deletion, WAL redaction, and MCP search input handling (#739) |
| 63 | +- Consistent input validation, argument whitelisting, concurrency safety, and WAL fixes (#647) |
| 64 | +- Remove hardcoded credential paths from benchmark runners (#177) |
| 65 | +- Remove global SSL verification bypass in convomem_bench (#176) |
| 66 | + |
| 67 | +### Bug Fixes |
| 68 | +- Parse Claude.ai privacy export with `messages` key and sender field (#685, #677) |
| 69 | +- Detect mtime changes in `_get_client` to prevent stale HNSW index (#757) |
| 70 | +- Hash full content in `tool_add_drawer` drawer ID — stable re-mines (#716) |
| 71 | +- Remove 10k drawer cap from status display (#707, #603) |
| 72 | +- Correct typo in entity_detector interactive classification prompt (#755) |
| 73 | +- Prevent convo_miner from re-processing 0-chunk files on every run (#732, #654) |
| 74 | +- Remove silent 8-line AI response truncation in convo_miner (#708, #692) |
| 75 | +- Store full AI response in convo_miner exchange chunking (#695) |
| 76 | +- Fix `mine --dry-run` TypeError on files with room=None (#687, #586) |
| 77 | +- Skip arg whitelist for handlers accepting `**kwargs` (#684, #572) |
| 78 | +- Allow Unicode in `sanitize_name()` — Latvian, CJK, Cyrillic (#683, #637) |
| 79 | +- Auto-repair BLOB seq_ids from chromadb 0.6→1.5 migration (#664) |
| 80 | +- Remove no-op `ORT_DISABLE_COREML` env var (#653, #397) |
| 81 | +- Disambiguate hook block reasons to name MemPalace explicitly (#666) |
| 82 | +- Use epsilon comparison for mtime to prevent unnecessary re-mining (#610) |
| 83 | +- Correct token count estimate in compress summary (#609) |
| 84 | +- Implement MCP ping health checks (#600) |
| 85 | +- Align `cmd_compress` dict keys with `compression_stats()` return values (#569) |
| 86 | +- Skip unreachable reparse points in `detect_rooms_from_folders` on Windows (#558) |
| 87 | +- Prevent HNSW index bloat from duplicate `add()` calls (#544, #525) |
| 88 | +- Purge stale drawers before re-mine to avoid hnswlib segfault (#544) |
| 89 | +- Mitigate system prompt contamination in search queries (#385, #333) |
| 90 | +- Count Codex `user_message` turns in `_count_human_messages` (#373, #347) |
| 91 | +- Paginate large collection reads and surface errors in MCP tools (#371, #339, #338) |
| 92 | +- Expand `~` in split command directory argument (#361) |
| 93 | +- Ignore `wait_for_previous` argument to support Gemini MCP clients (#322) |
| 94 | +- Close KnowledgeGraph SQLite connections in test fixtures (#450) |
| 95 | +- Remove duplicate cache variable declarations in mcp_server.py (#449) |
| 96 | +- Add `--yes` flag to init instructions for non-interactive use (#682, #534) |
| 97 | +- Add `mcp` command with setup guidance (#315) |
| 98 | + |
| 99 | +### New Features |
| 100 | +- i18n support — 8 languages (en, es, fr, de, ja, ko, zh-CN, zh-TW) (#718) |
| 101 | +- New MCP tools: get/list/update drawer, hook settings, export (#667, #635) |
| 102 | +- `mempalace migrate` — recover palaces from different ChromaDB versions (#502) |
| 103 | +- Add OpenClaw/ClawHub skill (#491) |
| 104 | +- Backend seam for pluggable storage backends (#413) |
| 105 | + |
| 106 | +### Improvements |
| 107 | +- Disable broken auto-bump workflow (#414) |
| 108 | +- Improve agent readiness — AGENTS.md, dependabot, CODEOWNERS, labels (#497) |
| 109 | + |
| 110 | +### Documentation |
| 111 | +- Add CLAUDE.md and mission/principles to AGENTS.md (#720) |
| 112 | +- Add VitePress documentation site (#439) |
| 113 | +- Add warning about fake MemPalace websites (#598) |
| 114 | +- Fix stale org URLs and PR branch target in contributor docs (#679) |
| 115 | +- Fix misaligned architecture diagram (#734, #733) |
| 116 | +- Add ROADMAP.md — v3.1.1 stability patch and v4.0.0-alpha plan |
| 117 | + |
| 118 | +### Internal |
| 119 | +- ruff format convo_miner.py (#741) |
| 120 | +- ruff format all Python files (#675) |
| 121 | +- CI: trigger tests on develop branch PRs and pushes (#674) |
| 122 | +- CI: fix GitHub Pages publishing (#691) |
| 123 | + |
| 124 | +--- |
| 125 | + |
| 126 | +## [3.1.0] — 2026-04-09 |
| 127 | + |
| 128 | +### Security |
| 129 | +- Harden inputs, fix shell injection, optimize DB access (#387) |
| 130 | +- Sanitize SESSION_ID in save hook to prevent path traversal (#141) |
| 131 | +- Sanitize error responses and remove `sys.exit` from library code (#139) |
| 132 | +- Shell injection fix in hooks, Claude Code mining, chromadb pin (#114) |
| 133 | + |
| 134 | +### Bug Fixes |
| 135 | +- MCP null args hang, repair infinite recursion, OOM on large files (#399) |
| 136 | +- Release ChromaDB handles before rmtree on Windows (#392) |
| 137 | +- Use `os.utime` in mtime test for Windows compatibility (#392) |
| 138 | +- Negotiate MCP protocol version instead of hardcoding (#324) |
| 139 | +- Use upsert and deterministic IDs to prevent data stagnation (#140) |
| 140 | +- Make `drawer_id` deterministic for idempotent writes (#387) |
| 141 | +- Honest AAAK stats — word-based token estimator, lossy labels (#147) |
| 142 | +- Room detection checks keywords against folder paths (#145) |
| 143 | +- Use actual detected room in mine summary stats (#165) |
| 144 | +- Honour `--palace` flag in mcp_server (#264) |
| 145 | +- Preserve default KG path when `--palace` not passed (#270) |
| 146 | +- `--yes` flag skips all interactive prompts in init (#123) |
| 147 | +- Repair command, split args, Claude export, room keywords (#119) |
| 148 | +- Replace Unicode separator in convo_miner.py for Windows compatibility (#129) |
| 149 | +- Coerce MCP integer arguments to native Python int (#84) |
| 150 | +- Batch ChromaDB reads to avoid SQLite variable limit (#66) |
| 151 | +- Respect nested .gitignore rules during mining (#78) |
| 152 | +- Narrow bare `except Exception` to specific types where safe (#54) |
| 153 | +- Mark MD5 as non-security in miner drawer ID generation (#53) |
| 154 | +- Remove dead code and duplicate set items in entity_registry.py (#42) |
| 155 | +- Silence ChromaDB telemetry warnings and CoreML segfault on Apple Silicon (#236) |
| 156 | +- Unify package and MCP version reporting (#16) |
| 157 | +- Fix broken AAAK Dialect link in README (#238) |
| 158 | +- Update input prompt for entity confirmation (#83) |
| 159 | +- Preserve CLI exit codes, log tracebacks, sanitize search errors (#139) |
| 160 | +- Enable SQLite WAL mode and add consistent LIMIT to KG timeline (#136) |
| 161 | +- Add limit=10000 safety cap to all unbounded ChromaDB `.get()` calls (#137) |
| 162 | +- Re-mine modified files, idempotent `add_drawer`, cleanup ChromaDB handles (#140) |
| 163 | +- Resolve formatting, regression logic, and pytest defaults (#270) |
| 164 | +- Use `parse_known_args` to allow importing mcp_server during pytest (#270) |
| 165 | + |
| 166 | +### New Features |
| 167 | +- Package MemPalace as standard Claude and Codex plugins (#270) |
| 168 | +- Add OpenAI Codex CLI JSONL normalizer (#61) |
| 169 | +- Add Codex plugin support with hooks, commands, and documentation (#270) |
| 170 | +- Add command documentation for help, init, mine, search, and status (#270) |
| 171 | + |
| 172 | +### Improvements |
| 173 | +- Cache ChromaDB `PersistentClient` instead of re-instantiating per call (#135) |
| 174 | +- Tighten chromadb version range and add `py.typed` marker (#142) |
| 175 | +- Consolidate split known-names config loading (#22) |
| 176 | +- CI: add separate jobs for Windows and macOS testing |
| 177 | +- CI: Upgrade GitHub Actions for Node 24 compatibility (#55) |
| 178 | + |
| 179 | +### Documentation |
| 180 | +- Add Gemini CLI setup guide and integration section (#106) |
| 181 | +- Add beginner-friendly hooks tutorial (#103) |
| 182 | +- Align MCP setup examples with shipped server (#21) |
| 183 | +- Honest README update — own the mistakes, fix the claims |
| 184 | + |
| 185 | +### Internal |
| 186 | +- Expand test coverage from 20 to 92 tests, migrate to uv (#131) |
| 187 | +- Add scale benchmark suite — 106 tests (#223) |
| 188 | +- Increase test coverage from 30% to 85%, fix Windows encoding bugs (#281) |
| 189 | +- Add WAL mode and entity timeline limit assertions |
| 190 | +- Add coverage for `file_already_mined` mtime check |
| 191 | + |
| 192 | +--- |
| 193 | + |
| 194 | +## [3.0.0] — 2026-04-06 |
| 195 | + |
| 196 | +Initial public release. |
| 197 | + |
| 198 | +- Palace architecture with day-based rooms, drawers (verbatim), and closets (searchable index) |
| 199 | +- AAAK compression dialect for memory folding |
| 200 | +- Knowledge graph with entity detection and timeline queries |
| 201 | +- MCP server for Claude, Codex, and Gemini integration |
| 202 | +- CLI: `init`, `mine`, `search`, `status`, `compress`, `repair`, `split` |
| 203 | +- Benchmark suite with recall and scale tests |
| 204 | +- README with MCP flow, local model flow, and specialist agent documentation |
| 205 | + |
| 206 | +--- |
| 207 | + |
| 208 | +[Unreleased]: https://github.com/MemPalace/mempalace/compare/v3.2.0...HEAD |
| 209 | +[3.2.0]: https://github.com/MemPalace/mempalace/compare/v3.1.0...v3.2.0 |
| 210 | +[3.1.0]: https://github.com/MemPalace/mempalace/compare/v3.0.0...v3.1.0 |
| 211 | +[3.0.0]: https://github.com/MemPalace/mempalace/releases/tag/v3.0.0 |
0 commit comments