v0.8.3
A SOTA-retrieval optimization pass: deliberate recall() and passive injection now share the full ranking stack, the injected set is diversity- and hybrid-fusion-aware, the learned scorer trains on the right signal with hard-negative emphasis, and heavy maintenance can no longer stall hook serving.
Performance
recall()routed through the real ranking stack. The deliberaterecall()tool ranked by raw cosine only — bypassing the semantic dedup + bge-reranker-v2-m3 cross-encoder that passive auto-injection uses, so explicit recalls were ranked worse than what an agent passively receives. It now runs dedup → cross-encoder rerank (0.6·cosine + 0.4·cross). Also fixes a default-limit mismatch (was 3; schema documents 5).- MMR diversification of the injected set. A Maximal Marginal Relevance pass (λ=0.7) between the cross-encoder rerank and token-budget selection — greedy argmax(λ·score − (1−λ)·maxCosineToPicked) over the selection-eligible items — so a redundant concept-family can't crowd out coverage.
- Hybrid dense+keyword fusion (RRF). The dense (vector) and keyword (tag) candidate rankings were merged by plain id-concat. They're now fused with Reciprocal Rank Fusion (k=60) for graph-walk seed selection, so a keyword-strong concept with mediocre cosine can still seed expansion.
- Hard-negative weighting in the ACAN training loss. The learned scorer's pointwise objective now upweights hard negatives (high retrieval cosine, low utilization) 2.5×. Weights version bumped 2→3 → clean cold-start retrain (ACAN falls back to WMR during the transition).
- HNSW M=16 / EFC=200. Bumped the vector indexes from SurrealDB's M=12/EFC=150 defaults to the SOTA-minimum (recall is monotonic in M; extra RAM offset by F32). New installs get it automatically; existing installs pick it up in the
scripts/migrate-hnsw-f32.mjsrebuild (now F32 + M/EFC together).
Fixed
- daemon: Heavy maintenance jobs now run on a dedicated SurrealDB connection, so a maintenance deadline → zombie → reconnect can no longer reject in-flight hook queries (the architectural complement to 0.8.2's per-query
TIMEOUT). Best-effort with a safe fallback to the shared store — cannot regress maintenance. - acan: The learned scorer trained on a recomputed aux-feature vector that didn't match the one used at scoring time (train/inference skew). It now persists and trains on the exact stage-time
aux_features.
Known follow-ups (benchmark-/ops-gated)
- True dense+sparse hybrid (BGE-M3 sparse/ColBERT heads) is blocked:
node-llama-cppexposes only dense embeddings, and SurrealDB BM25 full-text parse-errored on this build. A BM25 sparse arm + RRF-into-final-scoring needs a recall benchmark. - Full listwise RankNet ACAN loss needs offline NDCG/MRR validation before activation.
- Aggressive HNSW (M 24–48 / EFC 300) and a Qwen3-Embedding swap (model path + dims are already config-swappable via
EMBED_MODEL_PATH) are a benchmark + re-embed decision.