Teach the shared actions about Rust
Rust arms for the shared composite actions, so an SDK that grows a rust/ crate and a conformance/runner/rust runner can call them without forking. Pure additions: for every existing language each action does exactly what it did.
What changes
conformance-run:language: rustrunscargo run --release --lockedinconformance/runner/rust, after aSet up Ruststep (dtolnay/rust-toolchain, new optionalrust-toolchaininput, defaultstable, mirroringruby-version). The summary parser already understands the Go runner'sPassed: N, Failed: M, Total: Tline; the Rust runner prints the same line, so no new parsing branch.service-drift:rust) target=rs-generate-services— thers-prefix follows the abbreviation rule inMAKEFILE-CONVENTION.md(go-,ts-,rb-,swift-,kt-).rubric-check:--include="*.rs"on every source grep;rustin the 4A.3 (rs-generate), 4B.1 (tests/*.rsor#[test]underrust/), 4B.3 (conformance/runner/rust) and 4C.2 (release-rust.yml) loops;clippysatisfies 4B.6 alongsidetypecheck/go vet/rubocop. A repo without Rust scores exactly as before; one with Rust can only gain.- The
language/profileinputs reach the scripts throughenv:instead of${{ inputs.* }}expansion insiderun:— same values, and zizmor'stemplate-injectionfindings on these three actions go from 11 to none. The setup stepsconformance-runalready had are SHA-pinned at the commit their floating major currently resolves to (setup-go@v5→ v5.6.0,setup-node@v4→ v4.4.0,setup-ruby@v1→ v1.321.0,setup-java@v5→ v5.7.0,gradle/actions@v5→ v5.0.2), so the resolved code is unchanged today and moves through Dependabot from here on.
Consumer reach
None of these three actions is referenced by a real SDK: hey-sdk, fizzy-sdk and basecamp-sdk all inline their own conformance, drift and rubric jobs (make audit-check, scripts/check-*-service-drift.sh). They are referenced by seed/.github/workflows/test.yml.tmpl, so an SDK generated after this merges gets the Rust arms; existing SDKs see nothing.
Deliberately not here
release-github.yml.tmpllanguages: …,rustand arustmatrix entry intest.yml.tmpl— listing a language beforerelease-rust.yml.tmpland theseed/rust/**scaffold exist would make a freshly seeded SDK wait on a workflow it does not have. Those land together with the Rust templates, extracted from basecamp-sdk's crate.- A
Swatinem/rust-cachestep: the action caches nothing for the other languages either; add it when the runner build time warrants it. - Cross-runner exclusion manifests (
conformance/manifests/<lang>.json) are a basecamp-sdk convention the action does not know about.
Gates
No workflows run in this repo. Locally: zizmor actions/conformance-run actions/service-drift actions/rubric-check no findings; actionlint does not lint composite actions, shellcheck on the extracted run: blocks reports nothing new.
Companion to #9 (release-orchestrate). Part of the Rust seed work.