Problem
The Build (macOS) job added in #374 has never passed. It fails at the zsh-load step:
/Users/runner/work/_temp/….sh: line 1: timeout: command not found
##[error]Process completed with exit code 127
smoke.yml:139 calls timeout 60s zsh -c "…" unconditionally. timeout is GNU coreutils — macOS runners ship neither timeout nor gtimeout unless coreutils is brewed. The Ubuntu job passes because coreutils is the system default there.
Impact
Every PR opened since #374 shows a red Build (macOS), and main itself is red:
| Run |
Head |
Result |
| 2026-08-19 18:19Z |
fe31477b — "ci(smoke): add a macOS build job alongside Ubuntu (#374)" |
failure |
| 2026-08-19 17:39Z |
3ff358b5 |
success (pre-macOS-job) |
Found while driving #378 to green — its Build (macOS) failure reproduces on main with an untouched smoke.yml, so it is this, not that PR.
Fix
Two options.
A — install coreutils on macOS (keeps the run step identical across platforms):
- name: Install coreutils (macOS)
if: runner.os == 'macOS'
run: brew install coreutils
…then timeout resolves via the gnubin path, or call gtimeout explicitly.
B — drop the coreutils dependency (no install step, works on both):
- run: |
perl -e 'alarm 60; exec @ARGV' zsh -c '
source ~/.zshrc
[[ -n "$ZSH_VERSION" ]] || { echo "❌ zsh configuration failed to load"; exit 1; }
echo "✅ zsh $ZSH_VERSION configuration loaded successfully"
'
Recommend B. perl is preinstalled on both runner images, it adds no Homebrew step to every macOS run, and it preserves the "60 s is the ceiling" intent that the comment above line 139 spells out. The alarm fires SIGALRM and the process dies non-zero, so the job still fails on a hang — same semantics as timeout.
Acceptance
Build (macOS) passes on main.
- A deliberately hanging
~/.zshrc still fails the job rather than running to the 6-hour job limit — worth verifying once, since that is the whole point of the ceiling.
Problem
The
Build (macOS)job added in #374 has never passed. It fails at the zsh-load step:smoke.yml:139callstimeout 60s zsh -c "…"unconditionally.timeoutis GNU coreutils — macOS runners ship neithertimeoutnorgtimeoutunlesscoreutilsis brewed. The Ubuntu job passes because coreutils is the system default there.Impact
Every PR opened since #374 shows a red
Build (macOS), andmainitself is red:fe31477b— "ci(smoke): add a macOS build job alongside Ubuntu (#374)"3ff358b5Found while driving #378 to green — its
Build (macOS)failure reproduces onmainwith an untouchedsmoke.yml, so it is this, not that PR.Fix
Two options.
A — install coreutils on macOS (keeps the run step identical across platforms):
…then
timeoutresolves via thegnubinpath, or callgtimeoutexplicitly.B — drop the coreutils dependency (no install step, works on both):
Recommend B.
perlis preinstalled on both runner images, it adds no Homebrew step to every macOS run, and it preserves the "60 s is the ceiling" intent that the comment above line 139 spells out. Thealarmfires SIGALRM and the process dies non-zero, so the job still fails on a hang — same semantics astimeout.Acceptance
Build (macOS)passes onmain.~/.zshrcstill fails the job rather than running to the 6-hour job limit — worth verifying once, since that is the whole point of the ceiling.