Skip to content

Commit e72fa3b

Browse files
authored
Merge pull request #389 from ruvnet/feature/test-flake-real-fixes
test: real fixes for env-flaky tests (procfs probe + smoke/perf split)
2 parents 4a3d8bf + 767dc12 commit e72fa3b

23 files changed

Lines changed: 698 additions & 195 deletions

File tree

.cargo/audit.toml

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# cargo-audit configuration for the ruvector workspace.
2+
#
3+
# Ignored advisories MUST have a justification. Anything fixable should be
4+
# fixed via a dependency bump rather than ignored here. Re-evaluate the
5+
# `until` dates periodically.
6+
7+
[advisories]
8+
ignore = [
9+
# ------------------------------------------------------------------
10+
# Vulnerabilities (genuinely no upstream fix available)
11+
# ------------------------------------------------------------------
12+
13+
# rsa 0.9.x — Marvin Attack (timing sidechannel on RSA decryption).
14+
# No fixed upgrade is available from upstream `rsa`. We do not expose
15+
# an RSA decryption oracle: TLS in this workspace runs on rustls with
16+
# Ed25519/X25519 suites, and `rsa` is pulled only transitively (e.g.
17+
# SQL drivers, JWT verification paths) where we never decrypt
18+
# attacker-controlled ciphertexts under a long-lived RSA key.
19+
# Re-evaluate when the `rsa` crate ships a constant-time implementation.
20+
"RUSTSEC-2023-0071",
21+
22+
# ------------------------------------------------------------------
23+
# "Unmaintained" warnings (informational, not vulnerabilities)
24+
# ------------------------------------------------------------------
25+
# These are pulled transitively through deps we do not control. They
26+
# are not exploitable on their own; they are notices that the upstream
27+
# crate is no longer accepting patches. We mute them to keep CI clean
28+
# and revisit when the parent dep migrates.
29+
30+
"RUSTSEC-2021-0140", # rusttype — transitive via plotters; pure rendering, no untrusted input
31+
"RUSTSEC-2022-0054", # wee_alloc — transitive via wasm-bindgen-cli internals
32+
"RUSTSEC-2024-0370", # proc-macro-error — build-time only (proc-macro), no runtime exposure
33+
"RUSTSEC-2024-0380", # pqcrypto-dilithium — replaced by pqcrypto-mldsa, awaiting parent migration
34+
"RUSTSEC-2024-0381", # pqcrypto-kyber — replaced by pqcrypto-mlkem, awaiting parent migration
35+
"RUSTSEC-2024-0384", # instant — transitive via parking_lot/older time deps
36+
"RUSTSEC-2024-0388", # derivative — transitive proc-macro
37+
"RUSTSEC-2024-0436", # paste — transitive proc-macro, build-time only
38+
"RUSTSEC-2025-0119", # number_prefix — transitive via indicatif rendering
39+
"RUSTSEC-2025-0124", # rand_os — transitive, replaced by getrandom in modern code paths
40+
"RUSTSEC-2025-0134", # rustls-pemfile — transitive; rustls itself is current
41+
"RUSTSEC-2025-0141", # bincode — unmaintained notice; we pin a known-good version
42+
"RUSTSEC-2026-0105", # core2 — transitive, no_std fallback for std::io types
43+
44+
# ------------------------------------------------------------------
45+
# Soundness/unsoundness notices in deps we do not directly control
46+
# ------------------------------------------------------------------
47+
48+
# lru — IterMut Stacked Borrows violation. Used transitively; we do
49+
# not call IterMut from the affected crate. Track parent dep upgrade.
50+
"RUSTSEC-2024-0408",
51+
52+
# pprof — unsound `slice::from_raw_parts` usage. Only loaded behind
53+
# benchmark/profiling features, never in production binaries.
54+
"RUSTSEC-2026-0002",
55+
56+
# rand — unsoundness when using a custom global logger with rand::rng().
57+
# We never install a custom logger in the rand call path. Awaiting
58+
# transitive upgrade across the workspace.
59+
"RUSTSEC-2026-0097",
60+
]

