Skip to content

[All platforms] Slack channel silently skipped — SDK rejects placeholder token before any HTTP request #1569

@zNeill

Description

@zNeill

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:

  1. Sandbox env: SLACK_BOT_TOKEN=openshell:resolve:env:SLACK_BOT_TOKEN
  2. OpenClaw reads env var or openclaw.json botToken field
  3. Slack SDK validates token format in-process (checks xoxb- prefix)
  4. Placeholder doesn't match → SDK skips Slack initialization
  5. 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]

Metadata

Metadata

Assignees

Labels

Integration: SlackUse this label to identify Slack integration issues with NemoClaw.NV QABugs found by the NVIDIA QA TeamPlatform: AllApplies to all platforms supported by NemoClawUATIssues flagged for User Acceptance Testing.bugSomething isn't workingenhancement: integrationPRs or issues proposing integration of a third-party product or service into NemoClaw.status: blockedCannot proceed — waiting on an external team, dependency, or decision outside this repo.

Type

No type
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