Skip to content

Toolchain A/B: nightly-2026-07-23 (control) vs nightly-2026-08-25 (candidate), via paired RCs #308

Description

@bgonz808

First real exercise of the #301 bump factory, using release candidates as the comparison vehicle rather than throwaway builds. Maintainer's proposal, and it is a better design than what #301 sketched.

Why RCs are the right vehicle

#301 described building the same source twice and diffing posture. Doing that with actual RCs buys several things a scratch build cannot:

  • both artifacts go through the real release path — signed, attested, BinSkim-gated, caps-gated — so the comparison is between two things we would actually ship, not two lab specimens
  • both are published and durable, so the diff is reproducible later by anyone, not a transient log
  • it exercises the release pipeline against a new toolchain before a real release depends on it, which is the cheapest possible place to discover a codegen or hardening regression

The pair

toolchain purpose
v0.3.2-rc.2 nightly-2026-07-23 (current pin, age 33d) control — isolates the toolchain as the only variable
v0.3.2-rc.3 latest nightly (2026-08-25 at time of writing) candidate

v0.3.2-rc.1 (2026-08-21) is NOT the control: it predates the tool-fleet hardening (#306) and the caps/hardening ratchet, so it differs in more than the toolchain. A fresh rc.2 on the current pin is what makes this a clean A/B.

What gets diffed (all machinery already exists)

  1. Advisoriesxtask toolchain-advisories --channel <each> (harden(#267): toolchain vuln axis — Rust Security Response WG advisory watcher #298). Fail-closed; the candidate must be clean before anything else matters.
  2. Caps manifest — import surface AND hardening (harden(#267): ratchet codegen hardening posture in the caps manifest #299). A toolchain that silently drops CFG or changes the CRT surface shows up here as a manifest violation, which is the entire point of the ratchet.
  3. BinSkim rule dispositions — full --kind Fail Pass Review Open NotApplicable SARIF is already produced for both; BA2006 BuildWithSecureTools encodes the toolchain/linker version and the security features it emitted, so it is the single most direct evidence of a codegen posture change.
  4. Binary facts — size, and VT panel. The VT half is worth watching given Sign the build tools — SEPARATE Azure identity from the hp-thermal release identity #307: if the ML heuristic reacts differently to the two toolchains, that is a real data point on the hardening/reputation question rather than speculation.

Gate

Per #301's governing rule: auto-fail on any axis, but never auto-promote. A fully-green candidate stops for maintainer sign-off, because "no axis objected" is the precondition for a decision, not the decision. Adopting the new toolchain means editing app/rust-toolchain.toml in a reviewed PR — merge is the promotion mechanism.

Prerequisite worth respecting

#301 argues TOOLCHAIN.lock (manifest-digest verification before rustup install) should land first, so the candidate channel is bytes rather than a name. Doing the A/B before that is still useful — it exercises the comparison machinery — but the candidate's provenance is weaker than the control's until it lands, and that limitation should be stated in whatever evidence this produces rather than glossed.

Sequencing

  1. cut v0.3.2-rc.2 on the current pin (control)
  2. TOOLCHAIN.lock for the candidate channel (Toolchain supply-chain: authenticity pinning (TOOLCHAIN.lock), bump discovery/automation, advisory monitoring #267) — or proceed and record the gap explicitly
  3. cut v0.3.2-rc.3 on the latest nightly (candidate)
  4. diff advisories / caps+hardening / BinSkim / VT
  5. maintainer sign-off, then a reviewed rust-toolchain.toml bump

Related: #301 (factory), #267 (TOOLCHAIN.lock + advisories), #299 (hardening ratchet), #245 (caps), #307 (signing/reputation), #209 (REPRODUCIBLE.md records exact toolchain per release — the natural place to write the comparison down).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    securitySecurity fix or root-of-trust work

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions