Summary
On a Linux/container Gateway with a connected macOS node, remote macOS skill eligibility still reports apple-notes as missing memo even though the Mac node successfully exposes memo via system.which.
The issue appears to be that the remote bin probe parser only accepts bins as an array or stdout as a string, while system.which returns bins as an object map of { binName: resolvedPath }.
Environment
- OpenClaw:
2026.4.23
- Gateway host: Linux / containerized OpenClaw on Unraid
- Connected node: macOS / darwin node named
Mac
- Node capabilities include:
system.run
system.run.prepare
system.which
- Affected bundled skill:
apple-notes
- Required binary:
memo
Reproduction / observed behavior
- Enable bundled
apple-notes via skills.allowBundled.
- Pair/connect a macOS node with
system.which and system.run available.
- Install
memo on the Mac node.
- Confirm the node can resolve
memo:
{
"ok": true,
"command": "system.which",
"payload": {
"bins": {
"memo": "/opt/homebrew/bin/memo"
}
},
"payloadJSON": "{\"bins\":{\"memo\":\"/opt/homebrew/bin/memo\"}}"
}
- Confirm
memo itself runs on the Mac node:
memo, version 0.5.2
memo notes --help works
- Run
openclaw skills check --json.
Actual result:
{
"name": "apple-notes",
"missing": {
"bins": ["memo"],
"os": ["darwin"]
}
}
Expected result:
apple-notes should be eligible because:
- a connected remote macOS node is available
- that node supports
system.run
system.which successfully resolved memo
Suspected root cause
In the built output I inspected, parseBinProbePayload() handles:
Array.isArray(parsed.bins)
typeof parsed.stdout === "string"
but does not handle the system.which response shape:
parsed.bins = { memo: "/opt/homebrew/bin/memo" }
So a successful system.which response is parsed as an empty bin list, and remote skill eligibility never sees memo.
There was a closed, unmerged PR that appears to address this exact parser gap:
Suggested fix
Handle object/map-shaped bins responses in parseBinProbePayload(), for example:
if (parsed.bins && typeof parsed.bins === "object" && !Array.isArray(parsed.bins)) {
return Object.keys(parsed.bins)
.map((bin) => normalizeOptionalString(String(bin)) ?? "")
.filter(Boolean);
}
Impact
Docker/Linux Gateway + remote macOS node setups cannot use macOS-only skills like apple-notes even when the node and required binary are correctly configured. The skill remains hidden/missing from eligibility because the successful remote probe is misparsed.
Summary
On a Linux/container Gateway with a connected macOS node, remote macOS skill eligibility still reports
apple-notesas missingmemoeven though the Mac node successfully exposesmemoviasystem.which.The issue appears to be that the remote bin probe parser only accepts
binsas an array orstdoutas a string, whilesystem.whichreturnsbinsas an object map of{ binName: resolvedPath }.Environment
2026.4.23Macsystem.runsystem.run.preparesystem.whichapple-notesmemoReproduction / observed behavior
apple-notesviaskills.allowBundled.system.whichandsystem.runavailable.memoon the Mac node.memo:{ "ok": true, "command": "system.which", "payload": { "bins": { "memo": "/opt/homebrew/bin/memo" } }, "payloadJSON": "{\"bins\":{\"memo\":\"/opt/homebrew/bin/memo\"}}" }memoitself runs on the Mac node:openclaw skills check --json.Actual result:
{ "name": "apple-notes", "missing": { "bins": ["memo"], "os": ["darwin"] } }Expected result:
apple-notesshould be eligible because:system.runsystem.whichsuccessfully resolvedmemoSuspected root cause
In the built output I inspected,
parseBinProbePayload()handles:but does not handle the
system.whichresponse shape:So a successful
system.whichresponse is parsed as an empty bin list, and remote skill eligibility never seesmemo.There was a closed, unmerged PR that appears to address this exact parser gap:
Suggested fix
Handle object/map-shaped
binsresponses inparseBinProbePayload(), for example:Impact
Docker/Linux Gateway + remote macOS node setups cannot use macOS-only skills like
apple-noteseven when the node and required binary are correctly configured. The skill remains hidden/missing from eligibility because the successful remote probe is misparsed.