Releases: ruvnet/RuVector
Release list
ruvector 0.2.40 — MetaHarness, Darwin, and Flywheel
RuVector 0.2.40: MetaHarness, Darwin, and Flywheel
RuVector 0.2.40 makes its research and optimization control plane available
through the npm SDK, CLI, and MCP server. The integration uses pinned, direct
dependencies so an installed package has the same capability set that was
tested for the release.
Install
npm install ruvector@0.2.40Node.js 20 or newer is required.
Check the installation
npx ruvector harness doctor --jsonThe doctor loads and checks all nine pinned capabilities:
- MetaHarness core
- Darwin
- Flywheel
- algorithmic harness kernel
- cost-aware router
- Red/Blue safety controls
- Weight-EFT reward-hack detection
- workspace lens
- workspace probe
Use the SDK
All new APIs are exported from the main ruvector package:
const {
getMetaHarnessCapabilities,
routeWithMetaHarness,
evaluateMetaHarnessPromotion,
verifyMetaHarnessReplay,
} = require('ruvector');
const capabilities = await getMetaHarnessCapabilities();
const route = await routeWithMetaHarness({
rows: [
{
embedding: [1, 0],
scores: { economical: 0.91, frontier: 0.99 },
},
],
prices: { economical: 1, frontier: 20 },
queryEmbedding: [1, 0],
qualityBar: 0.9,
});
console.log(route);
// { id: "economical", predictedQuality: 0.91, costPerMTok: 1, metBar: true }Additional SDK entry points support:
- Flywheel generation runs and signed replay verification
- explicit Darwin evolution runs
- frozen promotion-gate evaluation
- algorithmic harness construction
- workspace receipt scoring
- reward-hack trajectory scanning
- live-credential guards
Darwin will not execute unless the caller explicitly supplies
{ execute: true }.
Use the CLI
Route by quality and cost
Prepare three JSON files:
[
{
"embedding": [1, 0],
"scores": {
"economical": 0.91,
"frontier": 0.99
}
}
]{
"economical": 1,
"frontier": 20
}[1, 0]Then route:
npx ruvector harness route \
--examples examples.json \
--prices prices.json \
--query query.json \
--quality-bar 0.9Verify research evidence
npx ruvector harness flywheel verify replay-bundle.json
npx ruvector harness flywheel gate promotion-evidence.jsonRun Darwin explicitly
npx ruvector harness darwin evolution-config.json --executeThe --execute requirement is deliberate because Darwin candidates can run
code. Review the configuration and sandbox policy before authorizing a run.
Use MCP safely
Start the MCP server with the curated read-only profile:
RUVECTOR_MCP_PROFILE=readonly npx ruvector mcp startThe profile exposes six non-executing MetaHarness tools:
metaharness_statusmetaharness_routemetaharness_replay_verifymetaharness_flywheel_gatemetaharness_workspace_probemetaharness_reward_hack_scan
Darwin execution and Flywheel mutation loops are intentionally not exposed over
MCP. They remain explicit SDK/CLI authority boundaries.
Upgrade notes
- Node.js 20+ is now required.
- MetaHarness packages are direct dependencies and are installed with RuVector.
- Dependencies are loaded lazily, keeping ordinary RuVector startup fast.
- Existing vector database APIs remain available from the same package entry
point.
Verification
The published tarball was installed into a clean project before release. The
release passed the full npm suite, SDK/CLI/MCP integration checks, MCP handshake
and policy checks, distribution verification, startup-budget checks, and a
production dependency audit with zero reported vulnerabilities.
Security package refresh — 2026-07-28
Published security-maintenance releases from #739:
- @ruvector/spiking-neural 1.0.3
- @ruvector/agentic-synth 0.1.7
- @ruvector/burst-scaling 1.0.2
- ruvbot 0.3.3
This wave clears all critical, high, and moderate Dependabot alerts and leaves one low-severity transitive Ratatui/LRU compatibility migration.
RVF durable COW v0.3.4
Durable COW branches and sparse-ID correctness
This release completes queryable, durable RVF copy-on-write branches and corrects immediate read-through for one-based and sparse vector IDs.
Published packages
- crates.io:
rvf-runtime0.3.2 - npm:
@ruvector/rvf0.3.4 - npm:
@ruvector/rvf-node0.2.3 - npm: all five
@ruvector/rvf-node-<platform>packages at 0.2.2
Security and correctness
- membership capacity is derived from the highest vector ID, with checked overflow
- dense membership allocation is capped at 64 MiB to fail closed against allocation abuse
- branch lineage, edits, tombstones, ID maps, and relative parent references survive reopen and relocation
- affected npm releases are deprecated with upgrade guidance
Validation
- 14/14 COW integration tests and 9/9 membership tests
- five-platform native build matrix
- clippy with warnings denied, formatting, lockfile integrity, dependency review, cargo-deny, RustSec, and npm audit
- clean-registry native and SDK immediate/reopen COW smoke tests
ruvector-postgres 2.0.6 — index and SONA integrity
Rejects unsafe concurrent index builds, applies canonical search configuration, validates per-table SONA dimensions, and reports real statistics. Published to crates.io and delivered in #738.
ruvector-graph 2.3.1 — replication integrity
Durable replication serialization and coverage for graph state transfer. Published to crates.io and delivered in #738.
ruvector-core 2.3.0 + ruvector-extensions 0.1.2 — Lattice embeddings, CVE cleanup
What's in this release
A Rust crate and an npm package, shipped together: local (non-API) embeddings via Lattice, plus a supply-chain cleanup that turned CI green again.
ruvector-core@2.3.0 + ruvector-extensions@0.1.2 — Lattice embeddings, two ways
Huge thanks to @ohdearquant for a complete, coordinated feature spanning both packages — six PRs across two weeks (#645, #647, #648, #651, #663, #664):
ruvector-coregains an optionallattice-embeddingsCargo feature (#648): a pure-Rust, CPU-nativeLatticeEmbeddingprovider backed by thelattice-embedcrate, bridging its async-only API toEmbeddingProvider's sync interface via a dedicated worker thread rather than risking ablock_on-inside-a-runtime panic. Fully opt-in — verified withcargo treethat it adds zero dependencies to the default build.ruvector-extensionsgainsLatticeWasmEmbeddings(#651): the same capability for the npm/WASM side, following the package's existing provider pattern with test coverage ahead of some sibling providers.- The two providers now agree with each other (#663). Shipping both in parallel surfaced a subtle bug: they disagreed on whether
bge-smallneeds a query-side instruction prefix, which would have silently degraded retrieval for anyone indexing with one provider and querying with the other. Fixed, and locked in with a genuinely nice piece of test infrastructure — both the Rust and TypeScript test suites now assert against the same shared fixture (fixtures/lattice-embed/query-prefixes.json), so the two implementations can't quietly re-diverge again. ruvllm's Llama 3.2 support (#645): fixed a hardcodedtie_word_embeddings = falsethat made Llama 3.2 1B/3B — and any other checkpoint that ties its input/output embedding weights — fail to load in the candle backend. Closes #646.- Housekeeping:
lattice-embed/lattice-inferencebumped to 0.6 (#664), and a rustfmt pass onlattice_backend.rs(#647) that also unblocked CI formatting checks for everything else in flight.
Postgres RLS: per-statement current_setting() evaluation (#639)
Thanks to @dmitrymaranik for a careful performance fix to tenant-isolation policy generation in ruvector-postgres — wrapping current_setting() in a scalar subquery so Postgres evaluates it once via an InitPlan instead of per-row. This is security-sensitive code (it's what stops one tenant from seeing another tenant's rows), so it got the most scrutiny of anything this cycle: verified the missing_ok=true argument survives at all 9 call sites, and that an unset session variable still fails closed (excludes rows) rather than open.
CI: build-native permissions fix (#632)
Thanks to @FritzHeider for catching a classic GitHub Actions reusable-workflow gotcha — build-native.yml pushes NAPI binary commits internally and declares permissions: contents: write on itself, but the calling job in release.yml wasn't granting that permission, so it silently couldn't inherit it. One-line fix.
Security: CVE scan + supply-chain hygiene (#672)
Ran cargo audit + cargo deny check against main and found it failing both: 3 real RustSec advisories and a cargo deny policy violation.
crossbeam-epochbumped to the patched 0.9.20 (real fix).quick-xml's two DoS advisories: traced the full transitive path (inferno <- pprof's optional flamegraph feature) and confirmed it's blocked upstream — evenpprof's newest release still pinsinferno ^0.11, which pinsquick-xml ^0.26. Documented, justified ignore rather than a silent suppress.ttf-parser(unmaintained, "no safe upgrade available" per the advisory itself) was the actual thing failingcargo deny— present in three different versions via three unrelated dev/bench/example-only dependency chains. Documented ignore.- Along the way, found and fixed a real bug in the policy files themselves: three RUSTSEC IDs had their human-readable justification comments cyclically swapped between
deny.tomland.cargo/audit.toml(verified against the authoritative advisory-dbpackagefield) — the ignored IDs were always correct, but the descriptions would have misled the next person doing a security review. Also removed 5 dead ignore entries thatcargo denyitself flagged as no-longer-applicable.
cargo audit and cargo deny check both exit clean on main for the first time in a while.
A process note
Neither ruvector-core nor ruvector-extensions had a working automated publish path at the time of this release — release.yml (the documented Rust release pipeline) has been failing with a workflow-file startup_failure for over a month, and ruvector-extensions has never had CI publish coverage. Both were published by hand this round with the equivalent gates run locally (full test suites, including the previously-silently-skipped TypeScript tests, plus --dry-run on both registries) in lieu of CI. Worth a follow-up to fix release.yml and add real publish CI for ruvector-extensions.
Upgrade
cargo add ruvector-core --features lattice-embeddings
npm install ruvector-extensions@0.1.2ruvector 0.2.34 — RVF DX + privacy fixes, lattice Metal backend
What's in this release
Two npm packages and one new Rust inference backend, all shipped together.
ruvector@0.2.34 + @ruvector/rvf@0.2.3 — the #641 fixes
Issue #641 (thanks @pacphi for an unusually precise report) uncovered three real problems in the RVF developer experience:
- A naming trap when creating vector stores. The SDK wanted
{ dimensions: 384 }(plural), but if you guessed{ dimension: 384 }(singular) the error message told you the singular name was missing — sending you in a circle. Both spellings now work, and the error for a genuinely missing value names the right option with an example. - The MCP
rvf_createtool could never succeed. It advertiseddimensionto callers but forwarded the wrong field name to the SDK, so creating an RVF store over MCP was impossible. Fixed — and the misleading "Install @ruvector/rvf" hint now only appears when the package is actually missing. - A privacy leak in
ruvector embed text. The only way to pass text was on the command line, which is visible to every process on the machine (ps aux,/proc/<pid>/cmdline). You can now pipe text via stdin (printf 'sensitive' | ruvector embed text -or--stdin) or read it from a file (--input-file <path>), keeping secrets out of the process table.
Verified end-to-end on Linux x64 and macOS arm64 against the published NAPI addon, with a new regression suite for the options contract.
ruvllm: lattice — an optional macOS Metal LLM backend (#642)
Huge thanks to @ohdearquant for contributing a complete new inference backend: lattice, wiring the lattice-inference crate (Metal GPU, Qwen3.5, Q4 + safetensors) into ruvllm's LlmBackend trait behind an opt-in lattice feature flag.
Highlights of the contribution:
- Double-layered gating: on non-macOS targets the dependency is never even fetched — enabling the feature on Linux is a safe no-op (verified).
- Honest capability surface: unsupported operations return typed
NotImplementedinstead of silently-wrong results. - A careful UTF-8-safe stop-sequence scanner that actually halts GPU generation early, with thorough unit tests (CJK, multi-candidate stops).
- The
!SendMetal state correctly confined to a dedicated worker thread.
During review we validated the full suite on an M4 Mac mini (cargo test -p ruvllm --features lattice — all green on Metal) and added one refinement: safetensors checkpoints now derive their precision label from the model's own config.json torch_dtype instead of assuming BF16.
Upgrade
npm install ruvector@0.2.34 @ruvector/rvf@0.2.3
# Rust, on Apple Silicon:
cargo add ruvllm --features latticeruvector 0.2.32 — Harness Router + Default-Deny MCP
Published to npm: ruvector@0.2.32 (npm i ruvector / npx ruvector@0.2.32).
Implements ADR-256: borrow the "agent harness" concepts using primitives ruvector already ships — no new runtime dependency.
✨ New
ruvector harness status [--json]— one unified view of the routing/agent surface: Tiny Dancer cost router, semantic router, hooks routing, MCP server, witness chain, and SONA memory, with graceful degradation when optional deps are absent.- Default-deny MCP tool policy — least-privilege control over which MCP tools are exposed/callable:
RUVECTOR_MCP_ALLOW="hooks_route,hooks_recall"— allowlistRUVECTOR_MCP_DENY="hooks_force_learn"— denylist (wins over allow)RUVECTOR_MCP_PROFILE=readonly— curated safe subset- Precedence: DENY > ALLOW/PROFILE > allow-all (no policy = backward-compatible)
- Stable memory namespace —
RUVECTOR_MEMORY_NAMESPACE(defaultruvector), surfaced asmemory.namespace.
🔒 / 🛠 Fixes
- Startup-budget CI guard — fails CI if a borrowed feature regresses cold start (the new
harnesscommand adds ~0–3ms). - Cross-platform build script — ONNX asset copy now uses
fs.cpSync, sonpm publishworks off-Linux (was silently Windows-broken).
✅ Verification
npm test green — CLI 73/0, MCP-policy 8/0, startup-budget 2/0. Published artifact smoke-tested: npx ruvector@0.2.32 harness status --json.
🤖 Generated with claude-flow
@ruvector/wasm 0.1.31 — corrected WASM adapter
@ruvector/wasm 0.1.31
Ships the RuvectorWasmAdapter (@ruvector/wasm/adapter) from #568 and restores a functional published package — 0.1.30 had shipped with only package.json (empty pkg/); 0.1.31 includes the built web pkg/ (WASM + JS bindings) plus the adapter.
The adapter corrects three behaviours of the raw WASM build
- HNSW not active — the wasm32 target compiles without the
hnswfeature and falls back to a flat (brute-force) index. The adapter surfaces this viaindexType/WASM_HNSW_AVAILABLEinstead of letting callers assume O(log n). scorewas a cosine distance (lower is better), contradicting the.d.ts. The adapter exposes a realsimilarity = 1 - distance(per-metric) so "higher is better" holds, with the rawdistancepreserved.- Metadata did not round-trip —
search/getreturned{}. The adapter keeps an in-process metadata sidecar keyed by id and re-attaches it on the way out.
Usage
import { RuvectorWasmAdapter } from '@ruvector/wasm/adapter';
const index = await RuvectorWasmAdapter.create({ dimensions: 384, metric: 'cosine' });
index.insert({ id: 'doc_1', vector: embedding, metadata: { title: 'My Document' } });
const results = index.search({ vector: query, k: 10 });
// results[i].similarity (higher better), .distance (raw), .metadata (round-trips), index.indexType ('flat')- Tarball: 13 files, 381 kB unpacked · npm: https://www.npmjs.com/package/@ruvector/wasm
- Adapter validated by 7 Node tests (all 3 findings + filter/batch/delete). PR #568.
@ruvector/rvagent-wasm 0.2.0
@ruvector/rvagent-wasm 0.2.0
Changes from 0.1.0
Documentation + metadata release. No Rust changes.
- Corrected npm package name:
@ruvector/rvagent-wasm(previously README showed unscopedrvagent-wasm) - Corrected build target documentation:
nodejs(notweb) for@claude-flow/cliusage - Added
JsModelProvider+addMcpTools()integration patterns (ruflo ADR-129 Gaps 1 & 2) - Added
WasmGallerydirect API examples - Added
CHANGELOG.md - Added
.github/workflows/publish-rvagent-wasm.ymlfor npm publish via CI
ADR-129 context
All gap APIs were already present in 0.1.0:
- Gap 1 (
JsModelProvider/set_model_provider): WASM API complete — wiring gap is in ruflo'sagent-wasm.ts - Gap 2 (
addMcpTools): WASM API complete — wiring gap is in ruflo'sbuildRvfContainer - Gap 3 (
get_state,get_todos,reset): WASM API complete — MCP tools missing in ruflo - Gap 4 (full
WasmGallerysurface): WASM API complete — MCP tools missing in ruflo
See ADR-129 for the ruflo-side fix plan.
Compatible with
@claude-flow/cli >= 3.10.4- wasm-pack 0.14.x, 0.15.x
- Rust 1.80+
Installing
npm install @ruvector/rvagent-wasm@0.2.0