CyberCLI

← All engines · Delivery

Slack adapter

beta

v0.9.0 · last updated 2026-06-06 · source: cybercli.delivery.channels.slack

§1

What it does

Slack incoming-webhook delivery with block-kit message formatting — sends structured alerts to a channel with rich layout, action buttons (for ack-from-Slack in v1.x), and per-webhook rate-limit awareness.

§2

Why you care

Slack is where most security teams already coordinate. Pushing the SOC alert to the operator's existing #soc-alerts channel (with the right block-kit layout) lands the alert in the same workflow that already gets pull-request reviews and incident updates. The alert isn't a new tool to learn; it's a familiar message in a familiar channel.

The block-kit formatting carries the signal's severity color, the connector + disposition, the truncated rationale, and a 'view in dashboard' link. Operators triage from Slack first, then click through to the dashboard for the full audit row. The Slack message is the front door; the dashboard is the deep dive.

§3

How it works

The adapter pulls the webhook URL from the CredentialVault (AAD = `delivery:slack:webhook_url:<destination_id>`), constructs a block-kit payload with the signal's severity-colored header + body + footer, and POSTs to the webhook. Slack's response code + retry-after header are read and surfaced as the adapter's typed result.

Slack's rate limit on incoming webhooks is ~1 message/sec per webhook. The adapter respects the `Retry-After` response header; if Slack returns 429, the dispatcher schedules a retry at the recommended interval rather than fire-and-forget.

§4

Configure & observe

CLI

$ cybercli channels test <destination_id>

POST a test block-kit message to the configured webhook; verify the channel can receive + the formatting renders.

Dashboard surfaces

/channels (slack card)

Configure the webhook URL (vaulted on save), the target channel hint (for display), and the message template (block-kit JSON).

Audit row shape

Outcomes emitted
notification_sentnotification_failednotification_rate_limited
Parameters block

parameters.channel: slack + parameters.destination_id + parameters.slack_response_code. The webhook URL is never landed on audit rows (it's the secret); the destination_id resolves to the URL via the vault.

§5

Status

Shipped 2026-06-07 (verifier half): `cybercli.delivery.channels.slack_ack` module ships three primitives — `verify_slack_signature` (HMAC-SHA256 with 5-min replay window + constant-time compare), `parse_block_kit_interaction` (form-then-JSON decode), and `extract_ack_intent` (pulls signal_id + actor + response_url out of a `cybercli_ack` action). SlackConfig gained an optional `signing_secret` field. The HTTP endpoint that runs these in order on `POST /api/slack/interactions` + hands the resolved signal_id to AckLoopEngine ships in v1.x.

Known limit: one webhook per Slack destination. Slack's app-based OAuth (which would let the engine post to multiple channels via one install) is a v1.5 backlog item.

How this engine talks to the rest

Upstream · feeds this engine
Downstream · this engine feeds