What's New in v0.17.0
Minor release. Theme: inspectable, trustworthy memory β explain recall on
every surface, auditable conflict resolution with a measurable payoff, honest
graphs, pagination metadata, and a dual-engine vector layer.
Added
-
Contradiction benchmark segment (#1172, phase 3) β
benchmarks/longmemeval/contradiction_segment.py: 40-topic active-store segment measuring conflict-resolution quality end-to-end. Baseline (both facts active) vs resolved (superseded): fusion winner@1 0.975 β 1.000, stale@5 0.825 β 0.000. Published inbenchmarks/longmemeval/RESULTS.md. Also addsuteke supersede <old> <new> [--reason]β CLI surface parity for supersession (previously MCP/HTTP only). -
/listpagination metadata (#1188) βPOST /listaccepts"include_meta": trueto respond with an envelope{memories, total, has_more, next_offset}(next_offsetisnullon the last page) so clients no longer blind-paginate with 100-row guesses. The default response is unchanged (bare array) β existing clients are untouched;include_metais ignored inat(point-in-time) mode, which stays a bare array. -
Explain recall (#1160) β
explainmode on every recall surface shows WHY each memory ranked where it did: vector similarity and rank, FTS rank, RRF score with per-channel fusion contributions, and jaccard/salience/recency/graph boost deltas. Surfaces:uteke recall "β¦" --explain(human-readable, combine with--jsonfor machine output),POST /recallwith"explain": true(memory-only β combined withsearch_type/at/before/afterreturns 400), and theexplainflag on the MCPuteke_recalltool. The explanation path replays the active strategy's exact pipeline (same channel depths, RRF constants, and boost order) while bypassing the recall cache, so the explanation always matches the returned results; fts5 explanation works without an embedder, other strategies embed the query once (~50 ms, same as a cold recall). -
Contradiction resolution ledger + undo (#1172, phase 2) β supersessions are now a first-class, auditable ledger instead of a side effect:
Uteke::contradiction_resolutions(namespace, limit)lists superseded-but-not-restored memories (winner, reason, timestamp via the deprecation row),Uteke::undo_supersession(id)restores a retired memory, removes the supersession edge pair, and records asupersession_undoneevent on both sides (only memories carrying a livesuperseded_byedge can be undone β the undo is itself auditable). Ledger membership is edge-driven (deprecated row +superseded_byedge), the same predicate undo resolves against, and re-superseding an already-deprecated memory refreshes the stored reason/timestamp so the ledger always names the current winner. Surfaces:GET /contradictions?namespace=&limit=,POST /contradictions/undo({id}; 404 when nothing to undo),uteke contradictions list|undo, and MCPuteke_contradictions/uteke_contradictions_undo. Fixed in the process: the no-namespace ledger query bound its limit parameter to a nonexistent placeholder (?2) and failed at runtime β caught by the new MCP roundtrip test. -
Provenance data model (#1172, phase 1) β schema v18 (additive):
memories.source_hashrecords the SHA-256 of content at write time (tamper evidence β audits recompute it against live content), andtimeline_events.actor/evidence_jsonrecord who performed an event and what evidence supports it. NewUteke::provenance(id)returns the full report (provenance fields, trust tier, hash comparison, event chain) β exposed asGET /provenance?id=,uteke provenance <id>, and theuteke_provenanceMCP tool.
Fixed
-
Graph data returned stale nodes (#1189) β
GET /graphwithout a namespace returned everygraph_nodesrow raw, including nodes whose parent memory had been forgotten or deprecated; with soft-delete the store accumulated stale nodes on every conflict resolution. Memory-linked nodes are now filtered by liveness (memory exists anddeprecated = 0) in everygraph_datapath, edges touching removed nodes are dropped, andstatscounts the filtered graph. -
Memory graph nodes labeled with raw UUIDs (#1187) β
ensure_node_for_memorynow labels new memory nodes with a readable content preview (first 60 chars of the memory) instead of the raw memory UUID, and upgrades legacy UUID-labeled rows in place on next access. Entity nodes are unaffected. -
Namespace management API (#1181) β namespaces are a derived view, now with sanctioned ops:
PUT /memoryacceptsnamespace(move a memory β plain column update, no re-embed),POST /namespaces/rename({from, to}; existing target = merge, returns{from, to, moved, target_existed}), andPOST /namespaces/deletewith an explicit strategy for its memories:refuse(default β 409 while any memory references the name),merge(move all memories totarget, the name vanishes), ordeprecate(soft-delete β restorable via promote, never hard-deleted).GET /namespaces?with_counts=truenow addsactive/deprecatedbreakdown fields (countstays the total). CLI parity:uteke namespace move|rename|delete(delete requires--confirm). MCP parity:uteke_namespace_rename,uteke_namespace_delete, andnamespacefield onuteke_update.
Fixed
POST /graph/edgealways returned 500 for valid memory IDs (#1180) β the handler validatedsource/targetas memory IDs but inserted them directly intograph_edges, whose foreign keys point atgraph_nodes(id). Memory IDs are now resolved to their linked graph node (or a node is ensured automatically) before insertion.DELETE /graph/edgeaccepts memory IDs or graph node IDs the same way, and its documented query params are corrected to?source=...&target=....POST /graph/edgenow responds with{ok, source_node, target_node}so clients can track the created nodes.
π¦ Downloads
Each archive contains three binaries + ONNX Runtime shared library:
| Binary | Description |
|---|---|
uteke |
CLI tool |
uteke-serve |
HTTP server daemon |
uteke-mcp |
MCP server (stdio + HTTP) |
libonnxruntime.so* / libonnxruntime*.dylib / onnxruntime*.dll |
ONNX Runtime |
| Platform | File |
|---|---|
| Linux x86_64 (AVX2) | uteke-x86_64-unknown-linux-gnu-v0.17.0.tar.gz |
| Linux x86_64 (Legacy, SSE4.2) | uteke-x86_64-unknown-linux-gnu-legacy-v0.17.0.tar.gz |
| Linux ARM64 | uteke-aarch64-unknown-linux-gnu-v0.17.0.tar.gz |
| macOS Apple Silicon | uteke-aarch64-apple-darwin-v0.17.0.tar.gz |
| Windows x86_64 | uteke-x86_64-pc-windows-msvc-v0.17.0.zip |
Legacy Bundle (Linux only) β Includes a SSE4.2-only ORT sidecar (
ort-legacy/) for CPUs without AVX2 (Intel Celeron J4125/N4020). Use this bundle to avoid SIGILL crashes on older hardware.
π Quick Start
# Quick install (Linux / macOS)
curl -fsSL https://raw.githubusercontent.com/codecoradev/uteke/main/install.sh | sh
# Pin a specific version
UTEKE_VERSION=v0.17.0 curl -fsSL https://raw.githubusercontent.com/codecoradev/uteke/main/install.sh | sh
# Store a memory
uteke remember "Important context" --tags project
# Recall by meaning
uteke recall "what was that context?"
# Start server for fast AI agent access
uteke-serve --port 8767Full changelog: https://github.com/codecoradev/uteke/blob/main/CHANGELOG.md