Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
134 commits
Select commit Hold shift + click to select a range
2a394e5
fix(docs): standardize recall latency to ~45ms
ajianaz Aug 11, 2026
e381b17
Merge pull request #999 from codecoradev/fix/docs-recall-latency-30ms…
ajianaz Aug 11, 2026
cc8a69b
chore: harden .gitignore + restructure repo for public safety
ajianaz Aug 13, 2026
c80655a
feat: hybrid as default recall strategy + import fixes (#1005, #1014)…
ajianaz Aug 13, 2026
4a56cac
perf: Phase 2 — skip update check in batch mode, pre-truncate embeddi…
ajianaz Aug 13, 2026
20a0455
feat: Phase 3 — lifecycle/deprecated, memory tools guide, source prov…
ajianaz Aug 13, 2026
6403f01
feat: scene-segmented extraction with priority scoring (#1009) (#1018)
ajianaz Aug 13, 2026
af0e500
chore: bump version to 0.14.0 (#1019)
ajianaz Aug 13, 2026
87a0280
fix: crates.io publish race condition + uteke-mcp metadata (#1021)
ajianaz Aug 14, 2026
5e063e2
fix(ci): switch deploy-website from npm to bun (#1022)
ajianaz Aug 14, 2026
4aea7c4
feat(test): adopt cargo-mutants for mutation testing (#1023)
ajianaz Aug 14, 2026
5441eab
fix(chunker): heading duplication + multibyte infinite loop; 40 mutat…
ajianaz Aug 14, 2026
6a1ec8e
chore: bump version to 0.14.1 (#1025)
ajianaz Aug 14, 2026
b98f579
fix(cli): uteke-cli crates.io publish failure + release verify step (…
ajianaz Aug 14, 2026
6e4dac1
chore: bump version to 0.14.2 (#1031)
ajianaz Aug 14, 2026
2253e07
ci(release): reject stale RELEASE_NOTES.md (#1033)
ajianaz Aug 14, 2026
9d3ad3a
fix: HTTP & MCP recall strategy — default hybrid, loud validation (#1…
ajianaz Aug 15, 2026
76d24b5
chore: bump version to 0.14.3 (#1039)
ajianaz Aug 15, 2026
c2d85de
fix(ci): release notes heredoc executed installer on runner — use tem…
ajianaz Aug 15, 2026
fdc0c68
docs: sync stale version refs, roadmap v0.13–v0.14, merge comparison …
ajianaz Aug 17, 2026
3780a3e
docs(agent): Critical Rule #14 — explicit approval before execution (…
ajianaz Aug 17, 2026
f5029a3
test: use ORT_LIB_NAME in find_ort_in_dir exact-match test (#1054) (#…
ajianaz Aug 17, 2026
de17609
chore: switch ID generation new_v4 → now_v7 (#1058) (#1060)
ajianaz Aug 17, 2026
ec23866
fix: soft-forgotten memories leak into list, search, and doctor count…
ajianaz Aug 17, 2026
8451a80
fix: search_content(None) coerced to default namespace — cross-namesp…
ajianaz Aug 17, 2026
5b8ec19
fix: recall cache hit skips salience/recency boosts — cold/warm score…
ajianaz Aug 17, 2026
021f22f
fix: /export drops namespace attribution + deprecated-row delta undoc…
ajianaz Aug 17, 2026
f6337fc
fix(mcp): uteke_dream destructive defaults — dry-run first, scope or …
ajianaz Aug 17, 2026
0a6331d
feat(mcp): enrich tool outputs agents need — stats tiers/namespaces, …
ajianaz Aug 17, 2026
faaf7f3
feat(mcp): uteke_get + uteke_update tools; short-ID resolution for al…
ajianaz Aug 17, 2026
b8c695e
feat: structural export — full-store round-trip (rooms, graph, edges,…
ajianaz Aug 17, 2026
33fad47
feat: supersession workflow — mark stale decisions superseded, flagge…
ajianaz Aug 17, 2026
db7299a
ci: add source-branch-check — PRs into main must come from develop (#…
ajianaz Aug 19, 2026
5983654
chore: bump version to 0.15.0 (#1073)
ajianaz Aug 19, 2026
072e188
ci: source-branch-check allows chore/release-* release branches (#1075)
ajianaz Aug 19, 2026
2102724
ci: bump actions/download-artifact v4 -> v8 (Node 24) (#1080)
ajianaz Aug 19, 2026
2076bc0
fix(core): structural import silently dropped room_documents + harden…
ajianaz Aug 19, 2026
38a5db8
fix(ci): skip CLA check for bots (dependabot, renovate, github-action…
ajianaz Aug 20, 2026
0dd4592
feat(core): add author_type (human|agent) to memory records (#1084)
ajianaz Aug 24, 2026
0ef1854
fix(server): wire 'at' time-travel param into /room/recall (#1085)
ajianaz Aug 24, 2026
d6ff6bb
docs(server): document deprecation time-travel limitation (#1086) (#1…
ajianaz Aug 24, 2026
bca7666
feat(core): room semantic segmentation (LLM-free, #1088) (#1090)
ajianaz Aug 25, 2026
1a61919
feat(core): expose semantic segments in room_summary (#1088) (#1091)
ajianaz Aug 25, 2026
5052c32
feat(core): segment-level consolidation planner, measure-only (#1088)…
ajianaz Aug 25, 2026
5ab4633
feat(core): provenance trust policy for consolidation (#1089) (#1093)
ajianaz Aug 25, 2026
f6bdb84
feat(core): LLM consolidation executor reusing extraction setup (#108…
ajianaz Aug 25, 2026
0c3f89e
feat: wire consolidation pipeline into core, CLI, and HTTP (#1088) (#…
ajianaz Aug 25, 2026
c1bba22
chore(docs): regenerate api-reference via docgen (#1095 follow-up) (#…
ajianaz Aug 25, 2026
9bc82c4
feat(core): vecq pure-Rust vector backend behind feature flag (#1099)
ajianaz Aug 26, 2026
17e2f91
fix(core): track deprecated_at for correct time-travel recall (#1086)…
ajianaz Aug 26, 2026
13b1d6d
chore: remove embed_cache.db artifact and ignore it (#1101)
ajianaz Aug 26, 2026
e7c127e
feat: per-pair dedup control via POST /consolidate/pair (#1076) (#1102)
ajianaz Aug 26, 2026
f07dfef
fix(ci): keep v prefix in release notes download table + pinned insta…
ajianaz Aug 26, 2026
19a1fe1
feat(server): add --version/-V flag to uteke-serve (#1044) (#1104)
ajianaz Aug 26, 2026
72fd7d9
fix(cli): honor UTEKE_HOME as store path override (#1105) (#1107)
ajianaz Aug 26, 2026
1a081e2
fix: echo author_type in remember responses + CLI --author-type flag …
ajianaz Aug 26, 2026
3f0cf32
fix(core): repair() no longer evicts document chunk vectors from inde…
ajianaz Aug 26, 2026
27a2b4f
fix(build): vecq binaries now buildable via forwarded backend feature…
ajianaz Aug 26, 2026
b4f0b8a
fix(core): backend-aware index filename, doctor label, forget --confi…
ajianaz Aug 26, 2026
668ed6c
fix(core): verify/doctor count doc chunks on DB side, no false MISMAT…
ajianaz Aug 26, 2026
9c1979e
fix(cli): repair report compares against memories + chunks (#1117)
ajianaz Aug 26, 2026
46e1c47
test(longmemeval): fast-eval foundation — datasets + Modal harness + …
ajianaz Aug 27, 2026
e65f36a
test(longmemeval): temporal date-window boost (#1119) (#1126)
ajianaz Aug 27, 2026
ac951f7
test(longmemeval): MMR diversity rerank flag + replay recording (#112…
ajianaz Aug 27, 2026
4e32746
fix(longmemeval): dataset-tagged volume paths + qid-set cache validat…
ajianaz Aug 27, 2026
9cb7cbb
fix(core): make sha2 non-optional — no-default-features profile compi…
ajianaz Aug 28, 2026
e27dbe5
feat(core): Fusion as default recall strategy + benchmark tooling (v0…
ajianaz Aug 28, 2026
c6cf669
feat(bench): UTEKE_GIT_REF — build validation binary from exact SHA i…
ajianaz Aug 29, 2026
bfbc296
fix(bench): install build-essential for git-ref image build (linker c…
ajianaz Aug 29, 2026
14b37ab
docs(bench): pure-default 500Q validation — fusion 0.946 R@5 (+9.2 vs…
ajianaz Aug 29, 2026
8a6d48f
docs: fusion weights = internal hasil tuning, bukan bagian kontrak pu…
ajianaz Aug 29, 2026
8dc6c4a
docs(bench): LongMemEval-S 500Q results page — dual-metric + comparis…
ajianaz Aug 29, 2026
bfed150
chore(release): CHANGELOG 0.16.0 — full-release validation numbers + …
ajianaz Aug 29, 2026
468f842
fix(core): repair --reembed can now repair NULL-embedding rows (#1146…
ajianaz Aug 29, 2026
7facdeb
fix(ci): CLA check skips bot PRs with exact allowlist (#1132) (#1148)
ajianaz Aug 29, 2026
18ff623
fix(cli): repair --reembed report reflects final index state (#1149) …
ajianaz Aug 29, 2026
da46d40
chore(ci): bump actions/github-script from v7 to v9 (#1151)
ajianaz Aug 29, 2026
febee27
test(cli): resolve_namespace precedence — flag > env > config > defau…
ajianaz Aug 29, 2026
512f379
test(cli,core): env parsing guards + validate_input_with_limits bound…
ajianaz Aug 29, 2026
d03375c
test(core): ensure_embedder branch coverage — unknown/custom/openai-m…
ajianaz Aug 29, 2026
978003f
test(cli): cover TOML helpers — migrate_content, global_config_path, …
ajianaz Aug 29, 2026
a0a400d
docs: refresh documentation for 0.16.0 — fusion default, updated benc…
ajianaz Aug 29, 2026
92b485b
chore: sync main back into develop after #1158 docs carry (#1159)
ajianaz Aug 29, 2026
a83987d
docs(contributing): require CLA + state contributions are unpaid (#1162)
ajianaz Aug 30, 2026
cf49be8
deps(core): bump vecq-core 0.1.1 -> 0.3.0, adopt 4-bit + residual pro…
ajianaz Aug 31, 2026
10ddcc4
fix(core): feature-aware embedder default in open() + open_with_backe…
ajianaz Aug 31, 2026
75b72ff
feat(core): runtime-selectable vector engine (usearch + vecq in one b…
ajianaz Aug 31, 2026
c0b92cb
feat(build): dual-engine default — official binaries ship usearch + v…
ajianaz Aug 31, 2026
652fca6
docs(bench): independent reproduction results + surfaced headline num…
ajianaz Sep 1, 2026
4dd7c54
chore(deps): bump flate2 from 1.1.9 to 1.1.10 (#1175)
dependabot[bot] Sep 3, 2026
39f877a
chore(deps): bump which from 8.0.5 to 8.0.6 (#1176)
dependabot[bot] Sep 3, 2026
2cc0474
chore(deps): bump usearch from 2.26.0 to 2.26.1 (#1177)
dependabot[bot] Sep 3, 2026
51707f3
chore(deps): bump uuid from 1.24.0 to 1.26.0 (#1178)
dependabot[bot] Sep 3, 2026
bd2288c
fix(room): honest room_delete reporting across CLI/HTTP/MCP — count u…
ajianaz Sep 3, 2026
cbccebb
fix(server): resolve memory IDs to graph nodes in /graph/edge endpoin…
ajianaz Sep 5, 2026
0f75a96
feat(api): namespace management — move, rename/merge, delete with str…
ajianaz Sep 5, 2026
16f1186
feat(core): provenance data model — source hash, event actor/evidence…
ajianaz Sep 5, 2026
841e990
feat: contradiction resolution ledger + undo across CLI/HTTP/MCP (#11…
ajianaz Sep 5, 2026
d0243a7
feat: explain recall — ranking signals on CLI, HTTP, and MCP (#1160) …
ajianaz Sep 6, 2026
8a28aef
fix: graph excludes stale memory nodes + readable node labels (#1189 …
ajianaz Sep 6, 2026
9bd004d
feat: /list pagination metadata envelope (#1188) (#1191)
ajianaz Sep 6, 2026
29d50d7
feat: contradiction benchmark segment + uteke supersede CLI (#1172 F3…
ajianaz Sep 6, 2026
b15c2c4
chore: release 0.17.0 (#1194)
ajianaz Sep 6, 2026
591f64d
chore: post-release sync main→develop + AGENTS.md (0.17.0) (#1198)
ajianaz Sep 6, 2026
100c3e2
docs: AGENTS.md points to codecora-workflow-standard room as workflow…
ajianaz Sep 6, 2026
c399678
feat(api): room rename, room update, memory room-move + CLI memory up…
ajianaz Sep 7, 2026
2da9693
docs(benchmarks): surface benchmark proof in README, fix stale versio…
ajianaz Sep 9, 2026
5ad4ce7
docs(benchmarks): restructure into internal/longmemeval/locomo, commi…
ajianaz Sep 9, 2026
5300c88
fix(core): verify dedup candidates are live before skipping insert (#…
ajianaz Sep 9, 2026
759dd13
docs(readme): benchmark-first restructure + self-service reproduction…
ajianaz Sep 9, 2026
fa38c48
bench(locomo): full 1536-QA results on v0.17.0 — fusion wins strict f…
ajianaz Sep 9, 2026
cfe217e
bench(longmemeval): v0.17.0 re-validation complete — headline numbers…
ajianaz Sep 9, 2026
05457d1
docs(readme): align headline numbers with owner decisions — 45ms late…
ajianaz Sep 9, 2026
d2aa018
docs(readme): fix badge anchor + humanizer/copywriting pass (zero em …
ajianaz Sep 9, 2026
2fbbd7d
docs(readme): embed v0.17 revalidation chart in the benchmark section…
ajianaz Sep 9, 2026
d1f2144
docs: sync Indonesian README + docs with v0.17.0 benchmark decisions …
ajianaz Sep 9, 2026
8657dbb
docs: document namespace management (#1181) and sync MCP tool table w…
ajianaz Sep 10, 2026
42d1e66
fix(benchmarks): correct LoCoMo category label mapping (official 1=si…
ajianaz Sep 10, 2026
b4d3991
fix(install): copy bundled ORT libs on binary install (#1221)
KazamiHazaki Sep 11, 2026
3fe6a6b
fix(ci): make cla-check work for fork PRs (#1224)
ajianaz Sep 11, 2026
7924453
chore(deps): bump usearch from 2.26.1 to 2.26.2 (#1204)
dependabot[bot] Sep 11, 2026
4e17273
chore(deps): bump tokenizers from 0.23.1 to 0.23.2 (#1206)
dependabot[bot] Sep 11, 2026
2804b55
chore(deps): bump dirs from 6.0.0 to 7.0.0 (#1207)
dependabot[bot] Sep 11, 2026
fd83959
fix(ci): skip branch naming and PR description checks for bot PRs (#1…
ajianaz Sep 11, 2026
b9bb420
chore(deps): bump toml from 1.1.4+spec-1.1.0 to 1.1.5+spec-1.1.0 (#1205)
dependabot[bot] Sep 11, 2026
f4bdae7
fix(cli): default recall min_score 0.3 -> 0.0 (#1223) (#1228)
ajianaz Sep 11, 2026
3b93b34
benchmarks: preserve AMB (agent-memory-benchmark) run kit (#1226) (#1…
ajianaz Sep 11, 2026
a6f1e5e
chore: revert "benchmarks: preserve AMB run kit (#1230)" (#1235)
ajianaz Sep 11, 2026
6ffd8db
feat(ingest): --timestamp date anchors for remember and text import (…
ajianaz Sep 12, 2026
c7329ab
test(recall): payload conformance — full payload contract, no stubs (…
ajianaz Sep 14, 2026
875a68a
chore: bump version 0.17.0 -> 0.18.0 (#1241)
ajianaz Sep 14, 2026
14da6d0
chore(release): v0.18.0 - changelog, docs, version refs (#1242)
ajianaz Sep 14, 2026
134cd62
Merge remote-tracking branch 'origin/develop' into chore/release-v0.1…
ajianaz Sep 14, 2026
f849a51
fix(release): drop duplicated legacy config tests from merge resolution
ajianaz Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 16 additions & 22 deletions .github/workflows/cla-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@ on:
pull_request:
types: [opened, synchronize, reopened]

# pull-requests:write is only effective for SAME-REPO PRs (bot comment).
# Fork PRs run with a read-only GITHUB_TOKEN no matter what is declared here
# — that is exactly why the old commit-status approach could never work on
# forks (verified: PR #1221, run 34481899319, POST statuses → 403).
permissions:
pull-requests: write
contents: read
statuses: write

jobs:
cla-check:
Expand Down Expand Up @@ -46,8 +49,16 @@ jobs:
env:
PR_AUTHOR: ${{ github.event.pull_request.user.login }}

- name: Comment on PR (unsigned only)
if: steps.check.outputs.signed != 'true'
# FORK-SAFE GATE: this job's own Actions check run carries the CLA gate.
# It is created by GitHub itself and is NOT subject to the fork token
# restriction: signed → job success; unsigned → annotated failure below.
#
# The PR comment is a courtesy for same-repo contributors only — forks
# cannot comment at all (also 403), so the step is conditioned and
# best-effort. It never affects the gate outcome.
- name: Comment on PR (same-repo, best effort)
if: steps.check.outputs.signed != 'true' && github.event.pull_request.head.repo.full_name == github.repository
continue-on-error: true
uses: actions/github-script@v9
with:
script: |
Expand All @@ -64,6 +75,7 @@ jobs:
'- 📋 **Individual?** → [Sign CLA Individual](https://codecoradev.github.io/cla/?type=individual)',
'- 🏢 **Corporate?** → [Sign CLA Corporate](https://codecoradev.github.io/cla/?type=corporate)',
'',
'After signing, this check turns green automatically (within ~1 hour, or ask a maintainer to re-run it).',
'---',
'<sub>By signing, you agree to the terms in [CLA_INDIVIDUAL.md](https://github.com/codecoradev/.github/blob/main/CLA_INDIVIDUAL.md) or [CLA_CORPORATE.md](https://github.com/codecoradev/.github/blob/main/CLA_CORPORATE.md).</sub>',
].join('\n');
Expand Down Expand Up @@ -96,27 +108,9 @@ jobs:
});
}

- name: Set commit status
uses: actions/github-script@v9
with:
script: |
const signed = '${{ steps.check.outputs.signed }}' === 'true';
await github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
sha: '${{ github.event.pull_request.head.sha }}',
state: signed ? 'success' : 'failure',
context: 'CLA Check',
description: signed
? '✅ CLA signed'
: '❌ CLA not signed — sign at https://codecoradev.github.io/cla',
target_url: signed
? 'https://github.com/codecoradev/.github/blob/main/.cla/signatures.json'
: 'https://codecoradev.github.io/cla',
});

- name: Fail if not signed
if: steps.check.outputs.signed != 'true'
run: |
echo "::error title=CLA not signed::Sign the CodeCoraDev CLA at https://codecoradev.github.io/cla — once the signature PR is merged, this check turns green automatically (re-run it or wait ~1 hour)."
echo "❌ CLA not signed by ${{ github.event.pull_request.user.login }}"
exit 1
2 changes: 2 additions & 0 deletions .github/workflows/pr-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ jobs:
branch-naming:
name: Branch Naming
runs-on: ubuntu-latest
if: "!contains(fromJSON('[\"dependabot[bot]\", \"renovate[bot]\", \"github-actions[bot]\", \"app/dependabot\", \"app/renovate\"]'), github.event.pull_request.user.login)"
steps:
- name: Check branch name
env:
Expand Down Expand Up @@ -38,6 +39,7 @@ jobs:
pr-template:
name: PR Description
runs-on: ubuntu-latest
if: "!contains(fromJSON('[\"dependabot[bot]\", \"renovate[bot]\", \"github-actions[bot]\", \"app/dependabot\", \"app/renovate\"]'), github.event.pull_request.user.login)"
steps:
- name: Check PR body
env:
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ scripts/demo-record.sh

# Internal docs — never commit to public repo
internal/
!benchmarks/internal/
!benchmarks/internal/**

# Benchmark results (large, ephemeral — commit RESULTS.md summaries, not raw data)
benchmarks/longmemeval/results_*/
Expand Down
2 changes: 1 addition & 1 deletion AGENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
**Uteke** is a local-first semantic memory engine for AI agents. Single Rust binary, fully offline, ~30ms recall. No API key, Docker, or cloud service needed.

- **Repo:** `codecoradev/uteke` (remote GitHub), local clone
- **Version:** 0.14.3
- **Version:** 0.18.0
- **License:** Apache 2.0
- **Main branches:** `develop` (default branch, all PRs go here), `main` (release mirror)

Expand Down
45 changes: 45 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# AGENTS.md — uteke

## Project

Uteke — local-first memory engine for AI agents.
Rust workspace: uteke-core (engine), uteke-cli, uteke-server, uteke-mcp, docgen.

## Stack

- **Rust** (workspace, single version in root Cargo.toml)
- **Storage**: SQLite (rusqlite bundled) + dual-engine vector index
- **Vector engines**: usearch (default, C++ FFI) OR vecq (quantized, zero C++ dep) —
runtime-selected via `UTEKE_VECTOR_BACKEND` env or `[vector] backend` in uteke.toml (#1168)
- **Embeddings**: EmbeddingGemma Q4 ONNX (default) / OpenAI / Ollama
- **Package manager**: BUN for any JS/tooling (not npm). Rust uses cargo.
- **Git author**: email MUST be ajianaz@users.noreply.github.com

## Branch & release rules (STANDARD — applies to all CodeCora repos)

- **Branches**: `develop` = integration, `main` = release (tags cut from main).
- **Branch naming**: `feat/`, `fix/`, `docs/`, `chore/`, `perf/`, `security/`,
`refactor/`, `test/`, `build/`, `ci/`. `release/x` and bare names are rejected.
- **main only accepts PRs from** `develop` or `chore/release-*` (Source Branch check).
- **POST-RELEASE SYNC IS MANDATORY**: after a release tag is cut from main, merge
`main` back into `develop` immediately (PR if develop is protected). Skipping this
makes the next develop→main PR conflict — paid on 0.17.0 (2026-09-06).
- **PR body**: `## What` / `## Why` / `## Testing` headers are REQUIRED (CI enforces).
- **CI is green + Cora bot clean** before merge; never trust one gate alone.
- Version: single workspace version in root Cargo.toml; internal deps (uteke-core/
uteke-mcp) must be bumped to the same version in the release commit.
- `docs/api-reference.md` is GENERATED (`cargo run -p docgen`) — never hand-edit.

## Conflicts at release time

When develop→main conflicts, do NOT hand-resolve server-side (protected branch
rejects direct pushes). Instead: branch from the release commit, `git merge main`,
resolve keeping develop's side (unless main carries unique content — verify), push
the branch as `chore/release-*`, and open the release PR from it.

## Source of truth for workflow standards

The canonical workflow SOP (merge gate, release flow, governance) lives in the
uteke room `codecora-workflow-standard` (namespace `codecora`) on the shared
store. This file is the repo-enforced subset — when rules disagree, the room
wins, and this file gets updated in the same commit that changes the rule.
28 changes: 27 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,31 @@
# Changelog

## [Unreleased]

## [0.18.0] - 2026-09-13

Minor release. Theme: **agent-operable memory plumbing** - ingest with explicit timestamps, full room lifecycle management, and a recall payload contract that keeps benchmark harnesses honest. Retrieval behavior is unchanged from 0.17.0 (revalidated at the published config: recall@5 non-abs 0.9457, identical per-question rankings).

### Added (release highlights)

- **Ingest date anchors: `uteke remember --timestamp` / `import` timestamps (#1232, #1238)** - attach an explicit timestamp at write time (CLI flag + batch import field) so time-travel recall (`at`), temporal boosts, and audit chains no longer depend on ingest order. The `LMEVAL_DATE_ANCHOR` env is benchmark-harness-only and never affects the binary.
- **Room lifecycle management (#1202/#1203)** - `POST /room/rename|/room/update|/room/memory/move`, CLI `uteke room rename|update|move-memory`, MCP `uteke_room_rename|uteke_room_update|uteke_room_memory_move`; schema v19 adds additive `rooms.description` (backward-compatible exports); `Uteke::rename_room` rewrites registry + all room references in ONE transaction. Plus `uteke update <id>` for in-place memory edits.
- **Recall payload conformance tests (#1233, #1239)** - contract tests pinning that recall responses carry the FULL payload (no hit-count stubs) across CLI/HTTP/MCP.

### Added

- **Benchmarks directory restructure** — `benchmarks/` is now the single source of truth: `benchmarks/README.md` (index, policies, reproduction), `internal/` (uteke bench, re-verified on v0.17.0), `longmemeval/` (harness + committed canonical raw artifacts under `results/` + corrected baselines), `locomo/` (planned external benchmark #2). The old `benchmarks/RESULTS.md` stub (stale pre-embedding figures) is removed — real numbers live in `internal/RESULTS.md` and `docs/benchmarks.md`.

### Fixed

- **Default recall `min_score` lowered 0.3 → 0.0 (#1223)** — since the fusion strategy (weighted RRF) became the recall default in 0.16.0, returned scores are rank-based (RRF contribution plus salience/recency boosts, typically ~0.0-0.2) rather than cosine similarity, so the CLI default threshold of 0.3 (a cosine-era value; HTTP/MCP already default 0.0) silently filtered out almost every result — measured on embeddinggemma-q4: all 20 paraphrase probes scored 0.169-0.186 rank-1 while a legacy-distribution 0.3 default expects ~0.5+, making default `uteke recall` return empty. Thresholds remain opt-in via `[recall] min_score`, `--min`, `--strict` (0.5), or HTTP `min_score`; docs now state the score scale per strategy.
- **LongMemEval baseline mislabel** — RESULTS.md previously attributed the 0.854/0.885 (2026-08-13) full-500 baseline to "v0.15.0 hybrid"; those figures are the **vector-only** run (hybrid was validated at 50 questions only). Corrected, with both delta bases stated (+8.9pp full-500, +9.2pp 470-non-abstention).
- **Full-dataset aggregates** — RESULTS.md now labels all three bases explicitly: Overall (470 non-abstention), Abstention (30), and Overall (full 500 = 0.982 recall_any@5 / 0.880 strict recall_all@5); no questions silently dropped from the aggregate rows.
- Removed stale run logs and an outdated metrics snapshot from git tracking (values superseded by recomputation from committed raw artifacts).

- **Room rename, room update, and memory room-move (#1202)** — rooms now have sanctioned lifecycle ops matching the namespace family: `Uteke::rename_room(old, new)` rewrites the registry row and every `room_memories`/`room_documents` reference in ONE transaction (FK-safe insert→repoint→delete order; no `ON UPDATE CASCADE` needed), preserving title/description/namespace; `Uteke::update_room(id, title?, description?)` edits room metadata (schema v19 adds the additive `rooms.description` column; structural export/import carry it and stay backward-compatible with 5-column exports); `Uteke::move_memory_to_room(id, from, to)` moves a memory between rooms preserving the link's `author`/`role`/`joined_at` provenance (`Ok(0)` when not a member of `from`). Surfaces: HTTP `POST /room/rename|/room/update|/room/memory/move` (404 on missing room/link), CLI `uteke room rename|update|move-memory`, MCP `uteke_room_rename|uteke_room_update|uteke_room_memory_move`.
- **`uteke update <id>` CLI** — in-place memory edit (content/tags/importance/pinned/type), closing the CLI surface gap: HTTP `PUT /memory` and MCP `uteke_update` already existed (#1202 item 5).

## [0.17.0] — 2026-09-06

Minor release. Theme: **inspectable, trustworthy memory** — explain recall on
Expand All @@ -8,7 +34,7 @@ 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 in `benchmarks/longmemeval/RESULTS.md`. Also adds `uteke supersede <old> <new> [--reason]` — CLI surface parity for supersession (previously MCP/HTTP only).
- **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.850 → 1.000, stale@5 1.000 → 0.000. Published in `benchmarks/longmemeval/RESULTS.md`. Also adds `uteke supersede <old> <new> [--reason]` — CLI surface parity for supersession (previously MCP/HTTP only).

- **`/list` pagination metadata (#1188)** — `POST /list` accepts `"include_meta": true` to respond with an envelope `{memories, total, has_more, next_offset}` (`next_offset` is `null` on 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_meta` is ignored in `at` (point-in-time) mode, which stays a bare array.

Expand Down
28 changes: 14 additions & 14 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ members = [
]

[workspace.package]
version = "0.17.0"
version = "0.18.0"
edition = "2024"
license = "Apache-2.0"
repository = "https://github.com/codecoradev/uteke"
Expand Down
9 changes: 8 additions & 1 deletion INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ Expand-Archive -Path uteke.zip -DestinationPath uteke
# Move to a directory in PATH (e.g. C:\Users\you\AppData\Local\bin)
mkdir -p C:\Users\you\AppData\Local\bin
move uteke\uteke.exe C:\Users\you\AppData\Local\bin\
move uteke\uteke-serve.exe C:\Users\you\AppData\Local\bin\
move uteke\uteke-mcp.exe C:\Users\you\AppData\Local\bin\
# Required for embeddings — release zip ships ONNX Runtime DLLs alongside the exes
move uteke\onnxruntime*.dll C:\Users\you\AppData\Local\bin\

# Add to PATH (current session)
$env:PATH += ";C:\Users\you\AppData\Local\bin"
Expand Down Expand Up @@ -101,7 +105,7 @@ copy target\release\uteke.exe C:\Users\you\AppData\Local\bin\

## First Run

On first `remember` command, Uteke automatically downloads the embedding model (~188MB):
On first `remember` command, Uteke automatically downloads the embedding model (~200MB):

```bash
uteke remember "My first memory" --tags test
Expand Down Expand Up @@ -165,6 +169,9 @@ Check internet connection. Model downloaded from HuggingFace:
https://huggingface.co/onnx-community/embeddinggemma-300m-ONNX
```

### `ONNX Runtime library not found` on `uteke remember` (notably Arch/CachyOS fresh installs)
The release tarball/zip ships `libonnxruntime.so*` / `onnxruntime.dll` next to the binaries — keep them in the same directory as `uteke` (`~/.local/bin/` on Linux/macOS). The quick-install script does this automatically; manual tarball installs must copy the `.so`/`.dylib`/`.dll` too. Fallbacks searched: `/usr/local/lib /usr/lib /lib`, pip `onnxruntime/capi/`, `~/.cache/ort.pyke.io/`, or set `ORT_LIB_PATH=/path/to/libonnxruntime.so`. Then `uteke doctor` should report `Embedding model: embeddinggemma-q4`.

Manual download:
```bash
# macOS/Linux
Expand Down
Loading
Loading