name: af-send-notifications description: Send project notifications for events like setup completion and deployments. Use when posting to Zulip, formatting status updates, or triggering notification templates for project milestones.
AgentFlow documentation fields
title: Communications Expertise created: 2025-12-10 updated: 2026-02-25 last_checked: 2026-02-25 tags: [skill, expertise, communications, zulip, slack, notifications] parent: ../README.md
Communications Expertise
When to Use This Skill
Load this skill when you need to:
- Send notifications for project milestones
- Announce setup completion to project streams/channels
- Post deployment or release notices
- Share status updates with teams
Quick Reference
AgentFlow uses Zulip as the primary communication platform. Slack is legacy (gated behind SLACK_ENABLED=false by default).
Zulip (Primary)
Zulip notifications are sent via the Zulip API using bot credentials from Doppler:
| Parameter | Source |
|---|---|
ZULIP_BOT_EMAIL |
Doppler (agentview/prd) |
ZULIP_API_KEY |
Doppler (agentview/prd) |
ZULIP_REALM |
Doppler (agentview/prd) |
Sending a Zulip message:
curl -s -X POST "$ZULIP_REALM/api/v1/messages" \
-u "$ZULIP_BOT_EMAIL:$ZULIP_API_KEY" \
-d "type=stream" \
-d "to=engineering-team" \
-d "topic=AgentFlow Updates" \
--data-urlencode "content=Your message here"
Slack (Legacy)
Slack MCP tools are available but gated behind SLACK_ENABLED=true. By default Slack is disabled.
Available Slack MCP tools (legacy):
mcp__slack__slack_list_channels- List available channelsmcp__slack__slack_post_message- Post to a channelmcp__slack__slack_reply_to_thread- Reply in a threadmcp__slack__slack_get_channel_history- Read recent messages
Note: Only use Slack MCP tools when SLACK_ENABLED=true is set and the agent is running in Slack-enabled mode.
Message Templates
Greenfield Setup Complete
Project setup complete!
**{Project Name}**
GitHub: https://github.com/{owner}/{repo}
Linear: https://linear.app/gaininsight/team/{KEY}
Worktree: /srv/worktrees/{repo}/develop
Ready for development. Use `start-work {repo} {ISSUE-ID}` to begin.
Deployment Notice
Deployed to {environment}
**{Project Name}** v{version}
URL: {deployment-url}
Issues: {comma-separated issue IDs}
Changes:
- {Change 1}
- {Change 2}
Status Update
Status Update: **{Project Name}**
Completed: {list}
In Progress: {list}
Blocked: {list if any}
Workflow
Sending a Zulip Notification (Primary)
Determine the stream and topic:
- Use the project's configured Zulip stream (from project registry)
- Use a descriptive topic (e.g., "Deployments", "Setup", "AgentFlow Updates")
Post message:
curl -s -X POST "$ZULIP_REALM/api/v1/messages" \ -u "$ZULIP_BOT_EMAIL:$ZULIP_API_KEY" \ -d "type=stream" \ -d "to={stream-name}" \ -d "topic={topic}" \ --data-urlencode "content={formatted message}"Handle errors:
- HTTP 401 -> Invalid bot credentials
- HTTP 400 -> Invalid stream or missing parameters
- Check
ZULIP_REALM,ZULIP_BOT_EMAIL,ZULIP_API_KEYare set
Sending a Slack Notification (Legacy)
Only when SLACK_ENABLED=true:
Check channel access:
mcp__slack__slack_list_channelsLook for
is_member: truePost message:
mcp__slack__slack_post_message - channel_id: [from list] - text: [formatted message]Handle errors:
not_in_channel-> Bot needs to be invited to channelchannel_not_found-> Invalid channel IDnot_authed-> Token issue
Bot Invitation (Slack Legacy)
If bot isn't in a channel, instruct user:
"Please invite the bot to #{channel} by typing
/invite @AgentFlowin the channel"
Integration Points
Greenfield setup (af-setup-project):
- After setup completion, optionally notify the project's Zulip stream
- Only if user provided a Zulip stream (or Slack channel for legacy) during setup
Delivery phase (af-deliver-features):
- Post deployment notices after successful releases
- Update on PR merges if configured
Common Pitfalls
- Missing Zulip credentials - Ensure
ZULIP_BOT_EMAIL,ZULIP_API_KEY,ZULIP_REALMare available via Doppler - Wrong stream name - Verify the stream exists in Zulip before posting
- Slack not enabled - Don't attempt Slack MCP tools unless
SLACK_ENABLED=true - Bot not in Slack channel (legacy) - Must be invited before posting
Key Principles
- Zulip is primary - Use Zulip for all new notifications
- Slack is legacy - Only use when explicitly enabled via
SLACK_ENABLED=true - Notifications are optional - Don't block workflows on notification failures
- Keep messages concise - Use templates, avoid walls of text
- Include links - GitHub, Linear, deployment URLs
- Fail gracefully - Log error, continue workflow