#Telegram not allowed to session spawn

1 messages · Page 1 of 1 (latest)

bitter violet
#

I have a custom skills and telegram configured, and a tried for example:

"Qual meu saldo?" that should have call my max-banking skill.

But got it:
{
"task": "Consultar saldo do Max Bank",
"runtime": "subagent",
"agentId": "max_banking",
"mode": "run"
}

{
"status": "forbidden",
"error": "agentId is not allowed for sessions_spawn (allowed: none)"
}

hallow ivyBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> ✅ Mark Solution

tribal heathBOT
bitter violet
#

please help me

still violetBOT
#

Yep, this looks like a sub-agent allowlist problem, not a Telegram problem.

That payload:

{
  "task": "Consultar saldo do Max Bank",
  "runtime": "subagent",
  "agentId": "max_banking",
  "mode": "run"
}

means OpenClaw is trying to spawn a separate agent called max_banking.

This error:

#
{
  agents: {
    list: [
      {
        id: "main",
        subagents: {
          allowAgents: ["max_banking"],
        },
      },
      {
        id: "max_banking",
      },
    ],
  },
}
#

Or globally:

{
  agents: {
    defaults: {
      subagents: {
        allowAgents: ["max_banking"], // or ["*"] if you really want any
      },
    },
  },
}

Two important details:

  1. This is spawning an agent, not directly calling a skill.
#
  1. allowed: none strongly suggests subagents.allowAgents is missing for the caller.

First, please paste:

openclaw --version
openclaw config get agents.defaults.subagents.allowAgents --json
openclaw config get agents.list --json

If you want, paste your agent config here and I’ll point to the exact line to change.

bitter violet
#

openclaw --version
OpenClaw 2026.4.14 (323493f)

openclaw config get agents.defaults.subagents.allowAgents --json
Config path not found: agents.defaults.subagents.allowAgents

openclaw config get agents.list --json
[
{
"id": "main",
"subagents": {
"allowAgents": []
}
}
]

still violetBOT
#

Nice, this confirms it.

Your config currently says:

[
  {
    "id": "main",
    "subagents": {
      "allowAgents": []
    }
  }
]

So main is allowed to spawn zero other agent IDs. That is exactly why agentId: "max_banking" fails.

#

Quick fix

Run:

openclaw config set agents.list[0].subagents.allowAgents '["max_banking"]' --strict-json
openclaw gateway restart

Then retry your Telegram prompt.

Important nuance

What you showed is not a skill call. It is a sub-agent spawn:

#
{
  "runtime": "subagent",
  "agentId": "max_banking"
}

So there are 2 possible setups:

  1. max_banking is meant to be a separate agent
    Then the fix above is correct.

  2. max_banking is meant to be a skill/tool on main
    Then sessions_spawn is the wrong behavior, and the routing/instructions need adjusting so main calls the skill directly instead of spawning another agent.

For quick debugging

bitter violet
#

Now it worked but the subagent aparently don't know about my skill max_banking.

When I call directly like /max_banking Qual meu saldo? It works!

But when I call:

"Qual meu saldo?" That spawn an subagent that look don't know about my skill.

#

I entered on the subagent on dashboard and type:

/context list

\U0001f9e0 Context breakdown
Workspace: /home/jonatan/.openclaw/workspace/max_banking
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 18,310 chars (~4,578 tok) (Project Context 14,171 chars (~3,543 tok))

Injected workspace files:

