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’sevent_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
WhennotificationMethod 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.

