---
name: hermes-discord-control-channel
description: Set up a private Discord control channel for Hermes/OpenClaw with a narrow command surface, allowlisted users, and no public agent endpoint.
---

# Hermes Discord Control Channel

Use this skill when a user wants Hermes/OpenClaw to report status, summarize inbox items, or process Linear triage work through a private Discord channel.

## Core Rule

Discord is the control room, not a remote shell.

Never expose:

- arbitrary shell execution,
- raw prompt passthrough,
- a public Hermes/OpenClaw control endpoint,
- secrets, env files, logs, or OAuth state,
- mutation commands without a reviewable decision ID.

## Required Boundary

1. Use one private Discord server or private category.
2. Use one configured agent channel.
3. Restrict commands to allowed user IDs or role IDs.
4. Run the adapter on the VPS next to Hermes/OpenClaw.
5. Talk to Hermes/OpenClaw locally.
6. Keep the firewall closed to raw agent ports.

## Environment

```bash
DISCORD_BOT_TOKEN=
DISCORD_APPLICATION_ID=
DISCORD_PUBLIC_KEY=
DISCORD_GUILD_ID=
DISCORD_AGENT_CHANNEL_ID=
DISCORD_ALLOWED_USER_IDS=
HERMES_COMMAND=
LINEAR_API_KEY=
LINEAR_TEAM_ID=
```

`LINEAR_API_KEY` and `LINEAR_TEAM_ID` are required only when commands inspect or apply Linear triage work.

## Command Contract

Start with:

- `/hermes status`
- `/hermes inbox`
- `/hermes summarize`
- `/hermes triage issue:<linearIssueId>`
- `/hermes apply decision:<decisionId>`

Prefer slash commands and buttons. Avoid privileged Message Content intent for v1.

## Implementation Checklist

1. Create the Discord application and bot.
2. Install the bot into only the target server.
3. Record `DISCORD_GUILD_ID` and `DISCORD_AGENT_CHANNEL_ID`.
4. Add allowed user or role IDs.
5. Store the bot token in the VPS secrets directory.
6. Run `node scripts/hermes-discord-control-channel.mjs check`.
7. Register slash commands only after the command contract is reviewed.
8. Log every command request and every mutation result.

## X Bookmark Flow

Use Discord after bookmark capture creates Linear issues:

```text
X bookmarks
  -> Linear Triage
  -> Hermes summary
  -> Discord post
  -> human discussion
  -> approved Linear update
```

The capture skill stays deterministic. This Discord skill is the discussion and approval boundary.
