ci(003): assert the manylinux_2_17 glibc floor at release time#6
Conversation
The Linux release binaries are cross-linked against glibc 2.17 so the manylinux_2_17 wheel tag and the npm libc:["glibc"] claim are honest, but that floor was never verified (TODO(D1)). Validated it: the zigbuild `.2.17` path produces binaries whose maximum referenced glibc symbol is exactly 2.17, and they run on a real glibc-2.17 userland (manylinux2014 aarch64 + x86_64), executing the full verify path. Add a standing guard so a toolchain bump cannot silently raise the floor and turn the tag into a lie: release.yml reads the ELF dynamic symbol table after each glibc-floor build and fails the release if any referenced GLIBC_x.y symbol exceeds 2.17. Document the guarantee as a spec 003 behavior requirement so the change is coupled, not drift.
AI Code ReviewBugs and Logic ErrorsDead code: empty-MAX guard is unreachable under
|
First release since v0.2.0, bundling PRs #5, #6, and #7. PR #7 is a breaking change to verify-certificate, so this is a minor bump under 0.x. - Breaking (#7, spec 001): verify-certificate requires a verified platform seal by default; an unsealed or unadjudicated certificate exits 1. Restore the prior behavior with --allow-unsealed. --require-sealed is now a deprecated no-op. - Added (#6, spec 003): release builds assert the manylinux_2_17 glibc floor. - Fixed (#5): hardened the verify cores, exit-code contract, and release pipeline. Version bumped in lockstep across Cargo.toml, npm/package.json (main + five platform pins), and py/pyproject.toml; Cargo.lock and the codebase-index shard regenerated. New CHANGELOG.md carries the migration note for pinned tenants.
What
Retire and guard
TODO(D1): prove the Linux release binaries honor themanylinux_2_17glibc floor, and add a standing release-time assertion so theycannot silently stop honoring it.
Why
release.ymlbuilds the two Linux targets withcargo zigbuild --target <triple>.2.17so themanylinux_2_17wheel tag and the npmlibc: ["glibc"]claim are honest. That path was authored but never validated (the
TODO(D1)comment), so nothing confirmed the produced binaries actually run on an
old-glibc host, and nothing stopped a future toolchain bump from raising the
floor and turning the tag into a lie.
What I did
.2.17binariesreference a maximum glibc symbol of exactly
GLIBC_2.17, and they run on areal glibc-2.17 userland (
manylinux2014aarch64 native + x86_64 emulated,ldd (GNU libc) 2.17), executing the fullverify-certificatepath.release.ymlnow reads the ELF dynamic symbol table after eachglibc-floor build and fails the release if any referenced
GLIBC_x.yexceeds2.17. Proven to pass at 2.17 and trip below it.
requirement, and regenerated
.derivedfor 003.Test
readelf) and runtime smokein
manylinux2014for both arches, all green; the guard passes at floor 2.17and trips at 2.14.
spec-spine compile/index check/lint --fail-on-warnallclean.
v*) releases, so its first live exercise isthe next release; the logic here is validated against the real built binaries.