Skip to content

Remote macOS skill eligibility ignores system.which bins object response, so apple-notes stays missing memo #71877

Description

@miguelarios

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

  1. Enable bundled apple-notes via skills.allowBundled.
  2. Pair/connect a macOS node with system.which and system.run available.
  3. Install memo on the Mac node.
  4. 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\"}}"
}
  1. Confirm memo itself runs on the Mac node:
memo, version 0.5.2
memo notes --help works
  1. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions