Skip to content

docs(changelog): batch entries for 7 v3.3.5 fixes#1370

Merged
igorls merged 1 commit intodevelopfrom
docs/changelog-v3.3.5-batch1
May 6, 2026
Merged

docs(changelog): batch entries for 7 v3.3.5 fixes#1370
igorls merged 1 commit intodevelopfrom
docs/changelog-v3.3.5-batch1

Conversation

@igorls
Copy link
Copy Markdown
Member

@igorls igorls commented May 6, 2026

Summary

CHANGELOG entries for the seven Tier-1 PRs merged today as part of the v3.3.5 backlog push:

Test plan

  • No code changes; CHANGELOG-only.
  • Renders correctly in Markdown.

…1282 #1167 #1160

Bundled CHANGELOG entries for the seven Tier-1 PRs merged today, including
the behavior-change call-out for #1167 (KG date validators now reject
non-ISO inputs that previously produced silent empty results).
Copilot AI review requested due to automatic review settings May 6, 2026 04:40
@igorls igorls added this to the v3.3.5 milestone May 6, 2026
@igorls igorls merged commit 5ae83d8 into develop May 6, 2026
7 checks passed
@igorls igorls deleted the docs/changelog-v3.3.5-batch1 branch May 6, 2026 04:40
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request updates the v3.3.5 “Bug Fixes” section of CHANGELOG.md to batch-document seven fixes that were merged as part of the v3.3.5 backlog push.

Changes:

  • Adds changelog entries for seven recently-merged Tier-1 bug fixes (KG interval validation, Chroma client close semantics, atomic entity registry save, closet regeneration pagination, Windows UTF-8 stdio, MCP KG date validation, MCP KG per-path cache).
  • Notes behavior changes where applicable (KG date validation now fails fast; diary agent-name casing behavior change already present).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread CHANGELOG.md
- **`EntityRegistry.save()` could leave a corrupt or empty `entity_registry.json` on crash.** `Path.write_text()` is not atomic — kernel sees `open('w')` (truncate), `write`, `close`, and any failure between truncate and full-flush (power loss, OOM, FS-full, kill -9) wipes the months-of-mining people/projects map silently (the registry's `load()` swallows `JSONDecodeError`). Save now writes to a sibling `.tmp` in the same directory, `fsync`s, `chmod 0o600`s, then `os.replace()`s into place — atomic on POSIX and Windows. The previous registry stays intact on any crash before the rename returns. (#1215)
- **`mempalace compress` crashed on large palaces.** `regenerate_closets` fetched all closet_llm drawers in a single `col.get()`, which trips `SQLITE_MAX_VARIABLE_NUMBER` on palaces above ~32k drawers. Mirrors the #851 fix in `miner.py`: drawer fetch is now paginated at `batch_size=5000`. Per-source aggregation works across batches, so the LLM regeneration call still groups chunks correctly. (#1073, #1107)
- **CLI and `fact_checker --stdin` mojibaked non-ASCII content on Windows.** Python defaults `sys.stdin`/`stdout`/`stderr` to the system ANSI codepage (cp1252/cp1251/cp950), so `mempalace search > out.txt` and piped fact_checker invocations corrupted Cyrillic / CJK drawer text at the process boundary. New `mempalace/_stdio.py` helper reconfigures all three streams to UTF-8 on `sys.platform == "win32"`, with per-stream `errors` policy: `surrogateescape` on stdin (preserves bad bytes from redirected files for the consumer's parser), `replace` on stdout/stderr (substitutes U+FFFD instead of `UnicodeEncodeError`-ing mid-print). With this, all three user-facing console_scripts (`mcp_server`, `hooks_cli`, `cli`/`fact_checker`) now reconfigure identically on Windows. (#1282)
- **MCP knowledge-graph tools forwarded malformed date strings to SQLite.** `tool_kg_query` (`as_of`), `tool_kg_add` (`valid_from`), and `tool_kg_invalidate` (`ended`) accepted any string and produced empty result sets on natural-language inputs like `"March 2026"` or `"yesterday"` — callers (especially LLM agents) could not distinguish "no fact at this time" from "your date format was unrecognized." New `sanitize_iso_date()` validator in `config.py` accepts `YYYY`, `YYYY-MM`, `YYYY-MM-DD` (and passes through `None`/`""`); all three tools call it before values reach the storage layer. **Behavior change:** previously-silent date typos now raise a clear `ValueError` naming the offending field; full ISO-8601 with time (`YYYY-MM-DDTHH:MM:SS`, timezone offsets) is not yet accepted — file an issue if you have a use case. (#1164, #1167)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants