From 0953b3b80b4fb5719d995d135c9f79df020a19f3 Mon Sep 17 00:00:00 2001 From: jan-kubica Date: Wed, 28 Oct 2026 07:29:00 +0100 Subject: [PATCH 1/3] chore: adopt Rust 1.99.1 toolchain policy --- .agents/cloud-setup.sh | 26 +++++++++++++------------- .changeset/rust-patch.md | 4 ++++ .github/workflows/ci.yml | 12 ++++++------ .github/workflows/mutants.yml | 8 ++++---- .github/workflows/release.yml | 16 ++++++++-------- bun.lock | 4 ++-- package.json | 2 +- rust-toolchain.toml | 2 +- stll-toolchain.json | 2 +- 9 files changed, 40 insertions(+), 36 deletions(-) create mode 100644 .changeset/rust-patch.md diff --git a/.agents/cloud-setup.sh b/.agents/cloud-setup.sh index fdc5572..2beafef 100755 --- a/.agents/cloud-setup.sh +++ b/.agents/cloud-setup.sh @@ -350,12 +350,12 @@ fetch_verified() { export RUSTUP_HOME=/opt/stll-cloud/rustup export CARGO_HOME=/opt/stll-cloud/cargo -export RUSTUP_TOOLCHAIN='1.99.0' +export RUSTUP_TOOLCHAIN='1.99.1' export RUSTUP_AUTO_INSTALL=0 rust_run() { local mode="$1" shift - set -- runuser -u "$OUTPUT_USER" -- env HOME="$OUTPUT_HOME" RUSTUP_HOME="$RUSTUP_HOME" CARGO_HOME="$CARGO_HOME" RUSTUP_AUTO_INSTALL=0 RUSTUP_TOOLCHAIN=1.99.0 RUSTUP_DIST_SERVER=https://static.rust-lang.org RUSTUP_UPDATE_ROOT=https://static.rust-lang.org/rustup PATH="$PATH" "$@" + set -- runuser -u "$OUTPUT_USER" -- env HOME="$OUTPUT_HOME" RUSTUP_HOME="$RUSTUP_HOME" CARGO_HOME="$CARGO_HOME" RUSTUP_AUTO_INSTALL=0 RUSTUP_TOOLCHAIN=1.99.1 RUSTUP_DIST_SERVER=https://static.rust-lang.org RUSTUP_UPDATE_ROOT=https://static.rust-lang.org/rustup PATH="$PATH" "$@" case "$mode" in local) "$@" ;; network) network_run static.rust-lang.org 180 "$@" ;; @@ -369,12 +369,12 @@ primary_rust_ready() { done [[ -x "$CARGO_HOME/bin/rustup" ]] || return 1 [[ "$(rust_run local "$CARGO_HOME/bin/rustup" --version 2>/dev/null)" == 'rustup 1.29.1 '* ]] || return 1 - [[ "$(rust_run local "$CARGO_HOME/bin/rustc" +1.99.0 --version)" == 'rustc 1.99.0 '* ]] || return 1 + [[ "$(rust_run local "$CARGO_HOME/bin/rustc" +1.99.1 --version)" == 'rustc 1.99.1 '* ]] || return 1 local host - host="$(rust_run local "$CARGO_HOME/bin/rustc" +1.99.0 -vV | awk '$1 == "host:" { print $2 }')" || return 1 - rust_run local "$CARGO_HOME/bin/rustup" component list --toolchain '1.99.0' --installed | awk -v name='clippy' -v host="$host" '$1 == name || $1 == name "-" host { found=1 } END { exit !found }' || return 1 - rust_run local "$CARGO_HOME/bin/rustup" component list --toolchain '1.99.0' --installed | awk -v name='rustfmt' -v host="$host" '$1 == name || $1 == name "-" host { found=1 } END { exit !found }' || return 1 - rust_run local "$CARGO_HOME/bin/rustup" target list --toolchain '1.99.0' --installed | awk -v name='wasm32-unknown-unknown' '$1 == name { found=1 } END { exit !found }' || return 1 + host="$(rust_run local "$CARGO_HOME/bin/rustc" +1.99.1 -vV | awk '$1 == "host:" { print $2 }')" || return 1 + rust_run local "$CARGO_HOME/bin/rustup" component list --toolchain '1.99.1' --installed | awk -v name='clippy' -v host="$host" '$1 == name || $1 == name "-" host { found=1 } END { exit !found }' || return 1 + rust_run local "$CARGO_HOME/bin/rustup" component list --toolchain '1.99.1' --installed | awk -v name='rustfmt' -v host="$host" '$1 == name || $1 == name "-" host { found=1 } END { exit !found }' || return 1 + rust_run local "$CARGO_HOME/bin/rustup" target list --toolchain '1.99.1' --installed | awk -v name='wasm32-unknown-unknown' '$1 == name { found=1 } END { exit !found }' || return 1 return 0 } rust_ready() { @@ -412,14 +412,14 @@ esac fi rust_run local "$CARGO_HOME/bin/rustup" set auto-self-update disable if ! primary_rust_ready; then - rust_run network "$CARGO_HOME/bin/rustup" toolchain install 1.99.0 --profile minimal --no-self-update '--component' 'clippy' '--component' 'rustfmt' '--target' 'wasm32-unknown-unknown' + rust_run network "$CARGO_HOME/bin/rustup" toolchain install 1.99.1 --profile minimal --no-self-update '--component' 'clippy' '--component' 'rustfmt' '--target' 'wasm32-unknown-unknown' fi - rust_run local "$CARGO_HOME/bin/rustup" default 1.99.0 + rust_run local "$CARGO_HOME/bin/rustup" default 1.99.1 verify_rust for tool in rustup cargo rustc rustdoc cargo-clippy clippy-driver rustfmt cargo-fmt; do # Launchers persist the system homes in fresh shells without profile sourcing. - printf '%s\n' '#!/bin/sh' 'export RUSTUP_HOME=/opt/stll-cloud/rustup' 'export CARGO_HOME=/opt/stll-cloud/cargo' 'export RUSTUP_AUTO_INSTALL=0' 'export RUSTUP_TOOLCHAIN=1.99.0' "exec /opt/stll-cloud/cargo/bin/$tool \"\$@\"" > "$scratch/$tool" + printf '%s\n' '#!/bin/sh' 'export RUSTUP_HOME=/opt/stll-cloud/rustup' 'export CARGO_HOME=/opt/stll-cloud/cargo' 'export RUSTUP_AUTO_INSTALL=0' 'export RUSTUP_TOOLCHAIN=1.99.1' "exec /opt/stll-cloud/cargo/bin/$tool \"\$@\"" > "$scratch/$tool" if ! cmp -s "$scratch/$tool" "/usr/local/bin/$tool"; then [[ ! -d "/usr/local/bin/$tool" ]] || fail 'Install target is a directory; remove it and rerun install:' "/usr/local/bin/$tool" install -m 755 "$scratch/$tool" "/usr/local/bin/$tool" @@ -465,7 +465,7 @@ export PATH='/opt/stll-cloud/node/26.10.0/bin:/opt/stll-cloud/bun/1.4.4:/usr/loc unset _stll_cloud_remaining _stll_cloud_result _stll_cloud_separator _stll_cloud_part _stll_cloud_more export RUSTUP_HOME=/opt/stll-cloud/rustup export CARGO_HOME=/opt/stll-cloud/cargo -export RUSTUP_TOOLCHAIN='1.99.0' +export RUSTUP_TOOLCHAIN='1.99.1' export RUSTUP_AUTO_INSTALL=0 STLL_CLOUD_PROFILE if ! cmp -s "$temporary" '/etc/profile.d/stll-cloud.sh'; then install -m 644 "$temporary" '/etc/profile.d/stll-cloud.sh'; fi @@ -502,11 +502,11 @@ done ) verify_shell_environment() { [[ -f '/etc/profile.d/stll-cloud.sh' && ! -L '/etc/profile.d/stll-cloud.sh' && "$(stat -c '%h:%u' '/etc/profile.d/stll-cloud.sh')" == 1:0 ]] || fail 'Managed shell environment is unavailable; run install' - [[ "$(sha256sum -- '/etc/profile.d/stll-cloud.sh' | cut -d ' ' -f1)" == '2e96da10364dade2b051fb77195abb3c42a3e848804b86ef26ada7aa6d392858' ]] || fail 'Managed shell environment differs; run install' + [[ "$(sha256sum -- '/etc/profile.d/stll-cloud.sh' | cut -d ' ' -f1)" == '24dfcdbf02036ed628e0fbc62bc76ec11f67e2df81f9e1ae4e3709bab30a0fb1' ]] || fail 'Managed shell environment differs; run install' } -[[ -f 'rust-toolchain.toml' && ! -L 'rust-toolchain.toml' ]] && [[ "$(sha256sum -- 'rust-toolchain.toml' | cut -d ' ' -f1)" == '72f7dd8c9fdf9c1fcd8eb8bf9326d4bc66833e4ebf4bc2932636e2b85efcb7af' ]] || fail 'rust-toolchain.toml changed; regenerate cloud-setup.sh' +[[ -f 'rust-toolchain.toml' && ! -L 'rust-toolchain.toml' ]] && [[ "$(sha256sum -- 'rust-toolchain.toml' | cut -d ' ' -f1)" == 'b9c8d2d59f6f46474c0cfa0b8b77bea21d94fc73a30ad93d5bf6385c422197d2' ]] || fail 'rust-toolchain.toml changed; regenerate cloud-setup.sh' [[ ! -e 'rust-toolchain' && ! -L 'rust-toolchain' ]] || fail 'rust-toolchain appeared; regenerate cloud-setup.sh' diff --git a/.changeset/rust-patch.md b/.changeset/rust-patch.md new file mode 100644 index 0000000..1b0ccb2 --- /dev/null +++ b/.changeset/rust-patch.md @@ -0,0 +1,4 @@ +--- +--- + +Adopt the shared Rust 1.99.1 toolchain policy and regenerate development setup for the FFI and linker fixes. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 863283e..8cb53aa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -188,8 +188,8 @@ jobs: - name: Setup shared stable Rust run: | - rustup toolchain install 1.99.0 --profile minimal --component rustfmt,clippy - rustup default 1.99.0 + rustup toolchain install 1.99.1 --profile minimal --component rustfmt,clippy + rustup default 1.99.1 - name: Install shared stable source checker run: >- cargo install --git https://github.com/stella/tooling @@ -232,9 +232,9 @@ jobs: ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ - key: ${{ runner.os }}-cargo-1.99.0-${{ hashFiles('Cargo.lock') }} + key: ${{ runner.os }}-cargo-1.99.1-${{ hashFiles('Cargo.lock') }} restore-keys: | - ${{ runner.os }}-cargo-1.99.0- + ${{ runner.os }}-cargo-1.99.1- - name: Rust checks (fmt, clippy, source lint, test) run: bun run rust:check @@ -278,7 +278,7 @@ jobs: - run: bun install --frozen-lockfile - name: Install the WebAssembly build toolchain run: | - rustup target add wasm32-unknown-unknown --toolchain 1.99.0 + rustup target add wasm32-unknown-unknown --toolchain 1.99.1 cargo install wasm-bindgen-cli --version 0.2.129 --locked - run: bun run typecheck - run: bun run build @@ -293,7 +293,7 @@ jobs: - name: Build the Python abi3 wheel uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: - rust-toolchain: "1.99.0" + rust-toolchain: "1.99.1" args: >- --release --locked diff --git a/.github/workflows/mutants.yml b/.github/workflows/mutants.yml index 90dc48b..2e74201 100644 --- a/.github/workflows/mutants.yml +++ b/.github/workflows/mutants.yml @@ -28,8 +28,8 @@ jobs: - name: Setup Rust run: | - rustup toolchain install 1.99.0 --profile minimal - rustup default 1.99.0 + rustup toolchain install 1.99.1 --profile minimal + rustup default 1.99.1 - name: Install pinned Rust tools (checksum-verified) # nextest is the test runner used by cargo-mutants. taiki-e/install-action @@ -46,9 +46,9 @@ jobs: ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ - key: ${{ runner.os }}-mutants-1.99.0-${{ hashFiles('Cargo.lock') }} + key: ${{ runner.os }}-mutants-1.99.1-${{ hashFiles('Cargo.lock') }} restore-keys: | - ${{ runner.os }}-mutants-1.99.0- + ${{ runner.os }}-mutants-1.99.1- - name: Run cargo-mutants # Scoped to the validation core (lib.rs). The fast unit cases diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 74f4979..44d60a8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -84,8 +84,8 @@ jobs: - name: Install Rust toolchain run: | - rustup toolchain install 1.99.0 --profile minimal --component rustfmt,clippy - rustup default 1.99.0 + rustup toolchain install 1.99.1 --profile minimal --component rustfmt,clippy + rustup default 1.99.1 - name: Verify versions and generated sources run: | @@ -146,8 +146,8 @@ jobs: - name: Install Rust toolchain run: | - rustup toolchain install 1.99.0 --profile minimal - rustup default 1.99.0 + rustup toolchain install 1.99.1 --profile minimal + rustup default 1.99.1 - name: Build native addon run: node scripts/build-native-node.mjs @@ -201,9 +201,9 @@ jobs: - name: Install Rust and wasm-bindgen run: | - rustup toolchain install 1.99.0 --profile minimal - rustup target add wasm32-unknown-unknown --toolchain 1.99.0 - rustup default 1.99.0 + rustup toolchain install 1.99.1 --profile minimal + rustup target add wasm32-unknown-unknown --toolchain 1.99.1 + rustup default 1.99.1 cargo install wasm-bindgen-cli --version 0.2.129 --locked - name: Build portable packages @@ -311,7 +311,7 @@ jobs: with: target: ${{ matrix.target }} manylinux: ${{ matrix.manylinux || 'auto' }} - rust-toolchain: "1.99.0" + rust-toolchain: "1.99.1" args: >- --release --locked diff --git a/bun.lock b/bun.lock index faaed6a..54e6c60 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@brazilian-utils/brazilian-utils": "^2.5.0", "@changesets/changelog-github": "^1.0.1", "@changesets/cli": "^3.0.3", - "@stll/oxlint-config": "3.2.0", + "@stll/oxlint-config": "3.2.1", "@stll/oxlint-plugin": "0.7.0", "@stll/typescript-config": "0.10.0", "@types/node": "^26.6.5", @@ -263,7 +263,7 @@ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - "@stll/oxlint-config": ["@stll/oxlint-config@3.2.0", "", { "dependencies": { "@changesets/assemble-release-plan": "7.0.0", "@changesets/config": "4.0.1", "@changesets/read": "1.0.1", "@manypkg/get-packages": "3.1.0", "acorn": "8.19.0", "esbuild": "0.28.2", "picomatch": "4.0.7", "semver": "7.8.5", "smol-toml": "1.9.1", "tsrs": "0.18.0-ts7.1.0-dev.20260929", "tsx": "4.23.15", "yaml": "2.9.1" }, "peerDependencies": { "oxlint": ">=1.89.0 <2", "oxlint-tsgolint": ">=7.0.2005 <8", "vite": "8.3.5" }, "optionalPeers": ["vite"], "bin": { "stll-dependabot": "dist/dependabot-cli.mjs", "stll-quarantine": "dist/quarantine-cli.mjs", "stll-cloud-setup": "dist/cloud-setup-cli.mjs", "stll-rust-policy": "dist/rust-policy-cli.mjs", "stll-engine-support": "dist/engine-support-cli.mjs", "stll-consumer-compat": "dist/consumer-compat-cli.mjs", "stll-toolchain-check": "dist/toolchain-check-cli.mjs", "stll-typecheck-probe": "dist/typecheck-probe-cli.mjs", "stll-publish-contract": "dist/publish-contract-cli.mjs", "stll-toolchain-changed": "dist/toolchain-changed-cli.mjs", "stll-normalize-wasi-loaders": "dist/wasi-loader-normalizer-cli.mjs" } }, "sha512-vlKNLCgu+248mLTElgtWUZTKFVal1UvUsnTjflUw7DbZglxyOuDXL3Z3HPzTMKhOUDzrsUGLb87bgMhI/VMDog=="], + "@stll/oxlint-config": ["@stll/oxlint-config@3.2.1", "", { "dependencies": { "@changesets/assemble-release-plan": "7.0.0", "@changesets/config": "4.0.1", "@changesets/read": "1.0.1", "@manypkg/get-packages": "3.1.0", "acorn": "8.19.0", "esbuild": "0.28.2", "picomatch": "4.0.7", "semver": "7.8.5", "smol-toml": "1.9.1", "tsrs": "0.18.0-ts7.1.0-dev.20260929", "tsx": "4.23.15", "yaml": "2.9.1" }, "peerDependencies": { "oxlint": ">=1.89.0 <2", "oxlint-tsgolint": ">=7.0.2005 <8", "vite": "8.3.5" }, "optionalPeers": ["vite"], "bin": { "stll-dependabot": "dist/dependabot-cli.mjs", "stll-quarantine": "dist/quarantine-cli.mjs", "stll-cloud-setup": "dist/cloud-setup-cli.mjs", "stll-rust-policy": "dist/rust-policy-cli.mjs", "stll-engine-support": "dist/engine-support-cli.mjs", "stll-consumer-compat": "dist/consumer-compat-cli.mjs", "stll-toolchain-check": "dist/toolchain-check-cli.mjs", "stll-typecheck-probe": "dist/typecheck-probe-cli.mjs", "stll-publish-contract": "dist/publish-contract-cli.mjs", "stll-toolchain-changed": "dist/toolchain-changed-cli.mjs", "stll-normalize-wasi-loaders": "dist/wasi-loader-normalizer-cli.mjs" } }, "sha512-CduJxELEW/DMDEEVZxghT/Rau0yh3umxdb4dC4PFkQK5x4kEixSfTcX71Y26SKvD2mek6hwOR1V4P3daPCfm7w=="], "@stll/oxlint-plugin": ["@stll/oxlint-plugin@0.7.0", "", { "peerDependencies": { "@oxlint/plugins": ">=1.89.0 <2", "oxlint": ">=1.89.0 <2" } }, "sha512-m8eASMb+3KhwhLMxwNmMtt51QF76pimcOWlwaLO0+11rj8sNf5q1bB4KsdVZGBhXgjqaJM/yjSazz3DgniYW4A=="], diff --git a/package.json b/package.json index 060266e..70bdd4f 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "@brazilian-utils/brazilian-utils": "^2.5.0", "@changesets/changelog-github": "^1.0.1", "@changesets/cli": "^3.0.3", - "@stll/oxlint-config": "3.2.0", + "@stll/oxlint-config": "3.2.1", "@stll/oxlint-plugin": "0.7.0", "@stll/typescript-config": "0.10.0", "@types/node": "^26.6.5", diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 5a341ac..955e964 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.99.0" +channel = "1.99.1" components = ["rustfmt", "clippy"] profile = "minimal" diff --git a/stll-toolchain.json b/stll-toolchain.json index 7736307..c9064c7 100644 --- a/stll-toolchain.json +++ b/stll-toolchain.json @@ -9,7 +9,7 @@ "rustExceptions": [ { "pin": "1.97.1", - "reason": "cargo-hawk compiler-private APIs require Rust 1.97.1; ordinary Rust checks use shared Rust 1.99.0.", + "reason": "cargo-hawk compiler-private APIs require Rust 1.97.1; ordinary Rust checks use shared Rust 1.99.1.", "tracking": "https://github.com/stella/tooling/issues/99", "expires": "2026-11-11" } From a8bd40d9c75c9d306fda2e40e792c92e615e5947 Mon Sep 17 00:00:00 2001 From: jan-kubica Date: Wed, 28 Oct 2026 08:00:44 +0100 Subject: [PATCH 2/3] fix: grant the shared CLA workflow its required check permission --- .github/workflows/cla.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 575889f..60cb537 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -8,6 +8,7 @@ on: permissions: actions: write + checks: write contents: read issues: write pull-requests: write From 1ccb902d36cd96196e702a7b41687729b73eb01c Mon Sep 17 00:00:00 2001 From: jan-kubica Date: Wed, 28 Oct 2026 08:01:34 +0100 Subject: [PATCH 3/3] fix: expose the shared CLA reconciliation dispatch --- .github/workflows/cla.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 60cb537..a19a2bf 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -1,6 +1,12 @@ name: CLA Assistant on: + workflow_dispatch: + inputs: + pull_requests: + description: Pull request numbers separated by commas or spaces + type: string + required: true issue_comment: types: [created] pull_request_target: # zizmor: ignore[dangerous-triggers] delegates to pinned reusable CLA workflow; never check out PR code here @@ -19,6 +25,7 @@ jobs: if: >- ( github.event_name == 'pull_request_target' + || github.event_name == 'workflow_dispatch' ) || ( github.event_name == 'issue_comment' && github.event.issue.pull_request