v3.6.0
0xPlaygrounds/rigv3.6.0Jul 17, 2026by igorls
AI Summary
This release significantly enhances MemPalace by introducing secure remote serving capabilities, a new Milvus storage backend, and atomic knowledge-graph management, alongside substantial performance and recovery improvements.
Key Highlights
- Introduces secure remote serving with TLS, token authentication, and read-only enforcement.
- Adds Milvus storage backend support (Lite, self-hosted, Zilliz Cloud).
- Implements atomic knowledge-graph fact replacement.
- Improves startup performance and metadata handling for large palaces.
New Features
- Secure remote serving with HTTP and TLS.
- Milvus storage backend support.
- Atomic knowledge-graph fact replacement.
- Conversation chronology preservation.
- Mined session associative graph population.
- Per-project mining exclusions.
- LaTeX project coverage.
- Shared daemon write-routing policy.
- Checkpoint author attribution preservation.
Full Release Notes
## v3.6.0 — secure remote serving, temporal facts, and resilient recovery This release makes MemPalace substantially easier to operate beyond a single local process while tightening the guarantees that protect long-lived palaces. A new secure-by-default `mempalace serve` path supports authenticated remote and team deployments with TLS and read-only enforcement; an opt-in Milvus backend adds embedded, self-hosted, and managed storage choices; and atomic knowledge-graph supersession gives changing facts precise temporal boundaries. Conversation chronology, mined-session graph derivation, project exclusions, and LaTeX coverage deepen ingestion, while startup, metadata, and recovery work make large palaces faster and safer. The MCP surface now comprises **36 tools**. ### Features - **Turnkey secure remote / team server.** `mempalace serve` exposes the full MCP surface over HTTP with secure defaults: non-loopback binds require a bearer token, generated tokens are stored with restrictive permissions and passed through the child environment rather than argv, native TLS 1.2+ is supported, and `--read-only` both hides and refuses mutating tools. Docker Compose, systemd, and environment templates are included. (#1877, #1897, #1900) - **Milvus storage backend.** The new opt-in `milvus` backend supports Milvus Lite, self-hosted Milvus, and Zilliz Cloud, with COSINE vector search, native BM25 lexical search for new collections, namespace isolation, target-mismatch protection, and an optional dependency extra. (#1899) - **Atomic knowledge-graph fact replacement.** `supersede()` / `mempalace_kg_supersede` closes an open fact and opens its successor at one shared instant. Temporal queries use half-open intervals at timestamp precision while preserving whole-day semantics for date-only facts. (#1913) - **Conversation chronology is preserved.** Drawers retain transcript time as `authored_at`, search results expose it, exact hybrid-score ties prefer recently authored content, and an idempotent dry-run-first backfill updates existing palaces without re-embedding. `mempalace_list_drawers` also gains `since` / `before` bounds. (#1890, #1891) - **Mined sessions populate the associative graph.** A precision-biased structural extractor records code symbols, URLs, paths, and qualified identifiers as drawer entities; conversation mining derives hallways from them, exposed by the new `mempalace hallways` CLI command. (#1894, #1895) - **Per-project mining exclusions** through `exclude_patterns` in `mempalace.yaml`, without changing corrected `--limit` semantics. (#1213, #1953) - **LaTeX project coverage** for `.tex` and `.bib` prose sources. (#1901) - **Shared daemon write-routing policy** provides one consistent policy seam for routing write-capable clients toward the local daemon. (#2027) - **Checkpoint author attribution** now preserves the filing agent instead of hard-coding every checkpoint drawer as `checkpoint`. (#2023, #2034) ### Performance - **MCP initialization no longer waits for palace-wide integrity work.** stdio answers `initialize` immediately while startup preflight runs in the background; concurrent tools join the same verdict instead of duplicating work. Large-palace startup SQLite probes are bounded, while repair preflights remain strict. (#1911, #1987) - **Qdrant metadata counts use server-side facets** instead of fetching and tallying every record; the embedding wrapper forwards facet and bulk-metadata capabilities correctly. (#1868, #1898) - **pgvector metadata-only fetches omit document payloads**, reducing transfer and decoding work. (#1892) ### Bug Fixes - **Chroma recovery distinguishes derived-index damage from data loss.** Valid all-layer-0 HNSW segments are no longer quarantined repeatedly; isolated FTS5 corruption is rebuilt from intact content during repair and after mining; embedded NUL bytes are sanitized before reaching ChromaDB. (#1716, #1872, #1878, #1927, #1928) - **SQLite recovery is bounded, atomic, and honest.** Integrity checks wait out transient writer contention; recovery archives use atomic rename; `repair --mode from-sqlite` rebuilds FTS5, vacuums, and requires a clean final `PRAGMA quick_check`; cleanup failures return non-zero instead of printing false success. (#1945, #2015, #2017) - **CLI search checks HNSW divergence before opening ChromaDB**, routing damaged palaces directly to SQLite BM25 while leaving healthy and non-Chroma backends on their normal path. (#2016) - **Writer leases recover instead of stranding servers read-only.** Refused writers retry and promote after a peer exits; status cannot acquire the writer lease; re-entrant holders are released across interruption; `checkpoint` and `delete_by_source` are correctly classified as mutations. (#1923, #1930, #1934, #1960, #1970, #1971) - **Status reports only checks that actually ran.** Non-Chroma backends mark Chroma SQLite integrity as not applicable. (#1931, #1946) - **Conversation transcripts are treated as mutable.** Appended or rewritten sessions are purged and re-filed by modification time, while Claude Code `tool-results/` sidecars are excluded from scans. (#1957, #2010) - **Explicit palace selection scopes derived graph state** so mining hallways and tunnels remain beside the selected `--palace`. (#2018) - **Remote and local server hardening.** Non-loopback HTTP requires a token unless explicitly overridden; provider probes cannot reuse ambient external keys before selection; hook transcript and file-copy/repair paths receive stricter validation; importing MCP no longer clobbers root logging; HTTP writes re-enter the palace lock safely; routine disconnects no longer emit tracebacks. (#1859, #1860, #1864, #1885, #2003, #2004) - **Mining and configuration correctness.** Oversized files warn visibly, configured `~` paths expand consistently, wing slugs handle special characters, and Windows background processes avoid console flashes. (#923, #1852, #1857, #1863, #1865) - **Windows `.gitignore` handling uses UTF-8 explicitly**, avoiding locale-dependent failures. (#1648) - **L1 wake-up prefers the latest moments** when importance ties. (#1630) - **Backend detection requires a SQLite magic header**, preventing unrelated files from being mistaken for a palace. (#1893, #1896) ### Documentation - Added a storage-backend configuration reference, a remote/team-server deployment guide, `authored_at` migration guidance, and refreshed the OpenClaw integration for the full 36-tool MCP surface. (#1719, #1877, #1890, #1904, #1905) ### Internal - Expanded WAL crash-safety, idempotence, and redaction-path coverage; updated GitHub Actions and Ruff; repaired `uv.lock` drift for Ruff 0.15.20 and Python 3.9 dependency markers. (#1869) A big thank-you to everyone who contributed to this release. Contributors and first-time contributors are credited below. ## What's Changed * fix: tighten local guards and file handling by @igorls in https://github.com/MemPalace/mempalace/pull/1864 * test(wal): cover WAL crash-safety, idempotent setup, and redaction edge paths by @arnoldwender in https://github.com/MemPalace/mempalace/pull/1869 * fix: spawn daemon with CREATE_NO_WINDOW to match hook miner (#1783) by @eldar702 in https://github.com/MemPalace/mempalace/pull/1857 * fix(cli): add repair rebuild-index alias by @jsiu93 in https://github.com/MemPalace/mempalace/pull/1670 * Fix/wing slug special chars by @tp9imka in https://github.com/MemPalace/mempalace/pull/1852 * fix(hooks): hide conhost window on Windows in _mine_sync non-daemon path by @davidfi01 in https://github.com/MemPalace/mempalace/pull/1863 * fix: expand tilde in palace_path when read from config file by @joesebastian6079 in https://github.com/MemPalace/mempalace/pull/1865 * fix(chroma): stop quarantining valid all-layer-0 HNSW segments (#1716) by @igorls in https://github.com/MemPalace/mempalace/pull/1872 * fix(repair): auto-heal isolated FTS5 inverted-index corruption (#1596) by @igorls in https://github.com/MemPalace/mempalace/pull/1878 * fix(mcp): stop clobbering host app root logger at import (#1860) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/1885 * fix(layers): order L1 wake-up by recency (filed_at) so it surfaces the latest moments by @davidglidden in https://github.com/MemPalace/mempalace/pull/1630 * fix(cli): force UTF-8 when reading/writing .gitignore in init by @ALaDingAhmad in https://github.com/MemPalace/mempalace/pull/1648 * chore(deps): bump actions/checkout from 6 to 7 by @dependabot[bot] in https://github.com/MemPalace/mempalace/pull/1882 * chore(deps): bump docker/setup-qemu-action from 3 to 4 by @dependabot[bot] in https://github.com/MemPalace/mempalace/pull/1880 * chore(deps): bump docker/setup-buildx-action from 3 to 4 by @dependabot[bot] in https://github.com/MemPalace/mempalace/pull/1881 * chore(deps-dev): bump ruff from 0.15.18 to 0.15.20 by @dependabot[bot] in https://github.com/MemPalace/mempalace/pull/1883 * fix(backends): require SQLite magic header for chroma + sqlite_exact detect() (#1893) by @messelink in https://github.com/MemPalace/mempalace/pull/1896 * fix(pgvector): skip document column for metadata-only fetches (#1840 follow-up) by @messelink in https://github.com/MemPalace/mempalace/pull/1892 * feat(convo): preserve authored timestamp from transcripts by @JosefAschauer in https://github.com/MemPalace/mempalace/pull/1890 * fix(palace): process-wide mine_palace_lock re-entrancy so the HTTP transport can write by @trongnguyenbinh in https://github.com/MemPalace/mempalace/pull/1859 * feat(mcp): add since/before date filter to list_drawers (#1128) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/1891 * feat: optimize metadata counting using Qdrant server-side facets by @Prayaksh in https://github.com/MemPalace/mempalace/pull/1868 * feat(graph): auto-populate the associative graph from mined sessions by @JosefAschauer in https://github.com/MemPalace/mempalace/pull/1895 * docs(guide): Remote / Team Server deployment guide (#1877) by @igorls in https://github.com/MemPalace/mempalace/pull/1897 * feat(serve): turnkey secure remote MCP server (#1877) by @igorls in https://github.com/MemPalace/mempalace/pull/1900 * docs(config): add storage backends configuration reference by @igorls in https://github.com/MemPalace/mempalace/pull/1904 * fix(docs): wide-table layout — stop clipping, fit backend table by @igorls in https://github.com/MemPalace/mempalace/pull/1905 * feat: add LaTeX (.tex, .bib) to readable and prose extensions by @messelink in https://github.com/MemPalace/mempalace/pull/1901 * docs(openclaw): catch up SKILL.md with 8 newer MCP tools by @raman325 in https://github.com/MemPalace/mempalace/pull/1719 * fix: read-only mode misses checkpoint and delete_by_source in _MUTATING_TOOLS by @yusefhaddad in https://github.com/MemPalace/mempalace/pull/1930 * fix(mine): log warning when files exceed MAX_FILE_SIZE (#923) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/924 * fix(backends): forward facet_counts + get_all_metadata in EmbeddingCollection by @messelink in https://github.com/MemPalace/mempalace/pull/1898 * fix: skip startup SQLite integrity check on oversized palace (unblocks MCP handshake) by @trek-e in https://github.com/MemPalace/mempalace/pull/1911 * fix: sanitize embedded NUL bytes before they reach ChromaDB by @jrzmurray in https://github.com/MemPalace/mempalace/pull/1929 * fix: half-open as-of interval + supersede() to end KG boundary double-count by @ggettert in https://github.com/MemPalace/mempalace/pull/1914 * [codex] fix status writer lease classification by @igorls in https://github.com/MemPalace/mempalace/pull/1934 * fix(mcp): mark sqlite_integrity not-applicable on non-chroma backends (#1931) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/1946 * fix(convo_miner): treat transcripts as mutable, not immutable by @jrzmurray in https://github.com/MemPalace/mempalace/pull/1957 * fix(mcp): self-heal writer lease instead of latching read-only for life by @Evgen197310 in https://github.com/MemPalace/mempalace/pull/1960 * fix(repair): use os.rename for in-place archive, not shutil.move by @KeilerHirsch in https://github.com/MemPalace/mempalace/pull/1945 * Add Milvus storage backend by @zc277584121 in https://github.com/MemPalace/mempalace/pull/1899 * style(tests): fix ruff format check left red by #1960 by @Evgen197310 in https://github.com/MemPalace/mempalace/pull/1965 * feat: add exclude_patterns config key to mempalace.yaml (rebase of #1213) by @jrzmurray in https://github.com/MemPalace/mempalace/pull/1953 * fix(palace): pair the mine_palace_lock holder-set update with its release (#1970) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/1971 * fix(convo_miner): don't mine Claude Code tool-results/ dirs — raw tool dumps flood the palace by @KeilerHirsch in https://github.com/MemPalace/mempalace/pull/2010 * fix(mcp): answer initialize immediately — run startup preflight in a background thread by @KeilerHirsch in https://github.com/MemPalace/mempalace/pull/1987 * mine: auto-heal isolated FTS5 corruption instead of forcing manual repair by @jrzmurray in https://github.com/MemPalace/mempalace/pull/1928 * fix(mcp): don't log a traceback when an HTTP client disconnects mid-response (#2003) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/2004 * fix(repair): wait out transient SQLite contention by @igorls in https://github.com/MemPalace/mempalace/pull/2015 * fix(searcher): guard CLI divergence before Chroma open by @igorls in https://github.com/MemPalace/mempalace/pull/2016 * fix(repair): require clean SQLite recovery finalization by @igorls in https://github.com/MemPalace/mempalace/pull/2017 * fix: scope derived graph state to explicit palace by @igorls in https://github.com/MemPalace/mempalace/pull/2018 * chore(release): 3.6.0 by @igorls in https://github.com/MemPalace/mempalace/pull/2019 * chore: sync main hotfixes into develop before 3.6.0 by @igorls in https://github.com/MemPalace/mempalace/pull/2022 * fix(mcp): preserve agent attribution in mempalace_checkpoint (#2023) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/2034 * feat(routing): add shared daemon write-routing policy by @fatkobra in https://github.com/MemPalace/mempalace/pull/2027 * Release v3.6.0 — promote develop to main by @igorls in https://github.com/MemPalace/mempalace/pull/2020 ## New Contributors * @tp9imka made their first contribution in https://github.com/MemPalace/mempalace/pull/1852 * @davidfi01 made their first contribution in https://github.com/MemPalace/mempalace/pull/1863 * @joesebastian6079 made their first contribution in https://github.com/MemPalace/mempalace/pull/1865 * @davidglidden made their first contribution in https://github.com/MemPalace/mempalace/pull/1630 * @ALaDingAhmad made their first contribution in https://github.com/MemPalace/mempalace/pull/1648 * @JosefAschauer made their first contribution in https://github.com/MemPalace/mempalace/pull/1890 * @trongnguyenbinh made their first contribution in https://github.com/MemPalace/mempalace/pull/1859 * @Prayaksh made their first contribution in https://github.com/MemPalace/mempalace/pull/1868 * @raman325 made their first contribution in https://github.com/MemPalace/mempalace/pull/1719 * @yusefhaddad made their first contribution in https://github.com/MemPalace/mempalace/pull/1930 * @jrzmurray made their first contribution in https://github.com/MemPalace/mempalace/pull/1929 * @Evgen197310 made their first contribution in https://github.com/MemPalace/mempalace/pull/1960 * @KeilerHirsch made their first contribution in https://github.com/MemPalace/mempalace/pull/1945 * @zc277584121 made their first contribution in https://github.com/MemPalace/mempalace/pull/1899 **Full Changelog**: https://github.com/MemPalace/mempalace/compare/v3.5.0...v3.6.0