You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+100-1Lines changed: 100 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,7 +6,106 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
7
7
---
8
8
9
-
## [Unreleased] — v3.3.0 (on develop)
9
+
## [3.3.2] — 2026-04-19
10
+
11
+
### Bug Fixes
12
+
13
+
- Fix silent drop of `.jsonl` files in project miner; raise `MAX_FILE_SIZE` cap from 10 MB to 500 MB so large transcripts no longer fall through unnoticed. Adds a tandem **sweeper** — a message-level, timestamp-coordinated, idempotent safety net that catches anything the primary miner missed. (#998)
14
+
-`mempalace sweep <target>` CLI to run the sweeper on demand against a transcript file or a directory. (#998)
15
+
- Guard `Layer3.search_raw` against `None` doc/meta rows returned by ChromaDB — prevents `AttributeError` crashes on mixed-schema palaces. (#1011, #1013)
16
+
- Guard searcher API path, closet loop, and miner status histogram against `None` metadata; matching guards added to `tool_status` / `list_wings` / `list_rooms` / `get_taxonomy` in the MCP server. (#999)
17
+
- Upgrade `chromadb` floor to `>=1.5.4` for Python 3.13 / 3.14 compatibility and pin upper bound to `<2` so future breaking majors don't silently install. (#1010)
18
+
- Fix Unicode checkmark rendering on Windows terminals that can't encode the `✓` glyph — avoids `UnicodeEncodeError` crashes on first-run output. (#681)
19
+
-**`quarantine_stale_hnsw`** — on open, detect HNSW segment directories whose `data_level0.bin` is significantly older than `chroma.sqlite3` and rename them out of the way. Recovers cleanly from HNSW/sqlite drift that otherwise causes SIGSEGV on `count()` / `query(...)` (the chroma-core/chroma#2594 failure mode). Rebuilds the index lazily on next use. (#1000)
20
+
-**PID file guard** — `mine` writes a per-source-directory PID file and refuses to start if an existing mine is still running, preventing process stacking that bloats HNSW and wedges concurrent writes. Includes cross-platform PID liveness check (`os.kill(pid, 0)` terminates on Windows, so the guard falls back to a platform-aware probe). (#1023)
21
+
22
+
### Improvements
23
+
24
+
-**RFC 001 §10 — typed backend contracts.**`BaseBackend` now returns typed `QueryResult` / `GetResult` dataclasses and `PalaceRef` for palace identity; registry-based backend discovery. Internal refactor; no user-facing API change. (#995)
25
+
-**RFC 002 §9 — source adapter scaffolding.** Introduces `BaseSourceAdapter`, adapter registry, and `PalaceContext` — the plumbing that future pluggable ingest sources will target. Internal refactor; no user-facing API change yet. (#1014)
26
+
27
+
### Documentation
28
+
29
+
-**RFC 002** — full specification for the source adapter plugin system (future pluggable ingest). (#990)
30
+
- First-run help text and `README` now reference the real `~/.claude/projects/<project>/` path shape instead of the placeholder `/path/to/transcripts`. (#996, #1012)
31
+
32
+
### Internal
33
+
34
+
- Harden sweeper for production: verbatim tool blocks, full `session_id`, logged failures.
35
+
- Address Copilot review on #995: cursor tie-break, honest metrics, accurate comments.
36
+
- Test hygiene: avoid ONNX network download in update-length validation tests; dedup update-length-validation tests; fix Windows file-lock in cache-invalidation test.
37
+
38
+
---
39
+
40
+
## [3.3.1] — 2026-04-16
41
+
42
+
### New Features
43
+
44
+
**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)
45
+
46
+
-**Five new fully-supported locales** with CLI strings, AAAK compression instructions, and entity-detection patterns:
47
+
- Brazilian Portuguese `pt-br` (#156)
48
+
- Russian `ru` (#760)
49
+
- Italian `it` (#907)
50
+
- Hindi `hi` (#773)
51
+
- Indonesian `id` (#778)
52
+
-**`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)
53
+
-**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)
54
+
-**VSCode devcontainer** matching the CI environment (#881)
55
+
-`MEMPAL_VERBOSE` env toggle — developers see diaries surfaced in chat while the default remains silent (#871)
56
+
-`created_at` timestamps included in search results (#846)
57
+
58
+
### Bug Fixes
59
+
60
+
**i18n / Unicode**
61
+
62
+
- 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)
63
+
- 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)
64
+
- 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)
65
+
- 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)
66
+
-`ko.json``status_drawers` used `{drawers}` instead of `{count}`, showing the raw template string instead of the number (#758)
67
+
- Move `test_i18n.py` from inside the installed package into `tests/` so pytest actually collects it; remove the `sys.path.insert` hack (#758)
68
+
-`Dialect.from_config()` defaulted to `current_lang()` (module-global) when config had no `lang` key — replaced with explicit `"en"` fallback for determinism (#758)
69
+
70
+
**Other**
71
+
72
+
- Guard `KnowledgeGraph.close()` and `query_relationship`/`timeline`/`stats` methods with the instance lock to prevent concurrent-access corruption (#887, #884)
73
+
- Replace invalid `{"decision": "allow"}` with `{}` in hook responses — the string wasn't a valid decision value and triggered schema warnings (#885)
74
+
-`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)
75
+
- Precompact hook no longer blocks compaction when it fails or takes too long (#856, #858, #863)
76
+
- Redirect stdout to stderr during MCP server import so library logging can't corrupt the JSON-RPC channel (#225, #864)
77
+
-`mempalace init` auto-adds per-project files to `.gitignore` in git repositories so users don't accidentally commit `mempalace.yaml` / `entities.json` (#185, #866)
78
+
- Searcher guards against empty ChromaDB query results that previously raised on edge-case corpora (#195, #865)
79
+
- Return empty status instead of an error on a cold-start palace with no drawers yet (#830, #831)
80
+
- Restrict file permissions on sensitive palace data (#814)
81
+
- Slack transcript importer writes a provenance header and preserves speaker IDs (#815)
82
+
- Allow `mempalace mine` to run in directories without a local `mempalace.yaml` and surface the missing-yaml warning on stderr (#604)
83
+
- Security hook injection fix (#812)
84
+
- Save hook auto-mines transcripts even when `MEMPAL_DIR` is unset (#840)
85
+
- Pin the Pages custom domain via a shipped `CNAME` in the deploy artifact (#877)
86
+
- Version drift safeguard — sync pyproject + `version.py` + README badge in one place (#876)
87
+
- Deploy docs workflow now runs on `develop` only, preventing accidental main-branch deploys (#845)
88
+
89
+
### Improvements
90
+
91
+
- 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)
92
+
- Knowledge-graph value sanitization now preserves natural punctuation (commas, colons, parentheses) that commonly appears in KG subject/object values (#873)
93
+
94
+
### Documentation
95
+
96
+
- Clarify that `mempalace init` requires a `<dir>` argument in CLI help text (#210, #862)
97
+
- Domain name and specific impostor sites called out in the scam-alert section (#869)
98
+
- Tightened `SECURITY.md` with a real version-support policy and the GHPVR-only reporting channel (#810)
99
+
- Fixed stale `pyproject.toml` URLs (#853)
100
+
- v4 planning prep (#852)
101
+
102
+
### Internal
103
+
104
+
-`palace_graph` tunnel helper test coverage (#908)
105
+
106
+
---
107
+
108
+
## [3.3.0] — 2026-04-13
10
109
11
110
### New Features
12
111
- Closet layer — a compact searchable index of pointers to verbatim drawers, enabling fast topical lookup without reading all content (#788)
0 commit comments