- Update overview to mention cargo-zigbuild instead of plain cargo build
- Change prerequisites from "recommended" to "required"
- Remove references to cargo build fallback (that code was removed)
- Add zigbuild/zig install to Quick Start
- Fix troubleshooting to mention both zig and cargo-zigbuild
https://claude.ai/code/session_019QkKmgPcFYaLwKe34EMFJy
- Remove phantom `-i, --image` CLI flag that doesn't exist in code
- Fix default base image from gcr.io/distroless/static:nonroot to cgr.dev/chainguard/static:latest
- Update --platform description to reflect auto-detection from base image
- Move -v/--verbose to Global Options (it's a global flag, not per-command)
- Add missing `version` command to CLI reference
- Fix non-existent `make test-verbose` reference
- Mark multi-platform image manifests as implemented in CLAUDE.md
https://claude.ai/code/session_019QkKmgPcFYaLwKe34EMFJy
The cargo-zigbuild cache was shared between x86 and ARM runners
(cache key only used runner.os), causing "Exec format error" when
an ARM binary was restored on x86 or vice versa. Added runner.arch
to all cache keys and use --force install to overwrite stale binaries.
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
cargo-zigbuild --version doesn't work reliably in all PATH configs.
Use cargo zigbuild --help instead, which uses cargo's subcommand
discovery to find the cargo-zigbuild binary. Also verify zigbuild
actually works in CI after installation.
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
The require_zigbuild() check was using `cargo zigbuild --version` which
fails because cargo-zigbuild's subcommand doesn't support --version.
Changed to use `cargo-zigbuild --version` which works correctly.
Also reverted integration test changes to keep original behavior.
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
Integration tests now skip instead of panicking when Docker or
cargo-zigbuild aren't available. Also removed redundant make test-e2e
step from CI since make test already includes e2e tests.
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
- Make zigbuild a hard requirement instead of optional with fallback
- Remove configure_cross_linker and all system linker detection logic
- Remove apt-get install of system cross-linkers from CI
- Remove unused `which` dependency
- Fail fast with clear install instructions if zigbuild is missing
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
The snap install was unreliable and the apt fallback used a
non-existent package name. pip install ziglang is the recommended
way to install zig in CI environments.
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
- Integrate cargo-zigbuild as the default build backend, falling back
to cargo build with best-effort linker detection if not installed
- Auto-install rustup targets when missing (rustup target add)
- Use persistent target/krust/ directory instead of temp dirs so
incremental compilation works across runs
- Remove .cargo/config.toml from repo (add to .gitignore) since
zigbuild handles cross-linker configuration
- Improve error messages: suggest cargo-zigbuild when linker not found
- Simplify CI to use zigbuild instead of per-target system linkers
- Simplify Makefile by removing setup-cross-compile/verify targets
- Update README and CLAUDE.md to reflect new approach
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
cargo-mutants revealed that get_binary_name's --bin/--example argument
parsing and get_binary_subdir had zero test coverage. These new tests
reduce missed mutants in the builder module from 34 to 10 (the remaining
10 are in RustBuilder::build which runs cargo and can't be unit tested).
https://claude.ai/code/session_01W3QJhFvej6fS1GevQm2vp7
- Deduplicate platform parsing: select_platform_manifest now uses
crate::image::parse_platform_string instead of reimplementing
the split/match logic inline
- Fix empty digest fallback: when docker-content-digest header is
missing, compute sha256 digest from the response body instead of
using an empty string
- Surface parse failures: get_image_platforms now returns errors
instead of silently returning Ok(vec![]) when config parsing fails
or the response is an unrecognized format
https://claude.ai/code/session_01RoAUcigxrM6Lz8DESr3SkW
- Fix digest mismatch: select_platform_manifest now returns the
platform-specific digest from docker-content-digest header instead
of reusing the index-level digest
- Fix empty platform list: get_image_platforms fetches config blob for
single-platform images to determine actual os/architecture
- Fix missing Accept header: add Docker manifest list media type
(application/vnd.docker.distribution.manifest.list.v2+json) to
Accept headers for broader registry compatibility
https://claude.ai/code/session_01RoAUcigxrM6Lz8DESr3SkW
Bug fixes:
- Fix platform selection: fetch_image_data now uses the platform parameter
to select the correct manifest from an image index instead of always
picking the first entry
- Fix parse_platform to accept 3-part platforms (linux/arm/v7, linux/arm/v6)
which previously caused a hard error at image creation time
- Fix variant always being None in manifest descriptors, now properly set
for ARM platforms so registries can select the correct image
- Fix auth tests that used matches!() without assert!(), silently passing
- Fix create_test_binary using a dangling path after NamedTempFile drop
Design improvements:
- Implement real platform detection in get_image_platforms by fetching
the image index from the registry instead of returning hardcoded defaults
- Deduplicate Platform type (was defined identically in manifest and registry)
- Extract shared build-and-push logic into build_and_push_platform() and
push_tagged_manifest_list(), eliminating ~100 lines of duplication
between Build and Resolve commands
- Use consistent OCI media types throughout instead of mixing Docker v2
and OCI formats
- Rename config::RegistryAuth to config::RegistryCredential to avoid
naming collision with registry::RegistryAuth
- Simplify push_manifest return type from (location, digest) to just digest
- Remove dead Push command that only printed an error
- Remove unused auth_cache field from RegistryClient
Robustness:
- URL-encode query parameters in token requests using reqwest::Url
- Add connect (30s) and request (300s) timeouts to HTTP client
https://claude.ai/code/session_01RoAUcigxrM6Lz8DESr3SkW