|
24 | 24 | // |
25 | 25 | // The install credential rides as the adapter-specific slack.SlackInstall payload |
26 | 26 | // on chat.Install.Credential (a Platform Escape Hatch for credentials): the |
27 | | -// per-workspace bot token plus an optional bot user id used for tenant-correct |
28 | | -// self-filtering. Thread Handle reconstruction (out-of-webhook posting) resolves |
29 | | -// the same way, keyed by the Platform Tenant decoded from the opaque Thread ID. |
| 27 | +// per-workspace bot token plus the bot user id used for tenant-correct |
| 28 | +// self-filtering. The bot user id is optional in the type but should be treated |
| 29 | +// as required: without it the bot's own posts are not filtered, and a |
| 30 | +// subscribed thread can loop on its own replies. Thread Handle reconstruction |
| 31 | +// (out-of-webhook posting) resolves the same way, keyed by the Platform Tenant |
| 32 | +// decoded from the opaque Thread ID. |
30 | 33 | // |
31 | 34 | // # Message history (ADR 0009) |
32 | 35 | // |
|
41 | 44 | // |
42 | 45 | // # Rate-limit retry (ADR 0005) |
43 | 46 | // |
44 | | -// Outbound posts are hardened against Slack throttling by default. The adapter |
45 | | -// wraps its Slack Web API call site (chat.postMessage / chat.postEphemeral / |
46 | | -// conversations.open) with bounded retry on a Slack 429 (honoring the Retry-After |
47 | | -// header, in seconds) and the ratelimited API error. Retry is bounded three ways: |
48 | | -// an attempt cap (Options.RetryPolicy.MaxAttempts), a cumulative backoff ceiling |
49 | | -// (MaxElapsed), and the caller's context deadline. The single load-bearing |
50 | | -// invariant is that in-line synchronous retry never sleeps past the caller's |
51 | | -// context deadline, so retry under the default DispatchSync stays inside Slack's |
52 | | -// 3-second ack window and cannot trigger a platform redelivery storm. |
| 47 | +// Outbound calls are hardened against Slack throttling by default. The adapter |
| 48 | +// wraps every Slack Web API call (including auth.test, chat.postMessage, |
| 49 | +// chat.postEphemeral, conversations.open, views.open, and history reads) and |
| 50 | +// every response_url post with bounded retry on a Slack 429 (honoring the |
| 51 | +// Retry-After header, in seconds) and the ratelimited API error. Retry is |
| 52 | +// bounded three ways: an attempt cap (Options.RetryPolicy.MaxAttempts), a |
| 53 | +// cumulative backoff ceiling (MaxElapsed), and the caller's context deadline. |
| 54 | +// The single load-bearing invariant is that in-line synchronous retry never |
| 55 | +// sleeps past the caller's context deadline, so retry under the default |
| 56 | +// DispatchSync stays inside Slack's 3-second ack window and cannot trigger a |
| 57 | +// platform redelivery storm. |
53 | 58 | // |
54 | 59 | // The RetryPolicy is per-adapter platform config in Options, never Runtime |
55 | 60 | // Options. Its zero value is a conservative default that keeps MaxElapsed under |
|
0 commit comments