Skip to content

Releases: ruvnet/RuVector

ruvector 0.2.40 — MetaHarness, Darwin, and Flywheel

Choose a tag to compare

@ruvnet ruvnet released this 29 Jul 22:13

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.40

Node.js 20 or newer is required.

Check the installation

npx ruvector harness doctor --json

The 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.9

Verify research evidence

npx ruvector harness flywheel verify replay-bundle.json
npx ruvector harness flywheel gate promotion-evidence.json

Run Darwin explicitly

npx ruvector harness darwin evolution-config.json --execute

The --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 start

The profile exposes six non-executing MetaHarness tools:

  • metaharness_status
  • metaharness_route
  • metaharness_replay_verify
  • metaharness_flywheel_gate
  • metaharness_workspace_probe
  • metaharness_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

Choose a tag to compare

@ruvnet ruvnet released this 28 Jul 04:13
9208c36

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

Choose a tag to compare

@ruvnet ruvnet released this 28 Jul 04:53
ac80ef5

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-runtime 0.3.2
  • npm: @ruvector/rvf 0.3.4
  • npm: @ruvector/rvf-node 0.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

Merged in #740 and #741.

ruvector-postgres 2.0.6 — index and SONA integrity

Choose a tag to compare

@ruvnet ruvnet released this 28 Jul 04:13
ff4862b

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

Choose a tag to compare

@ruvnet ruvnet released this 28 Jul 04:13
ff4862b

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

Choose a tag to compare

@ruvnet ruvnet released this 12 Jul 18:20
d811d42

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-core gains an optional lattice-embeddings Cargo feature (#648): a pure-Rust, CPU-native LatticeEmbedding provider backed by the lattice-embed crate, bridging its async-only API to EmbeddingProvider's sync interface via a dedicated worker thread rather than risking a block_on-inside-a-runtime panic. Fully opt-in — verified with cargo tree that it adds zero dependencies to the default build.
  • ruvector-extensions gains LatticeWasmEmbeddings (#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-small needs 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 hardcoded tie_word_embeddings = false that 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-inference bumped to 0.6 (#664), and a rustfmt pass on lattice_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-epoch bumped 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 — even pprof's newest release still pins inferno ^0.11, which pins quick-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 failing cargo 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.toml and .cargo/audit.toml (verified against the authoritative advisory-db package field) — 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 that cargo deny itself 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.2

ruvector 0.2.34 — RVF DX + privacy fixes, lattice Metal backend

Choose a tag to compare

@ruvnet ruvnet released this 05 Jul 15:29

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:

  1. 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.
  2. The MCP rvf_create tool could never succeed. It advertised dimension to 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.
  3. 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 NotImplemented instead 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 !Send Metal 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 lattice

ruvector 0.2.32 — Harness Router + Default-Deny MCP

Choose a tag to compare

@ruvnet ruvnet released this 17 Jun 14:41
a2c5ce4

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" — allowlist
    • RUVECTOR_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 namespaceRUVECTOR_MEMORY_NAMESPACE (default ruvector), surfaced as memory.namespace.

🔒 / 🛠 Fixes

  • Startup-budget CI guard — fails CI if a borrowed feature regresses cold start (the new harness command adds ~0–3ms).
  • Cross-platform build script — ONNX asset copy now uses fs.cpSync, so npm publish works 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

Choose a tag to compare

@ruvnet ruvnet released this 15 Jun 02:16

@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

  1. HNSW not active — the wasm32 target compiles without the hnsw feature and falls back to a flat (brute-force) index. The adapter surfaces this via indexType / WASM_HNSW_AVAILABLE instead of letting callers assume O(log n).
  2. score was a cosine distance (lower is better), contradicting the .d.ts. The adapter exposes a real similarity = 1 - distance (per-metric) so "higher is better" holds, with the raw distance preserved.
  3. Metadata did not round-tripsearch/get returned {}. 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')

@ruvector/rvagent-wasm 0.2.0

Choose a tag to compare

@ruvnet ruvnet released this 28 May 02:45

@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 unscoped rvagent-wasm)
  • Corrected build target documentation: nodejs (not web) for @claude-flow/cli usage
  • Added JsModelProvider + addMcpTools() integration patterns (ruflo ADR-129 Gaps 1 & 2)
  • Added WasmGallery direct API examples
  • Added CHANGELOG.md
  • Added .github/workflows/publish-rvagent-wasm.yml for 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's agent-wasm.ts
  • Gap 2 (addMcpTools): WASM API complete — wiring gap is in ruflo's buildRvfContainer
  • Gap 3 (get_state, get_todos, reset): WASM API complete — MCP tools missing in ruflo
  • Gap 4 (full WasmGallery surface): 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

PR

#512