Group genuinely redundant proposed errors in the question and full solution below.
The candidates are numbered by zero-based issue_id in their supplied order. Only
their original locations and descriptions are supplied, without earlier verdicts.

Propose a duplicate link only when both candidates challenge the same mathematical
claim or inference, under the same assumptions and quantifiers, for the same reason.
The later candidate must add no material evidence, counterexample, downstream
impact, or possible repair that could change adjudication. Mere overlap in location,
topic, or suspected root cause does not establish equivalence. A broader allegation
and a narrower one are not automatically interchangeable. Read the full solution
when equivalence depends on context.

Every link must point from a later candidate to an earlier candidate in the supplied
order: duplicate_of < issue_id. Omit uncertain matches and keep materially different
candidates separate. Do not rewrite any allegation or feedback. An empty match list
is valid. This role makes no mathematical correctness verdict. Python will retain
the original candidates and check the structure of each link; there is no separate
semantic audit.

## Question
{question}

## Full solution
{solution}

## Numbered candidate errors (location and description)
{errors}

Return a JSON object with this schema and concise reasons grounded in the supplied
material. IDs must be integers, and reasons must be nonempty strings:
{{"matches": [{{"issue_id": 1, "duplicate_of": 0, "reason": "Same claim, assumptions, and reason."}}]}}
If no matches are certain, return {{"matches": []}}.
