Slack Integration
Pilot sends real-time notifications to Slack channels as it works on issues. It supports progress updates, PR-ready alerts, failure reports, and interactive approval workflows. With the conversational bot enabled, Slack also becomes a two-way interface — chat, ask code questions, and file issues by talking to Pilot.
Setup
1. Create a Slack App
- Go to api.slack.com/apps → Create New App
- Choose From scratch, name it “Pilot”, and select your workspace
- Under OAuth & Permissions, add these bot token scopes:
chat:write— post messageschat:write.public— post to channels without joining
2. Install and Get Tokens
- Click Install to Workspace and authorize
- Copy the Bot User OAuth Token (
xoxb-...) - Under Basic Information, copy the Signing Secret
3. Configure Pilot
# ~/.pilot/config.yaml
slack:
enabled: true
bot_token: ${SLACK_BOT_TOKEN}
channel: "#dev-notifications"
signing_secret: ${SLACK_SIGNING_SECRET}4. Invite the Bot
Invite the Pilot bot to your notification channel:
/invite @PilotConfiguration Reference
| Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable Slack notifications |
bot_token | string | required | Slack bot OAuth token (xoxb-...) |
channel | string | "#dev-notifications" | Default notification channel |
signing_secret | string | — | Slack signing secret for webhook verification |
approval.enabled | bool | false | Enable interactive approval workflows |
approval.channel | string | "#pilot-approvals" | Channel for approval requests |
approval.signing_secret | string | — | Signing secret for approval webhooks |
Channel Formats
Pilot accepts several channel identifier formats:
| Format | Example |
|---|---|
Channel with # | #dev-notifications |
Channel without # | general |
| Channel ID | C1234567890 |
| DM channel ID | D1234567890 |
Conversational Bot
Beyond notifications, Slack can be a two-way interface. When the conversational bot and the Slack llm_classifier are both enabled, natural-language messages are classified by intent and answered on the fast path (~1–2s) instead of always spinning up the executor:
- Chat & greetings — direct replies from a fast model
- Code questions — grounded answers from bounded file retrieval
- Issue intake — “create an issue to add a /ping endpoint” → a drafted,
pilot-labeled GitHub issue the daemon then picks up
# ~/.pilot/config.yaml
slack:
enabled: true
bot_token: ${SLACK_BOT_TOKEN}
llm_classifier:
enabled: true # classify NL messages by intent (vs regex)
api_key: ${ANTHROPIC_API_KEY} # falls back to ANTHROPIC_API_KEY env var
history_size: 10
history_ttl: 30m
bot:
enabled: true # the conversational fast path (shared across adapters)
api_key: ${ANTHROPIC_API_KEY}
retrieval:
enabled: true| Field | Type | Default | Description |
|---|---|---|---|
llm_classifier.enabled | bool | false | Enable LLM-based intent classification for Slack |
llm_classifier.api_key | string | — | Anthropic API key (falls back to ANTHROPIC_API_KEY) |
llm_classifier.history_size | int | 10 | Messages to keep per channel for context |
llm_classifier.history_ttl | duration | 30m | TTL for conversation history |
The Slack llm_classifier is separate from the bot: block. The classifier decides which path a message takes; the bot is the conversational fast path itself. Both must be enabled for the two-way experience. Without the classifier, messages fall back to regex routing and most reach the executor. See the Conversational Bot feature page for the full reference and limitations.
Notification Types
Pilot sends Block Kit-formatted messages to your Slack channel at each phase of execution:
| Event | Emoji | Color | Description |
|---|---|---|---|
| Task started | 🚀 | — | Pilot began working on an issue |
| Progress update | ⏳ | — | Status update with progress bar (0–100%) |
| Task completed | ✅ | good (green) | Issue resolved, optional PR link |
| Task failed | ❌ | danger (red) | Error details in code block |
| PR ready | 🔔 | indigo | PR ready for review with file count |
Progress Bar
Progress updates include a visual progress bar:
⏳ Implementing changes...
[████████░░] 80%The bar uses 10 segments with █ (filled) and ░ (empty) characters.
Approval Workflows
Pilot can request human approval before executing, merging, or retrying via interactive Slack buttons.
Enable Approvals
slack:
enabled: true
bot_token: ${SLACK_BOT_TOKEN}
channel: "#dev-notifications"
signing_secret: ${SLACK_SIGNING_SECRET}
approval:
enabled: true
channel: "#pilot-approvals"Set Up Interactive Endpoint
- In your Slack app, go to Interactivity & Shortcuts
- Enable interactivity
- Set the request URL to
https://your-pilot.example.com/slack/interactions
Approval Stages
| Stage | Buttons | When |
|---|---|---|
| Pre-Execution | ✅ Execute / ❌ Cancel | Before Pilot starts implementing |
| Pre-Merge | ✅ Merge / ❌ Reject | Before merging a PR |
| Post-Failure | 🔄 Retry / ⏹ Abort | After an execution failure |
Each approval message includes context (PR URL, error details, timeout countdown) and updates in-place when a decision is made, showing who approved or rejected.
Webhook Security
Approval webhooks use HMAC-SHA256 signature verification with a 5-minute timestamp window to prevent replay attacks.
Planning Error Messages
When using the /plan command, Pilot shows specific error messages based on the failure type:
| Scenario | Message | Description |
|---|---|---|
| Timeout | ⏱ Planning timed out. Try a simpler request. | Planning exceeded the planning_timeout duration |
| API/executor error | ❌ Planning failed: <error> | The executor returned an error during planning |
| Empty result (error) | ❌ Planning error: <error> | Planning completed but produced an error |
| Empty result (timeout) | ⏱ Planning timed out. Try a simpler request. | Planning finished without output due to timeout |
| Empty result (success) | 🤷 The task may be too simple for planning. | No plan generated — try executing directly |
The planning timeout is controlled by the planning_timeout field in the executor config (default: 2m).
executor:
planning_timeout: 3m # increase for complex tasksDaily Briefs
Pilot can send daily or weekly summary digests to Slack channels.
Configure Briefs
daily_brief:
enabled: true
schedule: "0 9 * * 1-5" # 9 AM weekdays
timezone: "America/New_York"
channels:
- type: slack
channel: "#team-updates"
content:
include_metrics: true
include_errors: true
max_items_per_section: 10Brief Content
Briefs summarize Pilot activity for the configured period:
- Issues processed and their outcomes
- PRs created and merged
- Errors and failures
- Execution metrics