+**Sync status:** this fork's `main` rebases a single squash commit on top of upstream `main` at [`71736a3`](https://github.com/milla-jovovich/mempalace/commit/71736a3) (PR #142, packaging cleanup), audited against upstream through [`94f1689`](https://github.com/MemPalace/mempalace/commit/94f1689) (v3.3.3 + develop merge of 2026-04-25). Ported from that window: the `--palace` CLI flag for `mempalace.mcp_server` (upstream [PR #264](https://github.com/milla-jovovich/mempalace/pull/264), adapted — our KG lives in Postgres so the KG-path portion is dropped), `pytest-cov` coverage reporting in CI with a 30% floor (upstream `9de302f`), the mine summary stats fix (upstream [`75eb7ff`](https://github.com/milla-jovovich/mempalace/commit/75eb7ff), PR #165 by @adv3nt3), deterministic content IDs + `ON CONFLICT DO UPDATE` upsert to fix data stagnation (upstream [`a4149ab`](https://github.com/milla-jovovich/mempalace/commit/a4149ab), PR #140 findings #6/#11/#13 by @igorls), mtime-aware `file_already_mined` so modified files actually re-mine (upstream [`bf88daa`](https://github.com/milla-jovovich/mempalace/commit/bf88daa), same PR), MCP null-args hang fix so `"arguments": null` no longer crashes the server (upstream [`0720fb8`](https://github.com/milla-jovovich/mempalace/commit/0720fb8), PR #399 by @bensig, fixes #394), MCP protocol version negotiation so newer Claude Code clients can connect (upstream [`950d52b`](https://github.com/milla-jovovich/mempalace/commit/950d52b), PR #324 by @virgil-at-biocompute), 500 MB file-size guard on `normalize.py` and `split_mega_files.py` (upstream [`0720fb8`](https://github.com/milla-jovovich/mempalace/commit/0720fb8), PR #399, fixes #396), the `mempalace mcp` setup-guidance subcommand (upstream [`2981433`](https://github.com/milla-jovovich/mempalace/commit/2981433), PR #315 by @kpulik, adapted to print the Docker Compose invocation instead of `python -m`), a 10 MB per-file size ceiling + symlink skip during `scan_project` / `scan_convos` (cherry-picked from upstream [`1d19dfc`](https://github.com/milla-jovovich/mempalace/commit/1d19dfc), PR #252 by @anthonyonazure / @bensig — only the two scan-time safety filters; the rest of that commit is not applicable, see below), `MEMPALACE_PALACE_PATH` env-var normalization to match the `--palace` CLI code path (upstream [`bcd0791`](https://github.com/MemPalace/mempalace/commit/bcd0791), PR #1163 by @arnoldwender), empty/whitespace-only wing/room treated as no filter in `mempalace_search` so LLM-supplied `""` doesn't silently scope to nothing (upstream [`9947ad0`](https://github.com/MemPalace/mempalace/commit/9947ad0), PR #1097 by @kunalgarhewal), `~` expansion in the `mempalace split` directory argument (upstream [`dc14347`](https://github.com/MemPalace/mempalace/commit/dc14347), PR #361 by @brookewhatnall), entity-detector noise reduction — CamelCase product names (`MemPalace`, `ChromaDB`, `OpenAI`) captured whole, dialogue `^NAME:\s` requires ≥2 hits to count, version regex tightened to `\d+(\.\d+)*` so `context-manager` is no longer a project, `LICENSE`/`COPYING`/`NOTICE`/`AUTHORS`/`PATENTS` files skipped at scan, expanded stopword list, strong-pronoun classify path for diary main characters (upstream [`6aebf45`](https://github.com/MemPalace/mempalace/commit/6aebf45) by @igorls, adapted — i18n stopword portion landed inline since this fork has no i18n layer), full AI response in `convo_miner` exchange chunking with consecutive-drawer split when an exchange exceeds 800 chars (upstream [`d52d6c9`](https://github.com/MemPalace/mempalace/commit/d52d6c9) by @shafdev + [`9b60c6e`](https://github.com/MemPalace/mempalace/commit/9b60c6e) by @sramadugu1, PRs #695/#708), no-embedding sentinel rows so 0-chunk files don't get re-mined every run (upstream [`87e8baf`](https://github.com/MemPalace/mempalace/commit/87e8baf), PR #732 by @mvalentsev — adapted to PG via a new `PalaceDB.register_empty_file` that writes a sentinel with `embedding=NULL`), `process_file` early exits return `room="general"` instead of `None` so the dry-run summary doesn't crash (upstream [`091c2fe`](https://github.com/MemPalace/mempalace/commit/091c2fe), PR #687 by @mvalentsev), bash-arithmetic injection guard on the `LAST_SAVE` state file in `hooks/mempal_save_hook.sh` (upstream [`0f217f7`](https://github.com/MemPalace/mempalace/commit/0f217f7) by @marcio-heiderscheidt — only the bash portion; the upstream `eval $(python3 -c ...)` and `hooks_cli.py` validators don't apply here), and per-project diary wings — optional `wing` param on `tool_diary_write` / `tool_diary_read`, empty-wing on read spans every wing the agent has written to, agent-name filter applied unconditionally, derivation from `$TRANSCRIPT_PATH` in the bash stop hook (upstream [`df3ee28`](https://github.com/MemPalace/mempalace/commit/df3ee28) PR #659 by @jphein + [`1fd16da`](https://github.com/MemPalace/mempalace/commit/1fd16da) PR #1145 by @igorls + [`d158375`](https://github.com/MemPalace/mempalace/commit/d158375) hook-derivation portion adapted to bash since we have no `hooks_cli.py`). All other portable fixes merged into upstream since the fork point are absorbed: security hardening (shell injection, path traversal, hook security, error sanitisation), bounded queries, `.gitignore`-aware mining, MCP integer coercion, Windows Unicode fix, AAAK honest stats, and the expanded upstream test suite. Intentionally skipped because they don't apply to the PostgreSQL backend or this fork's delivery model: SQLite/ChromaDB-specific fixes (WAL mode, batched unbounded reads, `chromadb` version pin, ChromaDB client cache [`a67b00d`](https://github.com/milla-jovovich/mempalace/commit/a67b00d) — already achieved here via `get_db()`, ChromaDB telemetry/CoreML silencing `df33550`, Windows ChromaDB handle release [`58b8d5b`](https://github.com/milla-jovovich/mempalace/commit/58b8d5b)), the KG co-location portion of PR #264 and the security rework of `knowledge_graph.py` inside PR #252 (our KG lives in Postgres), the `palace.py` consolidation introduced in PR #252 (we don't share that module), upstream's `cmd_repair` infinite-recursion fix (ChromaDB-specific), upstream's 94-test ChromaDB-stress benchmark suite (PR #223 — targets ChromaDB-specific OOM and degradation behaviours we don't hit), upstream test-file ruff-format commits (`a0bcd0c`, `af42a85` — touch files we don't have), upstream's `parse_known_args` pytest-collection fix (`edf8f36` — already absorbed in fork commit `a309d16` when we ported PR #264), upstream's macOS/Windows CI split ([`43c5a47`](https://github.com/milla-jovovich/mempalace/commit/43c5a47), Windows mtime test fix [`1c48f4d`](https://github.com/milla-jovovich/mempalace/commit/1c48f4d) — we're Linux-only), upstream test coverage commits that touch `test_knowledge_graph.py` / `test_mcp_server.py` / `test_searcher.py` (dropped at PG migration in `abbab4f`), the md5→sha256 drawer-ID change inside PR #252 (would invalidate all existing drawer IDs without real benefit), the metadata 30s TTL cache inside PR #252 (upstream itself removed it in [`c2308a1`](https://github.com/milla-jovovich/mempalace/commit/c2308a1) for breaking test isolation), the `hooks/mempal_save_hook.sh` shell-eval sanitisation inside PR #252 (our hook uses command substitution into variables, not `eval` — so there is no injection path to fix), the v3.0.x / v3.1.0 / v3.2.0 / v3.3.x version bump chore commits, upstream's Claude Code plugin / marketplace ecosystem (`.claude-plugin/`, `.codex-plugin/`, `hooks_cli.py`, `mempalace-mcp` pipx entry point [`9f5b8f5`](https://github.com/MemPalace/mempalace/commit/9f5b8f5), all `hooks_cli.py` review fixes — this fork ships via Docker Compose, not the pip-install marketplace flow), upstream's i18n layer (Belarusian/Brazilian Portuguese/Indonesian/Russian/Italian/French/Spanish/German/Hindi/Simplified+Traditional Chinese — this fork is English-only), the `mempalace migrate` ChromaDB-version recovery command and other ChromaDB internals introduced post-2981433 (HNSW quarantine `0c38dea`, BLOB seq_id repair `abc115b`, chromadb<2 pin `fa7fe1d`, chromadb>=1.5.4 upgrade for py3.13/14 `d0c8ecd`, `cmd_repair` infinite-recursion follow-ups), the backend seam refactor [PR #413](https://github.com/MemPalace/mempalace/pull/413) (already achieved differently in this fork via `db.py`'s `PalaceDB`), the entity-detection overhaul (project_scanner.py + llm_providers.py + convo_scanner — produces a 600+ line module the fork doesn't have; the regex detector with the noise reduction above is sufficient for established palaces), VitePress documentation site + Netlify config (this fork uses README-only docs), `sanitize_name` Unicode fix (upstream [`6e2ced3`](https://github.com/MemPalace/mempalace/commit/6e2ced3), PR #683 — N/A: this fork never ported the `sanitize_name` function from upstream's PR #647 security hardening pass, so there's no validator to widen), the `**kwargs` handler whitelist exemption (upstream [`862a07b`](https://github.com/MemPalace/mempalace/commit/862a07b), PR #684 — N/A for the same reason: no schema whitelist on `tools/call`, only int/float coercion), the upstream commits raising `convo_miner` / `miner` `MAX_FILE_SIZE` 10 MB → 500 MB ([`6f33d52`](https://github.com/MemPalace/mempalace/commit/6f33d52), [`d137d12`](https://github.com/MemPalace/mempalace/commit/d137d12) — the 10 MB scan-time ceiling is a deliberate fork choice; the 500 MB cap on `normalize.py` / `split_mega_files.py` already aligned with upstream is independent and stays), Windows/macOS portability fixes (Windows `os.kill` PID handling, Windows mtime test fixes, macOS path symlink resolution, Unicode checkmark for Windows encoding — this fork is Linux-only), the deterministic hook saves rewrite ([upstream `74e9cbc`, PR #673](https://github.com/MemPalace/mempalace/pull/673) — switches from MCP-tool-based saves to a silent Python API path inside `hooks_cli.py`, which we don't have).
0 commit comments