Skip to content

v0.19.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 00:24
· 394 commits to develop since this release
8adbb86

What's New in v0.19.0

Minor release. Theme: agent-facing API surface + audit-grade history —
machine-readable route introspection, verify/repair over HTTP and MCP, an
append-only audit timeline, budgeted context packing, and two namespace
correctness fixes. Note: the previously prepared [0.18.2] patch line
(unified doc recall fix + honest embedding-write reporting, merged to
develop on 2026-09-18) was never tagged — no v0.18.2 tag or release exists,
the latest release remains v0.18.1 — so its contents ship in this version.

Added

  • Audit-grade timeline — history survives forget and deprecation (#1280, schema v20) - the timeline_events table is rebuilt without the ON DELETE CASCADE foreign key, so deleting a memory no longer wipes its history; deprecate_with_reason records a deprecated event with its reason (idempotent), hard forget() writes a forgot tombstone before the delete, and the migration backfills created events for memories that predate the timeline. New MCP tool uteke_timeline (id, optional limit) reads the trail, including tombstones of forgotten memories. Owner decision 2026-09-18: the timeline is the audit layer — history is never deleted.
  • Verify/repair over HTTP and MCP (#1272) - POST /verify reports the SQLite row count vs vector index size with a match flag, POST /repair rebuilds the vector index from stored embeddings, and MCP gains uteke_verify/uteke_repair — a live store can be audited and repaired without restarting uteke-serve (write-token surface). Motivated by the stale-vector-index failure mode: rows exist in SQLite+FTS5 but not in the vector index, so memories go missing under fusion/hybrid until repaired.
  • SKILL.md ships in version lockstep with the CLI (#1274) - the bundled agent skill's version line tracks CARGO_PKG_VERSION, enforced by two CI tests (parity with the workspace version, byte-equality with the canonical repo copy); content refreshed with the stale-index pitfall and a search-strategy guide (namespace = identity, room = context, tags = scope, when to prefer fts5).
  • Tier-tagged API registry + generated CORE contract list (#1276, uteke-cloud #81) - every registered endpoint carries a contract tier (33 CORE, each verified against uteke-cloud's routers, and 44 LAB); docgen additionally emits docs/core-contract.json, the machine-readable CORE/LAB list consumed by uteke-cloud's route-parity gate, and the API Docs Fresh CI gate fails when it goes stale. CORE changes now require the cloud contract process, so semantic drift is flagged automatically.
  • Budgeted context pack: recall --pack (#1281 Phase 1) - uteke recall --pack [--budget <chars>] [--exclude-ids <ids>] returns a {selected, skipped, budget_used, budget_chars} envelope instead of a bare ranked list: rank-order preserving greedy fill of a character budget, with per-item skip reasons (excluded for caller-supplied memory IDs already injected this turn, budget for items that no longer fit). Deterministic and LLM-free — ranking is untouched (fusion RRF remains the default strategy); this is a selection primitive, not a re-ranker. Surfaces: CLI flags, HTTP POST /recall ("pack": true, "budget_chars", "exclude_ids"), MCP uteke_recall (pack, budget_chars, exclude_ids). Phase 2 (MMR diversity) is an experiment gated on LongMemEval + redundancy benchmarks per the issue.
  • GET /routes — machine-readable API route introspection (#1289) - uteke-serve now serves the endpoint registry as JSON: method, path, tier (CORE/LAB), description, request/response types, and related issues for every route, straight from api_registry::ENDPOINTS — the same single source of truth that generates docs/api-reference.md. Consumers (typed clients, MCP tool descriptions, agent skill notes) can validate against the real contract instead of stale notes, closing the GET-vs-POST and param-name mismatch class that produced false "missing feature" reports. Auth follows the standard rules: anonymous callers get 401 when a token is configured (GET is allowed for read-only tokens, like every read endpoint). Registry entry is LAB tier (introspection only, no CORE contract impact); usage text and docgen grouping updated.

Changed

  • remember reports embedding-write failures honestly (#1273) - when embedding generation fails after retries, the vector insert fails, or index persistence fails, the memory is still stored (SQLite + FTS5, keyword-searchable) but every surface now says so instead of failing hard or passing silently: remember_detailed/remember_typed_detailed/remember_auto_infer_detailed return a RememberOutcome { id, embedding_written, warning }; POST /remember and POST /room/remember responses carry embedding_written + warning; the CLI prints a warning line and includes both fields in JSON output; MCP uteke_remember appends the warning to its result text. Recoverable any time via uteke repair. (Originally slated for the untagged v0.18.2 patch line.)

Fixed

  • Doc list honors --namespace on CLI, HTTP, and MCP (#1268, #1269) - doc list accepted a namespace nowhere despite the server help text advertising one; new Store::list_documents_ns applies an exact-match SQL filter, the HTTP DocListParams gains a back-compat namespace field, MCP uteke_doc_list accepts namespace, and NULL-namespace documents remain global-view-only by design (consistent with memory listing).
  • Unified recall (--type all) no longer floods results with cross-namespace documents (#1270, #1271) - the document arm ignored the recall's namespace (doc_search's ns parameter was unused), so documents from any namespace — including NULL-namespace rows — leaked into every scoped recall; new Uteke::doc_search_in(query, limit, mode, namespace) retains only exact-namespace documents (NULL-namespace docs are global-view-only, matching the #1269 doc-list semantics on develop). Document scores are now the raw hybrid RRF sum (~0.016–0.033) instead of the rank-derived (k+1)/(k+1+rank) that reported a fake 1.000 for rank-0 regardless of query and outranked every memory fusion score. The memory arm is called with min_score 0.0 (#1223 rank-based scores) and the caller's threshold is applied post-merge, so --min/--strict behave consistently on both result types. Unified document results now carry their namespace. Core-only change (crates/uteke-core/src/lib.rs) — CLI/MCP/HTTP surface unchanged. Design note: documents are global by design (NULL namespace = global view), so namespace-scoped unified recall returns memories only; documents remain discoverable via global doc search. (Originally slated for the untagged v0.18.2 patch line.)
  • GET /room/memories honors the namespace query param (#1288) - the endpoint parsed only room_id, limit, and author, so any namespace value was silently ignored and callers got a 200 with the room's full cross-namespace list — wrong scope presented as success (issue repro: 72 entries returned instead of the 19 in the requested namespace). The param is now parsed in the handler and applied at the SQL level via new Uteke::recall_room_scoped(room_id, author, namespace, limit); recall_room remains as a compatibility wrapper with the old cross-namespace default. Filtering happens inside the same query as LIMIT (no fetch-then-post-filter, #1085 class), the four duplicated SQL variants collapse into one dynamically composed WHERE clause (literal fragments stay in SQL text, all values bound as parameters), and usage text, registry description, and docs/api-reference.md were regenerated. New core and server tests cover the scoped filter, author+namespace combination, legacy signature, and ghost namespaces.

Docs

  • Evergreen README hero banner + install URL consistency (#1283), star-history embed replaces the self-hosted chart (#1265), AGENTS.md points at the written CORE/LAB contract as source of truth (#1275).

Dependencies

  • clap 4.6.7, clap_complete 4.6.11, uuid 1.26.1, toml 1.1.6+spec-1.1.0, vecq-core 0.3.1.

📦 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.19.0.tar.gz
Linux x86_64 (Legacy, SSE4.2) uteke-x86_64-unknown-linux-gnu-legacy-v0.19.0.tar.gz
Linux ARM64 uteke-aarch64-unknown-linux-gnu-v0.19.0.tar.gz
macOS Apple Silicon uteke-aarch64-apple-darwin-v0.19.0.tar.gz
Windows x86_64 uteke-x86_64-pc-windows-msvc-v0.19.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.19.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 8767

Full changelog: https://github.com/codecoradev/uteke/blob/main/CHANGELOG.md

Community contributors

(No external contributions in this cycle. Full contributor list: https://github.com/codecoradev/uteke/graphs/contributors)