Skip to content

Skills page shows 52 skills but agent only sees ~12 — UI ignores runtime dependency filtering #61

Description

@yikkuro

Summary

The Skills page shows 52 built-in skills as enabled/available, but the agent at runtime only sees a small subset (12 in this case). There is no indication in the UI of which skills are actually usable. The UI reflects only the allowBundled opt-in list, while the OpenClaw runtime additionally filters skills by whether their dependencies (required CLI binaries / env / OS) are satisfied on this machine. The two views disagree, and the app never surfaces the runtime eligibility, so users believe 52 skills are active when most are silently filtered out.

Reproduction

  1. Open Settings → Skills. It lists 52 built-in skills, all shown as installed and (mostly) enabled.
  2. Ask the agent "how many skills can you see / use?".
  3. The agent reports 12, not 52.

Observed on this Windows machine:

  • 6 bundled skills loaded (deps satisfied): coding-agent, gh-issues, github, healthcheck, skill-creator, weather.
  • 6 user skills from ~/.openclaw/skills/ (no binary deps): desktop-organizer, excel-xlsx, officecli, powerpoint-pptx, security-practice, word-docx.
  • ~40 bundled skills filtered out because their required CLIs aren't installed, e.g. op (1password), curl, python3, jq+rg (session-logs), ffmpeg (video-frames), tmux, himalaya, sag, etc. Only git and gh are present from the full required-binary set. Many of these tools are macOS/Linux-oriented.

Root cause

The MicroClaw UI and the OpenClaw runtime compute "available" differently.

UI (desktop/src/main.ts skills:list, ~lines 2470–2568): a skill's enabled flag is derived only from the allowBundled opt-in list (and entries for managed), and every on-disk skill is returned with installed: true. There is no check of the skill's declared dependencies (required binaries, env vars, OS):

if (source === "builtin" && allowBundled && allowBundled.length > 0) {
  enabled = allowBundled.includes(entry.name);   // opt-in only; no dep check
}
...
results.push({ id, name, ..., enabled, installed: true });

Runtime (openclaw package, config-*.js shouldIncludeSkill): after the allowlist check, the skill must also pass evaluateRuntimeEligibility, which requires the declared binaries/env/OS to be present:

function shouldIncludeSkill(params) {
  ...
  if (skillConfig?.enabled === false) return false;
  if (!isBundledSkillAllowed(entry, allowBundled)) return false;
  return evaluateRuntimeEligibility({
    os, remotePlatforms, always, requires,
    hasBin: hasBinary,             // ← required CLI must exist on PATH
    hasEnv, ...
  });
}

So a skill can be allowBundled + enabled:true + installed:true in the UI, yet be excluded by the runtime because (say) op/ffmpeg/python3/tmux isn't installed. The UI has no visibility into requires/hasBin, so it always reports the skill as available.

Impact

  • Misleading: users think all 52 skills are active; the agent actually exposes ~12. Asking the agent produces a number that contradicts the Skills page.
  • No discoverability: nothing tells the user why a skill won't run or what to install to enable it (e.g. "requires op CLI").
  • Compounds with the existing "X/Y enabled" header count, which also ignores runtime eligibility.

Suggested fixes

  1. In skills:list, evaluate each skill's declared dependencies (mirror OpenClaw's evaluateRuntimeEligibility / requires + binary-on-PATH check) and return an eligible/available flag plus the list of missing requirements.
  2. In the Skills UI, visually distinguish enabled-but-not-runnable skills (e.g. a "Requires: op" badge / muted state), and show the count of actually-usable skills.
  3. Optionally surface an install hint / link per missing dependency (OpenClaw already tracks install + missing.bins per skill in its control-ui skills view).

Environment

  • MicroClaw desktop (Electron dev build), Windows.
  • Built-in skills dir: %APPDATA%\npm\node_modules\openclaw\skills (52 dirs).
  • Runtime filtering in the bundled openclaw package (shouldIncludeSkill / evaluateRuntimeEligibility).

Screenshots

Settings -> Skills shows Built-in Skills (52) with 52/52 enabled:

Skills page shows 52

But the agent, asked what skills it has, lists only 12:

Agent sees 12

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions