Problem: CI fetches SDK archives, tool binaries, Python packages, Git sources, OCI images, and GitHub Actions from mutable references or without checking their content. These inputs can change between runs without a repository change.
Fix: Verify archives and binaries against committed hashes, clone Git sources at reviewed commits, install Python packages from locked or fully hashed requirements, and pin OCI images and GitHub Actions to multi-architecture index digests and full commit SHAs. These references and lock files require manual updates. APT, APK, Homebrew, hosted runner images, and LLVM PPA packages remain trusted; pinning the PPA key would not constrain published packages.
<details><summary>Verification</summary>
Container tags remain beside their added digests for direct comparison in the diff, and Python package hashes can be regenerated locally. The remaining pins can be checked with:
# SDK archives
grep 9600fa93644df674ee916b5e2c8a6ba8dacf631996a65dc922d003b98b5ea3b1 contrib/macdeploy/README.md
curl -fsSL https://download.freebsd.org/releases/amd64/amd64/15.1-RELEASE/MANIFEST | grep 3768988b151c20f965679062b065c63a977d6bbb9f47fd83695ec2c40790c18f
curl -fsSL https://cdn.netbsd.org/pub/NetBSD/NetBSD-11.0_RC6/amd64/binary/sets/SHA512 | grep 0323dbb284913cae27f1e67a41c395dc6c7a4160dc65e79866ca8a69e12bad5fd782cc3f5da81a9d718020a857ccbc764e007f6b2696d88d7b9df83baa86f45b
curl -fsSL https://cdn.netbsd.org/pub/NetBSD/NetBSD-11.0_RC6/amd64/binary/sets/SHA512 | grep a33f9cb6886713a2cc9d3e7bfbecbcb77b82d86cd43fa688531e06b389ad1820f1f63e501a37f899aee700270618b0865aacbf569b65a91fdb77ddd48f23d940
curl -fsSL https://cdn.openbsd.org/pub/OpenBSD/7.9/amd64/SHA256 | grep 923d2e03f06408d50d4848334398c6d04b5514dcac7917badfc178a0eef248de
curl -fsSL https://cdn.openbsd.org/pub/OpenBSD/7.9/amd64/SHA256 | grep 21a67af20aebcabf85b09f4206fc95b4cae0a35d42b154b976f0159f457724f9
# Git sources
git ls-remote https://github.com/llvm/llvm-project 'refs/tags/llvmorg-22.1.7^{}' | grep a255c1ed36a1d06f79bd2633ba9f8d900153007c
git ls-remote https://github.com/riscv-collab/riscv-gnu-toolchain refs/tags/2026.06.06 | grep 81bb1f89664aad156df3d2773195177c92dedc3a
git ls-remote https://github.com/include-what-you-use/include-what-you-use refs/heads/clang_22 | grep 01a091d16b3dedb808db21f32ed3e761737a3691
# Lint binaries
curl -fsSL https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellcheck-v0.11.0.linux.x86_64.tar.xz | sha256sum | grep 8c3be12b05d5c177a04c29e3c78ce89ac86f1595681cab149b65b97c4e227198
curl -fsSL https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellcheck-v0.11.0.linux.aarch64.tar.xz | sha256sum | grep 12b331c1d2db6b9eb13cfca64306b1b157a86eb69db83023e261eaa7e7c14588
curl -fsSL https://github.com/becheran/mlc/releases/download/v1.2.0/mlc-x86_64-linux | sha256sum | grep 7a72a93d5b3ee8a554cb840abdfe90aefb709418f225461b52021e3a058238a2
curl -fsSL https://github.com/becheran/mlc/releases/download/v1.2.0/mlc-aarch64-linux | sha256sum | grep 01ec8e086f3b625616d461b63451be9175a02557de6b591bac7cde6791ab074b
# GitHub Actions
git ls-remote https://github.com/actions/checkout refs/tags/v6 | grep d23441a48e516b6c34aea4fa41551a30e30af803
git ls-remote https://github.com/actions/cache refs/tags/v5 | grep caa296126883cff596d87d8935842f9db880ef25
git ls-remote https://github.com/actions/upload-artifact refs/tags/v7 | grep 043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
git ls-remote https://github.com/actions/download-artifact refs/tags/v8 | grep 3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
git ls-remote https://github.com/actions/github-script refs/tags/v8 | grep ed597411d8f924073f98dfc5c65a23a2325f34cd
git ls-remote https://github.com/docker/setup-buildx-action refs/tags/v4 | grep bb05f3f5519dd87d3ba754cc423b652a5edd6d2c
git ls-remote https://github.com/WarpBuilds/cache refs/tags/v1 | grep 6ab98e7fdd65255995acec1de229a0bf2a40fe37
</details>