#Agent skill

1 messages · Page 1 of 1 (latest)

coral cobalt
#

I created a skill in a agents named cody, and I put it in the workspace-cody/skills, but it doesn't show up.

  • cody
    Workspace: ~/.openclaw/workspace-cody
    Agent dir: ~/.openclaw/agents/cody/agent
    Model: openai/gpt-5.2
    Routing rules: 0

$ ls workspace-cody/skills/python-remote/
SKILL.md

edgy mistBOT
#

Two common gotchas here (and a quick way to prove which one you’re hitting):

0) Version (matters for skills + native commands)

Run and paste:

openclaw --version

1) Skills are per-workspace / per-agent

Putting a skill into ~/.openclaw/workspace-cody/skills/... only affects the cody agent.

If your Discord thread/session is still running the default agent (often main), you won’t see it.

Fast check (this also shows which workspace the CLI is scanning):

openclaw skills list --json
#

Look at workspaceDir in the output. If it’s not ~/.openclaw/workspace-cody, you’re editing the wrong workspace for the agent you’re actually using.

Fix options:

  • Move/copy the skill into the workspace that workspaceDir points to, or
  • Make sure your Discord route/thread is bound to agent cody (so it uses workspace-cody), or
  • Put it in ~/.openclaw/skills/<skill>/SKILL.md if you want it shared across all agents.

(Ref: https://docs.openclaw.ai/tools/skills)

2) SKILL.md must have YAML frontmatter (name/description)

OpenClaw won’t load it properly if the SKILL.md is missing at least:

---
name: python_remote
description: My python remote skill
---
#

Also note: Discord native skill commands sanitize names to a-z0-9_ (so python-remote becomes something like python_remote).
(Ref: https://docs.openclaw.ai/tools/creating-skills and https://docs.openclaw.ai/tools/slash-commands)

3) Refresh: new session or restart

Skills are snapshotted per-session (and native commands may need a restart to re-register cleanly).

  • start a new session (/new) or
  • restart the gateway

If you paste these 2 outputs, I can tell you exactly what’s wrong

openclaw --version
openclaw skills list --json

(And if it’s listed but still not visible in Discord’s / menu, we’ll check commands.nativeSkills + logs next.)

coral cobalt
#

ok I put it in ~/.openclaw/skills , now what?

edgy mistBOT
#

Nice — ~/.openclaw/skills is the “shared across all agents on this gateway” location. Next steps are basically: verify OpenClaw can see it, then refresh skills / restart so Discord commands update.

1) Make sure the folder layout + frontmatter are correct

You want:

~/.openclaw/skills/python-remote/SKILL.md

And the SKILL.md must start with YAML frontmatter, at least:

---
name: python-remote
description: Run python remotely (example)
---
#

(If the frontmatter is missing/malformed, it often just won’t load/index.)

2) Confirm OpenClaw sees it (best debug signal)

Run:

openclaw skills list -v

If it’s there but not “ready”, -v will tell you what’s missing (bins/env/config/os gates).

You can also inspect just that skill:

openclaw skills info python-remote
#

3) Refresh so it shows up in chat (and in Discord’s / menu)

Two different refreshes can be involved:

  • Model “skills snapshot” (per session): easiest is to start a new session in the chat:

    • send /new
  • Discord native slash commands for skills: these are typically registered at gateway startup, so if you want it to appear as a /python_remote-style command, do:

    openclaw gateway restart
    

Also: Discord sanitizes skill command names to a-z0-9_, so python-remote usually appears as /python_remote.

Docs refs:

#

4) If it still doesn’t show up, paste this output

openclaw skills list --json

That will show the exact workspaceDir/paths being scanned and whether the skill is being filtered (disabled/missing requirements/etc.).

coral cobalt
#

ok it is coming up now with cli, how to tell if agent itself can see it while using discord?

edgy mistBOT
#

Use the in-chat context report — it shows exactly what the agent’s system prompt currently includes (including the skills snapshot).

In Discord, send as a standalone message:

/context detail

Then look for:

  • Workspace: ... (confirms which agent/workspace that Discord session is using)
  • Skills: ... (it will list skill names; make sure python-remote / python_remote is in there)

If it’s not listed there but the CLI shows it:

  1. start a fresh session so the skills snapshot refreshes:
#
/new
  1. then run /context detail again.

To actually test-run it from Discord even if a native /python_remote command doesn’t appear, use:

/skill python-remote <some input>

(Discord may sanitize the command name to python_remote, but /skill <name> bypasses most of that and is the most reliable “does the agent see it?” test.)

coral cobalt
#

I don't see the skill python-on-coder-01 skill there.

Context breakdown (detailed)
Workspace: /home/node/.openclaw/workspace-cody
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 21,508 chars (~5,377 tok) (Project Context 10,720 chars (~2,680 tok))
Injected workspace files:

