Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
52b7e09
perf(build): codify CI's debug=0 policy as the workspace dev/test/rel…
henrypark133 Aug 22, 2026
84bc386
ci: add the setup-rust composite action (unused by any workflow yet)
henrypark133 Aug 22, 2026
0f8f7ac
ci(sccache-dist-smoke): install Rust via the setup-rust composite
henrypark133 Aug 22, 2026
46bdb2c
ci(reborn-playwright): install Rust via the setup-rust composite
henrypark133 Aug 22, 2026
a3d03dc
ci(release-plz): install Rust via the setup-rust composite
henrypark133 Aug 22, 2026
b71cca9
ci(nightly-deep-ci): install Rust via the setup-rust composite
henrypark133 Aug 22, 2026
68d4e16
ci(reborn-release-compile): install Rust via the setup-rust composite
henrypark133 Aug 22, 2026
80e576e
ci(ironclaw-stress): install Rust via the setup-rust composite
henrypark133 Aug 22, 2026
1f4bd5d
ci(code_style): install Rust via the setup-rust composite
henrypark133 Aug 22, 2026
ba1e730
ci(platform-and-compat): install Rust via the setup-rust composite
henrypark133 Aug 22, 2026
99d84e6
ci(reborn-e2e): install Rust and mold via the setup-rust composite
henrypark133 Aug 22, 2026
b98c2f0
ci(coverage): install the nightly toolchain via the setup-rust composite
henrypark133 Aug 22, 2026
050c0d2
ci(reborn-tests): install Rust and mold via the setup-rust composite
henrypark133 Aug 22, 2026
1af2b2b
ci(live-canary): install Rust via the setup-rust composite
henrypark133 Aug 22, 2026
020afb3
chore(qa): drop the now-redundant CARGO_PROFILE_DEV_DEBUG setdefault
henrypark133 Aug 22, 2026
b32e1fd
build: pin the local Rust toolchain via rust-toolchain.toml
henrypark133 Aug 22, 2026
daa5690
docs(agents): document the toolchain pin and bump process
henrypark133 Aug 22, 2026
d5d37e6
ci(gate): forbid direct dtolnay/rust-toolchain use; enforce the toolc…
henrypark133 Aug 22, 2026
5d3fe7c
fix(ci): let the composite own RUSTFLAGS so job env cannot shadow mold
henrypark133 Aug 22, 2026
29b073a
fix(ci): map .github/actions/setup-rust/ into the Reborn PR test planner
henrypark133 Aug 22, 2026
39498bd
fix(ci): let has_code see the toolchain pin and its own guard
henrypark133 Aug 23, 2026
fa3703a
fix(ci): pin the mold verify step's Linux guard in the setup-rust con…
henrypark133 Aug 23, 2026
2d125f5
fix(ci): anchor the toolchain-default regex to the toolchain input block
henrypark133 Aug 23, 2026
1ef72d8
fix(ci): catch workflow-level env RUSTFLAGS shadowing setup-rust too
henrypark133 Aug 23, 2026
3dc47cb
test(ci): assert every exhaustive-plan field for the setup-rust widen
henrypark133 Aug 23, 2026
d33e7f9
fix(ci): glob both .yml and .yaml when loading workflows
henrypark133 Aug 23, 2026
6a84103
fix(ci): guard every Rust bootstrap, not just the vendor action
henrypark133 Aug 24, 2026
36041d7
docs(toolchain): name the accepted release-workflow bootstrap in the …
henrypark133 Aug 24, 2026
cfb3761
fix(ci): migrate the release lane onto the composite and unbreak two …
henrypark133 Aug 24, 2026
ff4b4c6
fix(ci): catch step-level RUSTFLAGS, not just job- and workflow-level
henrypark133 Aug 24, 2026
edaf965
fix(ci): restore the release lane's Rust install and assert it is there
henrypark133 Aug 24, 2026
4cd3f10
refactor(ci): split the Rust toolchain contracts out of ws12_workflow…
henrypark133 Aug 24, 2026
463b029
docs(agents): point the toolchain pin at its owner instead of restati…
henrypark133 Aug 24, 2026
c35c70d
fix(ci): require every cargo job to reach the composite, not just the…
henrypark133 Aug 24, 2026
4a73f18
fix(ci): classify the cargo-dist fragment so the plan step stops fail…
henrypark133 Aug 24, 2026
cbe943f
refactor(ci): close the three open audit findings
henrypark133 Aug 24, 2026
3e0b5ce
Address PR review feedback (#7821)
henrypark133 Aug 24, 2026
6208df3
fix(ci): install Rust in the one hermetic lane that acquired it lazily
henrypark133 Aug 24, 2026
b628ab8
fix(ci): realign the assertion I broke by rewording the guard message
henrypark133 Aug 24, 2026
7fc365b
fix(ci): make the debug-policy guard see where the value was actually…
henrypark133 Aug 24, 2026
2d532b2
docs(agents): replace a universal claim with a verified, re-checkable…
henrypark133 Aug 24, 2026
89237f6
fix(ci): pin the release step's condition, and scope the coverage cla…
henrypark133 Aug 24, 2026
25aff16
fix(ci): close four review findings on the condition and debug-policy…
henrypark133 Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions .github/actions/setup-rust/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
name: Setup Rust
description: >-
Install the Rust toolchain (pinned by default to the same version as
rust-toolchain.toml — see the `toolchain` input), optionally the mold
linker, and pin RUSTUP_TOOLCHAIN for the rest of this job so it can never
silently drift from what this step actually installed.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

# Why RUSTUP_TOOLCHAIN: dtolnay/rust-toolchain only runs `rustup default`,
# which rust-toolchain.toml would otherwise outrank for every in-repo cargo
# invocation (rustup precedence: RUSTUP_TOOLCHAIN env > directory override >
# rust-toolchain.toml file > `rustup default`). Exporting the toolchain this
# step actually resolved — via the action's own `outputs.name`, not a
# second guess at it — makes that drift structurally impossible, for a
# pinned stable lane and a nightly lane alike. No lane needs special-casing.
#
# Why one place for mold: mold's apt-install/verify/RUSTFLAGS-export used to
# be copy-pasted per job (8 install sites, 2 "verify" blocks, 4 written-out
# copies of the linker RUSTFLAGS string across reborn-tests.yml and
# reborn-e2e.yml). One `mold: true` input replaces all of that.

inputs:
toolchain:
description: >-
Toolchain spec passed through to dtolnay/rust-toolchain. Defaults to
the same version pinned in rust-toolchain.toml — bump both together;
scripts/ci/ws12_workflow_contracts.py fails the build if they drift.
Comment thread
henrypark133 marked this conversation as resolved.
Pass an explicit value (e.g. nightly-2025-11-01) for a lane that
intentionally does not track the pinned stable toolchain.
required: false
default: "1.98.0"
components:
description: Comma-separated rustup components, passed through.
required: false
default: ""
targets:
description: Comma-separated target triples, passed through.
required: false
default: ""
mold:
description: >-
Install mold+clang, verify the linker actually links, and export the
canonical mold RUSTFLAGS prefix. Linux-only (a no-op elsewhere).
Defaults to false: most jobs in this repo do not link with mold; the
handful that do pass `mold: true` explicitly.
required: false
default: "false"
extra_rustflags:
description: >-
Extra RUSTFLAGS this job needs (e.g. the nightly `-Zcrate-attr=...`
the coverage and crate-bucket lanes compile with). Pass them HERE, not
as a job-level `env: RUSTFLAGS:` — a job-level env key is re-applied
to every step and therefore shadows what this action writes to
$GITHUB_ENV, silently dropping the mold linker flags. Routing them
through this input keeps one owner for the final value;
scripts/ci/ws12_workflow_contracts.py fails any job that pairs
setup-rust with its own RUSTFLAGS env key.
required: false
default: ""

runs:
using: composite
steps:
- name: Install Rust
id: install
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
with:
toolchain: ${{ inputs.toolchain }}
components: ${{ inputs.components }}
targets: ${{ inputs.targets }}

- name: Pin the resolved toolchain for the rest of this job
shell: bash
run: |
echo "RUSTUP_TOOLCHAIN=${{ steps.install.outputs.name }}" >> "$GITHUB_ENV"

- name: Install mold and clang
if: ${{ inputs.mold == 'true' && runner.os == 'Linux' }}
shell: bash
run: |
scripts/ci/install-ci-apt-packages.sh clang mold
test -x /usr/bin/mold

- name: Verify mold linker is active
if: ${{ inputs.mold == 'true' && runner.os == 'Linux' }}
shell: bash
run: |
clang_output=$(echo 'int main(void) { return 0; }' \
| clang --ld-path=/usr/bin/mold -Wl,--version -x c - -o /tmp/clang-mold-check 2>&1)
grep -qi mold <<< "$clang_output"
printf 'fn main() { println!("mold-link-ok"); }\n' > /tmp/mold-link-check.rs
rustc /tmp/mold-link-check.rs \
-C linker=clang \
-C link-arg=--ld-path=/usr/bin/mold \
-o /tmp/mold-link-check
test "$(/tmp/mold-link-check)" = "mold-link-ok"

- name: Export mold RUSTFLAGS
if: >-
${{ (inputs.mold == 'true' && runner.os == 'Linux')
|| inputs.extra_rustflags != '' }}
shell: bash
env:
MOLD_RUSTFLAGS: "-C linker=clang -C link-arg=--ld-path=/usr/bin/mold"
USE_MOLD: ${{ inputs.mold == 'true' && runner.os == 'Linux' }}
EXTRA_RUSTFLAGS: ${{ inputs.extra_rustflags }}
run: |
# Compose the whole value here so exactly one place owns it. Order:
# mold linker flags, then the job's extra flags, then anything an
# earlier step already exported. A job-level `env: RUSTFLAGS:` would
# shadow this write for every later step (job env is re-applied per
# step, on top of $GITHUB_ENV), which is why jobs pass their flags
# through `extra_rustflags` instead and ws12 enforces it.
flags=""
if [[ "${USE_MOLD}" == "true" ]]; then
flags="${MOLD_RUSTFLAGS}"
fi
if [[ -n "${EXTRA_RUSTFLAGS}" ]]; then
flags="${flags:+${flags} }${EXTRA_RUSTFLAGS}"
fi
echo "RUSTFLAGS=${flags}${RUSTFLAGS:+ ${RUSTFLAGS}}" >> "$GITHUB_ENV"
11 changes: 11 additions & 0 deletions .github/dist-build-setup.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
- name: Install Rust through the repo's single setup path
# cargo-dist re-includes this fragment on every regeneration
# (github-build-setup in [workspace.metadata.dist]), so unlike an inline
# step it survives `dist generate` — which is why the bootstrap belongs
# here rather than as a hand-edited `curl | sh` in the generated workflow.
# Container images ship without cargo; hosted runners already have it and
# resolve rust-toolchain.toml themselves, so this mirrors the previous
# step's condition exactly rather than changing release behaviour.
if: ${{ matrix.container }}
uses: ./.github/actions/setup-rust

Comment thread
coderabbitai[bot] marked this conversation as resolved.
- name: Install Node.js for the embedded WebUI
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
with:
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/code_style.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ jobs:
echo "has_clippy=false" >> "$GITHUB_OUTPUT"
fi

if printf '%s\n' "$CHANGED_FILES" | grep -Eq '^(crates/|tests/|migrations/|Cargo\.toml$|Cargo\.lock$|deny\.toml$|Dockerfile|\.gitignore$|scripts/ci/|\.githooks/|docker/reborn/entrypoint\.sh$|scripts/reborn_webui_v2_live_qa/|scripts/live-canary/|\.github/workflows/(live-canary|reborn-e2e)\.yml$|scripts/check_no_panics\.py$|scripts/no_panics_reborn_baseline\.txt$|scripts/(check|test-check)-type-duplicates\.py$|\.github/scripts/(pr-labeler|test-pr-labeler)\.sh$|\.github/workflows/(code_style|main-ci-slack-alerts)\.yml$|\.github/workflows/ironclaw-release\.yml$)'; then
if printf '%s\n' "$CHANGED_FILES" | grep -Eq '^(crates/|tests/|migrations/|Cargo\.toml$|Cargo\.lock$|deny\.toml$|Dockerfile|\.gitignore$|scripts/ci/|\.githooks/|docker/reborn/entrypoint\.sh$|scripts/reborn_webui_v2_live_qa/|scripts/live-canary/|\.github/workflows/(live-canary|reborn-e2e)\.yml$|scripts/check_no_panics\.py$|scripts/no_panics_reborn_baseline\.txt$|scripts/(check|test-check)-type-duplicates\.py$|\.github/scripts/(pr-labeler|test-pr-labeler)\.sh$|\.github/workflows/(code_style|main-ci-slack-alerts)\.yml$|\.github/workflows/ironclaw-release\.yml$|rust-toolchain\.toml$|\.github/actions/setup-rust/)'; then
echo "has_code=true" >> "$GITHUB_OUTPUT"
else
echo "has_code=false" >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -162,7 +162,7 @@ jobs:
fetch-depth: 0
persist-credentials: false
- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
uses: ./.github/actions/setup-rust
with:
components: rustfmt
- name: Install Python
Expand Down Expand Up @@ -354,7 +354,7 @@ jobs:
with:
persist-credentials: false
- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
uses: ./.github/actions/setup-rust
with:
components: clippy
- name: Enable pnpm for setup-node cache
Expand Down Expand Up @@ -456,7 +456,7 @@ jobs:
with:
persist-credentials: false
- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
uses: ./.github/actions/setup-rust
with:
components: clippy
- name: Enable pnpm for setup-node cache
Expand Down Expand Up @@ -503,7 +503,7 @@ jobs:
with:
persist-credentials: false
- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
uses: ./.github/actions/setup-rust
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
Expand Down
16 changes: 10 additions & 6 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,9 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 90
env:
CARGO_PROFILE_DEV_DEBUG: 0
CARGO_PROFILE_TEST_DEBUG: 0
# LLVM 21.1.3 predates these now-stable APIs used by current dependencies.
# Coverage-only compatibility; ordinary CI remains the MSRV authority.
RUSTC_BOOTSTRAP: "1"
RUSTFLAGS: "-Zcrate-attr=feature(array_windows,debug_closure_helpers,slice_as_array)"
# `--workspace` below runs BOTH root-package test tiers in one job: the
# Reborn integration suites (tests/integration/*) and the root QA suites
# (tests/reborn_qa_*). Both overrun libtest's 2 MiB default test-thread
Expand Down Expand Up @@ -113,9 +110,13 @@ jobs:
docker system prune -af || true
df -h

- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # branch coverage
- uses: ./.github/actions/setup-rust
with:
toolchain: nightly-2025-11-01
# Nightly crate attributes for the instrumented build. They belong
# here rather than in a job-level `env: RUSTFLAGS:`, which would
# split ownership of the variable with the composite.
extra_rustflags: "-Zcrate-attr=feature(array_windows,debug_closure_helpers,slice_as_array)"
components: llvm-tools-preview
targets: wasm32-wasip2

Expand Down Expand Up @@ -206,7 +207,6 @@ jobs:
env:
# Keep the shipping binary on the same crash-safe coverage toolchain.
RUSTC_BOOTSTRAP: "1"
RUSTFLAGS: "-Zcrate-attr=feature(array_windows,debug_closure_helpers,slice_as_array)"
permissions:
id-token: write
contents: read
Expand All @@ -222,9 +222,13 @@ jobs:
docker system prune -af || true
df -h

- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # branch coverage
- uses: ./.github/actions/setup-rust
with:
toolchain: nightly-2025-11-01
# Nightly crate attributes for the instrumented build. They belong
# here rather than in a job-level `env: RUSTFLAGS:`, which would
# split ownership of the variable with the composite.
extra_rustflags: "-Zcrate-attr=feature(array_windows,debug_closure_helpers,slice_as_array)"
components: llvm-tools-preview
targets: wasm32-wasip2

Expand Down
15 changes: 9 additions & 6 deletions .github/workflows/ironclaw-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -126,13 +126,16 @@ jobs:
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
with:
python-version: "3.12"
- name: Install Rust non-interactively if not already installed
- name: Install Rust through the repo's single setup path
# Mirrors .github/dist-build-setup.yml, which cargo-dist re-inlines
# here on `dist generate`. Both must carry it: the fragment so a
# regeneration keeps it, this file because the checked-in workflow is
# what actually runs. validate_release_workflow_installs_rust asserts
# the presence here, since the absence-only bootstrap checks happily
# passed a version of this file with no Rust install at all.
if: ${{ matrix.container }}
run: |
if ! command -v cargo > /dev/null 2>&1; then
curl --proto '=https' --tlsv1.2 --max-time 120 -sSf https://sh.rustup.rs | sh -s -- -y
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
fi
uses: ./.github/actions/setup-rust

- name: "Install Node.js for the embedded WebUI"
uses: "actions/setup-node@820762786026740c76f36085b0efc47a31fe5020"
with:
Expand Down
13 changes: 5 additions & 8 deletions .github/workflows/ironclaw-stress.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ concurrency:
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

env:
CARGO_PROFILE_RELEASE_DEBUG: 0
IRONCLAW_DISABLE_OS_KEYCHAIN: "1"

jobs:
Expand All @@ -62,7 +61,7 @@ jobs:
persist-credentials: false

- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
uses: ./.github/actions/setup-rust

- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
with:
Expand Down Expand Up @@ -141,7 +140,7 @@ jobs:
persist-credentials: false

- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
uses: ./.github/actions/setup-rust

- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
with:
Expand Down Expand Up @@ -187,7 +186,7 @@ jobs:
with:
persist-credentials: false
- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
uses: ./.github/actions/setup-rust
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
with:
key: ironclaw-stress-soak
Expand Down Expand Up @@ -221,7 +220,6 @@ jobs:
timeout-minutes: 60
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
env:
CARGO_PROFILE_RELEASE_DEBUG: 0
IRONCLAW_DISABLE_OS_KEYCHAIN: "1"
SECRETS_MASTER_KEY: stress-ci-secret-master-key-0123456789abcdef
IRONCLAW_REBORN_RUNNER_WORKER_COUNT: "0"
Expand All @@ -237,7 +235,7 @@ jobs:
persist-credentials: false

- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
uses: ./.github/actions/setup-rust

- name: Install Node.js for WebUI bundle build
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v4
Expand Down Expand Up @@ -436,7 +434,6 @@ jobs:
--health-timeout 5s
--health-retries 5
env:
CARGO_PROFILE_RELEASE_DEBUG: 0
IRONCLAW_DISABLE_OS_KEYCHAIN: "1"
IRONCLAW_REBORN_POSTGRES_URL: postgres://postgres:postgres@localhost:5432/ironclaw_stress
IRONCLAW_REBORN_SECRET_MASTER_KEY: stress-ci-secret-master-key-0123456789abcdef
Expand All @@ -455,7 +452,7 @@ jobs:
persist-credentials: false

- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
uses: ./.github/actions/setup-rust

- name: Install Node.js for WebUI bundle build
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v4
Expand Down
Loading
Loading