Description
Summary
Slack Socket Mode channel never initializes in the sandbox. The openclaw.json contains a complete Slack configuration with "botToken": "openshell:resolve:env:SLACK_BOT_TOKEN", and the OpenShell provider is registered with a valid credential. However, the Slack SDK validates the token format in-process (expects xoxb- prefix) before making any HTTP request. Since the sandbox environment variable contains the placeholder string (by design), the SDK rejects it and OpenClaw silently skips Slack initialization — no [slack] log line is ever emitted.
Root cause
OpenShell's security model intentionally keeps real secrets out of sandbox process memory:
"Child processes only see placeholder values in their environment; the proxy rewrites them to real secrets immediately before forwarding upstream."
This works for Telegram (HTTP polling — token appears in URL path /bot{TOKEN}/getUpdates, rewritten at proxy layer). It does not work for Slack because:
- Sandbox env:
SLACK_BOT_TOKEN=openshell:resolve:env:SLACK_BOT_TOKEN - OpenClaw reads env var or
openclaw.json botToken field - Slack SDK validates token format in-process (checks
xoxb- prefix) - Placeholder doesn't match → SDK skips Slack initialization
- No HTTP request is ever made → proxy never gets a chance to replace the placeholder
Evidence
From inside sandbox:$ env | grep SLACK
SLACK_BOT_TOKEN=openshell:resolve:env:SLACK_BOT_TOKEN
$ grep -i slack /tmp/gateway.log
(only config migration line — zero [slack] initialization or connection attempts)
$ node -e "const c=require('/sandbox/.openclaw/openclaw.json'); console.log(c.channels.slack.accounts.main.botToken)"
openshell:resolve:env:SLACK_BOT_TOKEN
Meanwhile, Telegram works because its token flows through an HTTP URL path that the L7 proxy can rewrite:L7_REQUEST l7_target=/botopenshell:resolve:env:TELEGRAM_BOT_TOKEN/getMe
→ proxy rewrites to /bot/getMe
→ Telegram API returns 200
Suggested fix
Provide an opt-in mechanism for specific environment variables to be injected with real secret values instead of placeholders, for SDKs that require in-process token validation before making network calls. For example:
- A provider flag like
--inject-env that tells OpenShell to pass the real value to the sandbox process - Or a sandbox-level config that lists env vars requiring real injection
- With appropriate documentation of the security trade-off (real secret visible in process memory)
Environment
- NemoClaw v0.0.7
- OpenShell 0.0.23
- OpenClaw 2026.3.11
- Node.js 22.22.1
Bug Details
| Field |
Value |
| Priority |
Unprioritized |
| Action |
Dev - Open - To fix |
| Disposition |
Open issue |
| Module |
Machine Learning - NemoClaw |
| Keyword |
NemoClaw, NEMOCLAW_GH_SYNC_APPROVAL |
[NVB# 6056223]
[NVB#6056223]
Description
Summary
Slack Socket Mode channel never initializes in the sandbox. The
openclaw.jsoncontains a complete Slack configuration with"botToken": "openshell:resolve:env:SLACK_BOT_TOKEN", and the OpenShell provider is registered with a valid credential. However, the Slack SDK validates the token format in-process (expectsxoxb-prefix) before making any HTTP request. Since the sandbox environment variable contains the placeholder string (by design), the SDK rejects it and OpenClaw silently skips Slack initialization — no[slack]log line is ever emitted.Root cause
OpenShell's security model intentionally keeps real secrets out of sandbox process memory:
This works for Telegram (HTTP polling — token appears in URL path
/bot{TOKEN}/getUpdates, rewritten at proxy layer). It does not work for Slack because:SLACK_BOT_TOKEN=openshell:resolve:env:SLACK_BOT_TOKENopenclaw.jsonbotTokenfieldxoxb-prefix)Evidence
From inside sandbox:$ env | grep SLACK
SLACK_BOT_TOKEN=openshell:resolve:env:SLACK_BOT_TOKEN
$ grep -i slack /tmp/gateway.log
(only config migration line — zero [slack] initialization or connection attempts)
$ node -e "const c=require('/sandbox/.openclaw/openclaw.json'); console.log(c.channels.slack.accounts.main.botToken)"
openshell:resolve:env:SLACK_BOT_TOKEN
Meanwhile, Telegram works because its token flows through an HTTP URL path that the L7 proxy can rewrite:L7_REQUEST l7_target=/botopenshell:resolve:env:TELEGRAM_BOT_TOKEN/getMe
→ proxy rewrites to /bot/getMe
→ Telegram API returns 200
Suggested fix
Provide an opt-in mechanism for specific environment variables to be injected with real secret values instead of placeholders, for SDKs that require in-process token validation before making network calls. For example:
--inject-envthat tells OpenShell to pass the real value to the sandbox processEnvironment
Bug Details
[NVB# 6056223]
[NVB#6056223]