Slack Alerts and Approvals for Claude Agents: Real-Time Human Oversight
The problem with agent monitoring dashboards is that nobody watches them. You open the dashboard when something’s wrong. By then, the agent has been doing the wrong thing for 20 minutes.
Slack-based oversight works because it meets people where they already are. When your agent needs attention, it shows up in the same channel where your team is discussing the work. No new tool to learn, no dashboard to remember to open.
Here’s how to build it well.
What Butler Does
Sentrely’s Slack integration uses a bot called Butler. Butler handles three categories of Slack interactions:
Approval requests. When an agent attempts a gated operation — pushing to main, deleting data, sending external communications — Butler posts a message with action buttons. One click approves or denies. The agent receives the decision and proceeds or stops accordingly.
Proactive alerts. Butler monitors agent behavior and surfaces anomalies without waiting to be asked. A loop that’s been retrying the same call for 15 minutes. A session that’s been idle for 2 hours but is still running. A project that’s consumed 80% of its daily token budget by 10 AM.
Status reports. When an agent completes a task, Butler posts a summary: what was done, how long it took, what was deployed, how many tokens were consumed.
Channel Architecture
The key to not drowning in noise is routing different signals to different channels. A single #ai-agents channel that receives everything becomes unactionable fast.
The pattern that works:
#engineering-agents — Deployment approvals and code-related gating. This is where your dev team lives. Approval requests for git pushes, code reviews, deployments go here. The audience is engineers who can make informed decisions quickly.
#agent-alerts — Anomaly detection and proactive issues. Stuck loops, unusual patterns, session anomalies. Lower urgency than approvals, but needs engineering attention within the hour.
#billing-alerts — Cost and budget notifications. Keeps financial visibility separate from operational noise. Finance or team leads can monitor this without wading through deployment approvals.
#deployments — Task completion summaries. Low-noise, informational. Good for stakeholders who want to know “what shipped today” without seeing every approval request.
#access-requests — When agents need elevated permissions not in their current policy. This often needs a different approver than deployment decisions.
Approval Request Anatomy
A good approval request message gives the approver everything they need to decide in under 30 seconds:
🚨 Approval Required
Agent claude-deploy-01 wants to push to main on acme/api.
📁 3 files changed · +142 −38
🔖 feat: add stripe webhook handler
👤 Session started 4 minutes ago by claude-deploy-01
[✓ Approve] [✕ Deny] [View Diff]
What makes this effective:
- The headline is the decision: push to main, yes or no?
- The diff summary gives confidence without requiring the approver to read code
- The commit message provides intent context
- The session age confirms this is a fresh, active session (not a zombie)
- Buttons make the decision a single click
- The diff link is there for anyone who wants it, but not required
After approval:
✅ Approved by Jordan. Push proceeding — commit a3f92d1 is live.
After denial:
✕ Denied by Jordan: "use the staging branch first"
The reason flows back to the agent, which can then route to staging as instructed.
Proactive Alert Examples
Loop detection:
🔴 Agent needs attention — claude-research-01
Making 73 calls to GET /api/v2/properties over 19 minutes.
All returning 429. Session may be stuck.
💸 $4.20 spent · Last progress: 23 min ago
[View Session] [Stop Agent] [Dismiss]
This surfaces before you’d notice it in a dashboard. The agent is burning money and making no progress. One click stops it.
Budget alert:
⚠️ Budget Alert — billing-automation (81%)
Used $163.40 of $200.00 monthly budget.
At this rate, exhausts in ~3 days.
Top consumer: claude-invoice-01 · $94.20 · 578k tokens
[Increase to $300] [Pause Agents] [View Breakdown]
The action buttons let the approver handle it without leaving Slack.
Unusual access pattern:
🔑 Access Request — claude-infra-01
Hit 403 trying to write to s3://prod-data-lake/raw/
Current policy: read-only. Agent says: "need to write processed leads back to S3"
📋 Requesting: s3:PutObject on prod-data-lake/raw/*
[Grant 1h] [Grant 24h] [Deny] [View Policy]
Setting Up Butler
Butler is configured at the project level in Sentrely. The configuration specifies:
notifications:
slack:
workspace: acme
channels:
deployments: engineering-agents
alerts: agent-alerts
billing: billing-alerts
access: access-requests
approval_timeout: 30m
approval_default: deny
approval_timeout is important: if an approval request expires without a response, it defaults to deny. Agents don’t block indefinitely.
Each project can route to different channels, which means billing-automation agents can post to different channels than code-review agents — keeping team-specific signals in team-specific channels.
What Good Agent Observability Looks Like
After a few weeks with Butler configured, you should be able to answer these questions without leaving Slack:
- What did my agents do today?
- Is anything stuck right now?
- Am I going to hit my budget this month?
- Did last night’s deployment succeed?
If the answer to any of these requires opening a dashboard or querying a database, your alerting coverage has gaps.
The goal isn’t to route everything to Slack — it’s to route the right things. Noise kills adoption. The agents and alerts that don’t need human attention should stay silent. The ones that do should surface themselves, with enough context to act on immediately.
When that works, oversight doesn’t feel like overhead. It feels like a teammate keeping you informed.
Put this into practice with Sentrely
Everything covered in this article is built into Sentrely's managed control plane. Get early access and have it running against your Claude agents in minutes.