Skip to main content
Chert treats every Slack credential as server-side and every inbound event as untrusted until verified.

Before You Begin

  • Chert Notifications and Chert Agent are installed via the OAuth flow described in Install.

OAuth token storage

Chert does not call Slack’s auth.revoke on disconnect. To fully revoke the install on Slack’s side, remove the app from Slack’s Manage apps page.

Signing-secret verification

Every inbound webhook from Slack is verified before any logic runs. The verification follows Slack’s documented v0 scheme: A failed verification returns 401 with a structured error body — { ok: false, code: 2004, message, retryable: false, trace_id } — and the event is dropped. If the Slack signing secret is missing server-side the route returns 500 with code 3003 (PROVIDER_NOT_CONFIGURED, retryable: false) instead. Slack’s one-time url_verification handshake is the only event accepted without signing — it still returns a bare 200 with the raw challenge string, unchanged. Genuine error paths across /api/slack/* now carry the structured body (numeric code, generic message, retryable, trace_id); the OAuth callback redirects to /settings with a stable short reason slug (no_code, slack_denied, oauth_exchange_failed, not_configured, …) rather than raw error text in the URL. See the Messaging API error scheme for the code registry.

Event deduplication

Slack retries webhooks on slow responses or network errors. Chert deduplicates by Slack’s event_id for 10 minutes, so retried events do not double-fire actions like proposals or sends.

Channel-binding scope

What the bot reads vs writes

The bot does not browse channel history beyond threads attached to its own messages, does not read direct messages, and does not read user profiles.

Webhook signing for outbound notifications

When notificationMethod is webhook or both and a webhookSecret is configured, every outbound POST from Chert carries an x-chert-signature: v1,<ts>,<hex> header. The signature is HMAC-SHA256 over <ts>.<raw-body> using your webhookSecret. Verify on receipt to authenticate the payload.

Sub-processors

All three are bound by their respective DPAs. Customers can disable the LLM surface by turning off AI-drafted replies in Settings.

See Also

Configuration

Routing, flags, and the Nth-reply filter.

Notifications

Card anatomy and thread-reply triage.