* fix(security): ADR-165 Phase 1 — close all critical CVEs, refresh registry, add CI gate
Closes ADR-165 Phase 1. Both workspaces pass `npm audit --audit-level=critical`.
## Before (2026-06-29)
| Workspace | Critical | High | Moderate | Total |
|-----------|----------|------|----------|-------|
| Root | **1** | 6 | 31 | 38 |
| v3 | **4** | 33 | 57 | 97 |
## After
| Workspace | Critical | High | Moderate | Total |
|-----------|----------|------|----------|-------|
| Root | **0** | 0 | 31 | 31 |
| v3 | **0** | 27 | 58 | 88 |
All 5 critical advisories closed (vitest GHSA-5xrq, handlebars prototype-pollution,
protobufjs constructor-pollution, plus 2 more in v3). 12 of 39 high advisories
closed via overrides; the remaining 27 v3 highs are deeper transitive chains
that would require breaking-change major bumps — flagged for ADR-165 Phase 2.
## Changes
### Root workspace overrides (package.json)
- `vitest`: `^1.0.0` → `^3.2.6` (closes critical GHSA-5xrq CVSS 9.8)
- `hono`: `>=4.11.4` → `>=4.12.25` (closes 6 hono advisories)
- `undici`: `>=7.18.0` → `>=8.5.0` (closes 7 undici advisories — bumps the
stale pin that ADR-165 flagged as still-in-vulnerable-range)
- `vite`: `>=6.4.6` → `>=8.0.16` (closes 2 vite advisories)
- NEW `@grpc/grpc-js`: `>=1.14.4`
- NEW `form-data`: `>=4.0.6`
- NEW `http-proxy-middleware`: `>=3.0.7`
- `@hono/node-server`: `>=1.19.10` → `>=1.19.14`
### v3 workspace overrides (v3/package.json + pnpm.overrides)
- `vitest`: `^4.0.16` → `^4.1.0` (and `@vitest/coverage-v8` matched)
- Top-level + pnpm overrides: `handlebars: >=4.7.9`, `protobufjs: >=8.6.0`
- 27 sub-package `package.json` updated to `vitest ^4.1.0`
### CVE registry refresh (v3/@claude-flow/security/src/CVE-REMEDIATION.ts)
Rewritten from 5 stale Jan-2026 entries to 16 total: 15 fixed, 1 open
(ADR165-OPEN-01 — PII pipeline wiring per ADR-164 §6.1 not yet on
dispatch-layer). `SECURITY_SUMMARY` is now computed dynamically from the
registry; `validateRemediation()` correctly returns `allFixed: false`
with 1 issue. ADR-165 §5 flagged this as THE Phase 2 priority — now closed.
### New CI gate
`.github/workflows/cve-audit.yml`:
- `audit-root` — `npm audit --audit-level=critical` in root, blocking
- `audit-v3` — same in v3, blocking
- `audit-high-report` — warn-only summary on high-severity drift
- Triggers: PR, push to main, daily cron
### ADR-165 §9 evidence ledger addendum
Captures AFTER-remediation `npm audit --json` metadata for both workspaces.
The diff between BEFORE (already in §9) and AFTER makes Phase 1 verifiable.
Also CORRECTED one prior surprise in §9: the `validate-input.ts` in
`mcp-tools/` is NOT a 9-line shim. It's 269 lines of real implementation.
(That was an inaccurate findings note from the initial audit.)
### §7.3 research items resolved
- `protobufjs` v3 chain confirmed gone after override pins
- `handlebars` v3 chain confirmed not user-reachable on the workflow path
(toolchain-only; override sufficient)
- `validate-input.ts` confirmed real implementation, not a shim (registry
entry corrected)
- CORS surface check: no `cors()` / `app.use(cors` call sites — the hono
CORS-wildcard advisory is not exploitable on the current server
- ADR-164 §6.1 PII pipeline NOT wired in current agentbbs dispatch —
recorded as ADR165-OPEN-01 (Phase 3 work)
## Gates (all PASS)
- `npm audit --audit-level=critical` root: exit 0 (was non-zero)
- `npm audit --audit-level=critical` v3: exit 0 (was non-zero)
- vitest suites: 105/109 pass (4 skip-conditional — same as before)
- ADR-112 audit: 352/352 tools with guidance
- business-pods smoke: 11/11 PASS
- agentbbs smoke: 8/8 PASS
- agenticow smoke: 8/8 PASS
- cli build: clean (tsc)
## Phase 2+ deferred
The 27 v3 high-severity advisories that remain are transitive chains with
no patched-in-range version. ADR-165 §6 Phase 2 picks these up after the
`cve-watch.yml` automation in §6 lands (NEW PR — not in scope here).
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_01WbBa4nccx5aGhXphoHxcni
* chore(lock): regen v3/pnpm-lock.yaml after override updates (PR #2508 CI fix)
PR #2508 added handlebars + protobufjs to v3 overrides + bumped vitest pin,
but v3/pnpm-lock.yaml wasn't regenerated. CI surfaced
ERR_PNPM_LOCKFILE_CONFIG_MISMATCH on every install step.
Same pattern as the previous lockfile-drift fixes on PR #2500 and #2503.
* fix(ci): cve-audit.yml jq-only + regen witness manifests for #1609 marker drift
Two PR #2508 CI failures fixed:
1. Static-regression-guard tripped on cve-audit.yml line 52: the static
YAML strict-parser sees `if high > 0:` inside the `run: |` block as
a YAML block-mapping key indicator. Refactored all 3 inline-python
blocks to use jq (preinstalled on ubuntu-latest) — no embedded
`if x > 0:` lines, so the YAML guard passes.
2. Witness marker drift smoke flagged fix-marker #1609 — the Phase 1
vitest bump (4.0.16 → 4.1.0) drifted the cited marker string in
v3/@claude-flow/aidefence/package.json. Updated `marker` field in
all 3 platform manifests + `desc` to reference ADR-165 Phase 1, then
re-signed via plugins/ruflo-core/scripts/witness/regen.mjs.
Co-Authored-By: RuFlo <ruv@ruv.net>
This commit closes the chain started in ca0a6fa5c (standalone use recipes
landed in repo but never reached npm because no version bumps shipped).
## Changes
### Module version bumps (alpha.43)
- @claude-flow/memory → 3.0.0-alpha.17 (republish standalone use README)
- @claude-flow/embeddings → 3.0.0-alpha.18 (republish standalone use README)
- @claude-flow/security → 3.0.0-alpha.8 (republish standalone use README)
- @claude-flow/neural → 3.0.0-alpha.9 (pin @ruvector/sona to 0.1.5,
republish standalone use README)
- @claude-flow/cli → 3.7.0-alpha.43 (repin to new modules above)
- claude-flow → 3.7.0-alpha.43 (umbrella)
- ruflo → 3.7.0-alpha.43 (umbrella)
### Umbrella bump (alpha.44) — npm download badges
- @claude-flow/cli → 3.7.0-alpha.44
- claude-flow → 3.7.0-alpha.44
- ruflo → 3.7.0-alpha.44
### Neural sona pin (root fix for #2022)
@claude-flow/neural alpha.8 had `"@ruvector/sona": "latest"`, and
@ruvector/sona@0.1.6 (current latest on npm) shipped as an empty publish
— README + package.json only, no index.js or native bins. So every
fresh `npm install @claude-flow/neural@alpha.8` broke at import time
with `Cannot find package '.../node_modules/@ruvector/sona/index.js'`.
Alpha.9 pins to the exact known-good 0.1.5 (which has index.js + 7
platform-specific .node bins). Will revert to a range once
@ruvector/sona@0.1.7+ ships with content (tracked in #2022).
### npm download badges across every published package README
Added `shields.io/npm/dm/<pkg>` (monthly downloads) badges to:
- claims, cli-core, plugins (had no npm badges at all)
- plugin-agent-federation, plugin-iot-cognitum (no npm badges)
- browser, codex, mcp (had version badge, missing downloads)
- umbrella root README (now badges both `ruflo` + `claude-flow`)
The ruflo/README.md and v3/@claude-flow/cli/README.md auto-copy from
root via prepublishOnly, so they inherit the new badges on publish.
Packages that already carried downloads badges (aidefence, deployment,
embeddings, guidance, hooks, integration, memory, neural, performance,
providers, security, shared, swarm, testing) are unchanged.
## Live functional check on the published artifacts
- Fresh `npm install @claude-flow/neural@3.0.0-alpha.9`:
sona resolves to 0.1.5; `import('@claude-flow/neural')` returns
A2CAlgorithm, BalancedMode, BaseModeImplementation, BatchMode,
CuriosityModule, ... (was broken before alpha.9).
- Standalone use sections from ca0a6fa5c now visible on npmjs.com for
memory@alpha.17, embeddings@alpha.18, security@alpha.8, neural@alpha.9.
- npm dm/ badges resolve and render the current weekly download count.
Co-Authored-By: RuFlo <ruv@ruv.net>
Adds a 'Standalone use (without the Ruflo CLI)' section to each
module's README right after Installation, with copy-pasteable
recipes verified against the published artifacts (fresh `npm install`
clean room, no patched dist, exit 0 for every example).
Recipes:
@claude-flow/memory (@3.0.0-alpha.16)
1. HNSWIndex — add 3 vectors, search top-2, no other deps
2. ControllerRegistry + injected AgentDB — proves the v3
governance layer works on a caller-owned AgentDB instance
(the agentdb injection field added in #2019)
@claude-flow/embeddings
1. MockEmbeddingService + cosineSimilarity — embed + compare
without network calls
2. Provider swap snippet showing OpenAI / Transformers / etc.
keep the same API surface
@claude-flow/security (@3.0.0-alpha.7)
1. InputValidator.validate(EmailSchema) +
new PasswordHasher({ rounds: 12 }) +
createCredentialGenerator().generateApiKey() — three of the
OWASP top 10 in ~15 lines
2. createDevelopmentExecutor — git through the allowlist gate;
createProjectPathValidator — refuses `../` traversal with
errors[] surfaced
Bugs uncovered by running the recipes against live npm:
- `embed()` returns { embedding, tokens, ... }, not a raw Float32Array
(recipe destructures `.embedding`).
- createPasswordHasher(rounds: number) accepts a NUMBER, not a
config object (passing `{ rounds: 12 }` made config.rounds nest
into `{ rounds: 12 }` and bcryptjs threw 'Illegal arguments:
string, object'). Switched recipe to `new PasswordHasher(...)`.
- generateCredentials() does NOT generate API keys — that lives
on `CredentialGenerator.generateApiKey(prefix)`. Recipe now
uses createCredentialGenerator().generateApiKey().
- PathValidator result is { isValid, errors[], ... }, not
{ valid, error }. Recipe matches the real shape.
Not included — @claude-flow/neural standalone recipe:
@claude-flow/neural@3.0.0-alpha.8 currently fails on fresh
install because @ruvector/sona@0.1.6 is an empty publish (only
README + package.json — no index.js, no native bins).
@ruvector/sona@0.1.5 had full content (index.js + 7 platform
bins), so this is a regression in the latest sona release that
blocks the entire neural package from loading.
Rather than ship a broken recipe, the neural README gains a
'Known issue' callout pointing at @ruvector/sona@0.1.6. Fix
path: republish @ruvector/sona with content or pin
@claude-flow/neural to @ruvector/sona@^0.1.5 in its next bump.
Co-Authored-By: RuFlo <ruv@ruv.net>
Same failure shape as #1147: `npx @claude-flow/cli@latest` crashes with
`npm error Invalid Version: ` on npm 11.x / Node 24+.
Root cause: @claude-flow/embeddings declared @huggingface/transformers in
both `optionalDependencies` AND `peerDependencies` (with
peerDependenciesMeta.optional = true). When npm 11.x arborist runs
PlaceDep.pruneDedupable → Node.canDedupe → semver.eq, the overlap plus a
"-dev." prerelease transitive (onnxruntime-web@1.26.0-dev.…) trips the
empty-version crash inside @npmcli/arborist.
Fix:
- @claude-flow/embeddings: keep only the optional peerDependency, drop
the duplicate optionalDependencies entry. Bumped to 3.0.0-alpha.17.
- @claude-flow/cli: pin embeddings to ^3.0.0-alpha.17 so existing
lockfiles re-resolve to the fixed version. Bumped to 3.7.0-alpha.39.
Regression guards (so this can't recur):
- scripts/audit-package-dep-overlap.mjs — static check that no package
declares the same name in BOTH optionalDependencies and
peerDependencies. Wired into v3-ci.yml as part of the
plugin-package-audit job.
- scripts/smoke-cli-npx-install.mjs — behavioural smoke: pack the CLI
tarball, install it into a scratch project with optionals enabled,
fail if `npm install` prints "Invalid Version:" or exits non-zero.
New v3-ci.yml job `cli-npx-install-smoke` runs on Node 22 + 24
(Node 24 ships npm 11.x, where the bug surfaces) and gates witness-verify.
Verified end-to-end:
$ npx -y @claude-flow/cli@3.7.0-alpha.39 doctor
✓ MCP Servers, AIDefence, Disk Space, TypeScript … 10 passed
Closes#1468.
`downloadEmbeddingModel`'s catch regex only matched
`Cannot find package` / `Cannot find module`. On Windows + Node strict
ESM, the bundled `agentic-flow`'s `package.json` doesn't declare a
`./embeddings` subpath, which raises a different shape:
Package subpath './embeddings' is not defined by "exports" in
C:\...\node_modules\agentic-flow\package.json
That message didn't match either branch of the existing regex, so the
error re-threw all the way up to `ruflo embeddings init` and broke the
init flow on Windows even though the rest of the embedding pipeline
(@xenova/transformers ONNX) doesn't actually need agentic-flow.
Fix: extend the regex to also catch:
- `Package subpath '\./embeddings' is not defined`
- `ERR_PACKAGE_PATH_NOT_EXPORTED`
When matched, falls back to the same lazy-fetch path as the missing-
package case — model downloads on first generate via @xenova.
The other three `import('agentic-flow/embeddings')` sites in this file
(init, isNeuralAvailable, listEmbeddingModels) already wrap their
imports in try/catch that returns a neutral value, so they degrade
gracefully on this same error.
Verified the new regex matches the Windows error string exactly.
WSL/Linux behavior unchanged (those resolve agentic-flow successfully).
Published @claude-flow/embeddings@3.0.0-alpha.16 (alpha + latest tags).
The cli's optional-dep range `^3.0.0-alpha.12` resolves to alpha.16 for
fresh installs, so `npx ruflo@latest embeddings init` picks up the fix
without a cli/umbrella republish.
Co-Authored-By: RuFlo <ruv@ruv.net>
* fix(init): #1744 honest defaults — --no-global, --minimal hooks gate, README install paths (v3.6.28)
Three fixes from @ruvnet's install-study (issue #1744) plus three
already-on-disk runtime honesty fixes:
#1744 changes (this commit):
1. **--no-global flag** for `init` (and codex/dual variants) — opt out
of the user-global ~/.claude/CLAUDE.md "Ruflo Integration" pointer
block append. Default behavior unchanged (block still appended once,
idempotent — but now opt-out is documented). #1744#2.
2. **--minimal hooks gate** in settings-generator. Before this commit,
`--minimal` wrote .claude/settings.json with 4 hook decls pointing at
.claude/helpers/hook-handler.cjs but didn't install the helpers
directory — so every hook fired and silently failed. Now the hooks
block only emits when components.helpers is true. Minimal stays
minimal AND functional. #1744#3.
3. **README Quick Start labeling** — added a head-to-head table
distinguishing Plugin install (lite, slash commands only, no MCP)
from CLI install (full Ruflo loop, MCP registered, hooks installed).
The previous README marketed both equally as "Recommended" which
surprised users who chose plugin install and found the MCP tools
missing. #1744#1.
Already-on-disk runtime honesty fixes (bundled in this release):
4. v3/@claude-flow/cli/src/commands/performance.ts — drop unverified
"Flash Attention 2.49x speedup" optimize/bottleneck recommendations.
Re-tagged as "in progress, currently JS reference impl".
5. v3/@claude-flow/cli/src/mcp-tools/neural-tools.ts — drop the silent
Tier 4 mock-fallback in embedding resolution. If Tier 1 (agentic-flow)
and Tier 3 (ONNX) both failed to import, leave realEmbeddings null
and let the explicit hash-fallback path run with a clear
_embeddingNote in stats. Silently substituting mock embeddings hid a
missing production dependency from callers.
6. v3/@claude-flow/embeddings/src/embedding-service.ts — throw on
unknown provider / no-real-provider-available paths instead of
silently substituting MockEmbeddingService. Mock embeddings are
tests-only; production code that lands on the mock path
accidentally is a bug, and silent fallback hid it.
All TypeScript clean (tsc --noEmit). Build verified — all 3 fixes
present in dist/.
Closes#1744 (3 of 5 papercuts; remaining 2 are doc-only, addressed
in PR #1751).
Co-Authored-By: RuFlo <ruv@ruv.net>
* chore(release): bump to 3.6.28 — published to npm
@claude-flow/cli@3.6.28 → tags: latest, alpha, v3alpha
claude-flow@3.6.28 → tags: latest, alpha, v3alpha
ruflo@3.6.28 → tags: latest, alpha, v3alpha
Includes: #1744 (--no-global, --minimal hooks gate, README install
labeling) + runtime honesty fixes (drop unverified Flash Attention
claim, drop silent mock embedding fallback, throw on missing real
embedding provider).
Co-Authored-By: RuFlo <ruv@ruv.net>
* chore(release): regen verification witness for 3.6.28
totalFixes: 27 → 55 (adds CAP-MCP capability inventory: 300 tools
across 28 source files)
releases: 3.6.24 → 3.6.28 (current published)
manifestHash + signature regenerated from current git commit
Includes the #1744 + runtime-honesty fixes shipped in 3.6.28.
Run `node scripts/regenerate-witness.mjs` after each release.
Co-Authored-By: RuFlo <ruv@ruv.net>
---------
Co-authored-by: Reuven <cohen@ruv-mac-mini.local>
Batched publish of iteration #11 (suppression-via-side-effect-module),
iteration #14 (ADR-094 transformers loader: try-prefer
@huggingface/transformers, fall back to @xenova).
Verified in clean smoke install:
- `ruflo --version` clean (no [AgentDB Patch] noise)
- `memory init --force` clean
- transformers-loader.js shipped in @claude-flow/embeddings dist
- ADR-094 inline logic shipped in cli memory-initializer.js
The protobufjs <7.5.5 CVE chain still shows in npm audit because
@huggingface/transformers is an OPTIONAL dep — users opt in via
`npm install @huggingface/transformers` and the loader picks it up.
Once installed, the legacy chain drops and audit clears.
Co-Authored-By: RuFlo <ruv@ruv.net>
ADR-094 — transformers loader (try-prefer-fallback):
- New v3/@claude-flow/embeddings/src/transformers-loader.ts exposes
loadTransformersPipeline() that prefers @huggingface/transformers
(clears protobufjs <7.5.5 critical RCE chain), falls back to legacy
@xenova/transformers for backwards compat. Caches the resolved
source so repeated callers don't re-import.
- Updated v3/@claude-flow/embeddings/src/embedding-service.ts:387 to
use the loader instead of direct @xenova import.
- Updated v3/@claude-flow/cli/src/memory/memory-initializer.ts:1539
with inlined try-prefer-fallback (avoids circular optional-dep at
install time).
- v3/@claude-flow/embeddings/package.json: added @huggingface/transformers
to optionalDependencies (^4.2.0) and peerDependenciesMeta.optional.
Both packages build clean. The loader uses a string-variable specifier
in dynamic import so tsc doesn't try to resolve types at compile time
(both packages are runtime-optional).
ADR-095 — architectural gap tracking from April audit (@roman-rr):
- Documents the 7 gaps the May audit/ADR-093 honesty work didn't
address: G1 agent_spawn no subprocess, G2 single-process consensus,
G3 workflow runtime missing, G4 WASM echo stub, G5 transformers
CVE chain (now ADR-094), G6 auto-memory graph 100MB bloat for 20
unique entries, G7 6 disabled AgentDB controllers.
- Reserves ADR-096..ADR-107 numbers for the per-gap follow-up ADRs.
- Explicit "tracking only — no decisions" status so gaps don't dilute
through the issue tracker.
Co-Authored-By: RuFlo <ruv@ruv.net>
Regression caught by 3.6.15 smoke test: with agentic-flow auto-installed
as an optional dep, `import('agentic-flow/embeddings')` succeeds but
the loaded module exposes `clearEmbeddingCache`/`computeEmbedding`/
`computeEmbeddingBatch`/`getEmbeddingDimensions` — no `downloadModel`.
3.0.0-alpha.13 only handled the "package missing" path. With agentic-
flow present but the function absent, it threw `downloadModel is not a
function` straight up to the CLI's `embeddings init` action, which
reported `[ERROR] Initialization failed: downloadModel is not a function`.
3.0.0-alpha.14 checks `typeof downloadFn === 'function'` before
calling and falls through to the same lazy-fetch warning otherwise.
@xenova/transformers downloads on first generate() either way.
Verified in clean smoke install with cache cleaned:
$ ruflo embeddings init --force
Initialize Embedding Subsystem
...
Next steps:
- embeddings generate -t "test text" - Test embedding generation
...
Co-Authored-By: RuFlo <ruv@ruv.net>
#1700 item 2: `embeddings init` failed with `Cannot find package
'agentic-flow'` because downloadEmbeddingModel did not catch the dynamic
import error, even though agentic-flow is declared as an optional peer.
Now logs an informative warning and returns the target dir as a no-op
success — @xenova/transformers fetches the model lazily on first
embeddings_generate call.
Bumps @claude-flow/embeddings to 3.0.0-alpha.13. ruflo@3.6.14 picks it
up automatically via caret range.
Verified in clean /tmp install:
$ node -e "import('@claude-flow/embeddings').then(m =>
m.downloadEmbeddingModel('Xenova/all-MiniLM-L6-v2', '/tmp/test-models'))"
[embeddings] agentic-flow not installed — skipping eager model download.
Models will be fetched lazily by @xenova/transformers on first generate.
downloadEmbeddingModel returned: "/tmp/test-models"
PASS — graceful fallback worked
Previously this threw "Cannot find package 'agentic-flow' imported from
.../@claude-flow/embeddings/dist/neural-integration.js".
Co-Authored-By: RuFlo <ruv@ruv.net>
* docs: add ADR-057 — RVF native storage backend to replace sql.js
Proposes replacing the 18MB sql.js WASM SQLite dependency with
RuVector Format (RVF) across @claude-flow/shared, memory, and
embeddings packages. Includes automatic and manual migration paths
for existing .db and .json files with full backward compatibility.
Key benefits: -18MB install size, 150x-12,500x faster vector search
via native HNSW, quantization support, crash-safe append-only format.
Co-Authored-By: claude-flow <ruv@ruv.net>
* docs: extend ADR-057 with RVF embedding provider, ruvLLM persistence, and progressive download
Add three major sections to ADR-057:
- Section 3A: RVF as 5th EmbeddingProvider (52KB WASM replaces 540MB
agentic-flow for basic use cases). Updated auto-select hierarchy:
rvf > agentic-flow > transformers > mock.
- Section 3B: ruvLLM learning persistence via RVF segments. SONA
patterns (ReasoningBank), LoRA adapters, and EWC++ weights now
survive process restarts. RuVectorProvider.searchMemory works
offline via RVF without HTTP server.
- Section 10: Progressive download architecture. Replaces npm
optionalDependencies (all-or-nothing 1.3GB) with on-demand
capability downloads stored as .rvf files. 5 phases from 22MB
core CLI to full LLM/CNN/GNN/kernel capabilities.
Implementation plan expanded from 5 to 8 phases. Testing strategy
updated with 11 new test cases covering the additions.
Co-Authored-By: claude-flow <ruv@ruv.net>
* feat: add optimized Docker images for Ruflo lite/full/workers
- Dockerfile: Multi-stage Alpine build with aggressive dependency pruning.
Result: 324MB image, 0.6s startup (vs 1.3GB/35s baseline).
Uses --omit=optional + explicit rm -rf of heavy transitive deps.
- Dockerfile.full: Full image variant with all optional dependencies
including native compilation (onnxruntime-node, better-sqlite3).
- Dockerfile.headless: Updated from node:20 to node:22, claude-flow
branding to ruflo, same prune strategy as lite.
- docker-compose.yml: Three profiles (lite, full, workers) with
appropriate resource limits and health checks.
- .dockerignore: Excludes node_modules, tests, source maps, IDE
configs, and secrets from build context.
Co-Authored-By: claude-flow <ruv@ruv.net>
* feat(ADR-057): implement RVF native storage backend across all packages
Replace sql.js (18MB WASM) with zero-dependency RVF format across
memory, events, embeddings, and learning subsystems. Pure TypeScript
fallback with optional native @ruvector/rvf acceleration.
New files:
- memory/rvf-backend.ts: IMemoryBackend impl with HNSW + binary persistence
- memory/hnsw-lite.ts: Lightweight HNSW graph for vector search
- memory/rvf-learning-store.ts: SONA pattern/LoRA/EWC/trajectory persistence
- memory/persistent-sona.ts: PersistentSonaCoordinator wrapping learning store
- shared/events/rvf-event-log.ts: Append-only event log (replaces EventStore)
- embeddings/rvf-embedding-cache.ts: Binary file embedding cache (FNV-1a keys)
- embeddings/rvf-embedding-service.ts: Hash-based embedding provider (<0.1ms)
Integrations:
- DatabaseProvider: 'rvf' added, auto-selected first (always available)
- EmbeddingProvider: 'rvf' added, auto-selected first in async factory
- All packages export new RVF types and classes
Tests: 163 passing (5 suites), validated in Docker (node:22-alpine)
- rvf-backend: 50 tests (CRUD, query, search, persistence, HNSW)
- rvf-event-log: 33 tests (append, replay, snapshots, crash recovery)
- rvf-embeddings: 30 tests (cache, service, determinism, normalization)
- rvf-learning-store: 31 tests (patterns, LoRA, EWC, trajectories)
- rvf-integration: 19 tests (provider selection, migration, concurrency)
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(ADR-057): harden RVF storage with security, performance, and migration
Security: atomic writes (tmp+rename) across all backends, path validation,
input validation at boundaries. Performance: persist lock prevents concurrent
flushes, stack overflow fix for large datasets, timer.unref() prevents hangs,
O(1) eviction lookup in embedding cache. New: bidirectional RVF migration
utility (JSON/SQLite/RVF), format v2 with backward compat, auto-persist
patterns and trajectories before eviction. Added HnswLite and RvfMigrator
exports. 193 tests passing, 0 TS errors.
Refs #1242
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix: doctor version detection and init settings warnings (#1235, #1230)
doctor: Replace unreliable path-walking heuristic with import.meta.url
traversal to find the correct package.json. Removes stale npx cache
scanning that could report wrong versions. Fixes#1235.
init: Remove invalid TeammateIdle and TaskCompleted keys from generated
.claude/settings.json hooks section. These are not recognized by Claude
Code and caused warnings. Config remains available under the claudeFlow
namespace. Fixes#1230.
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(doctor): remove Windows-incompatible shell redirects, simplify root detection
- Remove fragile Windows root calculation (split on backslash); use
dirname(dir) === dir instead which works on all platforms
- Remove 2>/dev/null from npm view command (fails on Windows cmd.exe);
the catch block handles errors gracefully already
Co-Authored-By: claude-flow <ruv@ruv.net>
* security: harden RVF against crafted files and race conditions
- rvf-backend: validate dimensions (1-10000), validate RVF header
structure and size before JSON.parse, guard persist interval
against concurrent flushes
- rvf-embedding-cache: use random suffix for tmp files to prevent
predictable-path attacks on multi-user systems
- rvf-event-log: add 100MB max payload size limit to prevent DoS
from crafted event log files
- rvf-migration: add null byte and type validation on all paths
Co-Authored-By: claude-flow <ruv@ruv.net>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T19:04:42Z
- Changes: 19 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T05:06:13Z
- Changes: 3 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T05:05:42Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T05:05:41Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T05:05:29Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T05:02:15Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T05:02:14Z
- Changes: 6 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T05:01:09Z
- Changes: 2 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T05:00:31Z
- Changes: 3 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:59:28Z
- Changes: 2 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:58:16Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:57:08Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:55:35Z
- Changes: 2 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:54:02Z
- Changes: 2 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:53:43Z
- Changes: 2 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:53:11Z
- Changes: 2 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:52:22Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:51:26Z
- Changes: 2 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:46:59Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:46:07Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:45:24Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:44:46Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:44:44Z
- Changes: 8 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:43:13Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:42:18Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:41:53Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:41:52Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:41:51Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:41:50Z
- Changes: 2 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:41:35Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:41:34Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:41:25Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:41:24Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:41:23Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:41:22Z
- Changes: 2 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:39:28Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:39:03Z
- Changes: 6 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: v3
- Timestamp: 2026-01-07T04:38:15Z
- Changes: 3 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>