You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
adapters/slack: follow-ups from #132 and #133 (retry comment, ADR 0005, mrkdwn tests, PostNative) #136
Follow-ups from the reviews of #132 and #133 in the Slack adapter and its retry docs. Each item is small, and none blocked those PRs.
Retry default comment. The withDefaults comment in adapters/slack/slackapi/retry.go (L42-L44) says the worst-case backoff is about 600ms. With a Slack Retry-After, each delay is capped only at MaxDelay, so total backoff can reach MaxElapsed (2s). Correct the number.
ADR 0005 ack-window sentence.docs/adr/0005-rate-limit-handling.md#L29 ends with "This keeps synchronous retry inside the ack window." The deadline check and MaxElapsed bound only the backoff sleep, not the HTTP attempts (docs: fix stale example, dispatch, and retry text #132 corrected the same claim in the package docs). ADRs record decisions, so decide whether to amend it or leave a note.
PostNative keeps its own request body. After refactor(adapters/slack): move Web API calls onto typed slackapi methods #133, PostNative still builds its own chat.postMessage body (interactive.go#L308), because slackapi.PostMessageRequest.Blocks is []Block and docs/reference.md promises the adapter forwards a native payload unchanged. Decide whether PostNative can require a JSON array of blocks and use the typed method.
Triage: ready-for-agent. I made the two open decisions, so all five items can ship in one PR.
Item 2 (ADR 0005): amend it. ADRs here record decisions, not mechanism claims, and this sentence is a false mechanism claim. Replace it with the decision only: retry backoff is bounded by MaxElapsed, and individual HTTP attempts are bounded by the caller's context and HTTP client. Add a dated amendment note that points to docs: fix stale example, dispatch, and retry text #132.
Item 4 (PostNative): keep its own body.docs/reference.md promises to forward a native payload unchanged. Decoding it into []slackapi.Block and encoding it again can drop fields that the typed struct does not model. Add a one-line comment at interactive.go that states this reason, so the next refactor does not undo it.
Item 5 (mrkdwn on chat.postEphemeral): I verified it. Slack's method docs list parse, markdown_text and text, but no mrkdwn argument. Drop Mrkdwn from slackapi.PostEphemeralRequest and from the adapter at slack.go L359.
Item 3 then changes for the ephemeral post: its test must assert that the mrkdwn field is absent. The DM-fallback post (chat.postMessage) keeps "mrkdwn": false, and the test must pin it.
I did not verify one thing: whether any caller relies on mrkdwn: false to send literal text in an ephemeral message. If a test shows it does, escape the text instead.
Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: medium
Activity
ThomasK33 commentedon Oct 29, 2026
Triage:
ready-for-agent. I made the two open decisions, so all five items can ship in one PR.MaxElapsed, and individual HTTP attempts are bounded by the caller's context and HTTP client. Add a dated amendment note that points to docs: fix stale example, dispatch, and retry text #132.PostNative): keep its own body.docs/reference.mdpromises to forward a native payload unchanged. Decoding it into[]slackapi.Blockand encoding it again can drop fields that the typed struct does not model. Add a one-line comment atinteractive.gothat states this reason, so the next refactor does not undo it.mrkdwnonchat.postEphemeral): I verified it. Slack's method docs listparse,markdown_textandtext, but nomrkdwnargument. DropMrkdwnfromslackapi.PostEphemeralRequestand from the adapter atslack.goL359.mrkdwnfield is absent. The DM-fallback post (chat.postMessage) keeps"mrkdwn": false, and the test must pin it.I did not verify one thing: whether any caller relies on
mrkdwn: falseto send literal text in an ephemeral message. If a test shows it does, escape the text instead.Generated with
xum• Model:anthropic:claude-opus-5-5• Thinking:medium