fix(ci): run the Rust lanes when any vendored crate moves - #5616
Conversation
A submodule pointer bump currently skips every openhuman Rust lane while the aggregate gate still reports success. Reproduced on the tip of main: 92bab8d "bump tinycortex" - the only change is the vendor/tinycortex pointer CI Lite run 32358998415: success TinyCortex Memory Tests success PR CI Gate skipped Rust Quality (fmt, clippy) skipped Rust Core Coverage (cargo-llvm-cov) skipped Rust Feature-Gate Smoke (gates off) skipped Rust Tauri Coverage (cargo-llvm-cov) So the current tip of main has never been compiled by CI, and main is what gets promoted to release. Cause: the `rust-core` and `rust-core-full` filters enumerated exactly two vendored paths - `vendor/motosan-ai-oauth/**` and `vendor/tinychannels` - out of ten submodules, and `rust-tauri` named none at all. The `tinycortex` filter that did match feeds only TinyCortex's own test lane, which is why that ran while nothing compiled openhuman against the new pin. Every vendored crate is force-resolved by path through `[patch.crates-io]`, in BOTH cargo worlds, so any pointer bump changes what the core and the shell compile against. This is the same defect the release Docker job had: a hand-maintained submodule list that went stale three times before fe5bcb2 (tinyhumansai#5596) replaced it with `--init --recursive`. Enumerating the ten paths here would fail the same way on the eleventh, so this matches on `vendor/**` and `.gitmodules` instead. `rust-core-full` gets them too: a dependency-graph change invalidates per-module test scoping exactly as a Cargo.lock change does, so a bump should run the full suite rather than a scoped subset. Cost: a vendored bump now runs the full Rust lanes rather than nothing. That is the point - eight of the ten crates could previously move with zero verification. Refs tinyhumansai#5595
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 10 included reviews per hour; 7 remain after this review. 📝 WalkthroughWalkthroughCI path filters now detect all vendored submodule and ChangesVendored dependency CI coverage
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to This change makes vendored-crate updates run the relevant Rust CI lanes instead of being skipped; it only increases validation coverage, and no actionable merge-blocking risk remains after normal checks and review. Possibly related PRs
Suggested labels: Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Verification follow-up: the glob was reproducible locally after allThe body lists this under Validation Blocked ("not reproducible locally"). The part that actually
Run against both picomatch majors in the repo's pnpm store (2.3.2 and 4.0.4),
Three things this pins down:
Corroborating live evidence: the pre-existing Also checked the one risk the widening introduces: every lane this can newly trigger No code change — evidence only. Adjacent gap, deliberately not folded inThe |
Summary
PR CI Gatestill reports success.vendor/**, because the enumeration is what went stale.Problem
92bab8df("bump tinycortex") changes exactly one thing — thevendor/tinycortexpointer. CI Lite run 32358998415:That commit is the current tip of
main, so the tip of main has not been compiled by CI, andmainis whatpromote-main-to-release.ymlmoves torelease.The
changesfilters enumerate vendored paths and the list is stale:rust-coreandrust-core-fullnamevendor/motosan-ai-oauth/**andvendor/tinychannels— 2 of 10 submodules, andmotosan-ai-oauthis an in-tree directory rather than a submodule.rust-taurinames none at all. Thetinycortexfilter that did match feeds only TinyCortex's own test lane, which is why that ran while nothing compiled openhuman against the new pin.Every vendored crate is force-resolved by path through
[patch.crates-io]in both cargo worlds, so any bump changes what the core and the shell compile against.Solution
Match
vendor/**and.gitmodulesinrust-core,rust-core-fullandrust-tauri.Deliberately not a list of the ten current submodules. The release Docker job had this exact defect: its hand-maintained list went stale three times before
fe5bcb22(#5596) replaced it with--init --recursive, and that commit message says so. A list here fails the same way on the eleventh crate.rust-core-fullgets them too — a dependency-graph change invalidates per-module test scoping for the same reason aCargo.lockchange does.Cost: a vendored bump now runs the full Rust lanes rather than nothing. That is the intent; eight of the ten crates could previously move with zero verification.
Submission Checklist
N/A: CI path-filter configuration.The behaviour under change is which jobs a given diff triggers, which is only observable in a real CI run; the reproduction is quoted above and the fix is verifiable by pushing a vendor-only diff.N/A: no executable lines changed.YAML filter globs and comments.N/A: no feature added, removed or renamed.## Related—N/A: no matrix feature IDs touched.N/A: does not touch a release-cut surface.Closes #NNN— see## Related.Impact
Related
AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
Validation Run
pnpm --filter openhuman-app format:check— N/A: no formatted source changed (workflow YAML only).pnpm typecheck— N/A: no TypeScript changed.Validation Blocked
command:observing the filter fire on a vendored bumperror:not reproducible locally —dorny/paths-filterevaluates against the PR's changed-file set on GitHubimpact:verified by reading the filters against the observed skip in run 32358998415; the first vendored bump after merge is the live confirmation.Behavior Changes
vendor/**or.gitmodulesnow triggers the Rust lanes in full-suite mode.Parity Contract
vendor/**is a superset of the two paths previously named, so nothing that triggered before stops triggering.Duplicate / Superseded PR Handling
Summary by CodeRabbit