Skip to content

V0.2.9

Choose a tag to compare

@het0814 het0814 released this 22 Jul 22:18
· 274 commits to main since this release
4d6344f

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: v0.2.8...v0.2.9