Summary
The macOS app currently tries to start the local node service with the old CLI shape:
openclaw service node start --json
But current official CLIs no longer support the top-level service command. This appears to be the real root cause behind the macOS app symptoms where:
- the node connects but stays missing
system.run.prepare
nodes.run fails with does not support system.run.prepare
- app logs show
node service start failed: (Did you mean devices?)
This is related to #31959 and #37591, but those issues describe the symptom. This issue points to the startup path that appears to cause the symptom.
Environment
- macOS app: 2026.3.8-beta.1 (installed from the v2026.3.8 mac asset line)
- local CLI: 2026.3.8
- gateway: Linux OCI, 2026.3.8
- transport: Remote over SSH
What I verified
1. SSH / remote gateway path is healthy
After fixing local remote config to the normal SSH shape and clearing stale local port-guard state, the official probe succeeds:
openclaw gateway probe --ssh <target> --ssh-identity <key> --json => ok: true
So this is not a Tailscale / SSH reachability problem.
2. The official app node can connect, but still lacks the exec startup path
The macOS app node shows up connected, but its command list is missing system.run.prepare and nodes.run fails with:
node command not allowed: the node (platform: macOS 26.3.1) does not support "system.run.prepare"
3. The app log matches a local CLI mismatch
The app logs:
[ai.openclaw:node.service] node service start failed: (Did you mean devices?)
4. The macOS source still uses the old command shape
In apps/macos/Sources/OpenClaw/NodeServiceManager.swift, the app builds the local node-service command as:
CommandResolver.openclawCommand(subcommand: "service", extraArgs: ["node", "start", "--json"], configRoot: ["gateway": ["mode": "local"]])
That ends up calling:
openclaw service node start --json
5. Current official CLI reproduces the failure directly
Running this locally with the official CLI gives:
error: unknown command 'service'
(Did you mean devices?)
I also checked official npm CLI packages across multiple versions (including 2026.2.26, 2026.3.1, 2026.3.2, 2026.3.8-beta.1, 2026.3.8). They all use the flattened openclaw node ... command surface, not openclaw service node ....
Expected behavior
The macOS app should start/manage the local node service using the current CLI shape, for example under openclaw node ..., so that the node advertises the full exec surface including system.run.prepare.
Actual behavior
The app appears to call an obsolete command shape, the node service never comes up correctly, and the node connects without the full exec command surface.
Why this matters
Without this fix, the macOS app can still expose UI-centric capabilities like screen/canvas/browser, but it cannot serve as a complete exec-capable node for nodes.run on a current official CLI install.
Summary
The macOS app currently tries to start the local node service with the old CLI shape:
openclaw service node start --jsonBut current official CLIs no longer support the top-level
servicecommand. This appears to be the real root cause behind the macOS app symptoms where:system.run.preparenodes.runfails withdoes not support system.run.preparenode service start failed: (Did you mean devices?)This is related to #31959 and #37591, but those issues describe the symptom. This issue points to the startup path that appears to cause the symptom.
Environment
What I verified
1. SSH / remote gateway path is healthy
After fixing local remote config to the normal SSH shape and clearing stale local port-guard state, the official probe succeeds:
openclaw gateway probe --ssh <target> --ssh-identity <key> --json=>ok: trueSo this is not a Tailscale / SSH reachability problem.
2. The official app node can connect, but still lacks the exec startup path
The macOS app node shows up connected, but its command list is missing
system.run.prepareandnodes.runfails with:node command not allowed: the node (platform: macOS 26.3.1) does not support "system.run.prepare"3. The app log matches a local CLI mismatch
The app logs:
[ai.openclaw:node.service] node service start failed: (Did you mean devices?)4. The macOS source still uses the old command shape
In
apps/macos/Sources/OpenClaw/NodeServiceManager.swift, the app builds the local node-service command as:CommandResolver.openclawCommand(subcommand: "service", extraArgs: ["node", "start", "--json"], configRoot: ["gateway": ["mode": "local"]])That ends up calling:
openclaw service node start --json5. Current official CLI reproduces the failure directly
Running this locally with the official CLI gives:
error: unknown command 'service'(Did you mean devices?)I also checked official npm CLI packages across multiple versions (including 2026.2.26, 2026.3.1, 2026.3.2, 2026.3.8-beta.1, 2026.3.8). They all use the flattened
openclaw node ...command surface, notopenclaw service node ....Expected behavior
The macOS app should start/manage the local node service using the current CLI shape, for example under
openclaw node ..., so that the node advertises the full exec surface includingsystem.run.prepare.Actual behavior
The app appears to call an obsolete command shape, the node service never comes up correctly, and the node connects without the full exec command surface.
Why this matters
Without this fix, the macOS app can still expose UI-centric capabilities like screen/canvas/browser, but it cannot serve as a complete exec-capable node for
nodes.runon a current official CLI install.