Problem
Upgrading the compiled binary with cp new dist/mcp2cli (same inode, contents overwritten) invalidates the ad-hoc code signature on macOS. The next exec is killed by the kernel:
$ cp /tmp/build/dist/mcp2cli dist/mcp2cli && mcp2cli --version
# exit code 137 (SIGKILL)
Hit this on 2026-06-11 upgrading skippy-oc from 0.2.0 to 0.3.3.
Working upgrade flow (should be in README/CONTRIBUTING)
rm dist/mcp2cli # fresh inode is the fix
cp /path/to/new/mcp2cli dist/mcp2cli
launchctl kickstart -k gui/501/com.mcp2cli.local-ui # restart local daemon
The already-running daemon keeps the old inode alive and is unaffected until restart, so this is safe to do live.
Nice-to-have
mcp2cli self-update (or a scripts/install.sh) that does rm+cp+kickstart atomically.
- Version-skew warning: a 0.2.0 client talked to the 0.3.3 daemon with no complaint from either side -- 0.2.0 predates the
source routing field entirely and just silently ignored it. mcp2cli daemon status could compare client vs daemon version and warn.
Problem
Upgrading the compiled binary with
cp new dist/mcp2cli(same inode, contents overwritten) invalidates the ad-hoc code signature on macOS. The next exec is killed by the kernel:Hit this on 2026-06-11 upgrading skippy-oc from 0.2.0 to 0.3.3.
Working upgrade flow (should be in README/CONTRIBUTING)
The already-running daemon keeps the old inode alive and is unaffected until restart, so this is safe to do live.
Nice-to-have
mcp2cli self-update(or ascripts/install.sh) that does rm+cp+kickstart atomically.sourcerouting field entirely and just silently ignored it.mcp2cli daemon statuscould compare client vs daemon version and warn.