v0.2.15
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_conflictdeleted the wrong memory after the first resolution
(memanto/cli/client/{direct_client,sdk_client}.py,memanto/app/ui/static/index.html)list_conflictsreturns only unresolved conflicts, while
resolve_conflictindexed 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_conflictsnow 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
tagsas a comma-separated string (e.g."project, db, prod"), but the OKF renderer wrapped it inlist(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 stringtagsvalue 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).
- Moorcheh stores
-
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.
- API, CLI, and Web UI daily-analysis date defaults are now aligned to the
-
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.
- An unresolved FastAPI
-
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 toanswer.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).
- If a single message exceeded
-
LangGraph key collisions and stale agent locks (
integrations/langgraph/langgraph_memanto/store.py)- Fixed a key-collision case in
MemantoStoreand stale per-agent locks left
behind after certain operations; legacy LangGraph key tags are preserved
for backward compatibility.
- Fixed a key-collision case in
-
CLI: minimum-confidence recall filter restored (
memanto/cli/commands/memory.py)memanto recall --min-confidencehad 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 thenextfield before treating pagination as
finished, instead of terminating early on a malformed page.
- Mem0's export/migrate path now targets their v3 API; pagination-envelope
-
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.
- An incomplete export refresh is now rejected rather than silently
-
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.
- Deleting an agent now cleans up its per-agent lock instead of leaving a
Tests
- New
tests/test_conflict_index_desync.py, and expandedtests/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