Repository navigation
ci: pin macOS wheel runners to macos-15 - #19
Conversation
GitHub rolled macos-latest forward to macOS 26 (Tahoe) in July 2026.
Homebrew's bottled protobuf/abseil are now built with a minimum target
of 26.0, but both workflows set the wheel's MACOSX_DEPLOYMENT_TARGET to
15.0. delocate refuses to bundle dylibs whose min target is newer than
the wheel's, so the macOS wheel build has failed since:
delocate.libsana.DelocationError: Library dependencies do not satisfy
target MacOS version 15.0:
.../libprotobuf.35.1.0.dylib has a minimum target of 26.0
.../libabsl_*.2601.0.0.dylib has a minimum target of 26.0
Pin the two wheel-building matrices to macos-15 so the runner image and
the deployment target agree again. This keeps the published wheel's macOS
support floor exactly where it is; bumping the target to 26.0 instead
would drop every macOS user below 26, which is a release decision rather
than a CI fix.
Both halves are fixed, not just the visible one. publish.yml carried the
identical pin on the release path — latent only because no tag has been
pushed since it broke; the next release would have failed the same way.
ci.yml's test matrix stays on macos-latest: it installs editable and
never runs delocate, so it is unaffected and keeps testing newest-macOS.
The stale "macos-latest = 15" comments are replaced with ones stating
that the runner image and the deployment target are a single decision,
so the next reader changes them together or not at all.
Fixes #18
Claude-Session: https://claude.ai/code/session_01EshKcwQsY1Mf6qhrckL95u
CI evidence — all 18 checks greenRun 33443842524 on The mechanism, before and afterThe Homebrew bottle actually poured on the runner is the whole story:
Same package versions (protobuf 35.1, abseil 20260107.1) — only the bottle's target OS delocate now succeedsNo The support floor is unchanged — which was the pointThe repaired wheel is tagged Scope of what is provenThe smoke job builds cp312 only, by design. The full release matrix |
Fixes #18.
macos-latestrolled forward to macOS 26 (Tahoe) in July 2026. Homebrew's bottledprotobuf/abseil now target 26.0, while both workflows build the wheel against
MACOSX_DEPLOYMENT_TARGET: "15.0"— and delocate refuses to bundle dylibs whosemin target is newer than the wheel's:
This pins the two wheel-building matrices to
macos-15, so the runner image andthe deployment target agree again.
Why pin the runner rather than raise the target
Raising
MACOSX_DEPLOYMENT_TARGETto 26.0 is the other one-line fix, and it is thewrong one to take silently: it would set the published wheel's macOS support floor to
26, dropping every macOS user below it. That is a release decision, not a CI fix.
Pinning restores green while leaving the support matrix exactly where it is.
Discussed as option (b) in #18; option (c) — building protobuf/absl from source at the
chosen target, as the Linux leg already does — is the durable fix that decouples the
support floor from the runner image entirely. Filed separately as #20.
Both halves, not just the visible one
publish.ymlcarried the identical pin on the release path. It is latent — no tag hasbeen pushed since the breakage — so nothing was visibly failing there, but the next
release would have failed the macOS wheel leg identically. Fixed here too.
ci.yml's test matrix deliberately stays onmacos-latest: it installs editableand never runs delocate, so it is unaffected, and it keeps exercising newest-macOS.
On the stale comments
Both files carried a comment asserting
macos-latest = 15. That assumption is whatexpired, and because it lived only in a comment it expired silently — the job went red
for six weeks with main never visibly failing (no pushes to main between 2026-05-30 and
2026-08-31, so only dependabot PRs ran CI, where the red X read as "the bump is broken").
Replaced with comments stating that the runner image and the deployment target are a
single decision, so the pair gets changed together or not at all.
Evidence
Pre-fix,
cibuildwheel smoke / macos-latestfailed identically on main @954e9b0(run 33439745254)
and on both open dependabot PRs #15 and #17 — same job, same DelocationError. Every
other leg was green on all three.
Post-fix CI evidence is posted as a comment below once this PR's run completes.
Follow-on
#15 and #17 are both clean and were only ever red from this. Once this lands they should
go green on rebase and can be merged normally. Worth noting #17 has already demonstrated
cibuildwheel 4.2.0 works on the Linux and Windows legs; macOS was the only untested one,
for this reason.