diff --git a/.github/workflows/gh-aw-duplicate-issue-detector.lock.yml b/.github/workflows/gh-aw-duplicate-issue-detector.lock.yml
index c94f5ec7..24fd3e67 100644
--- a/.github/workflows/gh-aw-duplicate-issue-detector.lock.yml
+++ b/.github/workflows/gh-aw-duplicate-issue-detector.lock.yml
@@ -34,7 +34,7 @@
#
# inlined-imports: true
#
-# gh-aw-metadata: {"schema_version":"v1","frontmatter_hash":"a42e6db2bc4a150c439e71c44d24fe9ca2e3ff4bed1b9ec5e4c9ecdd2ee278d0"}
+# gh-aw-metadata: {"schema_version":"v1","frontmatter_hash":"ac05861b4f42b7ed0ac61f61bac11118431a50c6cd14b76b7bc84fb267988a1b"}
name: "Duplicate Issue Detector"
"on":
@@ -355,56 +355,79 @@ jobs:
**Related issues detection setting**: __GH_AW_EXPR_7ADFD0BD__
- Classify each promising candidate using the categories below. If related issues detection is disabled (setting is `"false"`), only use the **Clear duplicate** and **Not related** categories — skip the **Highly related** category entirely.
+ Classify each promising candidate into one of the categories below. If related issues detection is disabled (setting is `"false"`), skip the **Related** category entirely.
- **Clear duplicate** — the candidate describes **the same underlying problem or request**:
- - Reports the same bug or requests the exact same feature
- - The affected component, behavior, and scope are the same
- - A fix for the candidate would fully resolve this issue too
+ **Duplicate** — a fix or resolution for the candidate would **fully resolve this issue too**:
+ - Reports the same bug with the same root cause, or requests the exact same feature
+ - The affected component, behavior, and scope match
+ - One being closed as "done" means the other is also done
- **Highly related** *(only when related issues detection is enabled)* — the candidate is closely related but **not** the same issue:
- - Covers a very similar area, component, or failure mode
+ **Related** *(only when detection is enabled)* — **not** the same issue, but may provide useful context or a partial answer:
+ - Covers a similar area, component, or failure mode but has distinct scope
+ - Contains discussion, workarounds, or decisions that would help the reporter
- One issue is a subset or superset of the other
- - Both issues overlap significantly but each has distinct scope or nuance
- **Not related** — skip it if:
- - The candidate only shares the same general topic area
- - The candidate is closed as "wont fix" or "invalid" with no resolution of the underlying issue
- - You are uncertain — when in doubt, err on the side of "not related"; if related issues detection is enabled, prefer "highly related" over "duplicate" for borderline overlapping cases
+ **Skip** a candidate if:
+ - It only shares the same general topic area
+ - It is closed as "won't fix" or "invalid" with no useful discussion
+ - You are uncertain — when in doubt, skip it; prefer **Related** over **Duplicate** for borderline cases
### Step 4: Post Result
- Post **exactly one** `add_comment` call total (or `noop` if nothing is found). Do not call `add_comment` more than once.
+ Post **exactly one** `add_comment` call (or `noop` if nothing is found). Do not call `add_comment` more than once.
- **If any duplicates (or highly related issues, when detection is enabled) were found:**
+ **If any duplicates or related issues were found:**
- Call `add_comment` with a single comment combining all findings. Include up to **3 duplicate issues** and, when related issues detection is enabled, up to **3 highly related issues**, each ranked from most to least relevant to the current issue. Use this format:
+ Call `add_comment` with a single comment. Include up to **3 duplicates** and up to **3 related issues**, ranked most-to-least relevant.
+
+ When there are duplicates, start with a recommendation line telling the maintainer whether this issue looks safe to close — for example: *"This issue looks like a duplicate of #123 and may be safe to close."* If there are multiple duplicate candidates, recommend the single best one.
+
+ Example with both duplicates and related issues:
```
- **Possible duplicates** (issues that appear to describe the same problem):
- - #{number} — {one concise sentence explaining why this issue overlaps with the candidate issue}
- More detail
- {optional extra context about shared symptoms, component, or scope}
-
- - #{number} — {one concise sentence explaining why this issue overlaps with the candidate issue}
- More detail
- {optional extra context about shared symptoms, component, or scope}
-
-
- **Highly related** (separate issues that significantly overlap or share scope):
- - #{number} — {one concise sentence explaining the shared scope and the key difference from this issue}
- More detail
- {optional extra context about the overlap and distinction}
-
- - #{number} — {one concise sentence explaining the shared scope and the key difference from this issue}
- More detail
- {optional extra context about the overlap and distinction}
-
+ This issue looks like a duplicate of #101 and may be safe to close.
+
+ **Possible duplicates:**
+ - #101 — {why this is the same problem, e.g. "same crash in the auth module when tokens expire"}
+ - #88 — {why this is the same problem}
+
+ {N} related issues
+
+ - #204 — {how this could help, e.g. "documents a workaround for the same timeout behavior"}
+ - #190 — {how this could help}
+
+
+ ```
+
+ Example with only duplicates:
+
+ ```
+ This issue looks like a duplicate of #101 and may be safe to close.
+
+ **Possible duplicates:**
+ - #101 — {why this is the same problem}
+ ```
+
+ Example with only related issues:
+
+ ```
+ {N} related issues
+
+ - #204 — {how this could help}
+ - #190 — {how this could help}
+
+
```
- Omit the **Highly related** section entirely when related issues detection is disabled or when no issues qualify for it. Omit a section entirely if no issues qualify for it. Put issue references on the main list line (outside ``) so GitHub renders issue status badges. Keep `` text generic (for example, `More detail`) and avoid repeating issue titles there. In justifications, refer to the current report as **"this issue"** (not by number). Use neutral, helpful language — the reporter may not be familiar with the existing issues. Do NOT use `fixes`, `closes`, or `resolves` keywords.
+ Formatting rules:
+ - Put `#{number}` on the list line so GitHub renders status badges
+ - Do NOT repeat issue titles or numbers in justification text
+ - Refer to the current report as "this issue" and to candidates by "it" or a short description
+ - Do NOT use `fixes`, `closes`, or `resolves` keywords (they auto-close issues)
+ - For duplicates, explain **why it is the same problem**
+ - For related issues, explain **how it could help the reporter**
- **If no duplicate (or highly related issue, when detection is enabled) is found:**
+ **If nothing is found:**
Call `noop` with message "No duplicate found for issue #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__".
diff --git a/.github/workflows/gh-aw-duplicate-issue-detector.md b/.github/workflows/gh-aw-duplicate-issue-detector.md
index 42eeab27..dbf41993 100644
--- a/.github/workflows/gh-aw-duplicate-issue-detector.md
+++ b/.github/workflows/gh-aw-duplicate-issue-detector.md
@@ -100,56 +100,79 @@ For each candidate result, read the title and (if promising) the body to assess
**Related issues detection setting**: ${{ inputs.detect-related-issues }}
-Classify each promising candidate using the categories below. If related issues detection is disabled (setting is `"false"`), only use the **Clear duplicate** and **Not related** categories — skip the **Highly related** category entirely.
+Classify each promising candidate into one of the categories below. If related issues detection is disabled (setting is `"false"`), skip the **Related** category entirely.
-**Clear duplicate** — the candidate describes **the same underlying problem or request**:
-- Reports the same bug or requests the exact same feature
-- The affected component, behavior, and scope are the same
-- A fix for the candidate would fully resolve this issue too
+**Duplicate** — a fix or resolution for the candidate would **fully resolve this issue too**:
+- Reports the same bug with the same root cause, or requests the exact same feature
+- The affected component, behavior, and scope match
+- One being closed as "done" means the other is also done
-**Highly related** *(only when related issues detection is enabled)* — the candidate is closely related but **not** the same issue:
-- Covers a very similar area, component, or failure mode
+**Related** *(only when detection is enabled)* — **not** the same issue, but may provide useful context or a partial answer:
+- Covers a similar area, component, or failure mode but has distinct scope
+- Contains discussion, workarounds, or decisions that would help the reporter
- One issue is a subset or superset of the other
-- Both issues overlap significantly but each has distinct scope or nuance
-**Not related** — skip it if:
-- The candidate only shares the same general topic area
-- The candidate is closed as "wont fix" or "invalid" with no resolution of the underlying issue
-- You are uncertain — when in doubt, err on the side of "not related"; if related issues detection is enabled, prefer "highly related" over "duplicate" for borderline overlapping cases
+**Skip** a candidate if:
+- It only shares the same general topic area
+- It is closed as "won't fix" or "invalid" with no useful discussion
+- You are uncertain — when in doubt, skip it; prefer **Related** over **Duplicate** for borderline cases
### Step 4: Post Result
-Post **exactly one** `add_comment` call total (or `noop` if nothing is found). Do not call `add_comment` more than once.
+Post **exactly one** `add_comment` call (or `noop` if nothing is found). Do not call `add_comment` more than once.
-**If any duplicates (or highly related issues, when detection is enabled) were found:**
+**If any duplicates or related issues were found:**
-Call `add_comment` with a single comment combining all findings. Include up to **3 duplicate issues** and, when related issues detection is enabled, up to **3 highly related issues**, each ranked from most to least relevant to the current issue. Use this format:
+Call `add_comment` with a single comment. Include up to **3 duplicates** and up to **3 related issues**, ranked most-to-least relevant.
+
+When there are duplicates, start with a recommendation line telling the maintainer whether this issue looks safe to close — for example: *"This issue looks like a duplicate of #123 and may be safe to close."* If there are multiple duplicate candidates, recommend the single best one.
+
+Example with both duplicates and related issues:
```
-**Possible duplicates** (issues that appear to describe the same problem):
-- #{number} — {one concise sentence explaining why this issue overlaps with the candidate issue}
- More detail
- {optional extra context about shared symptoms, component, or scope}
-
-- #{number} — {one concise sentence explaining why this issue overlaps with the candidate issue}
- More detail
- {optional extra context about shared symptoms, component, or scope}
-
-
-**Highly related** (separate issues that significantly overlap or share scope):
-- #{number} — {one concise sentence explaining the shared scope and the key difference from this issue}
- More detail
- {optional extra context about the overlap and distinction}
-
-- #{number} — {one concise sentence explaining the shared scope and the key difference from this issue}
- More detail
- {optional extra context about the overlap and distinction}
-
+This issue looks like a duplicate of #101 and may be safe to close.
+
+**Possible duplicates:**
+- #101 — {why this is the same problem, e.g. "same crash in the auth module when tokens expire"}
+- #88 — {why this is the same problem}
+
+{N} related issues
+
+- #204 — {how this could help, e.g. "documents a workaround for the same timeout behavior"}
+- #190 — {how this could help}
+
+
+```
+
+Example with only duplicates:
+
+```
+This issue looks like a duplicate of #101 and may be safe to close.
+
+**Possible duplicates:**
+- #101 — {why this is the same problem}
+```
+
+Example with only related issues:
+
+```
+{N} related issues
+
+- #204 — {how this could help}
+- #190 — {how this could help}
+
+
```
-Omit the **Highly related** section entirely when related issues detection is disabled or when no issues qualify for it. Omit a section entirely if no issues qualify for it. Put issue references on the main list line (outside ``) so GitHub renders issue status badges. Keep `` text generic (for example, `More detail`) and avoid repeating issue titles there. In justifications, refer to the current report as **"this issue"** (not by number). Use neutral, helpful language — the reporter may not be familiar with the existing issues. Do NOT use `fixes`, `closes`, or `resolves` keywords.
+Formatting rules:
+- Put `#{number}` on the list line so GitHub renders status badges
+- Do NOT repeat issue titles or numbers in justification text
+- Refer to the current report as "this issue" and to candidates by "it" or a short description
+- Do NOT use `fixes`, `closes`, or `resolves` keywords (they auto-close issues)
+- For duplicates, explain **why it is the same problem**
+- For related issues, explain **how it could help the reporter**
-**If no duplicate (or highly related issue, when detection is enabled) is found:**
+**If nothing is found:**
Call `noop` with message "No duplicate found for issue #${{ github.event.issue.number }}".