ci: split platform crates from workspace catch-all - #822
Conversation
The `core-and-rest` catch-all shard was not sharding. Its `packages:` value
is a YAML folded scalar (`>-`) that contained `#`-prefixed lines *inside*
the scalar. Those are content, not YAML comments: folding joins the whole
block onto one line, and when `run:` expands `${{ matrix.packages }}` the
shell treats the first `#` as the start of a comment and truncates the rest
of the command.
The effective command was therefore:
cargo nextest run --no-fail-fast --workspace
0 of 162 `--exclude` flags survived. Every shard split landed in iters
230-240 was inert — the catch-all kept building and testing all 210
workspace crates, which is why it kept drifting into the job timeout no
matter how many crates were hoisted out of it. The doctest step had the
same truncation. `core-and-rest-wasm` had the same defect but its inline
comment was trailing prose with no flags after it, so all 29 `-p` flags
survived; fixed anyway so the pattern does not get copied.
Move every comment above the `packages:` key at mapping level, where YAML
strips it — the pattern the `core-platform` entry already used. The folded
scalars now contain only `--workspace`, `--exclude <crate>`, and
`-p <crate>` tokens.
Verified by parsing the workflow with PyYAML and diffing each shard's
effective package set against `cargo metadata`: 162 excludes / 50 effective
packages in the catch-all, 203 of 210 crates covered, no crate built twice.
Also add `.config/nextest.toml` with a 10-minute per-test kill switch.
`ruvector-delta-index::tests::test_insert_and_search` hangs indefinitely in
DeltaHnsw insert/search rather than failing, and with no timeout it consumed
3h52m of the 240-minute `core-platform` budget. Hold that crate out of CI
until it is fixed (#825).
Co-Authored-By: claude-flow <ruv@ruv.net>
Review — 2 blocking issues found and fixedReviewed against this PR's own CI run logs. The shard split arithmetic is correct, but two defects made it ineffective. Both are fixed in 09cccfe. Finding 1 (critical): every
|
| shard | mode | excludes | effective pkgs |
|---|---|---|---|
| vector-index | -p list |
0 | 6 |
| rvagent | -p list |
0 | 10 |
| ruvix | -p list |
0 | 16 |
| ml-research-heavy | -p list |
0 | 4 |
| ml-research-rest | -p list |
0 | 6 |
| core-and-rest-heavy | -p list |
0 | 9 |
| core-and-rest-wasm | -p list |
0 | 29 |
| research-nightly | -p list |
0 | 12 |
| core-and-rest-examples | -p list |
0 | 36 |
| core-platform (new) | -p list |
0 | 25 |
| core-and-rest | --workspace |
162 | 50 |
- 26 crates moved into
core-platformby this PR; 25 remain after holding outruvector-delta-index. Each has a matching--excludein the catch-all. - No crate is built twice — the previously double-built
ruvector-decompileris fixed (it is incore-and-rest-heavyand excluded from the catch-all exactly once). - 203 of 210 crates covered. The 7 uncovered are all deliberate: the 4 hailo crates (
hailort-sys,ruvector-hailo,ruvector-hailo-cluster,ruvector-mmwave),ruvllm-wasm(wasm-target-only tests SIGABRT on native),timesfm(tested by its own dedicated step with--features candle), andruvector-delta-index(ruvector-delta-index test_insert_and_search hangs indefinitely (DeltaHnsw insert/search) #825).
Only after Finding 1 is fixed do those 162 excludes take effect — so this is the first run where the shard split will actually reduce the catch-all's workload, from 210 crates to 50.
Note on scope
Two pre-existing --exclude targets are not workspace members: ruvector-postgres and timesfm-wasm. Harmless and unrelated to this PR, so left alone.
Review and fixes generated by Claude.
The terminate-after cap added in ruvnet#822 (10 minutes) was sized for the regular shards and killed legitimately long tests on the first sharded run of main: ruvector-mincut subpolynomial tests and ruvector-nervous-system pattern_separation_collision_rate all TIMEOUT at exactly 600s in run 31714159600, failing ml-research-heavy and core-and-rest-heavy. Historical successful runs of those shards take up to ~75 minutes with individual tests exceeding 10 minutes by design. Scope a slow-timeout override to the 13 packages of the two heavy shards: 300s SLOW reporting period, killed after 18 periods (90 min) — still bounding a genuine hang at 1.5h instead of the 4h job budget. Co-Authored-By: claude-flow <ruv@ruv.net>
Summary
core-platformtest shardcore-and-restcatch-all from 78 packages to 50ruvector-graph-condense-wasminto the WASM shard and correct the duplicated decompiler exclusionWhy
The post-merge and PR validations for #821 remained in the catch-all test step beyond the historical 155–165 minute completion window. Five preceding runs timed out at 240 minutes with compile/link processes still active. This additional split keeps full test/doctest coverage while reducing cold-cache linker pressure.
Validation
core-platformpackage names exist in workspace metadatacore-platformpackage overlaps another explicit shardgit diff --checkpasses