BoundedCommandTests and BoundedProcessTests failed nondeterministically: 4/20 runs idle, 7/8 under CPU saturation. Three separate causes. 1. #require inside a retry loop. waitForPID polled through readPID with `try?`, but #require records an issue even when its error is swallowed, so the first read of a created-but-not-yet-written pid file failed the test outright. Added a non-recording pollPID for the polling path and kept the recording read as the authoritative final attempt. The two single-read call sites now poll too - echo $$ > file creates and writes in two steps, so any single read can see a missing or empty file. 2. A 0.1s deadline racing process spawn. BoundedCommand starts its timeout concurrently with the spawn, so the deadline also bounded /bin/sh starting and publishing its pid; under load the child was killed before it ever wrote the file. Wait for the pid while the run is in flight and give the child a deadline well clear of spawn cost. 3. A 1s per-process budget on the concurrent fan-outs. Instrumenting the deadline showed a stalled run observed all 64 exits at ~3.1s, clustered within 100ms of each other - a global stall, not a straggler. Those tests assert that no exit is lost during monitor registration, not latency, so the timeout should not double as a performance assertion. A missed exit still fails: the 50ms pollUntilExit fallback would never complete. Also widened waitUntilGone, since reaping is asynchronous. No production code changed. Proof: 30/30 idle and 20/20 under full 32-core saturation, against 16/20 and 1/8 before.
OpenClaw macOS app (dev + signing)
Quick dev run
# from repo root
scripts/restart-mac.sh
Options:
scripts/restart-mac.sh --no-sign # fastest dev; ad-hoc signing (TCC permissions do not stick)
scripts/restart-mac.sh --sign # force code signing (requires cert)
scripts/restart-mac.sh --background-only # keep services running without automatic windows
--background-only suppresses first-run onboarding, update and CLI prompts, and
the --chat/--dashboard auto-open helpers. Pairing, control-channel, and Mac
node services still start. Combine it with --attach-only when an external
process owns the local Gateway.
Packaging flow
scripts/package-mac-app.sh
Creates dist/OpenClaw.app and signs it via scripts/codesign-mac-app.sh.
Signing behavior
Auto-selects identity (first match):
- Developer ID Application
- Apple Distribution
- Apple Development
- first available identity
If none found:
- errors by default
- set
ALLOW_ADHOC_SIGNING=1orSIGN_IDENTITY="-"to ad-hoc sign
Team ID audit (Sparkle mismatch guard)
After signing, we read the app bundle Team ID and compare every Mach-O inside the app. If any embedded binary has a different Team ID, signing fails.
Skip the audit:
SKIP_TEAM_ID_CHECK=1 scripts/package-mac-app.sh
Library validation workaround (dev only)
If Sparkle Team ID mismatch blocks loading (common with Apple Development certs), opt in:
DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh
This adds com.apple.security.cs.disable-library-validation to app entitlements.
Use for local dev only; keep off for release builds.
Useful env flags
SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"ALLOW_ADHOC_SIGNING=1(ad-hoc, TCC permissions do not persist)CODESIGN_TIMESTAMP=off(offline debug)DISABLE_LIBRARY_VALIDATION=1(dev-only Sparkle workaround)SKIP_TEAM_ID_CHECK=1(bypass audit)