Bug Summary
Regression introduced ~2026.4.3–2026.4.24
Symptom
openclaw gateway crashes repeatedly with Unhandled promise rejection: CIAO ANNOUNCEMENT CANCELLED every ~34 seconds. The gateway reaches ready state but never stabilizes.
Root Cause (two parts)
-
Stuck mDNS announcement: The CIAO mDNS announcement gets stuck in announcing state indefinitely (never transitions to announced). Likely caused by CIAO iterating over too many macOS network interfaces (19 on a typical M-series Mac — anpi, awdl, utun system tunnels, etc.) and failing to complete its multicast loopback confirmation.
-
Unregistered rejection handler: The watchdog's recreateAdvertiser() calls svc.destroy() on the stuck service, which causes CIAO to throw ANNOUNCEMENT CANCELLED as an unhandled promise rejection. The handleCiaoUnhandledRejection function in extensions/bonjour/index.js is correctly written to suppress this, but the plugin entry point at line 287 only passes { logger: api.logger } to startGatewayBonjourAdvertiser — it never passes registerUnhandledRejectionHandler. So the suppression handler is never registered and the rejection crashes the Node process.
Environment
- macOS (M-series Mac, 19+ network interfaces)
- OpenClaw version: latest as of 2026-04-25
Workaround
OPENCLAW_DISABLE_BONJOUR=1
(env var check exists at line 48 of extensions/bonjour/index.js)
Important: Must be set in both .zshrc and the launchd plist EnvironmentVariables dict, since launchd doesn't inherit shell env.
Suggested Fixes
- Wire up the handler: Pass
registerUnhandledRejectionHandler in the plugin entry call at line 287 of extensions/bonjour/index.js.
- Add fallback: Add a direct
process.on('unhandledRejection', ...) fallback inside startGatewayBonjourAdvertiser when deps.registerUnhandledRejectionHandler is absent.
- Filter interfaces: Investigate filtering out non-physical/non-routable interfaces (
utun, awdl, anpi, gif, stf) from CIAO's interface list to address the stuck-announcement root cause.
Bug Summary
Regression introduced ~2026.4.3–2026.4.24
Symptom
openclaw gatewaycrashes repeatedly withUnhandled promise rejection: CIAO ANNOUNCEMENT CANCELLEDevery ~34 seconds. The gateway reaches ready state but never stabilizes.Root Cause (two parts)
Stuck mDNS announcement: The CIAO mDNS announcement gets stuck in
announcingstate indefinitely (never transitions toannounced). Likely caused by CIAO iterating over too many macOS network interfaces (19 on a typical M-series Mac —anpi,awdl,utunsystem tunnels, etc.) and failing to complete its multicast loopback confirmation.Unregistered rejection handler: The watchdog's
recreateAdvertiser()callssvc.destroy()on the stuck service, which causes CIAO to throwANNOUNCEMENT CANCELLEDas an unhandled promise rejection. ThehandleCiaoUnhandledRejectionfunction inextensions/bonjour/index.jsis correctly written to suppress this, but the plugin entry point at line 287 only passes{ logger: api.logger }tostartGatewayBonjourAdvertiser— it never passesregisterUnhandledRejectionHandler. So the suppression handler is never registered and the rejection crashes the Node process.Environment
Workaround
(env var check exists at line 48 of
extensions/bonjour/index.js)Important: Must be set in both
.zshrcand the launchd plistEnvironmentVariablesdict, since launchd doesn't inherit shell env.Suggested Fixes
registerUnhandledRejectionHandlerin the plugin entry call at line 287 ofextensions/bonjour/index.js.process.on('unhandledRejection', ...)fallback insidestartGatewayBonjourAdvertiserwhendeps.registerUnhandledRejectionHandleris absent.utun,awdl,anpi,gif,stf) from CIAO's interface list to address the stuck-announcement root cause.