ansible: workaround broken Homebrew python@3.14 pyexpat on macOS Tahoe #221
Labels
No labels
burndown-2026-06
burndown-2026-08
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure#221
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
coily ops *broken on macOS Tahoe: Homebrew python@3.14 pyexpat fails to dlopenOn macOS Tahoe (Darwin 25.x), every
coily opsverb that needs an SSM token fails with:Root cause
The Homebrew
python@3.143.14.5arm64_tahoebottle shipspyexpat.cpython-314-darwin.sowith an absolute install-name pointing at/usr/lib/libexpat.1.dylib. The shared object expects_XML_SetAllocTrackerActivationThreshold— a symbol the system libexpat in Tahoe does not export.brew reinstall python@3.14reproduces the broken bottle.DYLD_FALLBACK_LIBRARY_PATH/DYLD_INSERT_LIBRARIESdon't help because dyld binds the absolute path and the lookup itself succeeds — only the symbol resolution fails.Homebrew's own
expat2.8.1 exports the symbol. The fix is to repoint pyexpat at it (install_name_tool -change) and re-sign the Mach-O ad-hoc (codesign -fs -).Workaround landed
This issue ships
ansible/playbooks/fix-pyexpat.yml, an idempotent local-connection playbook that:import pyexpatalready works (no-op when fine).install_name_tool -change /usr/lib/libexpat.1.dylib /opt/homebrew/opt/expat/lib/libexpat.1.dylibon the bottle's pyexpat.so.codesign -fs - <pyexpat.so>so dyld accepts the modified binary.import pyexpat,aws --version, and a realaws ssm get-parameter /forgejo/api-tokencall before reporting success.Run:
Future work
freshen.yml(own role, gated on macOS) socoily ansible-freshen action=applyself-heals.