fix(ruvector): ONNX embedder API contract + cosine-safe worker pool (… #486
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |