11name : CI
22
3+ # Cancel superseded PR runs; never cancel runs on main / tags / scheduled
4+ # events. See docs/ci-concurrency.md (or the org-wide CI concurrency brief)
5+ # for rationale.
6+ concurrency :
7+ group : ${{ github.workflow }}-${{ github.head_ref || github.ref }}
8+ cancel-in-progress : ${{ github.event_name == 'pull_request' }}
9+
310on :
411 push :
512 branches : [main]
1421 # ── Fast checks ───────────────────────────────────────────────────────
1522 fmt :
1623 name : Format
17- runs-on : ubuntu-latest
24+ runs-on : [self-hosted, linux, x64, light]
1825 steps :
1926 - uses : actions/checkout@v4
2027 - uses : dtolnay/rust-toolchain@nightly
2431
2532 clippy :
2633 name : Clippy
27- runs-on : ubuntu-latest
34+ runs-on : [self-hosted, linux, x64, rust-cpu]
2835 steps :
2936 - uses : actions/checkout@v4
3037 - uses : dtolnay/rust-toolchain@nightly
3643 # ── Tests ─────────────────────────────────────────────────────────────
3744 test :
3845 name : Test
39- runs-on : ubuntu-latest
46+ runs-on : [self-hosted, linux, x64, rust-cpu]
4047 steps :
4148 - uses : actions/checkout@v4
4249 - uses : dtolnay/rust-toolchain@nightly
5865 # ── Bench compile smoke (fast regression gate) ──────────────────────
5966 bench-smoke :
6067 name : Bench compile smoke
61- runs-on : ubuntu-latest
68+ runs-on : [self-hosted, linux, x64, rust-cpu]
6269 steps :
6370 - uses : actions/checkout@v4
6471 - uses : dtolnay/rust-toolchain@nightly
7279 # ── Security audits ──────────────────────────────────────────────────
7380 audit :
7481 name : Security Audit (RustSec)
82+ # Stays on ubuntu-latest temporarily: smithy ships cargo-audit
83+ # v0.21.2 whose bundled rustsec parser still rejects RUSTSEC-2026-0037
84+ # ("unsupported CVSS version: 4.0"). v0.22.1 fixes it but the
85+ # `cargo install --locked cargo-audit` build trips over our
86+ # sccache-on-cc setup (aws-lc-sys C compile fails through sccache).
87+ # Follow-up: drop sccache from ralf's profile before bumping the
88+ # toolchains-role version, then move this back to [self-hosted, light].
7589 runs-on : ubuntu-latest
7690 steps :
7791 - uses : actions/checkout@v4
@@ -81,16 +95,29 @@ jobs:
8195
8296 deny :
8397 name : Cargo Deny
84- runs-on : ubuntu-latest
98+ # Smithy has cargo-deny installed (toolchains role, v0.16.4).
99+ # We avoid EmbarkStudios/cargo-deny-action@v2 because it launches
100+ # a rootless container, which fails on our hardened systemd unit:
101+ # newuidmap is setuid but NoNewPrivileges=true blocks the escalation
102+ # (newuidmap: write to uid_map failed: Operation not permitted).
103+ runs-on : [self-hosted, linux, x64, light]
85104 steps :
86105 - uses : actions/checkout@v4
87- - uses : EmbarkStudios/cargo-deny-action@v2
106+ - uses : dtolnay/rust-toolchain@stable
107+ - run : cargo deny --version
108+ # Skip the `advisories` check because both cargo-deny and
109+ # cargo-audit share the same rustsec parser, which currently
110+ # rejects RUSTSEC-2026-0037 ("unsupported CVSS version: 4.0").
111+ # bans / licenses / sources still gate. Re-add `advisories`
112+ # once smithy ships an upgraded rustsec; the audit job (still
113+ # on ubuntu-latest) covers vulnerability matching meanwhile.
114+ - run : cargo deny check bans licenses sources
88115
89116 # ── Code coverage ────────────────────────────────────────────────────
90117 coverage :
91118 name : Code Coverage
92119 needs : [test]
93- runs-on : ubuntu-latest
120+ runs-on : [self-hosted, linux, x64, rust-cpu]
94121 steps :
95122 - uses : actions/checkout@v4
96123 - uses : dtolnay/rust-toolchain@nightly
@@ -122,7 +149,9 @@ jobs:
122149 # ── Miri (undefined behavior, pointer provenance) ───────────────────
123150 miri :
124151 name : Miri
125- runs-on : ubuntu-latest
152+ # lean-mem class — Miri allocates aggressively and benefits from the 24G
153+ # MemoryHigh ceiling on smithy lean-mem runners over the 12G rust-cpu cap.
154+ runs-on : [self-hosted, linux, x64, lean-mem]
126155 steps :
127156 - uses : actions/checkout@v4
128157 - uses : dtolnay/rust-toolchain@nightly
@@ -145,7 +174,7 @@ jobs:
145174 # parser/scheduler invariants get exercised on every change.
146175 proptest :
147176 name : Proptest (extended)
148- runs-on : ubuntu-latest
177+ runs-on : [self-hosted, linux, x64, rust-cpu]
149178 steps :
150179 - uses : actions/checkout@v4
151180 - uses : dtolnay/rust-toolchain@nightly
@@ -159,7 +188,10 @@ jobs:
159188 mutants :
160189 name : Mutation Testing
161190 needs : [test]
162- runs-on : ubuntu-latest
191+ # lean-mem — many parallel cargo invocations, RAM pressure under -j 4.
192+ # The full-workspace exhaustive run lives in mutants-weekly.yml; this
193+ # gating job stays narrow (spar-analysis) with a survivor ratchet.
194+ runs-on : [self-hosted, linux, x64, lean-mem]
163195 steps :
164196 - uses : actions/checkout@v4
165197 - uses : dtolnay/rust-toolchain@nightly
@@ -196,7 +228,7 @@ jobs:
196228 # ── Fuzz smoke (60s per target on PRs) ──────────────────────────────
197229 fuzz-smoke :
198230 name : Fuzz smoke (60s/target)
199- runs-on : ubuntu-latest
231+ runs-on : [self-hosted, linux, x64, rust-cpu]
200232 # Only run on PRs — pushes to main hit the nightly workflow instead.
201233 if : github.event_name == 'pull_request'
202234 steps :
@@ -222,7 +254,7 @@ jobs:
222254 # ── Supply chain verification ───────────────────────────────────────
223255 supply-chain :
224256 name : Supply Chain (cargo-vet)
225- runs-on : ubuntu-latest
257+ runs-on : [self-hosted, linux, x64, light]
226258 steps :
227259 - uses : actions/checkout@v4
228260 - uses : dtolnay/rust-toolchain@stable
@@ -239,7 +271,7 @@ jobs:
239271 # in artifacts/, safety/stpa/, and rivet.yaml.
240272 rivet-validate :
241273 name : Rivet validate (artifacts)
242- runs-on : ubuntu-latest
274+ runs-on : [self-hosted, linux, x64, rust-cpu]
243275 steps :
244276 - uses : actions/checkout@v4
245277 - uses : dtolnay/rust-toolchain@stable
@@ -265,6 +297,9 @@ jobs:
265297 # Time budget: cold cache ≤30 min, warm ≤5 min (per #135).
266298 bazel-test :
267299 name : Bazel test (//...)
300+ # Stays on ubuntu-latest until Bazel is installed on the smithy host.
301+ # Tracked as a follow-up: smithy/group_vars/all.yml could add a
302+ # bazel apt-installable. Until then, hosted handles this.
268303 runs-on : ubuntu-latest
269304 continue-on-error : true
270305 timeout-minutes : 35
@@ -311,6 +346,10 @@ jobs:
311346 # 3. At that point, extend MAX_TASKS from 4 to 8 and re-tune unwinds.
312347 kani :
313348 name : Kani Bounded Model Checking
349+ # Stays on ubuntu-latest because kani-verifier bundles CBMC (~100 MB)
350+ # which we don't pre-install on smithy. Once smithy ships Kani as a
351+ # toolchain, switch to rust-cpu (the verification is RAM-modest but
352+ # CPU-bound; CBMC is single-threaded per harness).
314353 runs-on : ubuntu-latest
315354 continue-on-error : true
316355 steps :
0 commit comments