Skip to content

v1.2.0 — macOS MEDIUM tier + cmd.exe shim

Latest

Choose a tag to compare

@ron2k1 ron2k1 released this 18 May 03:15

v1.2.0 — macOS MEDIUM tier + cmd.exe shim

Second cross-platform release, and it closes the roadmap item v1.1.0 promised: macOS support. macOS Claude Code users now get the same subprocess-hygiene story Windows and Linux users have — with an honest MEDIUM ceiling that is pinned by a test so it can never silently regress. cmd.exe users on Windows get the full STRONG guarantee for the first time.

This release also makes the CI matrix honest about hosted Intel macOS, which GitHub is retiring.

What's new

  • tools/macos/find-claude.sh — macOS probe resolver mirroring the Linux/Windows versions, including the fnm dual-directory layout. Resolves every supported Claude Code install path on Darwin (PATH → npm prefix → /opt/homebrew/usr/local → nvm → fnm → asdf → volta → yarn global).
  • tools/macos/claude-jobbed.sh — the macOS reaper: setpgid + bash trap + a disowned, out-of-process watchdog. macOS has none of the kernel primitives the other tiers lean on (no Win32 Job Object, no cgroup cgroup.kill, no prctl(PR_SET_PDEATHSIG)), so the watchdog is what carries the guarantee.
  • tools/claude-jobbed.cmd — cmd.exe shim. It re-execs the PowerShell wrapper and inherits the same STRONG Win32 Job Object. cmd.exe users now get the identical kernel-enforced kill-on-close guarantee PowerShell users have had since v1.0.0 — doskey claude=C:\path\to\tools\claude-jobbed.cmd $* and you are covered.
  • install.sh — real macOS Darwin branch with a portable BSD/macOS mktemp template, ~/.bash_profile handling, and an honest-ceiling banner printed at install time so the user is told the MEDIUM limitation up front, not buried in docs.
  • tests/macos/test-honesty.bats — a NEGATIVE test that pins the honest MEDIUM ceiling: it asserts that a simultaneous SIGKILL of wrapper and watchdog leaks by design. If someone ever "fixes" this into a false STRONG claim, this test fails. Honesty is enforced, not promised.
  • CI matrix — bats now runs on macos-14 (Apple Silicon) alongside ubuntu-latest, with PowerShell on windows-latest.
  • Hosted Intel macos-13 dropped, tracked as an open gap (#3). GitHub is retiring hosted Intel macOS; the macos-13 leg never received a runner and ran to GitHub's hard 24h "awaiting a runner" ceiling (timeout-minutes bounds execution after a runner is assigned, never queue time). The scripts are architecture-neutral and bash-3.2-safe by construction, and the static-parse step still proves the 3.2 syntax, so only x86_64 execution is uncovered — not syntax. Documented as an explicit open gap rather than silently removed, consistent with this project's honest-ceiling ethos.

Guarantee matrix

Platform Mechanism SIGKILL-of-wrapper-alone survival Simultaneous SIGKILL of wrapper + watchdog
Windows 10+ (PowerShell and cmd.exe) Win32 Job Object + JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE ✅ Kernel-enforced ✅ Kernel-enforced (no watchdog needed)
Linux ≥ 5.14 + systemd --user systemd-run --scope + cgroup.kill (watchdog-supervised) ✅ Kernel-enforced via cgroup.kill ✅ Kernel-enforced via cgroup.kill
Linux < 5.14 / no systemd / WSL1 setpgid + bash trap ❌ (trap doesn't fire on SIGKILL)
macOS (v1.2.0, MEDIUM) setpgid + trap + disowned out-of-process watchdog ✅ Watchdog outlives the wrapper and reaps the tree By design — pinned honest by test-honesty.bats

The v1.1.0 matrix row macOS — deferred to v1.2.0 is now retired: macOS is shipped at the MEDIUM tier above.

Quick start

macOS

curl -fsSL https://raw.githubusercontent.com/ron2k1/claude-code-structured-concurrency/main/install.sh | bash -s -- --yes

The installer prints the honest MEDIUM ceiling banner. Then in a new shell:

claude --version  # routes through tools/macos/claude-jobbed.sh transparently

Windows cmd.exe (new in v1.2.0)

doskey claude=C:\path\to\claude-code-structured-concurrency\tools\claude-jobbed.cmd $*

claude from cmd.exe now runs inside the same STRONG Job Object as the PowerShell path.

Windows PowerShell / Linux

Unchanged — see the v1.1.0 release notes.

Why macOS is MEDIUM, not STRONG

Windows has JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; Linux ≥ 5.14 has cgroup.kill. Both are kernel-enforced tree-kill primitives — the OS itself guarantees no descendant outlives the job/scope. macOS has no equivalent: no Job Object, no kill-able cgroup, no PR_SET_PDEATHSIG. The closest honest construction is setpgid + a trap to reap the process group, plus a disowned watchdog (a backgrounded subshell that polls our identity and tears the group down when the wrapper vanishes).

That construction survives a Force-Quit / SIGKILL of the wrapper alone — the watchdog is a separate process, so it outlives the wrapper and reaps the tree. What it cannot survive is a simultaneous SIGKILL of wrapper and watchdog: bash traps don't fire on -9, and there is no kernel backstop on macOS to catch the gap. Rather than paper over that with an optimistic claim, tests/macos/test-honesty.bats asserts the leak happens in that exact scenario — so the ceiling is enforced by CI, not just documented.

Intel (x86_64) macOS coverage — the open gap

CI executes on Apple Silicon (macos-14) only. Hosted Intel (macos-13) execution is intentionally not a CI leg in v1.2.0 (GitHub hosted-Intel retirement; the leg ran to the 24h await-runner ceiling). The scripts are architecture-neutral and bash-3.2-safe by construction, and the static-parse step still proves bash-3.2 syntax — so only x86_64 execution coverage is missing, not syntax correctness. Restoring an Intel execution leg (self-hosted or paid runner) is tracked in #3.

What's next

  • v1.3.0+: optional macOS Swift kqueue helper to close the simultaneous-SIGKILL gap (would lift macOS toward STRONG); restored Intel macOS execution coverage (#3); Homebrew formula; apt PPA.

Stats

  • 36 PowerShell unit assertions + 1 functional test (Windows) + 41 bats tests (19 Linux + 22 macOS) — all passing in CI on ubuntu-latest, macos-14, windows-latest.
  • 9 ms reap latency verified on Windows 11 build 26200; macOS/Linux validated in CI (not micro-benched — no synthetic latency numbers claimed for the POSIX tiers).
  • macOS honest ceiling pinned by a dedicated negative test (tests/macos/test-honesty.bats).