#Discord OpenClaw is not able to create new channel or thread
1 messages · Page 1 of 1 (latest)
Yeah, that reply is busted.
The important clue is that OpenClaw leaked a malformed sessions_spawn tool call instead of executing it:
sessions_spawndoes not take amessageargmode: "session"requiresthread: true- the
tasklooks truncated/garbled
So this is probably not just a Discord permission issue.
What I’d check next:
openclaw --version
openclaw config get acp
openclaw config get channels.discord.threadBindings
openclaw logs --follow
For Discord ACP thread creation, you want:
acp.enabled: truechannels.discord.threadBindings.enabled: truechannels.discord.threadBindings.spawnAcpSessions: true
Then try a deterministic repro instead of plain English:
/acp spawn codex --thread auto
If that works, the bug is in the natural-language/tool-call path.
If that fails, paste the error plus the log lines.
Also, if you’re using a local/OpenAI-compatible model for the chat agent, raw JSON / malformed tool calls usually means a tool-calling failure, not a Discord perms failure.
Docs:
- https://docs.openclaw.ai/tools/acp-agents
- https://docs.openclaw.ai/channels/discord
- https://docs.openclaw.ai/help/faq
- https://docs.openclaw.ai/gateway/troubleshooting
One more thing, 2026.4.10 is a bit behind, and there have been ACP/thread-routing fixes since then, so trying latest first is worth it.
Paste those 4 outputs and I’ll help narrow it down fast.
check my openclaw.json
{
"agents": {
"list": [
{
"id": "claude",
"runtime": {
"type": "acp",
"acp": {
"agent": "claude",
"backend": "acpx",
"mode": "persistent",
"cwd": "/home/jarvis/.openclaw/workspace/my-project"
}
}
}
],
"defaults": {
"workspace": "/home/jarvis/.openclaw/workspace",
"models": {
"openrouter/auto": {
"alias": "OpenRouter"
},
"openrouter/moonshotai/kimi-k2.5": {
"alias": "kimi2.5"
},
"openrouter/free": {
"alias": "free",
"streaming": false
}
},
"model": {
"primary": "openrouter/free"
},
"sandbox": {
"mode": "off"
}
}
},
"bindings": [
{
"type": "acp",
"agentId": "claude",
"match": {
"channel": "discord",
"accountId": "default",
"peer": { "kind": "channel", "id": "########################" }
},
"acp": { "label": "claude-main" }
}
],
"gateway": {
"mode": "local",
"auth": {
"mode": "token",
"token": "###################################"
},
"port": 18789,
"bind": "loopback",
"tailscale": {
"mode": "off",
"resetOnExit": false
},
"nodes": {
"denyCommands": [
"camera.snap",
"camera.clip",
"screen.record",
"contacts.add",
"calendar.add",
"reminders.add",
"sms.send",
"sms.search"
]
}
},
"session": {
"dmScope": "per-channel-peer",
"threadBindings": {
"enabled": true,
"idleHours": 24,
"maxAgeHours": 48
}
},
"tools": {
"profile": "coding"
},
"auth": {
"profiles": {
"openrouter:default": {
"provider": "openrouter",
"mode": "api_key"
}
}
},
"skills": {
"install": {
"nodeManager": "npm"
},
"entries": {
"github": {
"enabled": true,
"env": {
"GH_TOKEN": "#############################"
}
}
}
},
"hooks": {
"internal": {
"enabled": true,
"entries": {
"boot-md": {
"enabled": true
},
"bootstrap-extra-files": {
"enabled": true
},
"command-logger": {
"enabled": true
},
"session-memory": {
"enabled": true
}
}
}
},
"wizard": {
"lastRunAt": "2026-04-11T06:54:58.820Z",
"lastRunVersion": "2026.4.10",
"lastRunCommand": "configure",
"lastRunMode": "local"
},
"meta": {
"lastTouchedVersion": "2026.4.10",
"lastTouchedAt": "2026-04-13T05:18:41.045Z"
},
"plugins": {
"entries": {
"openrouter": {
"enabled": true
},
"acpx": {
"enabled": true,
"config": {
"permissionMode": "approve-all"
}
}
}
},
"update": {
"channel": "stable",
"auto": {
"enabled": false
}
},
"channels": {
"discord": {
"enabled": true,
"token": {
"source": "env",
"provider": "default",
"id": "DISCORD_BOT_TOKEN"
},
"groupPolicy": "allowlist",
"guilds": {
"1492415216963817495": {
"requireMention": false
}
},
"markdown": {
"tables": "block"
},
"status": "online",
"ackReactionScope": "all",
"threadBindings": {
"spawnAcpSessions": true
}
}
},
"acp": {
"enabled": true,
"backend": "acpx",
"defaultAgent": "claude",
"allowedAgents": [
"claude",
"codex"
]
}
}
I can check it, but I can’t see an openclaw.json attachment in this thread yet.
Please paste these parts in a json block, and redact tokens/secrets:
acpchannels.discord- if you’re using a local/OpenAI-compatible model, also the relevant
models/agents.defaults.modelpart
Especially this bit:
{
"acp": { ... },
"channels": {
"discord": {
"threadBindings": { ... }
}
}
}
If you want, paste the whole file with secrets redacted and I’ll sanity-check it.
i can't post the whole file here because discord wont let me
Yep, I see the main problem.
Your snippet has a channel ACP binding, but I do not see the Discord setting that allows ACP to create a child thread:
- you already bind this Discord channel to an ACP session via
bindings[] - but I don’t see
channels.discord.threadBindings.spawnAcpSessions: true
That means OpenClaw can keep working in this channel, but it is not configured to spawn a Discord thread for ACP.
I’d add this:
{
"channels": {
"discord": {
"threadBindings": {
"enabled": true,
"spawnAcpSessions": true
}
}
}
}
If you also want non-ACP sessions_spawn({ thread: true }) flows, add:
"spawnSubagentSessions": true
Two other things I notice:
-
Your current chat is already ACP-bound
- this part does that:
{ "type": "acp", "agentId": "claude", "match": { "channel": "discord", "accountId": "default", "peer": { "kind": "channel", "id": "..." } } }So by default it will work in-place unless child-thread spawning is enabled.
-
agents.defaults.model.primary: "openrouter/free"is a red flag- that kind of free/router pool is not something I’d trust for tool-calling
- the malformed raw JSON you got is very consistent with a weak tool-calling model
So my recommendation is:
- add
channels.discord.threadBindings.spawnAcpSessions: true - restart the gateway
- test with an explicit command first:
/acp spawn claude --thread auto - if that works, then test plain English again
If your config snippet was truncated and you do already have a channels.discord block later in the file, paste that part too, because that’s the section that matters here.
Docs:
If you want, paste the rest of the file from channels onward and I’ll sanity-check the exact shape.
Thanks, this helps a lot.
Your config actually looks basically correct for ACP thread spawning:
session.threadBindings.enabled: truechannels.discord.threadBindings.spawnAcpSessions: trueacp.enabled: true
So I don’t think openclaw.json is the blocker anymore.
Also, not having channels.discord.threadBindings.enabled explicitly set is fine here, because you already enabled thread bindings globally under session.threadBindings.enabled.
What still looks wrong is the malformed sessions_spawn payload you got back. That points much more to a runtime/tool-dispatch bug on 2026.4.10 than a Discord permission problem.
At this point I’d do this exact test:
/acp spawn claude --thread auto
Why that command:
- it matches your configured ACP agent (
claude) - it bypasses the fuzzy natural-language path
- it directly tests the Discord ACP thread-spawn flow
Then:
-
If
/acp spawn claude --thread autoworks
→ your config is fine, and the bug is in the plain-English routing/tool-call path. -
If it fails
→ run:
openclaw --version
openclaw logs --follow
retry once, then paste the error/log snippet.
One more nuance: I wouldn’t use openrouter/free for agentic/tool-heavy work, but in your case the bigger signal is still the malformed ACP spawn output, not the permissions/config.
Honestly, I’d also update off 2026.4.10 before going too deep. Your config looks close enough that this smells like a fixed bug more than a bad setup.
If you paste the result of /acp spawn claude --thread auto, I can tell you pretty quickly which side it’s failing on.
No worries, you’ve already pasted the important bits. I don’t need the whole file.
At this point, the next useful data is:
- exact output of:
/acp spawn claude --thread auto
- exact version:
openclaw --version
- log lines right after one retry:
openclaw logs --follow
Then retry once and paste just the lines mentioning things like:
acpsessions_spawnthreaddiscord
If Discord is fighting the message length, just send the small snippets in 2-3 messages.
An attached .txt also works.
What you posted so far makes me think this is not a config/permissions miss, it’s probably a 2026.4.10 runtime bug in the thread-spawn path.
Yep, this confirms it. Your config has the important bits:
acp.enabled: truechannels.discord.threadBindings.spawnAcpSessions: true- earlier you showed
session.threadBindings.enabled: true
So I don’t need more JSON. This no longer looks like a config miss.
The next step is runtime behavior, not config:
openclaw --version
Then in Discord:
/acp spawn claude --thread auto
And if it still breaks:
openclaw logs --follow
retry once, then paste the log lines around the failure.
So the likely split is:
/acp spawn claude --thread autoworks
→ plain-English routing is broken on 2026.4.10
/acp spawn claude --thread autoalso fails
→ it’s a deeper ACP/thread runtime bug, and the logs will show which layer
Honestly, I’d update to latest stable before spending much more time on 2026.4.10:
https://docs.openclaw.ai/install/updating
If latest still reproduces, that’s GitHub-issue territory:
https://github.com/openclaw/openclaw/issues
Paste the /acp spawn claude --thread auto result next. That’s the most useful datapoint now.
{
"agents": {
"list": [
{
"id": "claude",
"runtime": {
"type": "acp",
"acp": {
"agent": "claude",
"backend": "acpx",
"mode": "persistent",
"cwd": "/home/jarvis/.openclaw/workspace/my-project"
}
}
}
],
"defaults": {
"workspace": "/home/jarvis/.openclaw/workspace",
"models": {
"openrouter/auto": {
"alias": "OpenRouter"
},
"openrouter/moonshotai/kimi-k2.5": {
"alias": "kimi2.5"
},
"openrouter/free": {
"alias": "free",
"streaming": false
}
},
"model": {
"primary": "openrouter/free"
},
"sandbox": {
"mode": "off"
}
}
},
"bindings": [
{
"type": "acp",
"agentId": "claude",
"match": {
"channel": "discord",
"accountId": "default",
"peer": { "kind": "channel", "id": "########################" }
},
"acp": { "label": "claude-main" }
}
],
"gateway": {
"mode": "local",
"auth": {
"mode": "token",
"token": "###################################"
},
"port": 18789,
"bind": "loopback",
"tailscale": {
"mode": "off",
"resetOnExit": false
},
"nodes": {
"denyCommands": [
"camera.snap",
"camera.clip",
"screen.record",
"contacts.add",
"calendar.add",
"reminders.add",
"sms.send",
"sms.search"
]
}
},
"session": {
"dmScope": "per-channel-peer",
"threadBindings": {
"enabled": true,
"idleHours": 24,
"maxAgeHours": 48
}
},
"tools": {
"profile": "coding"
},
"auth": {
"profiles": {
"openrouter:default": {
"provider": "openrouter",
"mode": "api_key"
}
}
},
"skills": {
"install": {
"nodeManager": "npm"
},
"entries": {
"github": {
"enabled": true,
"env": {
"GH_TOKEN": "#############################"
}
}
}
},
"hooks": {
"internal": {
"enabled": true,
"entries": {
"boot-md": {
"enabled": true
},
"bootstrap-extra-files": {
"enabled": true
},
"command-logger": {
"enabled": true
},
"session-memory": {
"enabled": true
}
}
}
},
"wizard": {
"lastRunAt": "2026-04-11T06:54:58.820Z",
"lastRunVersion": "2026.4.10",
"lastRunCommand": "configure",
"lastRunMode": "local"
},
"meta": {
"lastTouchedVersion": "2026.4.10",
"lastTouchedAt": "2026-04-13T05:18:41.045Z"
},
"plugins": {
"entries": {
"openrouter": {
"enabled": true
},
"acpx": {
"enabled": true,
"config": {
"permissionMode": "approve-all"
}
}
}
},
"update": {
"channel": "stable",
"auto": {
"enabled": false
}
},
"channels": {
"discord": {
"enabled": true,
"token": {
"source": "env",
"provider": "default",
"id": "DISCORD_BOT_TOKEN"
},
"groupPolicy": "allowlist",
"guilds": {
"1492415216963817495": {
"requireMention": false
}
},
"markdown": {
"tables": "block"
},
"status": "online",
"ackReactionScope": "all",
"threadBindings": {
"spawnAcpSessions": true
}
}
},
"acp": {
"enabled": true,
"backend": "acpx",
"defaultAgent": "claude",
"allowedAgents": [
"claude",
"codex"
]
}
}
Okay, with the full file, I’m comfortable saying this:
Your config for ACP thread spawning looks correct.
I do not see a missing Discord thread-binding flag anymore.
You have:
session.threadBindings.enabled: truechannels.discord.threadBindings.spawnAcpSessions: trueacp.enabled: true- a valid ACP binding for this Discord channel
So, at this point, please stop pasting more JSON. I don’t think the config will tell us anything else.
The two most likely remaining causes are:
- 2026.4.10 bug in the plain-English ACP/thread spawn path
- bad tool-calling behavior from
agents.defaults.model.primary: "openrouter/free"
- I really would not trust that for agentic/tool-heavy actions
So the next useful step is just this:
/acp spawn claude --thread auto
If that works:
- your config is fine
- the natural-language path is what’s broken
If that fails too:
- update to latest stable first: https://docs.openclaw.ai/install/updating
- if it still fails on latest, file a bug with:
openclaw --version- exact
/acp spawn claude --thread autoresult
- a short
openclaw logs --followsnippet
→ https://github.com/openclaw/openclaw/issues
So, bluntly: this does not look like a permissions/config problem anymore. It looks like a runtime bug or model/tool-calling issue.
with this config, openclaw-gateway wont start anymore :
jarvis@claw:~$ openclaw gateway status --deep
🦞 OpenClaw 2026.4.10 (44e5b62) — Your config is valid, your assumptions are not.
│
◇
Service: systemd (enabled)
File logs: /tmp/openclaw/openclaw-2026-04-13.log
Command: /usr/bin/node /home/jarvis/.npm-global/lib/node_modules/openclaw/dist/index.js gateway --port 18789
Service file: ~/.config/systemd/user/openclaw-gateway.service
Service env: OPENCLAW_GATEWAY_PORT=18789
Config (cli): ~/.openclaw/openclaw.json
Config (service): ~/.openclaw/openclaw.json
Gateway: bind=loopback (127.0.0.1), port=18789 (service args)
Probe target: ws://127.0.0.1:18789
Dashboard: http://127.0.0.1:18789/
Probe note: Loopback-only gateway; only local clients can connect.
Runtime: running (pid 123808, state active, sub running, last exit 0, reason 0)
Warm-up: launch agents can take a few seconds. Try again shortly.
RPC probe: failed
RPC target: ws://127.0.0.1:18789
gateway closed (1006):
Gateway port 18789 is not listening (service appears running).
Logs: journalctl --user -u openclaw-gateway.service -n 200 --no-pager
Troubles: run openclaw status
Troubleshooting: https://docs.openclaw.ai/troubleshooting
Ah, okay, this is a different failure now.
Your config is parsing, but the gateway is dying before it starts listening on 18789. So this is no longer a Discord permissions/thread question, it’s a gateway startup crash.
What I need next is startup logs, not more config. Please paste these:
journalctl --user -u openclaw-gateway.service -n 200 --no-pager
tail -n 100 /tmp/openclaw/openclaw-2026-04-13.log
If you want, do one clean restart first:
openclaw gateway restart
openclaw gateway status --deep
Then grab the logs again.
The key line in your output is:
Runtime: running- but
Gateway port 18789 is not listening
That usually means systemd thinks the process is up, but startup failed before the WS/HTTP server bound the port.
So right now I’d ignore Discord perms and thread config and look for log lines mentioning things like:
ErrorEADDRINUSEacpplugindiscordlisten
port
Paste those logs and I can probably pinpoint the exact crash pretty quickly.
Troubleshooting doc: https://docs.openclaw.ai/gateway/troubleshooting
jarvis@claw:~$ openclaw gateway restart
openclaw gateway status --deep
🦞 OpenClaw 2026.4.10 (44e5b62) — Running on your hardware, reading your logs, judging nothing (mostly).
Restarted systemd service: openclaw-gateway.service
Timed out after 60s waiting for gateway port 18789 to become healthy.
Gateway process is running but port 18789 is still free (startup hang/crash loop or very slow VM startup).
Service runtime: status=running, state=active, pid=125278, lastExit=0
Gateway port 18789 status: free.
Gateway restart timed out after 60s waiting for health checks.
Tip: openclaw gateway status --deep
Tip: openclaw doctor
🦞 OpenClaw 2026.4.10 (44e5b62) — We ship features faster than Apple ships calculator updates.
│
◇
Service: systemd (enabled)
File logs: /tmp/openclaw/openclaw-2026-04-13.log
Command: /usr/bin/node /home/jarvis/.npm-global/lib/node_modules/openclaw/dist/index.js gateway --port 18789
Service file: ~/.config/systemd/user/openclaw-gateway.service
Service env: OPENCLAW_GATEWAY_PORT=18789
Config (cli): ~/.openclaw/openclaw.json
Config (service): ~/.openclaw/openclaw.json
Gateway: bind=loopback (127.0.0.1), port=18789 (service args)
Probe target: ws://127.0.0.1:18789
Dashboard: http://127.0.0.1:18789/
Probe note: Loopback-only gateway; only local clients can connect.
Runtime: stopped (state activating, sub auto-restart, last exit 1, reason 1)
RPC probe: failed
RPC target: ws://127.0.0.1:18789
gateway closed (1006):
Service is loaded but not running (likely exited immediately).
File logs: /tmp/openclaw/openclaw-2026-04-13.log
Logs: journalctl --user -u openclaw-gateway.service -n 200 --no-pager
Troubles: run openclaw status
Troubleshooting: https://docs.openclaw.ai/troubleshooting
Nice, that narrows it down.
This now clearly looks like a crash loop:
last exit 1port 18789 status: freeService is loaded but not running (likely exited immediately)
So we’re past the permissions/config theory.
I just need the actual exception now.
Please paste one of these, ideally both:
journalctl --user -u openclaw-gateway.service -n 200 --no-pager
tail -n 120 /tmp/openclaw/openclaw-2026-04-13.log
If it’s too long for Discord, paste only the part starting at the first:
Error:TypeError:ReferenceError:SyntaxError:
and include the stack trace below it.
If easier, upload the log as a .txt attachment.
Right now the missing piece is not status output, it’s the crash line itself. Once you paste that, we should be able to tell whether it’s ACP/plugin startup, a bad config edge case, or something else.
{"0":"Gateway failed to start: Error: Startup failed: required secrets are unavailable. SecretRefResolutionError: Environment variable "DISCORD_BOT_TOKEN" is missing or empty.","_meta":{"runtime":"node","runtimeVersion":"22.22.2","hostname":"unknown","name":"openclaw","date":"2026-04-13T06:20:14.318Z","logLevelId":5,"logLevelName":"ERROR","path":{"fullFilePath":"file:///home/jarvis/.npm-global/lib/node_modules/openclaw/dist/subsystem-DX_oTata.js:161:68","fileName":
i followed the guide, doesn't the env variable persist ?
Nice, we found it.
The crash is not ACP/thread config. It’s this:
SecretRefResolutionErrorEnvironment variable "DISCORD_BOT_TOKEN" is missing or empty
Your config says Discord token should come from env:
"token": {
"source": "env",
"provider": "default",
"id": "DISCORD_BOT_TOKEN"
}
So the fix is to make sure the gateway service can actually see that env var.
Best fix on systemd/Linux:
- Put the token in
~/.openclaw/.env
(do not paste it here)
mkdir -p ~/.openclaw
nano ~/.openclaw/.env
Add:
DISCORD_BOT_TOKEN=your_real_token_here
- Restart the gateway:
openclaw gateway restart
openclaw gateway status --deep
Why this happened:
- your shell may have the token
- but the systemd user service does not inherit your shell env
- so the service starts, tries to resolve
DISCORD_BOT_TOKEN, and crashes
After that, once the gateway is healthy again, retry:
/acp spawn claude --thread auto
Docs:
- https://docs.openclaw.ai/channels/discord
- https://docs.openclaw.ai/help/environment
- https://docs.openclaw.ai/help/faq
If you want, after you restart, paste the new openclaw gateway status --deep output and I’ll sanity-check it.
Short answer: no, not if you only exported it in your shell.
export DISCORD_BOT_TOKEN=... only affects:
- that current terminal session
- child processes launched from that shell
Your systemd user service is started separately, so it usually does not inherit that shell env.
That’s why this happens:
- foreground/manual run can work
- background
openclaw-gateway.servicecrashes sayingDISCORD_BOT_TOKENis missing
For the service, use one of these persistent paths:
- Recommended:
~/.openclaw/.env
DISCORD_BOT_TOKEN=...
- service environment
- optional shell import (
env.shellEnv.enabled: true), but.envis the simpler fix
So the guide’s export ... step is fine for testing, but it does not make the token persist for systemd.
After adding ~/.openclaw/.env, do:
openclaw gateway restart
openclaw gateway status --deep
If you want, paste the next status --deep output after that and I’ll confirm it’s healthy.
Nice, glad we caught that.
Fastest verification path:
- Make sure the gateway itself is healthy:
openclaw gateway status --deep
You want the RPC probe to be OK.
- In Discord, run:
/acp doctor
That’s the quickest ACP readiness check.
- Then do a real spawn test:
/acp spawn claude --bind here
or, if you specifically want to test thread creation:
/acp spawn claude --thread auto
- Check the active session:
/acp status
If all that works, ACP is working.
What “working” looks like:
/acp doctorsays it’s ready
/acp spawn ...creates/binds a session successfully/acp statusshows the active ACP session/backend- with
--thread auto, it should actually create/bind the Discord thread
If /acp doctor or spawn fails, paste that output next and I’ll help decode it.
Yep, for Claude specifically:
- readiness check:
/acp doctor
- spawn Claude in the current chat:
/acp spawn claude --bind here
- or test Claude + thread creation:
/acp spawn claude --thread auto
- inspect the session:
/acp status
Claude-specific gotcha: even if ACP itself is healthy, the Claude harness still needs its own auth on that host. So if doctor is fine but spawn fails, the next suspect is Claude-side auth/setup rather than Discord.
If you run /acp spawn claude --thread auto and paste the result, I can tell you whether Claude ACP is actually ready or not.
ACP error (ACP_SESSION_INIT_FAILED): ACP metadata is missing for agent:claude:acp:binding:discord:default:fe9b76e26be43558. Recreate this ACP session with /acp spawn and rebind the thread.
next: If this session is stale, recreate it with /acp spawn and rebind the thread.
Yep, that means the current ACP binding is stale.
In plain English:
- the Discord conversation is still bound to an ACP session key
- but the backend metadata for that ACP session is gone
- so you need to recreate the session, not repair the old one
Do this:
- try clearing the stale binding/session:
/acp close
- then create a fresh one:
- reuse this chat:
/acp spawn claude --bind here
- or if you want the child thread behavior:
/acp spawn claude --thread auto
- verify:
/acp status
So this is actually a stale session/binding problem now, not a token problem.
If /acp close refuses to work because the binding is already half-broken, just run /acp spawn claude --bind here anyway and see if it rebinds cleanly.
If this keeps happening on 2026.4.10, I’d really update, because that smells like an older ACP session-state bug.
didn't i set it to auto bind from openclaw.json ? why is that not working ?
You did set auto-bind, but that’s not the same as auto-heal or auto-create a new thread.
Your config does two different things:
-
bindings[]- makes this Discord channel a persistent ACP workspace
- basically, “route messages here to Claude ACP”
-
channels.discord.threadBindings.spawnAcpSessions: true- allows ACP to create a child Discord thread
- but only when you explicitly do a spawn flow, like:
/acp spawn claude --thread auto
What it does not guarantee is:
- automatically recreating a broken/stale ACP session after metadata disappears
- automatically creating a new thread on any random message
So what broke here is:
- the channel binding still exists
- but the bound ACP session metadata is gone
- on 2026.4.10, that stale state is not recovering cleanly
So yes, your config is “working” in the sense that the bind exists, but the session behind the bind is dead.
That’s why the fix is still:
/acp close
/acp spawn claude --bind here
or, if you want a child thread:
/acp spawn claude --thread auto
If you want the blunt version: your config set up the routing, not immortality 😅
And honestly, the stale-binding behavior you’re hitting is exactly why I’d update off 2026.4.10.
do i have to use the discord messaging argument pills ? just typing in the command as is doesnt work
Yes, on Discord I’d use the actual slash command UI / argument pills for /acp.
Just typing:
/acp spawn claude --thread auto
as plain message text is not the reliable path on Discord.
A few commands have inline shortcut handling, but /acp is not one I’d trust that way. So do this instead:
- type
/acp - pick the Discord slash command from the menu
- choose:
- action:
spawn - agent:
claude
- action:
- thread:
auto
If /acp does not appear in Discord’s slash-command menu at all, then the problem is that native commands are not registered/enabled, which is a separate issue.
So, short version: yes, use the pills/menu for /acp on Discord.
: agent is not an avalible pill, its only action and value
Ah, got it. I worded that too strongly.
You do not need a pill for every flag.
If Discord only shows:
actionagent
that’s still enough for a basic ACP health test.
So try:
/acpaction = spawnagent = claude
Then run:
/acp status
If that works, ACP itself is alive.
The --bind here / --thread auto style options may not be exposed as native Discord pills on your build, especially on 2026.4.10. So I’d separate the tests:
-
Does ACP spawn at all?
→/acpwithaction=spawn,agent=claude -
Does thread creation work?
→ that’s the next layer, and older builds may be rough there
So for now, don’t block on the missing thread/bind pill. First confirm that a plain spawn works.
Ah, perfect, that makes sense.
In that UI, use:
action = spawnvalue = claude
So the value field is the harness/agent id in this case.
Then to check it after spawning:
action = status- leave
valueempty, or use the session if it asks
So for your test, the native Discord flow is basically:
/acp
action: spawnvalue: claude
If that succeeds, ACP for Claude is working at the basic level.
i keep getting this even with the commands you gave me
ACP error (ACP_SESSION_INIT_FAILED): ACP metadata is missing for agent:claude:acp:binding:discord:default:fe9b76e26be43558. Recreate this ACP session with /acp spawn and rebind the thread.
next: If this session is stale, recreate it with /acp spawn and rebind the thread.
Yep, and that’s exactly why you keep seeing the same error.
Your config auto-bind is still resolving this channel to the same stale session key:
agent:claude:acp:binding:discord:default:fe9b76e26be43558
So every /acp action keeps getting routed back into the dead ACP session.
You need to break that binding first.
Try this in the native /acp command UI:
-
action = close- leave
valueempty if it lets you
- leave
-
then:
action = spawn
value = claude
So the sequence is:
/acp→action=close/acp→action=spawn,value=claude
If close still won’t clear it on 2026.4.10, the blunt workaround is:
- temporarily remove the
bindings[]ACP entry fromopenclaw.json - restart the gateway
- spawn Claude fresh
- add the binding back later if you still want it
So, short version: auto-bind is working, but it’s auto-binding you to a stale dead session. That’s the problem.
whats the bind setting good for if i have to do this everytime
Honestly, you shouldn’t have to do this every time. You’re right to be annoyed.
What the bind setting is supposed to be good for:
- make a channel/thread a persistent ACP workspace
- keep follow-up messages routed to the same Claude session
- preserve context, cwd, and session state
- avoid having to
/acp spawnon every message
So the intended flow is:
- bind once
- keep chatting
- it stays attached
What you’re seeing is the bad case:
- the binding survives
- but the ACP session metadata dies/goes stale
- so the bind points at a dead session
That’s not the point of the feature, that’s a failure mode, and on 2026.4.10 it looks flaky.
My honest recommendation:
- if you want an always-on Claude workspace in this channel, keep the binding, but update OpenClaw
- if you just want ad hoc ACP/thread spawns, remove the static
bindings[]entry for now and use/acp spawnwhen needed
So:
- persistent workspace → keep bind, update
- one-off testing / threads → remove bind, spawn manually
If I were you, I’d probably remove the static bind for now, get /acp spawn working cleanly, then add the bind back after updating.
are you still helping me ?
Yep, I’m still with you, sorry 😅
We’ve actually narrowed it down a lot:
- Discord token/env issue is fixed
- gateway starts now
- ACP is failing on a stale bound session
- the flaky part is your persistent
bindings[]ACP setup on 2026.4.10
So the two sane paths from here are:
- keep the bind, but update OpenClaw first
- remove the static bind for now, restart, and test fresh
/acp spawn
If you want, I can walk you through either one step by step. My recommendation is remove the static bind first, test clean spawn, then add it back later.
i used /acp action = spawn value = claude --bind here , it claims the acp is started. but when I talk to it, Claude is not the one responding.
claude session active (idle auto-unfocus after 24h inactivity; max age 48h). Messages here go directly to this session.
cwd: /home/jarvis/.openclaw/workspace
[12:10 AM]TheReaper: tell me a joke
JarvisClaw: Why don't scientists trust atoms?
Because they make up everything!
That actually sounds like the bind worked.
The important part is this line:
claude session active ... Messages here go directly to this session.
On Discord, the sender will still be JarvisClaw.
ACP does not change the bot name/avatar to “Claude”, it just routes the reply through the Claude harness behind the scenes.
So this is normal:
- frontend sender: JarvisClaw
- backend session/harness: Claude ACP
And honestly, the joke itself isn’t a reliable way to tell.
If you want a stronger check, run:
/acp status
That should show the active ACP session/backend details.
So, short version: JarvisClaw replying does not mean Claude isn’t active. It usually just means Claude is active behind JarvisClaw.
JarvisClaw: ACP status:
session: agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d
backend: acpx
agent: claude
acpx session id: af0e2345-e450-4956-83ee-3d6e6b4726d1
acpx record id: agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d
sessionMode: persistent
state: idle
runtimeOptions: cwd=/home/jarvis/.openclaw/workspace
capabilities: session/set_config_option, session/set_mode, session/status
lastActivityAt: 2026-04-13T07:14:21.190Z
runtime: session=agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d backendSessionId=af0e2345-e450-4956-83ee-3d6e6b4726d1 pid=126879 open
runtimeDetails: {"cwd":"/home/jarvis/.openclaw/workspace","lastUsedAt":"2026-04-13T07:10:04.607Z","closed":false}
Yep, that confirms it. ACP for Claude is working. 🎉
The key lines are:
backend: acpxagent: claudesessionMode: persistentstate: idlepid=126879 open
So you really do have:
- Discord bot frontend: JarvisClaw
- ACP backend: acpx
- Harness/session: Claude
That part is healthy now.
So the original problem has narrowed down to this:
- Claude ACP works
- the flaky bit is specifically Discord thread creation / stale binding behavior on 2026.4.10
If you want, the next thing I can help you test is just the thread-spawn path now that we know ACP itself is alive.
ok how do i test thread-spawn path ?
Here’s the important gotcha:
Don’t test --thread auto from inside this support thread.
On Discord, --thread auto behaves like this:
- in an existing thread: bind the current thread
- in a normal top-level channel: create/bind a child thread
So if you want to test actual child-thread creation, do this:
- Go to a regular channel (not a thread)
- Make sure you’re not hitting your stale/static ACP bind there, or use a different channel
- Run the ACP spawn there
What you want to test is:
/acp spawn claude --thread auto
Expected result:
- OpenClaw creates a new Discord thread
- binds the Claude ACP session to it
- follow-up messages in that new thread go to Claude
If you run that inside this thread, it will just reuse/bind this thread, which is why it won’t prove child-thread creation.
So, short version:
- test in this thread → verifies binding
- test in a normal channel → verifies thread spawning
If you want, I can help you pick the cleanest exact place to run that test based on your current bindings[] setup.
you should spit out commands like :
/acp action:spawn value:claude --thread auto
becasue discord regonize that syntax
ok ?
Yep, exactly.
- Inside this thread:
--thread autojust binds this thread - In a normal top-level channel:
--thread autotests real child-thread creation
So the clean test is: go to a regular channel and run the spawn there. If you want, send me what happens and I’ll sanity-check it.
you should spit out commands like :
/acp action:spawn value:claude --thread auto
because that is a plug and play command
you should spit out commands like the following because thats a syntax that discord can parse out of the box :
/acp action:spawn value:claude --thread auto
you should spit out commands like the following because thats a syntax that discord can parse out of the box :
"/acp action:spawn value:claude --thread auto"
Yep, good call. That’s a better Discord-native way to write it here.
I should’ve formatted it like:
/acp action:spawn value:claude --thread auto
And for the real thread-spawn test, run that from a top-level channel, not from inside this thread.
Thanks for the correction.
i tried it, it gave me this: Session binding adapter failed to bind target conversation
Yep, understood.
For Discord slash-command help here, the most useful format is:
action:spawn value:claude --thread auto
I’ll use that style going forward. Thanks for the correction.
Good, that means Claude ACP itself is fine, but the Discord thread-binding layer failed.
That error usually means one of these:
-
you ran it in the wrong place
- use a normal text channel
- not a thread
- not a forum/media channel
-
the bot is missing channel-level thread perms
Check the target channel overrides, not just the bot profile/role globally:- View Channel
- Send Messages
- Create Public Threads
- Send Messages in Threads
-
2026.4.10 thread-binding bug
So the clean retry is:
- go to a regular text channel
- confirm those perms on that channel
- run:
action:spawn value:claude --thread auto
If it still fails there, the next thing I need is the log line from a retry:
openclaw logs --follow
then run the command once and paste the adapter error line.
07:30:09+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ sessions.delete 210ms conn=8e377782…44be id=c0a7725d…792f
07:30:09+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ sessions.list 90ms conn=d30de23c…56c6 id=66c62bfa…f63a
07:30:09+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ sessions.list 62ms conn=ee87bceb…18e9 id=f8b8114b…70e1
07:30:09+00:00 warn {"scope":"event-queue","level":"warn","type":"slow-listener","listener":"InteractionEventListener","eventType":"INTERACTION_CREATE","durationMs":5597,"lane":"critical"}
07:30:22+00:00 info gateway/channels/discord {"subsystem":"gateway/channels/discord"} discord gateway: Gateway websocket closed: 1006
07:30:22+00:00 info gateway/channels/discord {"subsystem":"gateway/channels/discord"} discord gateway: Gateway reconnect scheduled in 878ms (close, resume=true)
Thanks, this is actually useful.
Those log lines do not look like a clean permission denial.
What they show is:
slow-listeneronInteractionEventListenertaking 5597ms- then the Discord gateway socket closes with 1006
So the picture now is:
- ACP itself is working
- your config/token are fine
- the Discord interaction/thread-binding path is getting wedged / disconnecting
That lines up pretty well with:
Session binding adapter failed to bind target conversation
So at this point, I would stop chasing config.
This is looking like a 2026.4.10 Discord thread-binding/runtime bug.
My recommendation now:
- Update OpenClaw
- Retry in a normal text channel with:
action:spawn value:claude --thread auto - If it still fails on latest, file a GitHub issue with:
- the exact error
- these log lines
- your
openclaw --version
Issue tracker: https://github.com/openclaw/openclaw/issues
So, bluntly: I think you’ve hit a bug, not a bad setup.
show it to me in this syntax:
/acp action:spawn value:claude --thread auto
what else can we try ?
07:40:18+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ sessions.delete 248ms conn=6a6a3ff8…0e89 id=2fb4b6c4…6894
07:40:19+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ sessions.list 89ms conn=78bf0967…15b9 id=3258a444…eed3
07:40:19+00:00 warn {"scope":"event-queue","level":"warn","type":"slow-listener","listener":"InteractionEventListener","eventType":"INTERACTION_CREATE","durationMs":6207,"lane":"critical"}
07:40:19+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ sessions.list 158ms conn=56f47590…1eb9 id=c8d24718…9078
Yeah, we’ve still got a couple good things to try.
My recommendation is do #1 first, because it cleanly separates Discord thread creation from ACP thread binding.
1. Test plain Discord thread creation directly from the CLI
Run this from the machine:
openclaw message thread create --channel discord --target channel:<TEXT_CHANNEL_ID> --thread-name "test thread" --message "thread-create probe"
Use a normal text channel, not this thread, not a forum/media channel.
What it tells us:
- If this fails → the problem is lower-level Discord channel permissions / adapter behavior
- If this succeeds → Discord can create threads, and the broken bit is specifically ACP thread binding
2. Run doctor once
openclaw doctor
openclaw gateway restart
Low-risk, might repair stale session/binding state.
3. Use the workaround for now
If you just need Claude working, use:
action:spawn value:claude --bind here
That avoids the flaky child-thread path on 2026.4.10.
So my honest order would be:
openclaw message thread create ...openclaw doctor- if still bad, update
the cli worked
Nice, that’s the smoking gun. 🎯
If the CLI thread create worked, then:
- Discord bot permissions are fine
- normal Discord thread creation is fine
- the broken piece is specifically ACP thread binding / thread-spawn flow on your build
So this is not a bad Discord setup anymore. It’s basically an ACP bug/regression on 2026.4.10.
Best workaround right now
- create the Discord thread with the CLI
- go into that new thread
- run:
action:spawn value:claude --bind here
That should give you the same practical result, just with manual thread creation first.
Recommended long-term fix
- update OpenClaw
- if it still reproduces on latest, file a GitHub issue and mention:
- CLI thread creation works
- ACP
--thread autofails - you saw
slow-listener/ Discord1006logs
Issue tracker: https://github.com/openclaw/openclaw/issues
So, good news: we’ve isolated it pretty cleanly.
┌ OpenClaw doctor
│
◇ Update ──────────────────────────────────────────────────────────────────────────────────╮
│ │
│ This install is not a git checkout. │
│ Run openclaw update to update via your package manager (npm/pnpm), then rerun doctor. │
│ │
├───────────────────────────────────────────────────────────────────────────────────────────╯
│
◇ Startup optimization ─────────────────────────────────────────────────────────────────────╮
│ │
│ - NODE_COMPILE_CACHE is not set; repeated CLI runs can be slower on small hosts (Pi/VM). │
│ - OPENCLAW_NO_RESPAWN is not set to 1; set it to avoid extra startup overhead from │
│ self-respawn. │
│ - Suggested env for low-power hosts: │
│ export NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache │
│ mkdir -p /var/tmp/openclaw-compile-cache │
│ export OPENCLAW_NO_RESPAWN=1 │
│ │
├────────────────────────────────────────────────────────────────────────────────────────────╯
│
◇ Doctor warnings ────────────────────────────────────────────────────────────────────────╮
│ │
│ - channels.discord.groupPolicy is "allowlist" but groupAllowFrom (and allowFrom) is │
│ empty — all group messages will be silently dropped. Add sender IDs to │
│ channels.discord.groupAllowFrom or channels.discord.allowFrom, or set groupPolicy to │
│ "open". │
│ │
├──────────────────────────────────────────────────────────────────────────────────────────╯
│
◇ Claude CLI ─────────────────────────────────────────────────────────────────────────────╮
│ │
│ - Binary: ~/.npm-global/bin/claude. │
│ - Headless Claude auth: OK (oauth). │
│ - OpenClaw auth profile: missing (anthropic:claude-cli) in │
│ /home/jarvis/.openclaw/agents/main/agent/auth-profiles.json. │
│ - Workspace: ~/.openclaw/workspace (writable). │
│ - Claude project dir: ~/.claude/projects/-home-jarvis--openclaw-workspace (present). │
│ - Fix: run openclaw models auth login --provider anthropic --method cli --set-default. │
│ │
├──────────────────────────────────────────────────────────────────────────────────────────╯
│
◆ Archive 1 orphan transcript file in ~/.openclaw/agents/claude/sessions? This only renames them to *.deleted.<timestamp>.
│ ○ Yes / ● No
└
That doctor output found a couple real problems.
The big ones I’d fix next:
- Update OpenClaw
openclaw update
- Fix Claude CLI auth profile for OpenClaw
openclaw models auth login --provider anthropic --method cli --set-default
Doctor is saying Claude CLI itself is installed and logged in, but OpenClaw’s auth profile wiring is missing. That’s worth fixing.
- Fix your Discord group policy
Right now doctor says:
channels.discord.groupPolicy = "allowlist"- but
groupAllowFrom/allowFromis empty
That means group messages can be silently dropped.
So either:
- set
channels.discord.groupPolicyto"open" - or populate
channels.discord.groupAllowFrom
- Rerun doctor + restart
openclaw doctor
openclaw gateway restart
And no, I wouldn’t worry about the orphan transcript prompt right now, that looks unrelated.
So if I were doing this in order:
openclaw update
openclaw models auth login --provider anthropic --method cli --set-default
# fix discord groupPolicy / allowFrom in config
openclaw doctor
openclaw gateway restart
That’s the cleanest next pass.
i don't use group messages
If you only mean “I don’t use DM groups”, fair, but for Discord:
server channels and threads are group messages.
So for the exact thing you’re testing here, that doctor warning does matter.
In other words:
- Discord DM → not a group message
- Discord server channel/thread → is a group message
Since you’re testing ACP/thread spawning in a server, I would not ignore that warning yet.
So the priorities stay:
openclaw updateopenclaw models auth login --provider anthropic --method cli --set-default
- fix
channels.discord.groupPolicyfor the server/channel testing path - restart and retest
If you want, paste just your Discord config block after you change groupPolicy, and I’ll sanity-check it.
what are the remefication of running this ?
openclaw models auth login --provider anthropic --method cli --set-default
i do not use their api or extra charge. i only use their claude code cli
Good question. The important part is --method cli.
That command means:
- use Claude CLI auth, not Anthropic API-key auth
- do not create/switch to an
ANTHROPIC_API_KEYflow --set-defaultjust tells OpenClaw, “for Anthropic, use this Claude CLI-backed auth profile by default”
So the practical ramifications are:
- OpenClaw writes an Anthropic auth profile into its own auth store
- OpenClaw can reuse your existing Claude CLI login cleanly
- It should not switch you onto separate Anthropic API billing just because you ran that command
So if you already use Claude Code CLI and want OpenClaw to reuse that, this is the right direction.
The only thing --set-default changes is OpenClaw’s auth resolution order for Anthropic. It does not magically turn on API key billing.
If you want the cautious version, you can also run it without --set-default first, then inspect openclaw models status. But based on doctor, the missing auth profile is a real issue worth fixing.
i don't need that to run ACP do i ?
Strictly speaking, no, not for the ACP test you’re doing right now.
You already proved that, because you got:
- ACP session created
backend: acpxagent: claude
So the missing auth profile is not the thing blocking your current thread-spawn issue.
I’d frame it like this:
- Needed for current ACP runtime test? No, apparently not.
- Useful cleanup for Anthropic auth resolution in OpenClaw overall? Yes.
- The thing breaking thread auto-create right now? Probably not.
So if you want to stay focused, I’d treat that auth fix as optional cleanup, not the next must-do for this bug.
stay focused
You’re right.
Focused summary:
- ACP works
- CLI Discord thread creation works
- so the only broken piece is ACP child-thread binding on 2026.4.10
That means this is most likely a bug/regression, not auth, not basic Discord perms, not Claude CLI setup.
So the focused next step is:
- update OpenClaw
- retry in a normal text channel with:
action:spawn value:claude --thread auto
- if it still fails, file a bug with the log snippet
That’s the shortest path now.
there is an existing bug here: https://github.com/openclaw/openclaw/issues/64017
Nice catch, that sounds like the same issue.
In that case, I would not open a duplicate.
I’d just add your findings to #64017, especially:
- you’re on 2026.4.10
- CLI thread creation works
- ACP
--thread autofails - ACP itself is healthy (
backend: acpx,agent: claude) - you saw
slow-listener/ Discord1006around the failure
That’s a pretty solid repro trail.
So the practical path now is:
- workaround for now: create the thread via CLI, then
action:spawn value:claude --bind here - real fix: whatever lands for #64017
Glad we pinned it down.
If this fixed the diagnosis, please right-click the solution message → Apps → ✅ Mark Solution so Answer Overflow can index it.
ive updated to 2026.4.11 already
Nice. Then I’d do one clean retest on 2026.4.11:
- use a fresh normal text channel
- not this thread
- ideally close any old ACP bind first, or just use a different channel
Then run:
action:spawn value:claude --thread auto
If it works now, great, the update fixed it.
If it still fails on 2026.4.11, that’s perfect info to add to #64017:
- still repros on 2026.4.11
- CLI thread create works
- ACP
--thread autostill fails
Send me the result of that retest and I’ll help interpret it fast.
so for now, i''ve gotten acp spawn --bind here to work. how do i talk to the acp agent there ? because it seems like openclaw is still responding to my messages, there are 0 usage in claude
If --bind here worked, then the way you talk to the ACP agent is just:
- send normal messages in that same channel/thread
No extra prefix is needed after the bind.
Two important gotchas:
-
The Discord sender will still be OpenClaw/JarvisClaw
- the bot name/avatar does not change
- ACP/Claude is behind that frontend
-
The best verification is not the bot name, it’s ACP status
Run:
action:status
Then:
- note
lastActivityAt - send a normal message
- run
action:statusagain
If lastActivityAt moves forward, your message hit the ACP session.
So the quick test is:
action:status- send:
say the word BANANA and nothing else action:statusagain
If the reply ignores that kind of constrained prompt and lastActivityAt does not change, then the channel is not actually routing to ACP.
prefix your acp commands with /acp
Yep, you’re right. I should write them as:
/acp action:status
and for the bind test:
/acp action:spawn value:claude --bind here
Thanks, I’ll keep the /acp prefix on them.
ACP status:
session: agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d
backend: acpx
agent: claude
acpx session id: af0e2345-e450-4956-83ee-3d6e6b4726d1
acpx record id: agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d
sessionMode: persistent
state: idle
runtimeOptions: cwd=/home/jarvis/.openclaw/workspace
capabilities: session/set_config_option, session/set_mode, session/status
lastActivityAt: 2026-04-13T07:14:21.190Z
runtime: session=agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d backendSessionId=af0e2345-e450-4956-83ee-3d6e6b4726d1 pid=126879 open
runtimeDetails: {"cwd":"/home/jarvis/.openclaw/workspace","lastUsedAt":"2026-04-13T07:10:04.607Z","closed":false}
Only you can see this • Dismiss message
[1:06 AM]TheReaper: what time is it ?
[1:07 AM]
APP
JarvisClaw: The current time is 08:06 UTC.
[1:07 AM]
APP
JarvisClaw: ACP status:
session: agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d
backend: acpx
agent: claude
acpx session id: af0e2345-e450-4956-83ee-3d6e6b4726d1
acpx record id: agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d
sessionMode: persistent
state: idle
runtimeOptions: cwd=/home/jarvis/.openclaw/workspace
capabilities: session/set_config_option, session/set_mode, session/status
lastActivityAt: 2026-04-13T07:14:21.190Z
runtime: session=agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d backendSessionId=af0e2345-e450-4956-83ee-3d6e6b4726d1 pid=126879 open
runtimeDetails: {"cwd":"/home/jarvis/.openclaw/workspace","lastUsedAt":"2026-04-13T07:10:04.607Z","closed":false}
Only you can see this • Dismiss message
This is actually very helpful.
The key signal is:
- you sent a normal message
lastActivityAtdid not change
So your message did not reach the ACP session.
That means:
- the Claude ACP session is alive
- but the conversation is not actually bound to it, despite the success message
So the next thing I’d try is an explicit focus/bind to that exact session key.
Use the /focus command in the thread/channel where you want Claude, and target:
agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d
Then:
- send a distinctive message, like:
say BANANA and nothing else - run:
/acp action:status
If lastActivityAt moves, the focus worked.
If it still does not move, then we’ve got even stronger evidence that the bind/focus routing path is broken, not Claude itself. And that’s exactly the kind of detail worth adding to #64017.
Thread-bound subagent spawns are disabled for discord (set channels.discord.threadBindings.spawnSubagentSessions=true to enable).
That error is from the /focus workaround path, not from Claude ACP itself.
It means:
/focusis trying to use the thread-bound subagent/session binding flow- and your config does not have:
channels.discord.threadBindings.spawnSubagentSessions = true
So, two options:
Option A, simplest, stay focused
Don’t use /focus.
Stick with the workaround that already works:
- create the Discord thread via CLI
- go into that thread
- run:
/acp action:spawn value:claude --bind here
Option B, test /focus too
Add:
"channels": {
"discord": {
"threadBindings": {
"spawnAcpSessions": true,
"spawnSubagentSessions": true
}
}
}
then restart the gateway.
But honestly, if the goal is just talk to Claude in a thread, I’d avoid adding more moving parts right now and use Option A.
wtf, you told me to try that
You’re right. That was my miss, sorry.
I should not have sent you down the /focus path without checking that your config had spawnSubagentSessions enabled.
So, let’s correct course and ignore /focus entirely.
Do not use /focus.
The clean workaround path is still:
- create the Discord thread via CLI
- go into that thread
- run:
/acp action:spawn value:claude --bind here
That avoids the subagent-focus path completely.
So yes, you were right to call that out. My bad.
give me a 1 stence summary of this new problem, i am goign to fil a bug
On 2026.4.11, /acp action:spawn value:claude --bind here reports success, but normal messages in that same Discord channel are still answered by OpenClaw instead of reaching the bound Claude ACP session, and /acp status shows lastActivityAt never updates.
what si the acp command to close a specific sessio nid
Use the OpenClaw session key from /acp status as the target.
In Discord’s slash-command style, that should be:
/acp action:close value:agent:claude:acp:21a105bc-249d-4396-85bf-9f2ec68cb89d
Use the value from the session: line, not the acpx session id: line.
this doesn't work:
openclaw config set channels.discord.streaming block
Error: Config validation failed: channels.discord.streaming: invalid config: must be object
Yep, the parent key wants an object now, not a bare string.
Use either of these:
openclaw config set channels.discord.streaming.mode block
or, in one shot:
openclaw config set channels.discord.streaming '{"mode":"block"}' --strict-json
So your original command failed because it was trying to set:
"streaming": "block"
but the schema currently expects:
"streaming": {
"mode": "block"
}
Yep, use this one:
openclaw config set channels.discord.streaming.mode block
That’s the simplest fix.
how come /acp discord commands doesn't work in threads ?
They’re supposed to work in threads, so this isn’t just you doing it wrong.
The two gotchas are:
-
--thread autoinside a thread does not create a new thread
it just targets/binds the current thread -
the Discord thread routing/binding path is flaky/buggy in the builds you’ve been testing
which is why we kept seeing ACP session/bind weirdness
So the short answer is:
/acpin threads should work in principle- but the thread-specific ACP bind/spawn behavior is currently buggy, which is why it feels broken
That’s why the reliable workaround has been: