Skip to content

Make Whitaker installation binary-only and immutable #499

Open

Description

@leynos

Problem

The Rust baseline train for leynos/cuprum cannot bind its Whitaker gate to an immutable, binary-only toolchain through the current install-whitaker action.

Cuprum pins leynos/shared-actions@c5a54701c8603a0fa756a6b34c49bc2af75a6c11 and installer version 0.2.7. The action downloads and checksum-verifies the tagged installer archive and has no action-level source fallback. The installed Whitaker, however, can fall back to local compilation when a prebuilt suite or dependency binary is absent or rejected:

  • Whitaker v0.2.7 resolves to 2bc0c3fafb86914f14bd73461a511588841f0a34.
  • installer/src/prebuilt.rs maps prebuilt-suite failures to Fallback.
  • installer/src/deps/install.rs falls back from release assets to cargo binstall, then cargo install --locked.
  • The CLI offers --build-only, but no binary-only or fail-on-fallback mode.

Suite provenance is also mutable. Version 0.2.7 downloads the suite from the GitHub rolling release. At inspection time that release resolved to 1aa59f0e02c69f04407d389c673e15a0e7d9d09b, nightly 2026-05-28, with Linux x86_64 archive SHA-256 f0ef6da458c493a8dee0d1d7118b529374260730aeeca25062780cd67c3335c7. The shared-action cache key contains the installer version and dylint.toml hash, but no suite revision or manifest/archive digest.

A successful consumer job can therefore build from source or reuse a cached suite from a different rolling revision. That violates the estate's binary-only CI policy and prevents a repository from recording one reproducible Whitaker rule-suite revision.

Acceptance criteria

  • Provide a fail-closed binary-only installation mode covering the Whitaker suite and every dependency binary; no cargo install, cargo binstall source fallback, or local suite compilation may run in this mode.
  • Pin the suite to an immutable revision or content-addressed manifest and verify every downloaded archive before extraction.
  • Include the immutable suite identity and relevant archive/manifest digest in the shared-action cache key and version marker.
  • Emit the installer version, suite revision, toolchain, cargo-dylint version, dylint-link version, and verified archive digests in CI evidence.
  • Fail clearly on unsupported platforms or missing trusted binaries rather than silently compiling from source.
  • Add cold-cache, warm-cache, missing-asset, bad-digest, and attempted-fallback contract tests.
  • Preserve the existing action-level checksum verification for the installer archive.

Issue #420 concerns detection and source fallback while obtaining the installer itself. This issue covers the stricter consumer mode after that installer runs, plus immutable suite provenance and cache identity.

Impact

This blocks the final binding Whitaker layer in leynos/cuprum. Existing source-fix and formatting layers can proceed, but the train cannot claim a reproducible, binary-only Whitaker gate until this contract is available.

References

Activity

  1. added
    enhancementNew feature or request
    highUnblocks delivery within the current sprint or release window. Reaction time is days, not hours.
    testingTest coverage, test infrastructure, and verification tooling work.
    on Sep 16, 2026
  2. leynos commented on Sep 20, 2026

    @leynos
    OwnerAuthor

    Cuprum's final Rust-baseline layer is implemented and green at cuprum#449, but remains draft because this immutable binary-only installation path is still unavailable.

    Current evidence:

    • the shared action's installer archive is pinned and checksum verified;
    • the lint suite still comes from the mutable rolling release;
    • selecting a suite version requires a source build;
    • release v0.2.8 does not retain versioned whitaker-lints-* archives;
    • Whitaker issues #403 and #425 track retained/versioned lint artefacts and their provenance.

    The next executable sequence is: publish retained, versioned or content-addressed lint assets in Whitaker; add the committed manifest and fail-closed binary resolver here; then update Cuprum #449 to the approved immutable pin and rerun its gates and reviews. Pinning today's rolling asset ID would fail once that mutable release replaces its assets, so it would not resolve the blocker.

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

    enhancementNew feature or requesthighUnblocks delivery within the current sprint or release window. Reaction time is days, not hours.testingTest coverage, test infrastructure, and verification tooling work.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions