v0.2.9
KalyanKS-NLP/llm-engineer-toolkitv0.2.9Jul 22, 2026by het0814
AI Summary
A critical bug-fix release addressing memory-integrity issues, including content being silently wiped by false-positive 'Tags:' matches, phantom session summaries, and timestamp/TTL violations. It also introduces OKF support in the Web UI.
Key Highlights
- Fixed false-positive 'Tags:' match causing content to be silently wiped
- Fixed phantom session summaries logged for failed writes
- Fixed temporal filter fail-open behavior
- Added OKF (Open Knowledge Format) import support in the Web UI
- Enabled streaming uploads for both TypeScript SDK and Claude Code integration
New Features
- OKF import support in the Web UI
- Streaming uploads for TypeScript SDK and Claude Code integration
Full Release Notes
# Release Notes for v0.2.9
This release fixes a batch of **memory-integrity bugs** - content silently wiped by a false-positive "Tags:" match, phantom session summaries logged for writes that actually failed, timestamp/TTL invariant violations, and temporal-filter fail-open behavior — plus **tags/metadata/provenance preservation** across recall, LangGraph, MCP, and Hermes, streamed uploads for both the TypeScript SDK and the Claude Code integration's transcript parser, and OKF support surfaced in the Web UI.
## New Features
- **OKF in the Web UI** (`memanto/app/ui/static/index.html`, `memanto/app/ui/routes/ui_router.py`)
- The Migrate tab now supports importing an OKF bundle directly from the
dashboard, alongside Mem0/Letta/Supermemory.
## Bug Fixes
- **Content silently wiped by false-positive "Tags:" match** (`memanto/app/services/memory_read_service.py`)
- The wire-format parser split stored memory text on every blank-line-separated
chunk and dropped any chunk starting with `"Tags: "` — so content that
legitimately began a paragraph with the literal text `"Tags: "` was silently
deleted on read. Parsing now partitions strictly into title/content, and
only strips a trailing tags block when the record actually has tags *and*
the last blank-line-delimited segment starts with `"Tags: "`.
- **Temporal filter fail-open** (`memanto/app/services/memory_read_service.py`)
- A silent-fail path in temporal filtering could fall through to returning
unfiltered results instead of the intended filtered set; fixed to fail
closed.
- **Phantom session summaries from failed writes** (`memanto/app/routes/memory.py`,
`memanto/app/utils/validation.py`)
- `remember`/`batch-remember` logged a memory to the local session Markdown
summary regardless of whether the underlying Moorcheh write actually
succeeded. New shared `is_successful_write_result()` helper gates summary
logging (and batch per-item reporting) on a real success status
(`queued`/`success`/`ok`), so a failed write no longer produces a phantom
entry in the session log.
- **Batch upload status now fails closed on unrecognized values** (`memanto/app/services/memory_write_service.py`)
- Previously any non-empty status from Moorcheh was treated as ambiguous;
now only `queued`/`success`/`ok` count as successful and anything else is
explicitly marked `"failed"` with the returned status recorded as the error.
- **Timestamp / TTL invariant violations** (`memanto/app/core.py`,
`memanto/app/services/memory_write_service.py`)
- `created_at`/`updated_at` are now normalized to UTC-aware (`as_utc_aware`),
clamped to "now" if a caller-supplied value is in the future, and
`created_at` is forced to never exceed `updated_at` — closing a set of
cases where a bad/aware timestamp from an import or manual edit could
produce a memory that looks "created after it was updated" or timestamped
in the future.
- `expires_at` is now always serialized as an ISO string on the outgoing
document instead of relying on the object's default `str()`.
- Pagination offset and aware-datetime comparison bugs in session listing
(`memanto/app/models/session.py`, `memanto/app/services/session_service.py`)
fixed as part of the same batch.
- **Tags, metadata, and provenance preservation** (`memanto/app/services/memory_read_service.py`,
`memanto/cli/commands/memory.py`, `integrations/{langgraph,mcp,hermes-agents}/`)
- Consolidates four related fixes: Hermes agents no longer strip tags on
read; `memanto recall` CLI display now shows tags/provenance correctly;
LangGraph's `MemantoStore` normalizes tags consistently (including a fix
for comma-containing tag keys and preserving wildcard tag filters); and a
trailing-"Tags:" suffix leak in read formatting is fixed.
- MCP `batch_remember` tool now normalizes tags before sending.
- **Streaming uploads** (`sdks/typescript/src/index.ts`, `integrations/claudecode/hooks/_common.py`)
- TypeScript SDK file uploads are now streamed via a multipart
`Readable` generator instead of buffering the whole file in memory.
- The Claude Code integration's transcript reader now streams the JSONL
transcript line-by-line (bounded `deque` tail) instead of requiring
`readlines()` to materialize the entire file — matters for long-running
Claude Code sessions with large transcripts.
- Read failures during transcript parsing are now logged instead of
silently swallowed.
- **Export limit validation** (`memanto/cli/client/{direct_client,sdk_client}.py`)
- `limit_per_type` for `memanto memory export` is now validated (integer,
1–100) before querying every memory type, instead of failing deep inside
the export loop on a bad value.
- **UI date formatting** (`memanto/app/ui/static/index.html`)
- Fixed a date-format bug in the Memory Explorer.
## Tests
- New `tests/test_memory_format.py` covering the tags/content parsing fixes.
- New `tests/test_memory_read_confidence.py` additions, expanded
`tests/test_api.py`, `tests/test_cli.py`, `tests/test_unit.py` for
timestamp/TTL invariants, export-limit validation, and write-status gating.
- New/expanded test coverage in `integrations/{langgraph,mcp,hermes-agents,claudecode}/tests/`.
## Full Changelog
Full Changelog: https://github.com/moorcheh-ai/memanto/compare/v0.2.8...v0.2.9