#23799: fix(slack): finalize replyToMode off threading behavior
docs
channel: slack
maintainer
size: S
dedupe:parent
Cluster:
Slack Thread Management Fixes
## Summary
- rebases canonical Slack threading fix work on latest `main`
- folds in DM-specific `incomingThreadTs` handling from #18036 so `replyToMode: "off"` is respected even when typing indicators create thread context
- keeps status-thread fallback removal, explicit tag behavior, and default alignment from #22944
- adds Unreleased changelog entry under `### Fixes`
## Linked Issue/PR
- Related #16868
- Related #10837
- Supersedes #22944
- Supersedes #18036
## Repro + Verification
- `pnpm test src/slack/threading.test.ts src/slack/monitor.tool-result.test.ts src/auto-reply/reply/reply-plumbing.test.ts`
- all listed tests pass locally
## Scope boundary
- does not include queue drain / deliveryContext thread propagation work from #11934 (`#10837` track)
<!-- greptile_comment -->
<h3>Greptile Summary</h3>
This PR finalizes the Slack `replyToMode: "off"` threading behavior, ensuring it consistently prevents unwanted thread replies. The changes address multiple edge cases where `off` mode wasn't being respected, particularly in DMs with typing indicators and with explicit reply tags.
Key changes:
- Changed default `replyToMode` from `"all"` to `"off"` in `src/slack/monitor/provider.ts:124` to align runtime behavior with documentation
- Removed fallback thread creation for status indicators when `replyToMode` is `"off"` in `src/slack/threading.ts:52`
- Added DM-specific logic to respect `replyToMode: "off"` even when typing indicators create thread context in `src/slack/monitor/replies.ts:98-103`
- Changed `allowExplicitReplyTagsWhenOff` from `true` to `false` in both core and extension Slack channels to strip explicit `[[reply_to_*]]` tags in `off` mode
- Updated documentation to clarify that Slack `off` mode disables all threading including explicit tags, unlike Telegram
- Updated tests to reflect the new behavior
<h3>Confidence Score: 5/5</h3>
- This PR is safe to merge with minimal risk
- The implementation is well-structured with comprehensive test coverage. All tests pass according to the PR description. The changes are focused and address specific edge cases in threading behavior. The code follows established patterns in the codebase, includes helpful JSDoc comments, and the documentation accurately reflects the new behavior. The default change from `"all"` to `"off"` aligns with documented behavior and user expectations.
- No files require special attention
<sub>Last reviewed commit: f752b5d</sub>
<!-- greptile_other_comments_section -->
<!-- /greptile_comment -->
Most Similar PRs
#23513: fix(slack): respect replyToMode=off for inline directive reply tags
by dorukardahan · 2026-02-22
89.5%
#20406: fix(slack): respect replyToMode when computing statusThreadTs in DMs
by QuinnYates · 2026-02-18
87.7%
#12244: fix(slack): preserve thread context for DM thread replies
by junhoyeo · 2026-02-09
86.4%
#23320: fix(slack): respect replyToMode when incomingThreadTs is auto-created
by dorukardahan · 2026-02-22
86.1%
#23804: fix(slack): preserve string thread context in queue + DM route
by vincentkoc · 2026-02-22
85.5%
#19083: Slack: preserve per-thread context and consistent thread replies
by jkimbo · 2026-02-17
83.2%
#15969: fix: per-thread session isolation for Slack DMs when replyToMode is...
by neeravmakwana · 2026-02-14
79.9%
#22485: fix(slack): use threadId from delivery context as threadTs fallback...
by dorukardahan · 2026-02-21
79.6%
#14720: fix(slack): pass threadId in plugin read action (#14706)
by lailoo · 2026-02-12
79.2%
#11194: fix(slack): queue drain drops string thread_ts — replies leak to ma...
by Lukavyi · 2026-02-07
78.9%