Skip to content

Commit 6889c6f

Browse files
authored
Merge pull request #957 from MemPalace/release/3.3.1
release: v3.3.1
2 parents 73f038c + b552bcf commit 6889c6f

82 files changed

Lines changed: 335310 additions & 1575 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"name": "mempalace",
1010
"source": "./.claude-plugin",
1111
"description": "AI memory system — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, guided setup.",
12-
"version": "3.3.0",
12+
"version": "3.3.1",
1313
"author": {
1414
"name": "milla-jovovich"
1515
}

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mempalace",
3-
"version": "3.3.0",
3+
"version": "3.3.1",
44
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, and guided setup.",
55
"author": {
66
"name": "milla-jovovich"

.codex-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mempalace",
3-
"version": "3.3.0",
3+
"version": "3.3.1",
44
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, and guided setup.",
55
"author": {
66
"name": "milla-jovovich"

.devcontainer/devcontainer.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"name": "MemPalace",
3+
"image": "mcr.microsoft.com/devcontainers/python:3.11",
4+
"features": {
5+
"ghcr.io/devcontainers/features/github-cli:1": {}
6+
},
7+
"postCreateCommand": "bash .devcontainer/post-create.sh",
8+
"customizations": {
9+
"vscode": {
10+
"extensions": [
11+
"ms-python.python",
12+
"ms-python.debugpy",
13+
"charliermarsh.ruff"
14+
],
15+
"settings": {
16+
"python.defaultInterpreterPath": "/usr/local/bin/python",
17+
"python.testing.pytestEnabled": true,
18+
"python.testing.pytestArgs": ["tests/", "-v", "--ignore=tests/benchmarks"],
19+
"ruff.importStrategy": "fromEnvironment",
20+
"editor.formatOnSave": true,
21+
"editor.defaultFormatter": "charliermarsh.ruff"
22+
}
23+
}
24+
}
25+
}

.devcontainer/post-create.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
echo "=== MemPalace Dev Container Setup ==="
5+
6+
pip install -e ".[dev]"
7+
8+
# Match CI's ruff pin (pyproject only sets a floor; without this contributors
9+
# get a newer ruff locally than CI runs, causing phantom lint failures).
10+
pip install "ruff>=0.4.0,<0.5"
11+
12+
pip install pre-commit
13+
pre-commit install
14+
15+
echo ""
16+
echo "=== Verification ==="
17+
echo "python: $(python --version)"
18+
echo "pytest: $(python -m pytest --version 2>&1 | head -1)"
19+
echo "ruff: $(python -m ruff --version 2>&1 | head -1)"
20+
echo ""
21+
echo "Ready. Run: pytest tests/ -v --ignore=tests/benchmarks"

.pre-commit-config.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
repos:
22
- repo: https://github.com/astral-sh/ruff-pre-commit
3-
rev: v0.9.0
3+
# Keep in lock-step with the ruff version pinned in .github/workflows/ci.yml
4+
# (>=0.4.0,<0.5). Using a newer rev here produces a different formatter
5+
# output than CI and breaks `ruff format --check` in the lint job.
6+
rev: v0.4.10
47
hooks:
58
- id: ruff
69
args: [--fix]

CHANGELOG.md

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,75 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66

77
---
88

9-
## [Unreleased] — v3.3.0 (on develop)
9+
## [3.3.1] — 2026-04-16
10+
11+
### New Features
12+
13+
**Multi-language entity detection** — lexical patterns (person verbs, pronouns, dialogue markers, project verbs, stopwords, candidate character classes) now live in the optional `entity` section of each locale JSON under `mempalace/i18n/<lang>.json`. Every public function in `entity_detector` accepts a `languages=` tuple and unions patterns across enabled locales. Default stays `("en",)` so existing English-only callers are unchanged. (#911)
14+
15+
- **Five new fully-supported locales** with CLI strings, AAAK compression instructions, and entity-detection patterns:
16+
- Brazilian Portuguese `pt-br` (#156)
17+
- Russian `ru` (#760)
18+
- Italian `it` (#907)
19+
- Hindi `hi` (#773)
20+
- Indonesian `id` (#778)
21+
- **`MempalaceConfig.entity_languages`** — persistent palace-level language selection; `MEMPALACE_ENTITY_LANGUAGES` env override; `mempalace init --lang en,pt-br` flag that saves to `~/.mempalace/config.json` (#911)
22+
- **Per-language `candidate_pattern`** — non-Latin scripts register their own character class, so names like `João`, `Инна`, `राज` are no longer silently dropped by the ASCII-only default (#911)
23+
- **VSCode devcontainer** matching the CI environment (#881)
24+
- `MEMPAL_VERBOSE` env toggle — developers see diaries surfaced in chat while the default remains silent (#871)
25+
- `created_at` timestamps included in search results (#846)
26+
27+
### Bug Fixes
28+
29+
**i18n / Unicode**
30+
31+
- Script-aware word boundaries for combining-mark scripts — Python's `\b` fails on Devanagari vowel signs (`ा ी ु`), Arabic, Hebrew, Thai, Tamil, Khmer etc., truncating names like `अनीता``अनीत` and making person-verb patterns never fire. Locales now declare an optional `boundary_chars` field and the i18n loader expands `\b` into a script-aware lookaround boundary (#932)
32+
- Case-insensitive BCP 47 language code resolution — `--lang PT-BR`, `zh-cn`, `Pt-Br` previously fell through to English silently; now resolve to the canonical locale file via lowercase matching, with the entity-pattern cache keyed on the canonical form so casing variations share one cache entry (#928)
33+
- Wire i18n candidate patterns into `miner._extract_entities_for_metadata()`, `palace.build_closet_lines()`, and `entity_registry.extract_unknown_candidates()` — three code paths that still hardcoded ASCII-only `[A-Z][a-z]{2,}` and silently missed Cyrillic, accented Latin, and non-Latin entity metadata tags (#931)
34+
- Explicit `encoding="utf-8"` on `Path.read_text()` calls across entity_registry, instructions_cli, split_mega_files, and onboarding tests — prevents Windows GBK (and other non-UTF-8) locales from corrupting UTF-8 files (#946, #776)
35+
- `ko.json` `status_drawers` used `{drawers}` instead of `{count}`, showing the raw template string instead of the number (#758)
36+
- Move `test_i18n.py` from inside the installed package into `tests/` so pytest actually collects it; remove the `sys.path.insert` hack (#758)
37+
- `Dialect.from_config()` defaulted to `current_lang()` (module-global) when config had no `lang` key — replaced with explicit `"en"` fallback for determinism (#758)
38+
39+
**Other**
40+
41+
- Guard `KnowledgeGraph.close()` and `query_relationship`/`timeline`/`stats` methods with the instance lock to prevent concurrent-access corruption (#887, #884)
42+
- Replace invalid `{"decision": "allow"}` with `{}` in hook responses — the string wasn't a valid decision value and triggered schema warnings (#885)
43+
- `entity_registry.research()` defaults to local-only — previously made outbound Wikipedia HTTPS requests without explicit user opt-in; callers now must pass `allow_network=True` (#811)
44+
- Precompact hook no longer blocks compaction when it fails or takes too long (#856, #858, #863)
45+
- Redirect stdout to stderr during MCP server import so library logging can't corrupt the JSON-RPC channel (#225, #864)
46+
- `mempalace init` auto-adds per-project files to `.gitignore` in git repositories so users don't accidentally commit `mempalace.yaml` / `entities.json` (#185, #866)
47+
- Searcher guards against empty ChromaDB query results that previously raised on edge-case corpora (#195, #865)
48+
- Return empty status instead of an error on a cold-start palace with no drawers yet (#830, #831)
49+
- Restrict file permissions on sensitive palace data (#814)
50+
- Slack transcript importer writes a provenance header and preserves speaker IDs (#815)
51+
- Allow `mempalace mine` to run in directories without a local `mempalace.yaml` and surface the missing-yaml warning on stderr (#604)
52+
- Security hook injection fix (#812)
53+
- Save hook auto-mines transcripts even when `MEMPAL_DIR` is unset (#840)
54+
- Pin the Pages custom domain via a shipped `CNAME` in the deploy artifact (#877)
55+
- Version drift safeguard — sync pyproject + `version.py` + README badge in one place (#876)
56+
- Deploy docs workflow now runs on `develop` only, preventing accidental main-branch deploys (#845)
57+
58+
### Improvements
59+
60+
- Regex compilation optimization for entity extraction — pre-compile per-entity pattern sets once and cache by `(name, languages)` tuple, so multi-language callers don't thrash the cache (#880)
61+
- Knowledge-graph value sanitization now preserves natural punctuation (commas, colons, parentheses) that commonly appears in KG subject/object values (#873)
62+
63+
### Documentation
64+
65+
- Clarify that `mempalace init` requires a `<dir>` argument in CLI help text (#210, #862)
66+
- Domain name and specific impostor sites called out in the scam-alert section (#869)
67+
- Tightened `SECURITY.md` with a real version-support policy and the GHPVR-only reporting channel (#810)
68+
- Fixed stale `pyproject.toml` URLs (#853)
69+
- v4 planning prep (#852)
70+
71+
### Internal
72+
73+
- `palace_graph` tunnel helper test coverage (#908)
74+
75+
---
76+
77+
## [3.3.0] — 2026-04-13
1078

1179
### New Features
1280
- Closet layer — a compact searchable index of pointers to verbatim drawers, enabling fast topical lookup without reading all content (#788)
@@ -41,6 +109,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
41109
- Add `docs/CLOSETS.md` — closet layer overview
42110
- Fix stale `milla-jovovich/*` org URLs in website and plugin manifests (#787)
43111
- Fix remaining stale org URLs in contributor docs (#808)
112+
- Rewrite `README.md` and `mempalaceofficial.com` benchmark pages to remove category-error cross-system comparisons (R@5 retrieval recall had been listed next to competitor QA accuracy under one column), remove the retracted "+34% palace boost" claim from the surfaces where it had remained, replace the `100%` Haiku-rerank headline with the honest held-out `98.4%` R@5, drop the LoCoMo `100%` top-50 row (retrieval-bypass artefact), and fix the broken `aya-thekeeper/mempal` reproduction URL (#875)
113+
- Add `docs/HISTORY.md` as the canonical home for corrections, retractions, and public notices; move the 2026-04-07 "Note from Milla & Ben" and the 2026-04-11 impostor-domain notice out of `README.md`
114+
- Add v3.3.0 reproduction result JSONLs and the deterministic `seed=42` 50/450 LongMemEval split under `benchmarks/` — every BENCHMARKS.md claim reproduces exactly
44115

45116
### Internal
46117
- Add test coverage for `mine_lock`, closets, entity metadata, BM25, and diary

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ If you're planning a significant change, open an issue first to discuss the appr
8282
- **Verbatim first**: Never summarize user content. Store exact words.
8383
- **Local first**: Everything runs on the user's machine. No cloud dependencies.
8484
- **Zero API by default**: Core features must work without any API key.
85-
- **Palace structure matters**: Wings, halls, and rooms aren't cosmetic — they drive a 34% retrieval improvement. Respect the hierarchy.
85+
- **Palace structure is scoping, not magic**: Wings, halls, and rooms act as metadata filters in the underlying vector store. They keep retrieval predictable when a palace holds many unrelated projects or people. Respect the hierarchy — but don't present it as a novel retrieval mechanism.
8686

8787
## Community
8888

0 commit comments

Comments
 (0)