AGENTS.md: OK | raw 7,804 chars (~1,951 tok) | injected 7,804 chars (~1,951 tok)
SOUL.md: OK | raw 496 chars (~124 tok) | injected 496 chars (~124 tok)
TOOLS.md: OK | raw 850 chars (~213 tok) | injected 850 chars (~213 tok)
IDENTITY.md: OK | raw 633 chars (~159 tok) | injected 633 chars (~159 tok)
USER.md: OK | raw 210 chars (~53 tok) | injected 210 chars (~53 tok)
HEARTBEAT.md: OK | raw 80 chars (~20 tok) | injected 80 chars (~20 tok)
BOOTSTRAP.md: MISSING | raw 0 | injected 0

Skills list (system prompt text): 1,656 chars (~414 tok) (4 skills)
Skills: discord, healthcheck, skill-creator, weather
Top skills (prompt entry size):

healthcheck: 456 chars (~114 tok)
weather: 381 chars (~96 tok)
skill-creator: 261 chars (~66 tok)
discord: 180 chars (~45 tok)
edgy mistBOT
#

That /context detail output is the smoking gun: your Discord session is running with a skills allowlist/filter, so the model only gets these 4 skills injected:

discord, healthcheck, skill-creator, weather

So the agent can see your workspace, but this Discord channel (or the agent config) is restricting skills.

How to confirm which case it is

On the gateway host, run:

openclaw skills list -v
openclaw skills info python-on-coder-01

If it shows the skill as đźš« blocked / blockedByAllowlist: true, that means a skills filter is active (not a discovery problem).

Where that filter comes from (most common on Discord)

#
  1. Discord channel config (per-channel):
  • channels.discord.guilds.<guildId>.channels.<channel>.skills: [...]
  1. Agent config (per-agent):
  • agents.list[].skills: [...]

OpenClaw intersects them, so either one can “hide” a skill from /context.

Fix

  • Add your skill name (the name: from SKILL.md, exact string) to the relevant skills: [...] list, or
  • Remove the skills list to allow all skills in that channel, or
  • Test in a DM / another channel that doesn’t have a skills filter.

After changing config, do:

  • /new (refresh the session’s skills snapshot)
  • and if you rely on native Discord / skill commands, also openclaw gateway restart.
#

If you paste the openclaw skills info python-on-coder-01 output, I can tell you whether it’s blocked by allowlist vs missing requirements vs something like disable-model-invocation.

coral cobalt
#

$ ./openclaw.bsh skills info python-on-coder-01

🦞 OpenClaw 2026.2.26 (unknown) — IPC, but it's your phone.

📦 python-on-coder-01 ✓ Ready

Create and execute new Python projects on the remote node coder-01 under /workspace.

Details:
Source: openclaw-managed
Path: ~/.openclaw/skills/python-remote/SKILL.md

Tip: use npx clawhub to search, install, and sync skills.

edgy mistBOT
#

Yep — the skill is installed and eligible (✓ Ready), but your Discord chat is running with a skills allowlist.

Your /context detail proves it:

Skills: discord, healthcheck, skill-creator, weather

When a Discord channel has skills: [...] set in config, OpenClaw filters everything else out (and even /skill ... won’t see it, because /skill also respects the same filter).

Fix: add your skill name to the Discord channel’s skills list (or remove the filter)

  1. Find where the filter is set in ~/.openclaw/openclaw.json:
rg -n 'skills\\s*:\\s*\\[' ~/.openclaw/openclaw.json

You’re looking for something like:

#
channels: {
  discord: {
    guilds: {
      "<guildId>": {
        channels: {
          "agent-skill": {
            skills: ["discord","healthcheck","skill-creator","weather"],
          }
        }
      }
    }
  }
}
  1. Update it to include the skill name from SKILL.md (in your case: python-on-coder-01, not the folder name python-remote):
#
skills: ["discord", "healthcheck", "skill-creator", "weather", "python-on-coder-01"],

Or, if you want the channel to allow all eligible skills, remove the skills: line entirely.

  1. Then refresh:
  • in Discord: send /new
  • and if you want native / skill commands to show up reliably: openclaw gateway restart

After that, /context detail should list python-on-coder-01 and the agent will be able to use it in that channel.

Docs: https://docs.openclaw.ai/tools/skills (see “Per-channel skills filters” via Discord config)

coral cobalt
#

here is my current channels section
"channels": {
"discord": {
"enabled": true,
"token": "xxx",
"groupPolicy": "allowlist",
"streaming": "off",
"guilds": {
"1063105375370494102": {
"requireMention": false,
"users": [
"345141769077260299"
]
}
}
}
},

edgy mistBOT
#

Your Discord channels config isn’t filtering skills at all (there’s no guilds.<id>.channels.<channel>.skills block), so the “only 4 skills” you saw in /context detail is coming from the agent-level skills allowlist.

In other words: your cody agent likely has:

  • agents.list[...].skills: ["discord","healthcheck","skill-creator","weather"]

…and that hides everything else (including python-on-coder-01) from the system prompt.

Check where the filter is

Run:

openclaw config get agents.list
openclaw config get agents.defaults.skills

Look for a skills: [...] array under the cody agent entry.

#

Fix it (two options)

Option A: Add your skill to the allowlist (keep the filter)
Make sure the list includes the skill name (python-on-coder-01, from SKILL.md), e.g.