AGENTS.md: OK | raw 7,727 chars (~1,932 tok) | injected 7,727 chars (~1,932 tok)
SOUL.md: OK | raw 1,738 chars (~435 tok) | injected 1,738 chars (~435 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 474 chars (~119 tok) | injected 474 chars (~119 tok)

Skills list (system prompt text): 0 chars (~0 tok) (0 skills)
Skills: (none)
Tool list (system prompt text): 0 chars (~0 tok)
Tool schemas (JSON): 9,907 chars (~2,477 tok) (counts toward context; not shown as text)
Tools: read, edit, write, apply_patch, exec, process, image_generate, video_generate, sessions_yield, web_fetch, image, memory_search, memory_get

Session tokens (cached): 6,941 total / ctx=200,000

Inline shortcut: a command token inside normal text (e.g. \u201chey /status\u201d) that runs immediately (allowlisted senders only) and is stripped before the model sees the remaining message

still violetBOT
#

Let me verify the skills behavior in the docs/source so I don’t send you on a wild goose chase.

#

Yep, that makes sense, and I think I see the trap.

What’s happening is:

  1. "Qual meu saldo?" is spawning a different agent: max_banking
  2. For cross-agent spawns, OpenClaw uses the target agent’s workspace, not main’s workspace
  3. If your skill lives only in main’s skills/ folder, the spawned max_banking agent won’t see it

So /max_banking Qual meu saldo? can work, while the spawned sub-agent still acts like the skill does not exist.

Best fix options

Option A, easiest and probably best
Don’t spawn a separate agent for this. Keep it as a skill on main, so natural text can use the skill directly.

Option B, keep max_banking as a separate agent
Make the skill visible to that agent too. Best long-term way is to move the skill to a shared location:

#

If that is set, the skill can still work via /max_banking, but the model will not use it from normal text like "Qual meu saldo?".

So please check these two things:

  1. Is the skill only inside main/skills/?
  2. Does SKILL.md contain disable-model-invocation: true?

If you want a dedicated agent, this shape is safer

{
  agents: {
    list: [
      {
        id: "main",
        subagents: { allowAgents: ["max_banking"] },
#
      },
      {
        id: "max_banking",
        skills: ["max_banking"],
      },
    ],
  },
}

And put the skill in a shared location like ~/.openclaw/skills.

If you paste your max_banking SKILL.md frontmatter plus where the folder is installed, I can tell you the exact fix in one shot.

bitter violet
#

My skill are cloned at /workspace/skills/max-banking/SKILL.MD

still violetBOT
#

Ah, yep, that explains it.

Because your skill is in:

/workspace/skills/max-banking/SKILL.md

it is visible to the agent whose workspace is /workspace.

But your natural-language prompt is spawning a different agent: max_banking.

For cross-agent spawns, OpenClaw resolves the target agent’s workspace, not main’s. So unless you explicitly configure max_banking to also use /workspace, it will look somewhere else and won’t see /workspace/skills/max-banking.

Important naming detail

  • skill name is likely max-banking
#
  • slash command becomes /max_banking

So if you use a skill allowlist, use:

skills: ["max-banking"]

not max_banking.

Fix 1, simplest

Configure the spawned agent to use the same workspace:

{
#
  agents: {
    list: [
      {
        id: "main",
        workspace: "/workspace",
        subagents: { allowAgents: ["max_banking"] },
      },
      {
        id: "max_banking",
        workspace: "/workspace",
        skills: ["max-banking"],
      },
    ],
  },
}
#

Then restart the gateway.

Fix 2, cleaner long-term

Move the skill to a shared location:

~/.openclaw/skills/max-banking/SKILL.md

That way both main and max_banking can see it without depending on the same workspace.

One more thing to check

If your SKILL.md has:

bitter violet
#

Skills from official lib for example clawhub where they are clonned?

still violetBOT
#

Yep:

ClawHub-installed skills

By default, openclaw skills install ... installs into the active workspace:

<workspace>/skills/<skill-name>/SKILL.md

So if your workspace is /workspace, ClawHub skills land in:

/workspace/skills/<skill-name>/SKILL.md

That matches what you’re seeing with max-banking.

#

Shared/global skills

If you want a skill visible across multiple agents/workspaces, use:

~/.openclaw/skills/<skill-name>/SKILL.md

That’s the cleaner setup for your case.

Precedence

OpenClaw checks skills in this order:

<workspace>/skills
<workspace>/.agents/skills
~/.agents/skills
#
~/.openclaw/skills
bundled skills
skills.load.extraDirs

So yes, ClawHub installs go into the workspace skills/ folder by default.

That’s also why your spawned max_banking agent may miss the skill if it’s using a different workspace.

Docs:
https://docs.openclaw.ai/help/faq
https://docs.openclaw.ai/tools/skills

Glad we found the real issue 😄
If this fixed it, please right-click the solution message → Apps → ✅ Mark Solution so Answer Overflow can index it.

bitter violet
#

So when I'll have my skill on official clawhub I need to guarantee that configuration:

"agents": {
"defaults": {
"workspace": "/home/jonatan/.openclaw/workspace",
"models": {
"openai/gpt-5.4": {
"alias": "GPT"
},
"openai/gpt-4o-mini": {}
},
"model": {
"primary": "openai/gpt-4o-mini"
},
"skills": [
"max_banking"
]
},
"list": [
{
"id": "main",
"subagents": {
"allowAgents": ["max_banking"]
},
},
{
"id": "max_banking",
"skills": ["max_banking"]
},
]
},

For example

still violetBOT
#

Close, but not quite. Three important fixes:

  1. Use the skill name, not the slash-command name
    So likely:
skills: ["max-banking"]

not:

skills: ["max_banking"]

/max_banking is the sanitized command name. The skill itself is usually max-banking.

#
  1. Your config still does not make max_banking use the same workspace
    With only:
agents.defaults.workspace: "/home/jonatan/.openclaw/workspace"

the main agent uses:

/home/jonatan/.openclaw/workspace

but max_banking will default to something like:

#
/home/jonatan/.openclaw/workspace/max_banking

So it still won’t see skills installed in:

/home/jonatan/.openclaw/workspace/skills
  1. agents.defaults.skills is optional
    Use it only if you want a strict allowlist. Otherwise omit it.

If the skill stays in workspace skills/

#

Then configure max_banking to use the same workspace:

{
  agents: {
    defaults: {
      workspace: "/home/jonatan/.openclaw/workspace",
      model: { primary: "openai/gpt-4o-mini" },
    },
    list: [
      {
        id: "main",
        subagents: { allowAgents: ["max_banking"] },
        skills: ["max-banking"],
      },
      {
#
        id: "max_banking",
        workspace: "/home/jonatan/.openclaw/workspace",
        skills: ["max-banking"],
      },
    ],
  },
}

Cleaner setup, what I’d recommend

Put the skill in:

#
~/.openclaw/skills/max-banking/SKILL.md

Then you don’t need shared workspace coupling, and this is enough:

{
  agents: {
    defaults: {
      workspace: "/home/jonatan/.openclaw/workspace",
      model: { primary: "openai/gpt-4o-mini" },
    },
    list: [
      {
        id: "main",
#
        subagents: { allowAgents: ["max_banking"] },
        skills: ["max-banking"],
      },
      {
        id: "max_banking",
        skills: ["max-banking"],
      },
    ],
  },
}

That’s the safer long-term config.

Also, if you want "Qual meu saldo?" to work from normal text, make sure the skill does not have:

bitter violet
#

But think, If my skill turn on to a official skill, that will be cloned at ~/.openclaw/workspace/skills/

So if my client uses subagents they will need the configuration on openclaw.json to works fine

still violetBOT
#

Yes, if it is a ClawHub-installed skill, then your reasoning is right.

Short version

If a user installs the skill from ClawHub, it normally lands in:

~/.openclaw/workspace/skills/<skill-name>

or whatever that agent’s active workspace is.

So if they use cross-agent subagents, and those subagents have a different workspace, then yes, they may need extra config for it to work.

Their options

Users have 3 valid setups:

#
  1. Same workspace for both agents
    Configure the spawned agent to use the same workspace.

  2. Shared/global skill location
    Put the skill in:

    ~/.openclaw/skills/<skill-name>
    

    This is the cleanest for multi-agent setups.

  3. Install the skill separately per agent workspace
    Works, but kind of annoying.

Important nuance

#

If the skill becomes a bundled OpenClaw skill, that is different.
Bundled skills are not just “cloned into workspace/skills” the same way ClawHub installs are.

So:

  • ClawHub install → workspace-scoped by default
  • Bundled skill → globally available via the OpenClaw install, subject to skill visibility rules

Practical recommendation

For customers using subagents, I’d document one of these as required:

  • “Use ~/.openclaw/skills for shared skills”, or
  • “Set the spawned agent’s workspace to the same workspace as main

That avoids the weird “works in /max_banking, fails in natural language via subagent” trap.

bitter violet
#

Now it worked fine, I moved to ~/.openclaw/skills and are working.

still violetBOT
#

Perfect, glad we caught it 🎉

Yep, that confirms it was the workspace-scoping issue.
For multi-agent/subagent setups, ~/.openclaw/skills is the right shared place.

For future readers, the working pattern is:

  • workspace/skills → workspace-local
  • ~/.openclaw/skills → shared across agents/workspaces

If this fixed it, please right-click the solution message → Apps → ✅ Mark Solution.
That helps Answer Overflow index the fix for the next person.