Repository navigation
Description
Problem
macos-latest has rolled forward to macOS 26 (Tahoe). Homebrew's bottled
protobuf/abseil dylibs are now built with a minimum target of 26.0, but both
workflows hardcode MACOSX_DEPLOYMENT_TARGET: "15.0". delocate refuses to bundle
dylibs whose min target is newer than the wheel's, so the macOS wheel build fails.
The assumption is stated explicitly in both files and has expired:
.github/workflows/ci.yml:164-166— "Homebrew's bottled dylibs are built for the runner's OS (macos-latest = 15). Set the wheel's deployment target to match so delocate accepts them.".github/workflows/publish.yml:58-63— "Deployment target must match the runner: … (macos-latest = 15) …"
Evidence
cibuildwheel smoke / macos-latest on main @ 954e9b0 — run 33439745254:
delocate.libsana.DelocationError: Library dependencies do not satisfy target MacOS version 15.0:
.../protowire/.dylibs/libprotobuf.35.1.0.dylib has a minimum target of 26.0
.../protowire/.dylibs/libabsl_log_severity.2601.0.0.dylib has a minimum target of 26.0
.../protowire/.dylibs/libabsl_base.2601.0.0.dylib has a minimum target of 26.0
... (all bundled absl dylibs, 2601.0.0)
##[error]cibuildwheel: Command delocate-wheel --require-archs arm64 -w .../repaired_wheel
.../protowire_python-1.0.0-cp312-cp312-macosx_11_0_arm64.whl failed with code 1.
Identical failure, same job, on both open dependabot PRs — #15 (setup-python 6→7) and
#17 (cibuildwheel 3.4.1→4.2.0). Neither PR causes it; both inherit it from main.
Every other leg is green on all three (Linux, Windows, all four Python versions, CodeQL).
When it broke — ci.yml run history:
| date | branch | result |
|---|---|---|
| 2026-06-22 | actions/checkout-7 (#13) |
success |
| 2026-07-20 | setup-python-7 (#15) |
failure |
| 2026-07-27 | cibuildwheel-4.1.1 (#16) |
failure |
| 2026-08-10 | cibuildwheel-4.2.0 (#17) |
failure |
| 2026-08-31 | main @ 954e9b0 |
failure |
Broke between 2026-06-22 and 2026-07-20. main had no pushes between 2026-05-30 and
2026-08-31, so main never went visibly red — the dependabot PRs were the only canary,
and their red X read as "the bump is broken" rather than "main is broken."
Blast radius
publish.yml:61-63 carries the same hardcoded macosx_deployment_target: "15.0" on
the macos-latest / arm64 leg. This is latent, not yet live — no tag has been
pushed since it broke. The next release would fail the macOS wheel leg the same way.
The smoke job did its job here: it exists to "exercise the wheel-publishing path on
every PR so packaging regressions surface before release time," and it caught one.
Options
| fix | effect | cost | |
|---|---|---|---|
| a | bump target to 26.0 |
wheels install only on macOS 26+ | silently guts the published support matrix |
| b | pin runner to macos-15 |
keeps 15.0 target + current support matrix, restores green | one-line, reversible; macos-15 deprecates eventually |
| c | build protobuf/absl from source on macOS at the chosen target (as the Linux leg already does via scripts/cibw_install_protobuf_linux.sh) |
decouples the wheel's support floor from the runner image entirely | most work; stops the recurrence |
Open decision — needs a call
Which of the above. This sets the published wheel's macOS support floor, so it is
not an implementation detail: (a) drops every macOS user below 26.
Recommendation: (b) now to unblock main and both PRs, (c) filed as follow-up as
the durable fix — (b) restores green without touching the support matrix, and (c) is the
only option that stops this recurring each time GitHub rolls the runner image.
Done-when
-
cibuildwheel smoke / macos-latestgreen on main -
publish.yml's macOS leg carries the same fix (the latent half) - the runner-version assumption is either removed or restated where it is pinned,
so the next image roll fails loudly against a stated assumption rather than
silently against a stale comment
Activity