agents: {
  list: [
    {
      id: "cody",
      skills: ["discord", "healthcheck", "skill-creator", "weather", "python-on-coder-01"],
    },
  ],
}

Option B: Remove the skills key (no filtering; all eligible skills can appear)

#

After changing config

  • In Discord: send /new and then /context detail again (skills snapshot refresh)
  • If you also want it to appear as a native Discord /... skill command, do a gateway restart too:
    openclaw gateway restart
    

Docs ref (skills + filtering): https://docs.openclaw.ai/tools/skills

coral cobalt
#

Using the WebUI, and going to agent->cody->skills shows the skil enabled, and "All skills are enabled. Disabling any skill will create a per-agent allowlist. "

edgy mistBOT
#

That output means: the skill is installed + eligible, but it’s not being injected into the model’s “available skills” list for this Discord session.

When a skill is ✓ Ready but missing from /context detail, it’s almost always one of these:

1) Per-agent (or per-channel) skills allowlist is active

/context showing only 4 skills strongly suggests agents.list[].skills is set to something like:

skills: ["discord", "healthcheck", "skill-creator", "weather"]

Even if the WebUI says “all enabled”, the actual config might still have that allowlist set.

Check the real config value on the gateway host:

#
./openclaw.bsh config get agents.list
# (or, if it’s big)
./openclaw.bsh config get agents.list --json

Find the cody entry and see if it has a skills: array.

Fix options:

  • Add your skill name to that list (python-on-coder-01), OR
  • Remove the skills key entirely to stop filtering.

(Then openclaw gateway restart + in Discord /new.)

2) The skill has disable-model-invocation: true

That flag makes a skill eligible but excluded from the prompt skills list (so it won’t show in /context and the model won’t “know” it exists unless you call it explicitly).

#

Quick check (paste just the top/frontmatter, redact anything sensitive):

head -n 30 ~/.openclaw/skills/python-remote/SKILL.md

If you see:

disable-model-invocation: true

…remove it (or set it to false) and restart + /new.


If you paste:

  1. the cody agent snippet from ./openclaw.bsh config get agents.list (just the cody part), and
  2. the first ~30 lines of that SKILL.md,
#

I can tell you exactly which one it is.

coral cobalt
#

name: python-on-coder-01
description: Create and execute new Python projects on the remote node coder-01 under /workspace.
metadata: {"clawdbot":{"requires":["nodes"]}}

Python Execution on coder-01

When the user asks to create or run a Python program:

Node

Always use nodes.run
Target node: coder-01

Workspace rules

  1. Base directory: /workspace
  2. Project directory name format: project-<timestamp>
  3. If a generated directory already exists, generate a new timestamp.
  4. Never overwrite an existing directory.

Execution procedure

  1. Generate a unique project directory:
    mkdir /workspace/project-<timestamp>

  2. Write all generated Python files into that directory.

  3. Execute the program using:
    cd /workspace/project-<timestamp> && python3 <main_file>

  4. Capture and return:

    • exit_code
    • stdout
    • stderr
    • project_path

Important

  • Never execute Python locally.
  • Always run remotely on coder-01.
  • Leave all generated files in place.
    ~

./openclaw.bsh config get agents.list

🦞 OpenClaw 2026.2.26 (unknown) — If something's on fire, I can't extinguish it—but I can write a beautiful postmortem.

[
{
"id": "manager",
"default": true,
"name": "manager",
"workspace": "/home/node/.openclaw/workspace-manager",
"agentDir": "/home/node/.openclaw/agents/manager/agent"
},
{
"id": "librarian",
"name": "librarian",
"workspace": "/home/node/.openclaw/workspace-librarian",
"agentDir": "/home/node/.openclaw/agents/librarian/agent"
},
{
"id": "cody",
"name": "cody",
"workspace": "/home/node/.openclaw/workspace-cody",
"agentDir": "/home/node/.openclaw/agents/cody/agent"
}
]

edgy mistBOT
#

That’s actually consistent with prompt truncation, not an allowlist.

Key detail from your /context detail earlier:

  • Skills list shows (4 skills) and it’s exactly the “core/bundled” ones.
  • Your skill is âś“ Ready in CLI, so it is installed/eligible — it’s just not making it into the skills list injected into the system prompt (what /context reports).

OpenClaw has global limits for how many skills get included in the prompt:

  • skills.limits.maxSkillsInPrompt
  • skills.limits.maxSkillsPromptChars

If one of those is set low (e.g. 4), you’ll see exactly what you’re seeing: only the first few skills get injected, and everything else (like python-on-coder-01) won’t appear in /context.

Check your limits

On the gateway host run:

#
./openclaw.bsh config get skills
# or just:
./openclaw.bsh config get skills.limits

Fix (example: make room for more skills)

./openclaw.bsh config set skills.limits.maxSkillsInPrompt 150 --strict-json
./openclaw.bsh config set skills.limits.maxSkillsPromptChars 30000 --strict-json
openclaw gateway restart

Then in Discord:

  • /new
  • /context detail (you should now see python-on-coder-01 listed)