.github/workflows/ci.yml

Lines changed: 171 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ on:
88
env:
99
CARGO_TERM_COLOR: always
1010
RUST_BACKTRACE: 1
11+
# Skip building unused proc-macro features in test bin link steps
12+
CARGO_INCREMENTAL: 0
1113

1214
jobs:
1315
fmt:
@@ -67,10 +69,158 @@ jobs:
6769
- name: Clippy (workspace)
6870
run: cargo clippy --workspace --exclude ruvector-postgres --all-targets -- -W warnings
6971

72+
# The full workspace test suite exceeds the 30-minute timeout on a single
73+
# runner. We split the work into parallel matrix jobs grouped by domain so
74+
# each shard fits comfortably under the timeout, and use `cargo-nextest` for
75+
# faster test discovery and execution.
7076
test:
71-
name: Tests
77+
name: Tests (${{ matrix.name }})
7278
runs-on: ubuntu-latest
73-
timeout-minutes: 30
79+
# `core-and-rest` is the catch-all shard and compiles ~50 crates; on a
80+
# cold cache the build alone has hit ~90min, so headroom matters more
81+
# than tight feedback for this job. Faster shards still finish in ~10–20m.
82+
timeout-minutes: 150
83+
strategy:
84+
fail-fast: false
85+
matrix:
86+
include:
87+
- name: vector-index
88+
packages: >-
89+
-p ruvector-rabitq
90+
-p ruvector-rulake
91+
-p ruvector-diskann
92+
-p ruvector-graph
93+
-p ruvector-gnn
94+
-p ruvector-cnn
95+
- name: rvagent
96+
packages: >-
97+
-p rvagent-a2a
98+
-p rvagent-acp
99+
-p rvagent-backends
100+
-p rvagent-cli
101+
-p rvagent-core
102+
-p rvagent-mcp
103+
-p rvagent-middleware
104+
-p rvagent-subagents
105+
-p rvagent-tools
106+
-p rvagent-wasm
107+
- name: ruvix
108+
packages: >-
109+
-p ruvix-aarch64
110+
-p ruvix-bench
111+
-p ruvix-boot
112+
-p ruvix-cap
113+
-p ruvix-demo
114+
-p ruvix-drivers
115+
-p ruvix-hal
116+
-p ruvix-integration
117+
-p ruvix-nucleus
118+
-p ruvix-proof
119+
-p ruvix-queue
120+
-p ruvix-region
121+
-p ruvix-sched
122+
-p ruvix-shell
123+
-p ruvix-types
124+
-p ruvix-vecgraph
125+
- name: ruqu-quantum
126+
packages: >-
127+
-p ruqu
128+
-p ruqu-algorithms
129+
-p ruqu-core
130+
-p ruqu-exotic
131+
-p ruqu-wasm
132+
- name: ml-research-heavy
133+
# Heaviest crates split into their own shard so ml-research
134+
# doesn't exceed the 45-min timeout.
135+
packages: >-
136+
-p ruvector-attention
137+
-p ruvector-mincut
138+
-p ruvector-fpga-transformer
139+
-p ruvector-graph-transformer
140+
- name: ml-research-rest
141+
packages: >-
142+
-p ruvector-scipix
143+
-p ruvector-sparse-inference
144+
-p ruvector-sparsifier
145+
-p ruvector-solver
146+
-p ruvector-domain-expansion
147+
-p ruvector-robotics
148+
- name: core-and-rest-heavy
149+
# Hoist the known-heavy long-tail crates out of core-and-rest
150+
# so neither shard exceeds the 90-min timeout.
151+
packages: >-
152+
-p ruvllm
153+
-p ruvllm-cli
154+
-p ruvector-dag
155+
-p ruvector-nervous-system
156+
-p ruvector-math
157+
-p ruvector-consciousness
158+
-p prime-radiant
159+
-p mcp-brain
160+
-p ruvector-decompiler
161+
- name: core-and-rest
162+
# Everything else: core, delta, server/cluster, etc.
163+
# Uses --workspace + --exclude to subtract the groups above so we
164+
# don't have to enumerate ~100 crates by hand.
165+
packages: >-
166+
--workspace
167+
--exclude ruvector-postgres
168+
--exclude ruvector-decompiler
169+
--exclude ruvllm
170+
--exclude ruvllm-cli
171+
--exclude ruvector-dag
172+
--exclude ruvector-nervous-system
173+
--exclude ruvector-math
174+
--exclude ruvector-consciousness
175+
--exclude prime-radiant
176+
--exclude mcp-brain
177+
--exclude ruvector-rabitq
178+
--exclude ruvector-rulake
179+
--exclude ruvector-diskann
180+
--exclude ruvector-graph
181+
--exclude ruvector-gnn
182+
--exclude ruvector-cnn
183+
--exclude rvagent-a2a
184+
--exclude rvagent-acp
185+
--exclude rvagent-backends
186+
--exclude rvagent-cli
187+
--exclude rvagent-core
188+
--exclude rvagent-mcp
189+
--exclude rvagent-middleware
190+
--exclude rvagent-subagents
191+
--exclude rvagent-tools
192+
--exclude rvagent-wasm
193+
--exclude ruvix-aarch64
194+
--exclude ruvix-bench
195+
--exclude ruvix-boot
196+
--exclude ruvix-cap
197+
--exclude ruvix-demo
198+
--exclude ruvix-drivers
199+
--exclude ruvix-hal
200+
--exclude ruvix-integration
201+
--exclude ruvix-nucleus
202+
--exclude ruvix-proof
203+
--exclude ruvix-queue
204+
--exclude ruvix-region
205+
--exclude ruvix-sched
206+
--exclude ruvix-shell
207+
--exclude ruvix-types
208+
--exclude ruvix-vecgraph
209+
--exclude ruqu
210+
--exclude ruqu-algorithms
211+
--exclude ruqu-core
212+
--exclude ruqu-exotic
213+
--exclude ruqu-wasm
214+
--exclude ruvector-attention
215+
--exclude ruvector-mincut
216+
--exclude ruvector-scipix
217+
--exclude ruvector-fpga-transformer
218+
--exclude ruvector-sparse-inference
219+
--exclude ruvector-sparsifier
220+
--exclude ruvector-solver
221+
--exclude ruvector-graph-transformer
222+
--exclude ruvector-domain-expansion
223+
--exclude ruvector-robotics
74224
steps:
75225
- uses: actions/checkout@v4
76226

