Skip to content

fix(ruvector): ONNX embedder API contract + cosine-safe worker pool (… #486

fix(ruvector): ONNX embedder API contract + cosine-safe worker pool (…

fix(ruvector): ONNX embedder API contract + cosine-safe worker pool (… #486

Workflow file for this run

name: Workspace CI
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
# Skip building unused proc-macro features in test bin link steps
CARGO_INCREMENTAL: 0
jobs:
fmt:
name: Rustfmt
runs-on: ubuntu-22.04
timeout-minutes: 30
continue-on-error: true
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Check formatting
run: cargo fmt --all -- --check
check:
name: Cargo check
runs-on: ubuntu-22.04
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust
uses: Swatinem/rust-cache@v2
- name: Cargo check (workspace)
run: cargo check --workspace --exclude ruvector-postgres
clippy:
name: Clippy
runs-on: ubuntu-22.04
timeout-minutes: 30
continue-on-error: true
steps:
- uses: actions/checkout@v4
- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- name: Cache Rust
uses: Swatinem/rust-cache@v2
- name: Clippy (workspace)
run: cargo clippy --workspace --exclude ruvector-postgres --all-targets -- -W warnings
# The full workspace test suite exceeds the 30-minute timeout on a single
# runner. We split the work into parallel matrix jobs grouped by domain so
# each shard fits comfortably under the timeout, and use `cargo-nextest` for
# faster test discovery and execution.
test:
name: Tests (${{ matrix.name }})
runs-on: ubuntu-22.04
# `core-and-rest` is the catch-all shard and compiles ~50 crates; on a
# cold cache the build alone has hit ~90min, so headroom matters more
# than tight feedback for this job. Faster shards still finish in ~10–20m.
# Iter 231 — bumped 150→180. Historical successful runs landed at
# 2h 30m 16s (just under the old cap); two PR-413 runs (iter 228 +
# iter 230) both hit the cap and got cancelled mid-test. Excluding
# the iter-219 hailo crates from the catch-all (iter 230) was a
# necessary but not sufficient fix — the shard was already at the
# ragged edge. Iter 232+ — natural duration drifted to 155–165 min
# (ci/supply-chain-guards branch), hitting the 180-min cap. Bumped
# 180→240 to restore headroom. The right long-term fix is to split
# heavy crates out into a new sibling shard.
timeout-minutes: 240
strategy:
fail-fast: false
matrix:
include:
- name: vector-index
packages: >-
-p ruvector-rabitq
-p ruvector-rulake
-p ruvector-diskann
-p ruvector-graph
-p ruvector-gnn
-p ruvector-cnn
- name: rvagent
packages: >-
-p rvagent-a2a
-p rvagent-acp
-p rvagent-backends
-p rvagent-cli
-p rvagent-core
-p rvagent-mcp
-p rvagent-middleware
-p rvagent-subagents
-p rvagent-tools
-p rvagent-wasm
- name: ruvix
packages: >-
-p ruvix-aarch64
-p ruvix-bench
-p ruvix-boot
-p ruvix-cap
-p ruvix-demo
-p ruvix-drivers
-p ruvix-hal
-p ruvix-integration
-p ruvix-nucleus
-p ruvix-proof
-p ruvix-queue
-p ruvix-region
-p ruvix-sched
-p ruvix-shell
-p ruvix-types
-p ruvix-vecgraph
- name: ruqu-quantum
packages: >-
-p ruqu
-p ruqu-algorithms
-p ruqu-core
-p ruqu-exotic
-p ruqu-wasm
- name: ml-research-heavy
# Heaviest crates split into their own shard so ml-research
# doesn't exceed the 45-min timeout.
packages: >-
-p ruvector-attention
-p ruvector-mincut
-p ruvector-fpga-transformer
-p ruvector-graph-transformer
- name: ml-research-rest
packages: >-
-p ruvector-scipix
-p ruvector-sparse-inference
-p ruvector-sparsifier
-p ruvector-solver
-p ruvector-domain-expansion
-p ruvector-robotics
- name: core-and-rest-heavy
# Hoist the known-heavy long-tail crates out of core-and-rest
# so neither shard exceeds the 90-min timeout.
packages: >-
-p ruvllm
-p ruvllm-cli
-p ruvector-dag
-p ruvector-nervous-system
-p ruvector-math
-p ruvector-consciousness
-p prime-radiant
-p mcp-brain
-p ruvector-decompiler
- name: core-and-rest-wasm
# Iter 232 — split out the 29 *-wasm crates from core-and-rest
# because the catch-all shard had grown to 115 crates and was
# consistently missing the 180min cap (iter-228 + iter-230 +
# iter-231 all cancelled at the timeout boundary). The wasm
# crates are a natural sub-group: thin bindings on top of host
# crates, easy to compile + test in isolation.
packages: >-
-p neural-trader-wasm
-p ruvector-acorn-wasm
-p ruvector-attention-unified-wasm
-p ruvector-attention-wasm
-p ruvector-cnn-wasm
-p ruvector-consciousness-wasm
-p ruvector-dag-wasm
-p ruvector-decompiler-wasm
-p ruvector-delta-wasm
-p ruvector-domain-expansion-wasm
-p ruvector-economy-wasm
-p ruvector-exotic-wasm
-p ruvector-fpga-transformer-wasm
-p ruvector-gnn-wasm
-p ruvector-graph-transformer-wasm
-p ruvector-graph-wasm
-p ruvector-learning-wasm
-p ruvector-math-wasm
-p ruvector-mincut-gated-transformer-wasm
-p ruvector-mincut-wasm
-p ruvector-nervous-system-wasm
-p ruvector-rabitq-wasm
-p ruvector-router-wasm
-p ruvector-solver-wasm
-p ruvector-sparsifier-wasm
-p ruvector-tiny-dancer-wasm
-p ruvector-verified-wasm
-p ruvector-wasm
# Iter 233 — `ruvllm-wasm` excluded from native nextest:
# 11 of its 195 tests (sona_instant + workers::feature_detect)
# fail or SIGABRT on native because they're wasm-target
# specific (need wasm-bindgen-test). Surfaced by iter-232's
# split; previously masked by the iter-228..231 timeout
# cancellations of the megaShard. Tracking as workspace
# follow-up — fix is to gate the affected modules behind
# `#[cfg(target_arch = "wasm32")]` or migrate to
# wasm-bindgen-test runners.
- name: core-and-rest
# Everything else: core, delta, server/cluster, etc.
# Uses --workspace + --exclude to subtract the groups above so we
# don't have to enumerate ~100 crates by hand.
packages: >-
--workspace
--exclude ruvector-postgres
--exclude ruvector-decompiler
--exclude ruvllm
--exclude ruvllm-cli
--exclude ruvector-dag
--exclude ruvector-nervous-system
--exclude ruvector-math
--exclude ruvector-consciousness
--exclude prime-radiant
--exclude mcp-brain
--exclude ruvector-rabitq
--exclude ruvector-rulake
--exclude ruvector-diskann
--exclude ruvector-graph
--exclude ruvector-gnn
--exclude ruvector-cnn
--exclude rvagent-a2a
--exclude rvagent-acp
--exclude rvagent-backends
--exclude rvagent-cli
--exclude rvagent-core
--exclude rvagent-mcp
--exclude rvagent-middleware
--exclude rvagent-subagents
--exclude rvagent-tools
--exclude rvagent-wasm
--exclude ruvix-aarch64
--exclude ruvix-bench
--exclude ruvix-boot
--exclude ruvix-cap
--exclude ruvix-demo
--exclude ruvix-drivers
--exclude ruvix-hal
--exclude ruvix-integration
--exclude ruvix-nucleus
--exclude ruvix-proof
--exclude ruvix-queue
--exclude ruvix-region
--exclude ruvix-sched
--exclude ruvix-shell
--exclude ruvix-types
--exclude ruvix-vecgraph
--exclude ruqu
--exclude ruqu-algorithms
--exclude ruqu-core
--exclude ruqu-exotic
--exclude ruqu-wasm
--exclude ruvector-attention
--exclude ruvector-mincut
--exclude ruvector-scipix
--exclude ruvector-fpga-transformer
--exclude ruvector-sparse-inference
--exclude ruvector-sparsifier
--exclude ruvector-solver
--exclude ruvector-graph-transformer
--exclude ruvector-domain-expansion
--exclude ruvector-robotics
--exclude hailort-sys
--exclude ruvector-hailo
--exclude ruvector-mmwave
--exclude ruvector-hailo-cluster
--exclude neural-trader-wasm
--exclude ruvector-acorn-wasm
--exclude ruvector-attention-unified-wasm
--exclude ruvector-attention-wasm
--exclude ruvector-cnn-wasm
--exclude ruvector-consciousness-wasm
--exclude ruvector-dag-wasm
--exclude ruvector-decompiler-wasm
--exclude ruvector-delta-wasm
--exclude ruvector-domain-expansion-wasm
--exclude ruvector-economy-wasm
--exclude ruvector-exotic-wasm
--exclude ruvector-fpga-transformer-wasm
--exclude ruvector-gnn-wasm
--exclude ruvector-graph-transformer-wasm
--exclude ruvector-graph-wasm
--exclude ruvector-learning-wasm
--exclude ruvector-math-wasm
--exclude ruvector-mincut-gated-transformer-wasm
--exclude ruvector-mincut-wasm
--exclude ruvector-nervous-system-wasm
--exclude ruvector-rabitq-wasm
--exclude ruvector-router-wasm
--exclude ruvector-solver-wasm
--exclude ruvector-sparsifier-wasm
--exclude ruvector-tiny-dancer-wasm
--exclude ruvector-verified-wasm
--exclude ruvector-wasm
--exclude ruvllm-wasm
steps:
- uses: actions/checkout@v4
- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust
uses: Swatinem/rust-cache@v2
with:
key: test-${{ matrix.name }}
- name: Install cargo-nextest
uses: taiki-e/install-action@v2
with:
tool: cargo-nextest
- name: Run tests (${{ matrix.name }})
run: cargo nextest run --no-fail-fast ${{ matrix.packages }}
- name: Run doctests (${{ matrix.name }})
# nextest does not run doctests; do them in a separate step. Cheap
# because compilation is already cached from the nextest run.
run: cargo test --doc ${{ matrix.packages }}
audit:
name: Security audit
runs-on: ubuntu-22.04
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: Install cargo-audit
uses: taiki-e/install-action@v2
with:
tool: cargo-audit
- name: Run cargo audit
# Configuration (including the justified ignore list) lives in
# .cargo/audit.toml at the workspace root.
run: cargo audit