Skip to content

v0.2.15

Choose a tag to compare

@het0814 het0814 released this 18 Aug 16:32
· 80 commits to main since this release
4d08dd9

Release Notes for v0.2.15

This release closes a large batch of correctness bugs discovered through the bounty program — a wrong-memory-deletion bug in conflict resolution, an OKF tag-export corruption bug, a UTC/local-date mismatch across daily analysis surfaces, a FastAPI header-metadata leak into backend API keys, and several LangGraph/OKF/conversation-extraction edge cases.

Bug Fixes

  • resolve_conflict deleted the wrong memory after the first resolution
    (memanto/cli/client/{direct_client,sdk_client}.py, memanto/app/ui/static/index.html)

    • list_conflicts returns only unresolved conflicts, while
      resolve_conflict indexed into the full report — the two index spaces
      agreed only until the first resolution, then desynced. A caller (REST API
      or Web UI) resolving by filtered-list position could delete a memory it
      never selected, while the conflict the user actually chose stayed
      unresolved. list_conflicts now tags each conflict with its stable index
      into the full report; the Web UI resolves (and keys its DOM elements) by
      that stable index instead of on-screen position; resolve_conflict
      rejects an already-resolved index as defense in depth.
  • OKF export corrupted multi-tag memories (memanto/app/services/okf_export_service.py)

    • Moorcheh stores tags as a comma-separated string (e.g. "project, db, prod"), but the OKF renderer wrapped it in list(tags), splitting the
      string character-by-character and emitting garbage one-character tags in
      the frontmatter — every multi-tag memory lost its real tags on export.
      Now splits-and-strips a string tags value and passes a list through
      unchanged.
    • OKF markdown-link parsing is now linear-time (was worse-case quadratic).
    • Colliding OKF context filenames are now preserved instead of silently
      overwritten (canonical vs. portable/reserved filename collisions).
  • Daily analysis dates misaligned with UTC storage (memanto/app/services/daily_analysis_service.py,
    memanto/app/ui/static/index.html, memanto/cli/commands/{memory,schedule}.py)

    • API, CLI, and Web UI daily-analysis date defaults are now aligned to the
      same UTC boundary memories are actually stored under, fixing off-by-one-day
      results near midnight depending on local timezone.
  • FastAPI header metadata leaking into backend API keys (memanto/app/clients/moorcheh.py)

    • An unresolved FastAPI Header(...) default object (truthy, not a string)
      could be forwarded to the Moorcheh SDK as if it were a real API key when
      the dependency function was called directly rather than injected —
      fixed to only accept a genuine string as a supplied key.
  • Empty query when a conversation message exceeded the extraction char budget
    (memanto/app/services/conversation_memory_extraction_service.py)

    • If a single message exceeded MAX_CONTENT_CHARS (12,000), the extraction
      service dropped it entirely and sent an empty query to answer.generate,
      producing an API error or garbage results. The first message is now
      always included (truncated if necessary), newline separators are counted
      in the budget, and the budget was raised to 120,000 chars — the old cap
      was inherited from an embedding-search bottleneck that no longer applies
      now that extraction runs in raw-LLM mode (empty namespace, bypassing
      semantic search).
  • LangGraph key collisions and stale agent locks (integrations/langgraph/langgraph_memanto/store.py)

    • Fixed a key-collision case in MemantoStore and stale per-agent locks left
      behind after certain operations; legacy LangGraph key tags are preserved
      for backward compatibility.
  • CLI: minimum-confidence recall filter restored (memanto/cli/commands/memory.py)

    • memanto recall --min-confidence had regressed to a no-op; filtering is
      restored and positional recall arguments are preserved.
  • Mem0 export updated to v3 API (memanto/cli/analyze/mem0_export.py)

    • Mem0's export/migrate path now targets their v3 API; pagination-envelope
      handling validates the next field before treating pagination as
      finished, instead of terminating early on a malformed page.
  • Incomplete memory exports rejected, with stale-cache fallback preserved
    (memanto/cli/client/{direct_client,sdk_client}.py)

    • An incomplete export refresh is now rejected rather than silently
      accepted as complete, while still falling back to the last good
      (stale-cache) export when a refresh genuinely fails — keeping the
      outage-safety behavior shipped earlier while fixing the incomplete-data
      case.
  • Stale per-agent lock removed on delete (memanto/app/services/agent_service.py)

    • Deleting an agent now cleans up its per-agent lock instead of leaving a
      stale lock object behind.

Tests

  • New tests/test_conflict_index_desync.py, and expanded tests/test_okf.py,
    tests/test_backend.py, tests/test_cli.py,
    tests/test_conversation_memory_extraction.py, tests/test_export_resilience.py
    covering every fix above.

Full Changelog

Full Changelog: v0.2.14...v0.2.15