From 2ed895db72a023d3105d6b6663b33c3dde5d2f72 Mon Sep 17 00:00:00 2001 From: ajianaz Date: Thu, 10 Sep 2026 20:33:42 +0700 Subject: [PATCH 1/4] chore(skills): sync uteke skill to v0.17.0 Covers v0.12.0-v0.17.0: fusion default strategy (v0.16.0), explain recall, contradiction ledger + undo, provenance, namespace ops (v0.17.0), UUIDv7, supersession, structural export (v0.15.0). Frontmatter, binary reference, and What's New updated from verified CHANGELOG. --- .../__pycache__/handler.cpython-313.pyc | Bin 13056 -> 0 bytes .../__pycache__/handler.cpython-313.pyc | Bin 12572 -> 0 bytes .../__pycache__/tool.cpython-313.pyc | Bin 14664 -> 0 bytes src/uteke/SKILL.md | 41 +++++++++++------- 4 files changed, 25 insertions(+), 16 deletions(-) delete mode 100644 extensions/uteke-extract/__pycache__/handler.cpython-313.pyc delete mode 100644 extensions/uteke-recall/__pycache__/handler.cpython-313.pyc delete mode 100644 plugins/uteke-tool/__pycache__/tool.cpython-313.pyc diff --git a/extensions/uteke-extract/__pycache__/handler.cpython-313.pyc b/extensions/uteke-extract/__pycache__/handler.cpython-313.pyc deleted file mode 100644 index d7db6456818975acbaf778fcc2477e0a574c1f1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13056 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 diff --git a/extensions/uteke-recall/__pycache__/handler.cpython-313.pyc b/extensions/uteke-recall/__pycache__/handler.cpython-313.pyc deleted file mode 100644 index ae6db5ad928a439a000139aa22f59263d0134fec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12572 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, `--type `, `--detect-contradiction` when re-storing. -## What's New (v0.10.2 — v0.11.0) - -### v0.11.0 -- **`POST /doc/move` fixed** — `deny_unknown_fields` + UUID fallback for parent resolution. Wrong field names now return 400 instead of silent data loss (#833). -- **Recall score reports cosine similarity** — not RRF rank, when results appear in only one store (#831). -- **MCP/CLI store mismatch fixed** — hardcoded `~/.uteke` paths resolved through `uteke_home()`. MCP and CLI now share the same store (#830). -- **`POST /consolidate` accepts string threshold** — flex deserializer for MCP layers that stringify params (#826). -- **API route drift guard** — source-backed test ensures all handler routes are registered (#829). - -### v0.10.2 -- **SIGILL fix for non-AVX2 CPUs** — Runtime CPU feature detection selects between AVX2 and SSE4.2 ONNX libraries. Use `*-legacy*` release bundles on older CPUs (#709). -- **Room operations filter deprecated** — `room_stats`, `recall_room`, `get_room_memory_ids` now filter `deprecated = 0` (was 76% stat inflation). -- **Short ID prefix for forget** — `DELETE /forget` accepts 8-char prefix, not just full UUID. -- **Auto-generated API reference** — `crates/docgen` generates `docs/api-reference.md` from route registry. +## What's New (v0.15.0 — v0.17.0) + +### v0.17.0 — inspectable, trustworthy memory +- **Explain recall** — `uteke recall "…" --explain` shows WHY each memory ranked: vector/FTS ranks, RRF score with per-channel fusion contributions, boost deltas. Also `POST /recall` with `"explain": true` and MCP `uteke_recall` explain flag (#1160). +- **Contradiction ledger + undo** — supersessions are an auditable ledger: `uteke contradictions list|undo`, `GET /contradictions`, `POST /contradictions/undo`, MCP `uteke_contradictions`/`uteke_contradictions_undo`. `undo_supersession(id)` restores a retired memory (#1172). +- **`uteke supersede [--reason]`** — CLI surface parity for supersession (previously MCP/HTTP only) (#1172). +- **`uteke provenance `** — SHA-256 content hash at write time (tamper evidence), actor/evidence timeline, trust tier. Schema v18, additive (#1172). +- **Namespace ops** — `uteke namespace move|rename|delete` (delete needs `--confirm`; strategies: `refuse`/`merge`/`deprecate`). `PUT /memory` accepts `namespace` to move a memory (#1181). +- **`/list` pagination metadata** — `"include_meta": true` returns `{memories, total, has_more, next_offset}` envelope; default response unchanged (#1188). +- **Fixed** — `/graph` no longer returns stale nodes from forgotten/deprecated memories; memory graph nodes get readable content-preview labels instead of raw UUIDs; `POST /graph/edge` accepts memory IDs (was 500). + +### v0.16.0 — fusion is the default everywhere +- **`fusion` recall strategy** — weighted RRF of vector + hybrid rankings (k=60). **Default recall strategy is now `fusion`** (CLI, HTTP, MCP) when no strategy is specified; explicit `default_strategy` configs are untouched. LongMemEval fast50: R@5 0.98 vs 0.9267 hybrid (#1123). +- **Public benchmark page** — `docs/benchmarks.md`: recall_any@5 98.2%, recall_all@10 95.4%. + +### v0.15.0 — trust + portability +- **UUIDv7 for new IDs** — time-ordered; existing v4 IDs keep working (#1060). +- **Supersession workflow** — mark stale decisions superseded; recall flags superseded entries (#1069). +- **Structural export/import** — full-store round-trip: rooms, graph, edges, documents, timeline (#1068). +- **MCP `uteke_get` + `uteke_update`** — read/edit a single memory by ID, short-ID resolution (#1067). +- **Fixed** — `uteke_dream` is dry-run-first (destructive passes need explicit confirmation); `/export` keeps namespace attribution; recall cache score parity; soft-forgotten memories no longer leak into list/search/doctor counts. + +See the [CHANGELOG](https://github.com/codecoradev/uteke/blob/main/CHANGELOG.md) for the full history (v0.12.0—v0.14.3: merge_from_file config fix, FTS5 content indexing, room-document junction tools, hybrid default strategy, HTTP/MCP strategy parity, crates.io publish fix). ## ⚠️ Breaking Changes (v0.8.0) From 1b2e240381e850dde6d5baa4bb95ddd226d05e33 Mon Sep 17 00:00:00 2001 From: ajianaz Date: Thu, 10 Sep 2026 20:34:31 +0700 Subject: [PATCH 2/4] chore(skills): sync cora-code skill to v0.15.0 Covers v0.13.0-v0.15.0: vecq opt-in vector store + vector_bits knob, reasoning-model empty-response recovery, dead-code skips public API by default, runtime embedding backend, incremental embedding. Frontmatter and What's New updated from verified CHANGELOG. --- src/cora-code/SKILL.md | 47 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/cora-code/SKILL.md b/src/cora-code/SKILL.md index d845060..0fc5fd3 100644 --- a/src/cora-code/SKILL.md +++ b/src/cora-code/SKILL.md @@ -4,7 +4,7 @@ description: | Cora Code — complete guide covering usage (review, scan, brain search, code intelligence) AND development (architecture, Brain Mode roadmap, embedding strategy, CI pitfalls, tree-sitter). CLI binary cora. BYOK AI code review + code intelligence platform. -version: 0.12.0 +version: 0.15.0 metadata: author: CodeCoraDev hermes: @@ -73,29 +73,28 @@ After restart, tools become `mcp_cora_brain_search`, `mcp_cora_find_callers`, `m - Debugging cora issues (auth, config, CI failures) - Adding CI review to a repo -## What's New (v0.11.0 — v0.12.0) - -### v0.12.0 -- **FTS5 camelCase search fixed** — `split_camel_case()` decomposes identifiers (`findUser` → `find OR user`). Added `file` column to FTS5 virtual table (schema v6) (#451). -- **Dead-code false positives on framework entry points** — `FRAMEWORK_ENTRY_PREFIXES` (`handle_*`, `on_*`, `route_*`) excluded from dead-code detection (#452). -- **Symbol-level suppression markers** — `// cora: keep` in symbol body excludes it from dead-code detection (#452). -- **Sticky skip files on config change** — `index_config_hash` column re-evaluates skipped files when `.cora.yaml` changes (#453). -- **`entry_point_patterns` config field** — Custom glob patterns for framework-specific entry points in `.cora.yaml`. -- **Schema migration v6** — Auto-migration: adds `index_config_hash`, rebuilds FTS5 with `file` column. - -### v0.11.0 -- **Unused import detection** — Index-powered scanner flags imports never referenced in file. Works across Rust, TypeScript, Go, Python. -- **Dead code in review** — Changed files with dead functions/methods (zero callers) auto-flagged during review. -- **Breaking change detection** — Removed/modified public symbols flagged with affected callers list. -- **HTTP route detection** — Route handlers (Axum, Actix, Express, Go net/http) tracked as `ROUTE` edges. -- **Brain enrichment (Tier 1)** — Review pipeline leverages symbol index for caller resolution, impact analysis, affected tests, semantic search. - -### v0.10.0 -- **Dead code detection** — `cora dead-code` CLI + MCP tool. Call graph analysis, zero-caller detection. -- **Graph query DSL** — `cora query "main -> *"` for code graph traversal. -- **Auto-config agent installer** — `cora install` detects 40+ AI coding agents, configures MCP server. -- **Background reindex on serve** — `cora serve` auto-reindexes before starting MCP server. -- **Tree-sitter default feature** — AST-based extraction in all builds including release binaries. +## What's New (v0.13.0 — v0.15.0) + +### v0.15.0 — quantized vector store (vecq) +- **Opt-in `vecq` vector store for Brain Mode** — `brain.vector_store: vecq` in `.cora.yaml` replaces the usearch HNSW index with a vecq quantized scan (pure Rust, deterministic, ~5x smaller). Keyed persistence: symbol IDs survive reload, so `cora index` no longer re-embeds unchanged projects (#542, #547). +- **`brain.vector_bits` knob** — `residual` (default) | `4` | `5` | `6`. Default residual = best recall@10 at 4-bit scan speed. Changing width rebuilds the index once on next `cora index` (#542). +- **Fixed: vector signal never fired in a fresh process** — `cora brain` / MCP `brain_search` silently degraded to FTS-only unless the same process had run the embed. Index now lazy-loads once per process with a dimension guard (#545). +- **Fixed: stale embed fingerprints after a global index rebuild** — rebuilds now clear fingerprints for all projects (#545). + +### v0.14.0 — reasoning-model robustness + honest dead-code +- **Empty LLM responses from reasoning models fixed** — GLM-style models that burn `max_tokens` on chain-of-thought no longer surface as `EOF while parsing`; cora retries with doubled budget (up to 32768), salvages JSON from reasoning text, reports explicit "EMPTY response" (#536). +- **Dead-code skips public API surface by default** — `pub`/`export` items excluded; `--include-pub` / MCP `include_pub_api` opt back in (#520). +- **Fixed: dead-code false positives from cross-crate method calls** — was 557 false positives on a 5-crate workspace (#519). +- **Fixed: index root mismatch between CLI and MCP** — root resolution prefers `[workspace]` Cargo.toml, never climbs past `.git` (#522). +- **Fixed: `ignore.files` honored by the index** — matched files are excluded from indexing entirely (#521). +- **Default `max_tokens` raised 4096 → 8192** (#536). +- **Relicensed MIT → Apache-2.0** + CLA added (individual + corporate). + +### v0.13.0 — runtime embedding backend +- **Runtime embedding backend selection** — `brain.embedding` in `.cora.yaml`: `auto` (default) | `hashing` (256d, zero-dependency) | `pretrained` (768d nomic). No recompilation to switch. +- **Incremental per-symbol embedding** — `embed_fingerprint` (name + signature hash) skips unchanged symbols; re-index after touching one file embeds only changes. Schema v7, auto-migrates. + +See the [CHANGELOG](https://github.com/codecoradev/cora-code/blob/main/CHANGELOG.md) for the full history. ## Data Directory From a0a63e2527beb84b82b54e880a55f7ba6fd58cae Mon Sep 17 00:00:00 2001 From: ajianaz Date: Thu, 10 Sep 2026 20:34:48 +0700 Subject: [PATCH 3/4] chore(readme): bump product versions (uteke v0.17.0, cora-code v0.15.0) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bf91b4c..8d81328 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,8 @@ Product skills require their respective binary installed. Download from GitHub R | Product | Latest | Download | |---------|--------|----------| -| [Uteke](https://github.com/codecoradev/uteke) | v0.15.0 | [Releases](https://github.com/codecoradev/uteke/releases/latest) (Linux, macOS, Windows) | -| [Cora Code](https://github.com/codecoradev/cora-code) | v0.13.0 | [Releases](https://github.com/codecoradev/cora-code/releases/latest) (Linux, macOS, Windows) | +| [Uteke](https://github.com/codecoradev/uteke) | v0.17.0 | [Releases](https://github.com/codecoradev/uteke/releases/latest) (Linux, macOS, Windows) | +| [Cora Code](https://github.com/codecoradev/cora-code) | v0.15.0 | [Releases](https://github.com/codecoradev/cora-code/releases/latest) (Linux, macOS, Windows) | | [Covecto](https://github.com/codecoradev/covecto) | v0.1.1 | [Releases](https://github.com/codecoradev/covecto/releases/latest) (Linux, macOS, Windows) | Each release ships binaries for x86_64 and aarch64 on Linux/macOS, plus x86_64 on Windows. From c2ba86398c548ca51ba1e68a4ead08196a585e4f Mon Sep 17 00:00:00 2001 From: ajianaz Date: Thu, 10 Sep 2026 20:40:09 +0700 Subject: [PATCH 4/4] chore: drop tracked __pycache__ files ci: add weekly version drift check Weekly workflow compares releases/latest for uteke, cora-code, covecto against the README table and SKILL.md frontmatter (binary-backed skills only; covecto skill documents the vtracer library and versions independently). Fails with pointers when versions drift. --- .github/workflows/version-drift.yml | 78 +++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 .github/workflows/version-drift.yml diff --git a/.github/workflows/version-drift.yml b/.github/workflows/version-drift.yml new file mode 100644 index 0000000..6c014c3 --- /dev/null +++ b/.github/workflows/version-drift.yml @@ -0,0 +1,78 @@ +name: Version Drift Check + +on: + schedule: + # Every Monday 04:00 UTC (11:00 WIB) + - cron: "0 4 * * 1" + workflow_dispatch: + pull_request: + paths: + - "README.md" + - "src/uteke/SKILL.md" + - "src/cora-code/SKILL.md" + +permissions: + contents: read + +env: + # All products listed in the README quick-install table. + PRODUCTS: "uteke cora-code covecto" + # Only these skills document the product binary 1:1, so only these + # must keep their `version:` aligned with the product release tag. + # (covecto skill teaches the vtracer library and versions independently.) + SKILL_PRODUCTS: "uteke cora-code" + +jobs: + drift-check: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Compare live releases vs declared versions + run: | + set -euo pipefail + drift=0 + + get_readme_version() { + # Row looks like: | [Uteke](https://github.com/codecoradev/uteke) | v0.15.0 | ... + grep -oP "codecoradev/$1\)\s*\|\s*\Kv[0-9.]+" README.md | head -1 + } + + get_skill_version() { + local f="src/$1/SKILL.md" + [ -f "$f" ] && grep -m1 '^version:' "$f" | awk '{print "v" $2}' + } + + for repo in $PRODUCTS; do + live=$(curl -sfL "https://api.github.com/repos/codecoradev/$repo/releases/latest" | grep -oP '"tag_name":\s*"\K[^"]+') + readme_v=$(get_readme_version "$repo" || echo "MISSING") + + echo "$repo: live=$live readme=$readme_v" + + if [ "$readme_v" != "$live" ]; then + echo "::error file=README.md::$repo README says ${readme_v:-MISSING} but latest release is $live" + drift=1 + fi + done + + for repo in $SKILL_PRODUCTS; do + live=$(curl -sfL "https://api.github.com/repos/codecoradev/$repo/releases/latest" | grep -oP '"tag_name":\s*"\K[^"]+') + skill_v=$(get_skill_version "$repo" || echo "vMISSING") + + echo "$repo: live=$live skill=$skill_v" + + if [ "$skill_v" != "$live" ]; then + echo "::error::$repo SKILL.md says $skill_v but latest release is $live" + drift=1 + fi + done + + if [ "$drift" -ne 0 ]; then + echo "" + echo "Version drift detected. Update the README table and SKILL.md frontmatter," + echo "then add a 'What's New' entry covering the missed releases." + exit 1 + fi + + echo "All product versions in sync."