@@ -82,20 +232,35 @@ jobs:
82232

83233
- name: Cache Rust
84234
uses: Swatinem/rust-cache@v2
235+
with:
236+
key: test-${{ matrix.name }}
237+
238+
- name: Install cargo-nextest
239+
uses: taiki-e/install-action@v2
240+
with:
241+
tool: cargo-nextest
85242

86-
- name: Run tests (workspace)
87-
run: cargo test --workspace --exclude ruvector-postgres --exclude ruvector-decompiler
243+
- name: Run tests (${{ matrix.name }})
244+
run: cargo nextest run --no-fail-fast ${{ matrix.packages }}
245+
246+
- name: Run doctests (${{ matrix.name }})
247+
# nextest does not run doctests; do them in a separate step. Cheap
248+
# because compilation is already cached from the nextest run.
249+
run: cargo test --doc ${{ matrix.packages }}
88250

89251
audit:
90252
name: Security audit
91253
runs-on: ubuntu-latest
92254
timeout-minutes: 30
93-
continue-on-error: true
94255
steps:
95256
- uses: actions/checkout@v4
96257

97258
- name: Install cargo-audit
98-
run: cargo install cargo-audit --locked
259+
uses: taiki-e/install-action@v2
260+
with:
261+
tool: cargo-audit
99262

100263
- name: Run cargo audit
264+
# Configuration (including the justified ignore list) lives in
265+
# .cargo/audit.toml at the workspace root.
101266
run: cargo audit

0 commit comments

Comments
 (0)