Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
3a1afa2
feat(rulake): vector-native federation intermediary — ADR-155 + MVP c…
Apr 23, 2026
8e574da
feat(rulake): cache-first reframe + bundle sidecar + recall gate
Apr 23, 2026
79e57f3
feat(rulake): witness-addressed cache — cross-backend sharing via SHA…
Apr 23, 2026
9d9bf30
feat(rulake): LRU eviction with max_entries — bounded-memory mode
Apr 23, 2026
4df5bc8
feat(rulake): bundle FS persistence — write_to_dir + read_from_dir
Apr 23, 2026
f88016c
feat(rulake): rayon parallel fan-out — 4× prime speedup on 4 shards
Apr 23, 2026
a604fd2
feat(rulake): FsBackend — real file-based adapter with mtime witness
Apr 23, 2026
fedaa85
test(rulake): concurrent query hammer — M3 multi-client smoke
Apr 23, 2026
e896f4b
docs(adr-155): promote to Accepted (M1) — measured + reframed
Apr 23, 2026
865e2c8
feat(rulake): publish_bundle — writer side of the bundle protocol
Apr 23, 2026
ec5ce6c
feat(rulake): refresh_from_bundle_dir — reader side of sidecar protocol
Apr 23, 2026
d0c633d
docs(adr-155): close cache-sidecar-daemon question — iter 10 resolved it
Apr 23, 2026
a68a2ed
bench(rulake): concurrent-clients × shard-count — honest rayon finding
Apr 23, 2026
a20d293
docs(adr-155): file per-shard-rerank optimization as M2 cross-crate task
Apr 23, 2026
4546015
feat(rulake): hit_rate + avg_prime_ms accessors on CacheStats
Apr 23, 2026
93146fe
feat(rulake,rabitq): adaptive per-shard rerank — 4-shard 0.60× → 0.98×
Apr 23, 2026
1a50c14
docs(adr-155): cache-first reframe + 95% gate + strategic questions
Apr 23, 2026
773d05c
feat(rulake): Consistency::Frozen + ADR-156 substrate positioning
Apr 24, 2026
74f218a
docs(adr-157): optional accelerator plane — VectorKernel trait + disp…
Apr 24, 2026
bb6080e
feat(rulake): search_batch API — one lock, one coherence check for N …
Apr 24, 2026
9e21d89
feat(rulake): PerBackendStats — hit rate attribution per backend id
Apr 24, 2026
3daa8b1
test(rulake): brain_substrate_acceptance — the six-guarantee loop
Apr 24, 2026
39110f0
bench(rulake): search_batch vs per-query — 1.05× warm, big latent wins
Apr 24, 2026
2bdfd34
feat(rabitq,rulake): VectorKernel + memory_class + per-collection sta…
Apr 24, 2026
39e0b4f
security+perf(rulake): path-traversal fix + JSON caps + Arc-drop-lock…
Apr 24, 2026
87c6ef2
docs(rulake): comprehensive README — features, usages, benchmarks, guide
Apr 24, 2026
d9aedaa
perf(rabitq,rulake): parallel prime via rayon — 11× faster at n=100k
Apr 24, 2026
4e541fd
docs(rulake): rewrite README — clearer intro, benefits, RuVector posi…
Apr 24, 2026
fdc43fb
security(rulake): 3 audit findings — DoS caps + 32-bit truncation + G…
Apr 24, 2026
7f95bb0
perf(rabitq): flatten originals Vec<Vec<f32>> → contiguous Vec<f32>
Apr 24, 2026
4f458cd
perf(rabitq): thread-local scratch in encode_query_packed — 3 allocs → 1
Apr 24, 2026
a0fdd4d
feat(rulake): per-shard over-request for federated top-K (SOTA folklo…
Apr 24, 2026
5a4b0d7
perf(rabitq): AVX2 popcount kernel with runtime dispatch — +20% QPS a…
Apr 24, 2026
5f32fd4
perf(rulake): CacheKey Arc<str> intern — cheap refcount clones on hot…
Apr 24, 2026
a659919
docs(bench): update BENCHMARK.md with wave-2 stacked numbers
Apr 24, 2026
835f350
feat(rabitq): persistence + randomized Hadamard rotation — 2 M2 items
Apr 24, 2026
f357801
feat(rabitq): Hadamard rotation integration + ADR-158 positioning
Apr 24, 2026
bf48f16
bench(rabitq,rulake): Hadamard vs Haar — 3× prime speedup at D=128
Apr 24, 2026
2139631
docs(bench): add Hadamard rotation table — 3× build speedup at D=128
Apr 24, 2026
0ceba2a
feat(rabitq,rulake): persist end-to-end — save_cache_to_dir + warm_fr…
Apr 24, 2026
d60c802
feat(rabitq,rulake): external_ids accessor + warm_restart example — c…
Apr 24, 2026
2c4b7dd
perf(rabitq): AVX-512 VPOPCNTDQ scan variant — +10.5% single-thread a…
Apr 24, 2026
e63fda6
chore(rulake): add version to ruvector-rabitq path dep for crates.io
Apr 24, 2026
f5003bc
ci: mirror crates/ruvector-rulake/ + ADRs to ruvnet/RuLake on push
Apr 24, 2026
96d8fdc
chore(workspace): cargo fmt — mechanical whitespace fix across 427 files
Apr 24, 2026
758fce1
chore(workspace): cargo fmt nested workspaces — rvf/, examples/*
Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
127 changes: 127 additions & 0 deletions .github/workflows/mirror-rulake.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
name: Mirror ruvector-rulake → ruvnet/RuLake

# Keeps the public ruvnet/RuLake repo in sync with the canonical
# source at crates/ruvector-rulake/ inside this monorepo. Triggered
# on push to main whenever either the crate or its ADRs change.
#
# ruvnet/RuLake is a **mirror** — do not commit to it directly.
# Changes land there automatically from this workflow with an
# attribution commit message.
#
# One-time setup (operator):
# 1. Generate a fine-grained PAT at
# github.com/settings/personal-access-tokens/new
# with write access to contents of ruvnet/RuLake only.
# 2. Add it as a repository secret on this repo named
# RULAKE_MIRROR_PAT.
# 3. Confirm ruvnet/RuLake exists and the PAT can push to it.
#
# The built-in GITHUB_TOKEN cannot push to another repo, hence the PAT.

on:
push:
branches: [main]
paths:
- 'crates/ruvector-rulake/**'
- 'docs/adr/ADR-155-*'
- 'docs/adr/ADR-156-*'
- 'docs/adr/ADR-157-*'
- 'docs/adr/ADR-158-*'
- '.github/workflows/mirror-rulake.yml'
workflow_dispatch: {}

concurrency:
group: mirror-rulake
cancel-in-progress: false

jobs:
mirror:
name: Sync crate + ADRs to ruvnet/RuLake
runs-on: ubuntu-latest
steps:
- name: Checkout monorepo
uses: actions/checkout@v4
with:
fetch-depth: 1

- name: Checkout RuLake mirror
uses: actions/checkout@v4
with:
repository: ruvnet/RuLake
token: ${{ secrets.RULAKE_MIRROR_PAT }}
path: rulake-mirror
fetch-depth: 1

- name: Sync files
run: |
set -euo pipefail

# /crate/ — the full Rust source tree of the crate.
# --delete keeps the mirror an exact reflection; we never
# carry orphaned files from deleted monorepo paths.
mkdir -p rulake-mirror/crate
rsync -av --delete \
--exclude='target/' \
--exclude='.idea/' \
--exclude='*.rs.bk' \
crates/ruvector-rulake/ rulake-mirror/crate/

# /docs/adr/ — the four ADRs scoped to ruLake. Only ruLake's
# ADRs are copied; the full docs/adr/ tree is not exposed.
mkdir -p rulake-mirror/docs/adr
cp docs/adr/ADR-155-rulake-datalake-layer.md rulake-mirror/docs/adr/
cp docs/adr/ADR-156-rulake-as-memory-substrate.md rulake-mirror/docs/adr/
cp docs/adr/ADR-157-optional-accelerator-plane.md rulake-mirror/docs/adr/
cp docs/adr/ADR-158-optional-rotation-and-qvcache-positioning.md rulake-mirror/docs/adr/

# A tombstone marker so humans who stumble into the repo
# understand it's auto-generated.
cat > rulake-mirror/MIRROR.md <<'EOF'
# This is a mirror

The canonical source lives at
[ruvnet/ruvector](https://github.com/ruvnet/ruvector) under
[`crates/ruvector-rulake/`](https://github.com/ruvnet/ruvector/tree/main/crates/ruvector-rulake).

Contents of this repo:
- `README.md` — hand-maintained landing page
- `crate/` — **auto-synced** from `crates/ruvector-rulake/`
- `docs/adr/` — **auto-synced** (ADR-155 through ADR-158)

Do not open PRs against `crate/` or `docs/adr/` here — they
will be overwritten on the next sync. Send changes to
ruvnet/ruvector instead.

The sync is driven by
[.github/workflows/mirror-rulake.yml](https://github.com/ruvnet/ruvector/blob/main/.github/workflows/mirror-rulake.yml)
and runs on every push to `main` that touches the crate or
its ADRs.
EOF

- name: Commit & push to RuLake
working-directory: rulake-mirror
env:
UPSTREAM_SHA: ${{ github.sha }}
UPSTREAM_REF: ${{ github.ref_name }}
run: |
set -euo pipefail
git config user.name "ruvnet-mirror-bot"
git config user.email "ruvnet-mirror-bot@users.noreply.github.com"

if [[ -z "$(git status --porcelain)" ]]; then
echo "no-op: mirror already up to date"
exit 0
fi

# Short subject line, full provenance in the body.
git add -A
git commit -m "mirror: ruvnet/ruvector@${UPSTREAM_SHA:0:12}

Auto-synced from ruvnet/ruvector on ${UPSTREAM_REF}.

Source commit: https://github.com/ruvnet/ruvector/commit/${UPSTREAM_SHA}

Do not commit to this repo directly; changes flow from
ruvnet/ruvector via .github/workflows/mirror-rulake.yml."

git push
15 changes: 15 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
exclude = ["crates/micro-hnsw-wasm", "crates/ruvector-hyperbolic-hnsw", "crates/ruvector-hyperbolic-hnsw-wasm", "examples/ruvLLM/esp32", "examples/ruvLLM/esp32-flash", "examples/edge-net", "examples/data", "examples/ruvLLM", "examples/delta-behavior", "crates/rvf", "crates/rvf/*", "crates/rvf/*/*", "examples/rvf-desktop", "crates/mcp-brain-server"]
members = [
"crates/ruvector-rabitq",
"crates/ruvector-rulake",
"crates/ruvector-core",
"crates/ruvector-node",
"crates/ruvector-wasm",
Expand Down
5 changes: 4 additions & 1 deletion crates/cognitum-gate-kernel/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,10 @@ pub unsafe extern "C" fn ingest_delta(ptr: *const u8, len: usize) -> i32 {
///
/// Returns 1 on success, 0 if buffer is full or tile not initialized.
#[no_mangle]
#[deprecated(since = "0.1.2", note = "Use ingest_delta(ptr, len) with bounds checking")]
#[deprecated(
since = "0.1.2",
note = "Use ingest_delta(ptr, len) with bounds checking"
)]
#[must_use]
pub unsafe extern "C" fn ingest_delta_unchecked(ptr: *const u8) -> i32 {
// Use Delta size as implied length
Expand Down
5 changes: 4 additions & 1 deletion crates/cognitum-gate-kernel/tests/security_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,10 @@ fn test_buffer_full_behavior() {
}

// Buffer should now be full
assert_eq!(tile.delta_count as usize, cognitum_gate_kernel::MAX_DELTA_BUFFER);
assert_eq!(
tile.delta_count as usize,
cognitum_gate_kernel::MAX_DELTA_BUFFER
);

// Next insert should fail
let delta = Delta::edge_add(999, 1000, 100);
Expand Down
9 changes: 7 additions & 2 deletions crates/mcp-brain-server/src/auth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ use axum::{
extract::FromRequestParts,
http::{request::Parts, StatusCode},
};
use sha3::{Shake256, digest::{Update, ExtendableOutput, XofReader}};
use sha3::{
digest::{ExtendableOutput, Update, XofReader},
Shake256,
};
use subtle::ConstantTimeEq;

/// Authenticated contributor extracted from request
Expand Down Expand Up @@ -53,7 +56,9 @@ const MIN_API_KEY_LEN: usize = 8;
/// If BRAIN_SYSTEM_KEY is unset, system key authentication is disabled entirely
/// (no hardcoded fallback).
static SYSTEM_KEY: std::sync::LazyLock<Option<String>> = std::sync::LazyLock::new(|| {
std::env::var("BRAIN_SYSTEM_KEY").ok().filter(|k| !k.is_empty())
std::env::var("BRAIN_SYSTEM_KEY")
.ok()
.filter(|k| !k.is_empty())
});

#[axum::async_trait]
Expand Down
Loading
Loading